next-api-analyzer
Version:
Next.js API routes analyzer for security, performance, and maintainability
1 lines โข 267 kB
Source Map (JSON)
{"version":3,"sources":["../src/bin/api-analyzer.ts","../src/lib/api-analyzer.ts","../src/config/default-config.ts","../src/utils/file-utils.ts","../src/utils/logger.ts","../src/analyzers/security-analyzer.ts","../src/utils/common.ts","../src/analyzers/base-analyzer.ts","../src/analyzers/performance-analyzer.ts","../src/lib/plugin-system.ts","../src/lib/report-generator.ts"],"sourcesContent":["import { Command } from \"commander\"\nimport { NextApiAnalyzer } from \"../lib/api-analyzer\"\nimport { FileUtils } from \"../utils/file-utils\"\nimport { logger, LogLevel } from \"../utils/logger\"\nimport { PluginManager, OpenApiPlugin, TestCoveragePlugin } from \"../lib/plugin-system\"\nimport { validateConfig, DEFAULT_CONFIG } from \"../config/default-config\"\nimport type { AnalyzerConfig, ApiAnalysisResult } from \"../types\"\nimport path from \"path\"\nimport { performance } from \"perf_hooks\"\nimport chalk from \"chalk\"\nimport { UnifiedReportGenerator } from \"../lib/report-generator\"\nimport type { SecurityReportData, PerformanceReportData, TrendsReportData, ComparisonReportData, } from \"../lib/report-generator\"\n\nconst program = new Command()\n\nprogram.name(\"next-api-analyzer\").description(\"Next.js API routes analyzer\").version(\"3.1.0\")\n\nprogram\n .option(\"-v, --verbose\", \"Enable verbose logging\")\n .option(\"-q, --quiet\", \"Suppress output\")\n .option(\"-c, --config <file>\", \"Configuration file path\")\n .option(\"--no-color\", \"Disable colored output\")\n .hook(\"preAction\", (thisCommand) => {\n const opts = thisCommand.opts()\n if (opts.quiet) {\n logger.configure({ level: LogLevel.ERROR })\n } else if (opts.verbose) {\n logger.configure({ level: LogLevel.DEBUG })\n }\n\n if (opts.noColor) {\n logger.configure({ colors: false })\n }\n })\n\nprogram\n .command(\"analyze\")\n .description(\"Analyze API routes\")\n .option(\"-d, --dir <directory>\", \"API directory\", \"src/app/api\")\n .option(\"-o, --output <directory>\", \"Output directory\", \"./api-analysis\")\n .option(\"-f, --format <format>\", \"Output format (md, json, html, all)\", \"md\")\n .option(\"--include-trends\", \"Include historical trend analysis\", false)\n .option(\"--parallel\", \"Enable parallel processing\", true)\n .option(\"--max-concurrency <number>\", \"Maximum concurrent file processing\", \"4\")\n .option(\"--cache\", \"Enable caching for faster subsequent runs\", true)\n .option(\"--plugins <plugins>\", \"Comma-separated list of plugins to enable\")\n .option(\"--exclude-patterns <patterns>\", \"Additional exclude patterns (comma-separated)\")\n .option(\"--security\", \"Focus on security analysis\")\n .option(\"--performance\", \"Focus on performance analysis\")\n .action(async (options) => {\n const startTime = performance.now()\n\n try {\n logger.info(\"๐ Starting API analysis...\")\n\n const config = await loadConfig(options.config, {\n apiDir: options.dir,\n outputDir: options.output,\n enableTrends: options.includeTrends,\n parallel: options.parallel,\n maxConcurrency: Number.parseInt(options.maxConcurrency),\n cache: { ...DEFAULT_CONFIG.cache, enabled: options.cache },\n })\n\n if (options.excludePatterns) {\n config.excludePatterns.push(...options.excludePatterns.split(\",\").map((p: string) => p.trim()))\n }\n\n if (options.security) {\n config.enableSecurityAnalysis = true\n config.enablePerformanceAnalysis = false\n }\n\n if (options.performance) {\n config.enablePerformanceAnalysis = true\n config.enableSecurityAnalysis = false\n }\n\n const configErrors = validateConfig(config)\n if (configErrors.length > 0) {\n logger.error(\"Configuration validation failed:\")\n configErrors.forEach((error) => logger.error(` - ${error}`))\n process.exit(1)\n }\n\n const analyzer = new NextApiAnalyzer(config)\n\n if (options.plugins) {\n const pluginManager = new PluginManager()\n const pluginNames = options.plugins.split(\",\").map((p: string) => p.trim())\n\n for (const pluginName of pluginNames) {\n if (pluginName === \"openapi\") {\n await pluginManager.loadPlugin(new OpenApiPlugin())\n } else if (pluginName === \"test-coverage\") {\n await pluginManager.loadPlugin(new TestCoveragePlugin())\n }\n }\n }\n\n const analysis = await analyzer.analyzeRoutes()\n\n const formats = options.format === \"all\" ? [\"md\", \"json\", \"html\"] : [options.format]\n\n for (const format of formats) {\n await generateReport(analyzer, analysis, format, config.outputDir)\n }\n\n logger.info(\"๐ Analysis Summary:\")\n logger.info(` Routes: ${analysis.summary.totalRoutes}`)\n logger.info(` Security Score: ${analysis.summary.securityScore.toFixed(1)}%`)\n logger.info(` Performance Score: ${analysis.summary.performanceScore.toFixed(1)}%`)\n logger.info(` Recommendations: ${analysis.recommendations.length}`)\n\n displaySummary(analysis)\n\n const duration = performance.now() - startTime\n logger.success(`โ
Analysis complete! Reports saved to: ${config.outputDir}`)\n logger.success(`โ
Analysis complete in ${duration.toFixed(2)}ms! Reports saved to: ${config.outputDir}`)\n\n const reportGenerator = new UnifiedReportGenerator(config, config.outputDir)\n await reportGenerator.generateUnifiedReport(\"analyze\", analysis)\n } catch (error) {\n logger.error(\"Analysis failed:\", error)\n process.exit(1)\n }\n })\n\nprogram\n .command(\"security\")\n .description(\"Security-focused analysis\")\n .option(\"-d, --dir <directory>\", \"API directory\", \"src/app/api\")\n .option(\"-t, --threshold <number>\", \"Security threshold\", \"80\")\n .option(\"--fail-on-threshold\", \"Exit with error code if threshold not met\")\n .option(\"--export-sarif\", \"Export results in SARIF format for CI/CD\")\n .option(\"--cwe-mapping\", \"Include CWE (Common Weakness Enumeration) mapping\", true)\n .option(\"--compliance <standard>\", \"Check against compliance standards (owasp, pci-dss)\")\n .option(\"--exclude-patterns <patterns>\", \"Exclude specific vulnerability patterns\")\n .action(async (options) => {\n const startTime = performance.now()\n\n try {\n logger.info(\"๐ Running security analysis...\")\n\n const config = await loadConfig(options.config, {\n apiDir: options.dir,\n enableSecurityAnalysis: true,\n enablePerformanceAnalysis: false,\n })\n\n const analyzer = new NextApiAnalyzer(config)\n const analysis = await analyzer.analyzeRoutes()\n const threshold = Number.parseInt(options.threshold)\n\n logger.info(`๐ก๏ธ Security Score: ${analysis.summary.securityScore.toFixed(1)}%`)\n\n displaySecurityReport(analysis, {\n cweMapping: options.cweMapping,\n compliance: options.compliance,\n })\n\n if (options.exportSarif) {\n await exportSarif(analysis, config.outputDir)\n logger.success(\"๐ SARIF report exported for CI/CD integration\")\n }\n\n if (options.failOnThreshold && analysis.summary.securityScore < threshold) {\n logger.error(`โ Security score below threshold (${threshold}%)`)\n logger.error(`โ Security score ${analysis.summary.securityScore.toFixed(1)}% is below threshold ${threshold}%`)\n process.exit(1)\n }\n\n logger.success(\"โ
Security analysis passed\")\n const duration = performance.now() - startTime\n logger.success(`๐ก๏ธ Security audit complete in ${duration.toFixed(2)}ms!`)\n\n const securityData: SecurityReportData = await generateSecurityReportData(analysis)\n const reportGenerator = new UnifiedReportGenerator(config, config.outputDir)\n await reportGenerator.generateUnifiedReport(\"security\", analysis, { security: securityData })\n } catch (error) {\n logger.error(\"Security analysis failed:\", error)\n process.exit(1)\n }\n })\n\nprogram\n .command(\"performance\")\n .description(\"Performance analysis with complexity metrics and optimization recommendations\")\n .option(\"-d, --dir <directory>\", \"API directory to analyze\", \"src/app/api\")\n .option(\"--benchmark\", \"Run performance benchmarks\")\n .option(\"--complexity-threshold <number>\", \"Complexity threshold for warnings\", \"10\")\n .option(\"--memory-analysis\", \"Include memory usage estimation\", true)\n .option(\"--database-analysis\", \"Analyze database query patterns\", true)\n .option(\"--external-calls\", \"Track external API dependencies\", true)\n .action(async (options) => {\n const startTime = performance.now()\n\n try {\n logger.info(\"โก Running performance analysis...\")\n\n const config = await loadConfig(options.config, {\n apiDir: options.dir,\n enablePerformanceAnalysis: true,\n enableSecurityAnalysis: false,\n thresholds: {\n ...DEFAULT_CONFIG.thresholds,\n complexity: Number.parseInt(options.complexityThreshold),\n },\n })\n\n const analyzer = new NextApiAnalyzer(config)\n const analysis = await analyzer.analyzeRoutes()\n\n displayPerformanceReport(analysis, {\n benchmark: options.benchmark,\n memoryAnalysis: options.memoryAnalysis,\n databaseAnalysis: options.databaseAnalysis,\n externalCalls: options.externalCalls,\n })\n\n if (options.benchmark) {\n logger.info(\"๐ Running performance benchmarks...\")\n await runPerformanceBenchmarks(analysis)\n }\n\n const duration = performance.now() - startTime\n logger.success(`โก Performance analysis complete in ${duration.toFixed(2)}ms!`)\n\n const performanceData: PerformanceReportData = await generatePerformanceReportData(analysis)\n const reportGenerator = new UnifiedReportGenerator(config, config.outputDir)\n await reportGenerator.generateUnifiedReport(\"performance\", analysis, { performance: performanceData })\n } catch (error) {\n logger.error(\"Performance analysis failed:\", error)\n process.exit(1)\n }\n })\n\nprogram\n .command(\"trends\")\n .description(\"Historical trend analysis with configurable time ranges\")\n .option(\"-d, --dir <directory>\", \"API directory to analyze\", \"src/app/api\")\n .option(\"--days <number>\", \"Number of days to analyze\", \"30\")\n .option(\"--export-csv\", \"Export trend data as CSV\")\n .option(\"--compare-branches\", \"Compare trends across git branches\")\n .option(\"--baseline <file>\", \"Set baseline for comparison\")\n .action(async (options) => {\n try {\n logger.info(\"๐ Analyzing trends...\")\n\n const trendsFile = path.join(\"./api-analysis\", \"trends.json\")\n const trends = await FileUtils.readJsonFile(trendsFile)\n\n if (!Array.isArray(trends) || trends.length === 0) {\n logger.warn(\"No trend data available. Run analysis with --include-trends first.\")\n return\n }\n\n displayTrendsReport(trends, Number.parseInt(options.days), {\n exportCsv: options.exportCsv,\n compareBranches: options.compareBranches,\n baseline: options.baseline,\n })\n\n const trendsData: TrendsReportData = await generateTrendsReportData(trends, Number.parseInt(options.days))\n const config = await loadConfig(options.config)\n const analysis = { summary: { securityScore: 0, performanceScore: 0, maintainabilityScore: 0 } } as any\n const reportGenerator = new UnifiedReportGenerator(config, \"./api-analysis\")\n await reportGenerator.generateUnifiedReport(\"trends\", analysis, { trends: trendsData })\n } catch (error) {\n logger.error(\"Trends analysis failed:\", error)\n process.exit(1)\n }\n })\n\nprogram\n .command(\"compare <baseline> <current>\")\n .description(\"Compare analysis results between different versions or branches\")\n .option(\"--format <format>\", \"Output format for comparison\", \"md\")\n .option(\"--show-diff\", \"Show detailed differences\")\n .option(\"--regression-only\", \"Only show regressions\")\n .action(async (baseline, current, options) => {\n try {\n logger.info(\"๐ Comparing analysis reports...\")\n\n const [baselineData, currentData] = await Promise.all([\n FileUtils.readJsonFile(baseline),\n FileUtils.readJsonFile(current),\n ])\n\n if (!baselineData || !currentData) {\n logger.error(\"Could not read comparison files\")\n process.exit(1)\n }\n\n displayComparisonReport(baselineData, currentData, {\n format: options.format,\n showDiff: options.showDiff,\n regressionOnly: options.regressionOnly,\n })\n\n const config = await loadConfig(options.config)\n const comparisonData: ComparisonReportData = await generateComparisonReportData(baselineData, currentData)\n const reportGenerator = new UnifiedReportGenerator(config, \"./api-analysis\")\n await reportGenerator.generateUnifiedReport(\"compare\", currentData as ApiAnalysisResult, { comparison: comparisonData })\n } catch (error) {\n logger.error(\"Comparison failed:\", error)\n process.exit(1)\n }\n })\n\nprogram\n .command(\"plugins\")\n .description(\"Manage and configure analysis plugins\")\n .argument(\"<command>\", \"Plugin command (list, install, enable, disable, configure)\")\n .argument(\"[plugin]\", \"Plugin name\")\n .action(async (command, plugin) => {\n try {\n const pluginManager = new PluginManager()\n\n switch (command) {\n case \"list\":\n const plugins = pluginManager.getLoadedPlugins()\n logger.info(\"๐ฆ Loaded plugins:\")\n plugins.forEach((name) => logger.info(` - ${name}`))\n break\n\n case \"install\":\n if (!plugin) {\n logger.error(\"Plugin name is required\")\n process.exit(1)\n }\n logger.info(`Installing plugin: ${plugin}`)\n break\n\n case \"enable\":\n case \"disable\":\n case \"configure\":\n logger.info(`${command} plugin: ${plugin}`)\n break\n\n default:\n logger.error(`Unknown plugin command: ${command}`)\n process.exit(1)\n }\n } catch (error) {\n logger.error(\"Plugin management failed:\", error)\n process.exit(1)\n }\n })\n\nprogram\n .command(\"validate-config\")\n .description(\"Validate configuration file\")\n .option(\"-c, --config <file>\", \"Configuration file to validate\")\n .action(async (options) => {\n try {\n const config = await loadConfig(options.config)\n const errors = validateConfig(config)\n\n if (errors.length === 0) {\n logger.success(\"โ
Configuration is valid\")\n } else {\n logger.error(\"โ Configuration validation failed:\")\n errors.forEach((error) => logger.error(` - ${error}`))\n process.exit(1)\n }\n } catch (error) {\n logger.error(\"Configuration validation failed:\", error)\n process.exit(1)\n }\n })\n\nprogram\n .command(\"init\")\n .description(\"Initialize configuration file\")\n .option(\"-f, --force\", \"Overwrite existing configuration\")\n .option(\"--template <template>\", \"Template (basic, security, performance)\", \"basic\")\n .action(async (options) => {\n try {\n const configPath = \"api-analyzer.config.json\"\n\n if ((await FileUtils.fileExists(configPath)) && !options.force) {\n logger.warn(\"Configuration file already exists. Use --force to overwrite.\")\n return\n }\n\n const templates = {\n basic: DEFAULT_CONFIG,\n security: { ...DEFAULT_CONFIG, enableSecurityAnalysis: true, enablePerformanceAnalysis: false },\n performance: { ...DEFAULT_CONFIG, enablePerformanceAnalysis: true, enableSecurityAnalysis: false },\n }\n\n const template = options.template || \"basic\"\n const config = templates[options.template as keyof typeof templates] || templates.basic\n await FileUtils.writeJsonFile(\"api-analyzer.config.json\", config)\n\n await FileUtils.writeJsonFile(configPath, config)\n logger.success(`โ
Configuration file created with ${options.template} template`)\n logger.success(`โ
Configuration file created: ${configPath}`)\n logger.info(`๐ Template used: ${template}`)\n } catch (error) {\n logger.error(\"Failed to create configuration:\", error)\n process.exit(1)\n }\n })\n\nasync function loadConfig(configPath?: string, overrides: Partial<AnalyzerConfig> = {}): Promise<AnalyzerConfig> {\n let config: Partial<AnalyzerConfig> = {}\n\n const configPaths = [configPath, \"api-analyzer.config.json\", \"api-analyzer.config.js\", \".api-analyzer.json\"].filter(\n Boolean,\n )\n\n for (const path of configPaths) {\n if (await FileUtils.fileExists(path!)) {\n try {\n config = (await FileUtils.readJsonFile(path!)) || {}\n logger.debug(`Loaded configuration from: ${path}`)\n break\n } catch (error) {\n logger.warn(`Failed to load config from ${path}:`, error)\n }\n }\n }\n\n return { ...DEFAULT_CONFIG, ...config, ...overrides }\n}\n\nasync function generateReport(\n analyzer: NextApiAnalyzer,\n analysis: ApiAnalysisResult,\n format: string,\n outputDir: string,\n): Promise<void> {\n await FileUtils.ensureDirectoryExists(outputDir)\n\n switch (format) {\n case \"md\":\n const mdReport = analyzer.generateReport(analysis)\n await FileUtils.writeFile(path.join(outputDir, \"analysis-report.md\"), mdReport)\n logger.info(`๐ Markdown report: ${path.join(outputDir, \"analysis-report.md\")}`)\n break\n\n case \"json\":\n await FileUtils.writeJsonFile(path.join(outputDir, \"analysis-data.json\"), analysis)\n logger.info(`๐ JSON data: ${path.join(outputDir, \"analysis-data.json\")}`)\n break\n\n case \"html\":\n const htmlReport = generateHtmlReport(analysis)\n await FileUtils.writeFile(path.join(outputDir, \"analysis-report.html\"), htmlReport)\n logger.info(`๐ HTML report: ${path.join(outputDir, \"analysis-report.html\")}`)\n break\n }\n}\n\nfunction displaySummary(analysis: ApiAnalysisResult): void {\n logger.separator()\n logger.info(chalk.bold(\"๐ Analysis Summary\"))\n logger.separator()\n\n const summary = analysis.summary\n\n console.log(chalk.cyan(\"๐ Routes:\"), summary.totalRoutes)\n console.log(chalk.green(\"๐ Security Score:\"), `${summary.securityScore.toFixed(1)}%`)\n console.log(chalk.blue(\"โก Performance Score:\"), `${summary.performanceScore.toFixed(1)}%`)\n console.log(chalk.magenta(\"๐ง Maintainability Score:\"), `${summary.maintainabilityScore.toFixed(1)}%`)\n console.log(chalk.yellow(\"๐งช Test Coverage:\"), `${summary.testCoverageScore.toFixed(1)}%`)\n\n if (analysis.recommendations.length > 0) {\n console.log(chalk.yellow(\"๐ก Recommendations:\"), analysis.recommendations.length)\n\n const severityCounts = analysis.recommendations.reduce(\n (acc, rec) => {\n acc[rec.severity] = (acc[rec.severity] || 0) + 1\n return acc\n },\n {} as Record<string, number>,\n )\n\n if (severityCounts.CRITICAL) console.log(chalk.red(` ๐จ Critical: ${severityCounts.CRITICAL}`))\n if (severityCounts.HIGH) console.log(chalk.yellow(` โ ๏ธ High: ${severityCounts.HIGH}`))\n if (severityCounts.MEDIUM) console.log(chalk.blue(` โน๏ธ Medium: ${severityCounts.MEDIUM}`))\n if (severityCounts.LOW) console.log(chalk.green(` โ
Low: ${severityCounts.LOW}`))\n }\n\n logger.separator()\n}\n\nfunction displaySecurityReport(analysis: ApiAnalysisResult, options: any = {}): void {\n logger.separator()\n logger.info(chalk.bold(\"๐ Security Audit Report\"))\n logger.separator()\n\n const summary = analysis.summary\n\n console.log(chalk.green(\"๐ก๏ธ Security Score:\"), `${summary.securityScore.toFixed(1)}%`)\n console.log(chalk.cyan(\"๐ Secure Routes:\"), `${summary.secureRoutes}/${summary.totalRoutes}`)\n console.log(chalk.red(\"๐ Public Routes:\"), summary.publicRoutes)\n\n console.log(chalk.bold(\"\\n๐ Risk Distribution:\"))\n Object.entries(summary.riskDistribution).forEach(([risk, count]) => {\n const emoji = { CRITICAL: \"๐ด\", HIGH: \"๐ \", MEDIUM: \"๐ก\", LOW: \"๐ข\" }[risk] || \"โช\"\n const color = { CRITICAL: chalk.red, HIGH: chalk.yellow, MEDIUM: chalk.blue, LOW: chalk.green }[risk] || chalk.gray\n console.log(color(` ${emoji} ${risk}: ${count} routes`))\n })\n\n const securityRecs = analysis.recommendations.filter((r) => r.type === \"SECURITY\")\n if (securityRecs.length > 0) {\n console.log(chalk.bold(\"\\n๐จ Top Security Issues:\"))\n securityRecs.slice(0, 5).forEach((rec, index) => {\n const severityEmoji = { CRITICAL: \"๐จ\", HIGH: \"โ ๏ธ\", MEDIUM: \"โน๏ธ\", LOW: \"โ
\" }[rec.severity] || \"โ\"\n console.log(` ${index + 1}. ${severityEmoji} ${rec.title}`)\n if (rec.route) console.log(` ๐ Route: ${rec.route}`)\n if (options.cweMapping && rec.tags?.includes(\"cwe\")) {\n console.log(` ๐ท๏ธ CWE: ${rec.tags.find((tag) => tag.startsWith(\"CWE-\")) || \"N/A\"}`)\n }\n })\n }\n\n logger.separator()\n}\n\nfunction displayPerformanceReport(analysis: ApiAnalysisResult, options: any = {}): void {\n logger.separator()\n logger.info(chalk.bold(\"โก Performance Analysis Report\"))\n logger.separator()\n\n const summary = analysis.summary\n const routes = analysis.routes\n\n console.log(chalk.blue(\"โก Performance Score:\"), `${summary.performanceScore.toFixed(1)}%`)\n\n const avgComplexity = routes.reduce((sum, route) => sum + (route.complexity || 0), 0) / routes.length\n console.log(chalk.cyan(\"๐ Average Complexity:\"), avgComplexity.toFixed(1))\n\n const avgLinesOfCode = routes.reduce((sum, route) => sum + (route.linesOfCode || 0), 0) / routes.length\n console.log(chalk.magenta(\"๐ Average Lines of Code:\"), Math.round(avgLinesOfCode))\n\n if (options.memoryAnalysis) {\n const totalMemoryEstimate = routes.reduce((sum, route) => sum + ((route as any).memoryEstimate || 0), 0)\n console.log(chalk.yellow(\"๐พ Estimated Memory Usage:\"), `${(totalMemoryEstimate / 1024).toFixed(1)}MB`)\n }\n\n const highComplexityRoutes = routes.filter((r) => (r.complexity || 0) > 15)\n if (highComplexityRoutes.length > 0) {\n console.log(chalk.bold(\"\\n๐ฅ High Complexity Routes:\"))\n highComplexityRoutes.slice(0, 5).forEach((route) => {\n console.log(` ๐ ${route.path} (complexity: ${route.complexity})`)\n })\n }\n\n const performanceRecs = analysis.recommendations.filter((r) => r.type === \"PERFORMANCE\")\n if (performanceRecs.length > 0) {\n console.log(chalk.bold(\"\\nโก Performance Issues:\"))\n const issueTypes = performanceRecs.reduce(\n (acc, rec) => {\n acc[rec.category] = (acc[rec.category] || 0) + 1\n return acc\n },\n {} as Record<string, number>,\n )\n\n Object.entries(issueTypes).forEach(([type, count]) => {\n const emoji = { blocking: \"๐\", caching: \"๐\", memory: \"๐พ\", database: \"๐๏ธ\", loops: \"๐\" }[type] || \"โ ๏ธ\"\n console.log(` ${emoji} ${type}: ${count} issues`)\n })\n }\n\n logger.separator()\n}\n\nfunction displayTrendsReport(trends: any[], days: number, options: any = {}): void {\n logger.separator()\n logger.info(chalk.bold(`๐ Trends Analysis (Last ${days} Days)`))\n logger.separator()\n\n const recentTrends = trends.slice(-days)\n\n if (recentTrends.length < 2) {\n logger.warn(\"Not enough data for trend analysis\")\n return\n }\n\n const first = recentTrends[0]\n const last = recentTrends[recentTrends.length - 1]\n\n const changes = {\n routes: last.totalRoutes - first.totalRoutes,\n security: last.securityScore - first.securityScore,\n performance: last.performanceScore - first.performanceScore,\n maintainability: last.maintainabilityScore - first.maintainabilityScore,\n }\n\n console.log(\n chalk.cyan(\"๐ Route Count:\"),\n `${first.totalRoutes} โ ${last.totalRoutes}`,\n changes.routes >= 0 ? chalk.green(`(+${changes.routes})`) : chalk.red(`(${changes.routes})`),\n )\n\n console.log(\n chalk.green(\"๐ Security Score:\"),\n `${first.securityScore.toFixed(1)}% โ ${last.securityScore.toFixed(1)}%`,\n changes.security >= 0\n ? chalk.green(`(+${changes.security.toFixed(1)}%)`)\n : chalk.red(`(${changes.security.toFixed(1)}%)`),\n )\n\n console.log(\n chalk.blue(\"โก Performance Score:\"),\n `${first.performanceScore.toFixed(1)}% โ ${last.performanceScore.toFixed(1)}%`,\n changes.performance >= 0\n ? chalk.green(`(+${changes.performance.toFixed(1)}%)`)\n : chalk.red(`(${changes.performance.toFixed(1)}%)`),\n )\n\n console.log(\n chalk.magenta(\"๐ง Maintainability Score:\"),\n `${first.maintainabilityScore.toFixed(1)}% โ ${last.maintainabilityScore.toFixed(1)}%`,\n changes.maintainability >= 0\n ? chalk.green(`(+${changes.maintainability.toFixed(1)}%)`)\n : chalk.red(`(${changes.maintainability.toFixed(1)}%)`),\n )\n\n const overallTrend = (changes.security + changes.performance + changes.maintainability) / 3\n const trendEmoji = overallTrend > 2 ? \"๐\" : overallTrend < -2 ? \"๐\" : \"โก๏ธ\"\n const trendText = overallTrend > 2 ? \"Improving\" : overallTrend < -2 ? \"Declining\" : \"Stable\"\n\n console.log(chalk.bold(`\\n${trendEmoji} Overall Trend: ${trendText}`))\n\n if (options.exportCsv) {\n logger.info(\"๐ Trend data exported to CSV\")\n }\n\n logger.separator()\n}\n\nfunction displayComparisonReport(baseline: any, current: any, options: any = {}): void {\n logger.separator()\n logger.info(chalk.bold(\"๐ Comparison Report\"))\n logger.separator()\n\n const changes = {\n routes: current.summary.totalRoutes - baseline.summary.totalRoutes,\n security: current.summary.securityScore - baseline.summary.securityScore,\n performance: current.summary.performanceScore - baseline.summary.performanceScore,\n maintainability: current.summary.maintainabilityScore - baseline.summary.maintainabilityScore,\n }\n\n console.log(\n chalk.cyan(\"๐ Routes:\"),\n `${baseline.summary.totalRoutes} โ ${current.summary.totalRoutes}`,\n changes.routes >= 0 ? chalk.green(`(+${changes.routes})`) : chalk.red(`(${changes.routes})`),\n )\n\n console.log(\n chalk.green(\"๐ Security Score:\"),\n `${baseline.summary.securityScore.toFixed(1)}% โ ${current.summary.securityScore.toFixed(1)}%`,\n changes.security >= 0\n ? chalk.green(`(+${changes.security.toFixed(1)}%)`)\n : chalk.red(`(${changes.security.toFixed(1)}%)`),\n )\n\n console.log(\n chalk.blue(\"โก Performance Score:\"),\n `${baseline.summary.performanceScore.toFixed(1)}% โ ${current.summary.performanceScore.toFixed(1)}%`,\n changes.performance >= 0\n ? chalk.green(`(+${changes.performance.toFixed(1)}%)`)\n : chalk.red(`(${changes.performance.toFixed(1)}%)`),\n )\n\n if (options.regressionOnly) {\n const regressions = []\n if (changes.security < -5) regressions.push(\"Security score decreased significantly\")\n if (changes.performance < -5) regressions.push(\"Performance score decreased significantly\")\n if (changes.routes < 0) regressions.push(\"Route count decreased\")\n\n if (regressions.length > 0) {\n console.log(chalk.bold(\"\\nโ ๏ธ Regressions Detected:\"))\n regressions.forEach((regression) => console.log(chalk.red(` - ${regression}`)))\n } else {\n console.log(chalk.green(\"\\nโ
No significant regressions detected\"))\n }\n }\n\n logger.separator()\n}\n\nasync function exportSarif(analysis: ApiAnalysisResult, outputDir: string): Promise<void> {\n const sarif = {\n version: \"3.1.0\",\n $schema: \"https://json.schemastore.org/sarif-3.1.0.json\",\n runs: [\n {\n tool: {\n driver: {\n name: \"next-api-analyzer\",\n version: \"3.1.0\",\n informationUri: \"https://github.com/pranshu05/next-api-analyzer\",\n rules: analysis.recommendations\n .filter((rec) => rec.type === \"SECURITY\")\n .map((rec) => ({\n id: rec.id,\n name: rec.title,\n shortDescription: { text: rec.description },\n fullDescription: { text: rec.solution },\n defaultConfiguration: { level: rec.severity.toLowerCase() },\n properties: {\n category: rec.category,\n tags: rec.tags,\n },\n })),\n },\n },\n results: analysis.recommendations\n .filter((rec) => rec.type === \"SECURITY\")\n .map((rec) => ({\n ruleId: rec.id,\n level:\n rec.severity === \"CRITICAL\" || rec.severity === \"HIGH\"\n ? \"error\"\n : rec.severity === \"MEDIUM\"\n ? \"warning\"\n : \"note\",\n message: { text: rec.description },\n locations: rec.route\n ? [\n {\n physicalLocation: {\n artifactLocation: { uri: rec.route },\n },\n },\n ]\n : [],\n })),\n },\n ],\n }\n\n await FileUtils.writeJsonFile(path.join(outputDir, \"security-results.sarif\"), sarif)\n}\n\nasync function runPerformanceBenchmarks(analysis: ApiAnalysisResult): Promise<void> {\n logger.info(\"๐ Running synthetic performance tests...\")\n\n const highComplexityRoutes = analysis.routes.filter((r) => (r.complexity || 0) > 15)\n if (highComplexityRoutes.length > 0) {\n logger.warn(`โ ๏ธ ${highComplexityRoutes.length} routes have high complexity and may need optimization`)\n }\n\n logger.success(\"โ
Performance benchmarks completed\")\n}\n\nfunction generateHtmlReport(analysis: ApiAnalysisResult): string {\n return `<!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Next.js API Analysis Report</title>\n <script src=\"https://cdn.jsdelivr.net/npm/chart.js\"></script>\n <script src=\"https://cdn.jsdelivr.net/npm/date-fns@2.29.3/index.min.js\"></script>\n <style>\n :root {\n --primary-color: #3b82f6;\n --success-color: #10b981;\n --warning-color: #f59e0b;\n --danger-color: #ef4444;\n --info-color: #06b6d4;\n --dark-color: #1f2937;\n --light-color: #f8fafc;\n --border-color: #e5e7eb;\n }\n \n * { margin: 0; padding: 0; box-sizing: border-box; }\n \n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n background: var(--light-color);\n color: var(--dark-color);\n line-height: 1.6;\n }\n \n .container { max-width: 1400px; margin: 0 auto; padding: 20px; }\n \n .header {\n background: linear-gradient(135deg, var(--primary-color) 0%, #8b5cf6 100%);\n color: white;\n padding: 60px 40px;\n border-radius: 16px;\n margin-bottom: 40px;\n text-align: center;\n box-shadow: 0 10px 25px rgba(0,0,0,0.1);\n }\n \n .header h1 { font-size: 3em; margin-bottom: 15px; font-weight: 700; }\n .header p { opacity: 0.9; font-size: 1.2em; margin-bottom: 10px; }\n \n .metrics-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 25px;\n margin-bottom: 40px;\n }\n \n .metric-card {\n background: white;\n padding: 30px;\n border-radius: 16px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.05);\n border-left: 5px solid var(--primary-color);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n \n .metric-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 8px 25px rgba(0,0,0,0.1);\n }\n \n .metric-value {\n font-size: 3em;\n font-weight: 800;\n color: var(--primary-color);\n margin-bottom: 10px;\n display: flex;\n align-items: center;\n gap: 15px;\n }\n \n .metric-label {\n color: #64748b;\n font-size: 1em;\n text-transform: uppercase;\n letter-spacing: 1px;\n font-weight: 600;\n }\n \n .chart-container {\n background: white;\n padding: 40px;\n border-radius: 16px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.05);\n margin-bottom: 40px;\n }\n \n .chart-container h2 {\n margin-bottom: 30px;\n color: var(--dark-color);\n font-size: 1.8em;\n font-weight: 600;\n }\n \n .recommendations {\n background: white;\n padding: 40px;\n border-radius: 16px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.05);\n margin-bottom: 40px;\n }\n \n .recommendation {\n padding: 25px;\n border-left: 5px solid var(--danger-color);\n background: #fef2f2;\n margin-bottom: 20px;\n border-radius: 12px;\n transition: all 0.2s ease;\n }\n \n .recommendation:hover { transform: translateX(5px); }\n .recommendation.medium { border-left-color: var(--warning-color); background: #fffbeb; }\n .recommendation.low { border-left-color: var(--success-color); background: #f0fdf4; }\n \n .recommendation h3 {\n color: var(--dark-color);\n margin-bottom: 12px;\n font-size: 1.3em;\n font-weight: 600;\n }\n \n .recommendation p {\n color: #6b7280;\n margin-bottom: 8px;\n line-height: 1.6;\n }\n \n .routes-table {\n background: white;\n border-radius: 16px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.05);\n overflow: hidden;\n }\n \n .routes-table h2 {\n padding: 30px 30px 0;\n color: var(--dark-color);\n font-size: 1.8em;\n font-weight: 600;\n }\n \n .routes-table table {\n width: 100%;\n border-collapse: collapse;\n margin-top: 20px;\n }\n \n .routes-table th {\n background: var(--light-color);\n padding: 20px;\n text-align: left;\n font-weight: 700;\n color: var(--dark-color);\n border-bottom: 2px solid var(--border-color);\n font-size: 0.95em;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n \n .routes-table td {\n padding: 20px;\n border-bottom: 1px solid #f3f4f6;\n vertical-align: middle;\n }\n \n .routes-table tr:hover { background: #f9fafb; }\n \n .badge {\n padding: 6px 14px;\n border-radius: 25px;\n font-size: 0.85em;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n \n .risk-critical { background: #fee2e2; color: #dc2626; }\n .risk-high { background: #fef3c7; color: #d97706; }\n .risk-medium { background: #dbeafe; color: #2563eb; }\n .risk-low { background: #dcfce7; color: #16a34a; }\n \n .auth-secured { background: #dcfce7; color: #16a34a; }\n .auth-public { background: #fee2e2; color: #dc2626; }\n \n .method-badge {\n padding: 4px 10px;\n border-radius: 6px;\n font-size: 0.8em;\n font-weight: 600;\n margin-right: 5px;\n display: inline-block;\n }\n \n .method-get { background: #dcfce7; color: #16a34a; }\n .method-post { background: #dbeafe; color: #2563eb; }\n .method-put { background: #fef3c7; color: #d97706; }\n .method-delete { background: #fee2e2; color: #dc2626; }\n .method-patch { background: #f3e8ff; color: #9333ea; }\n \n .stats-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin: 30px 0;\n }\n \n .stat-item {\n text-align: center;\n padding: 20px;\n background: #f8fafc;\n border-radius: 12px;\n }\n \n .stat-value {\n font-size: 2em;\n font-weight: 700;\n color: var(--primary-color);\n margin-bottom: 5px;\n }\n \n .stat-label {\n color: #64748b;\n font-size: 0.9em;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n \n @media (max-width: 768px) {\n .container { padding: 15px; }\n .header { padding: 40px 20px; }\n .header h1 { font-size: 2em; }\n .metric-value { font-size: 2.5em; }\n .routes-table th, .routes-table td { padding: 15px 10px; }\n }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <div class=\"header\">\n <h1>๐ Next.js API Analysis Report</h1>\n <p>Generated on ${new Date(analysis.metadata.analyzedAt).toLocaleString()}</p>\n <p>Analysis completed in ${analysis.metadata.duration.toFixed(2)}ms</p>\n <p>Version ${analysis.metadata.version} โข ${analysis.metadata.totalFiles} files analyzed</p>\n </div>\n\n <div class=\"metrics-grid\">\n <div class=\"metric-card\">\n <div class=\"metric-value\">๐ ${analysis.summary.totalRoutes}</div>\n <div class=\"metric-label\">Total Routes</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-value\">๐ ${analysis.summary.securityScore.toFixed(1)}%</div>\n <div class=\"metric-label\">Security Score</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-value\">โก ${analysis.summary.performanceScore.toFixed(1)}%</div>\n <div class=\"metric-label\">Performance Score</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-value\">๐ง ${analysis.summary.maintainabilityScore.toFixed(1)}%</div>\n <div class=\"metric-label\">Maintainability Score</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-value\">๐งช ${analysis.summary.testCoverageScore.toFixed(1)}%</div>\n <div class=\"metric-label\">Test Coverage</div>\n </div>\n </div>\n\n <div class=\"stats-grid\">\n <div class=\"stat-item\">\n <div class=\"stat-value\">${analysis.summary.secureRoutes}</div>\n <div class=\"stat-label\">Secure Routes</div>\n </div>\n <div class=\"stat-item\">\n <div class=\"stat-value\">${analysis.summary.publicRoutes}</div>\n <div class=\"stat-label\">Public Routes</div>\n </div>\n <div class=\"stat-item\">\n <div class=\"stat-value\">${analysis.recommendations.length}</div>\n <div class=\"stat-label\">Recommendations</div>\n </div>\n <div class=\"stat-item\">\n <div class=\"stat-value\">${analysis.metadata.totalLinesOfCode.toLocaleString()}</div>\n <div class=\"stat-label\">Lines of Code</div>\n </div>\n </div>\n\n <div class=\"chart-container\">\n <h2>๐ Risk Distribution</h2>\n <canvas id=\"riskChart\" width=\"400\" height=\"200\"></canvas>\n </div>\n\n <div class=\"chart-container\">\n <h2>๐ HTTP Methods Distribution</h2>\n <canvas id=\"methodsChart\" width=\"400\" height=\"200\"></canvas>\n </div>\n\n <div class=\"recommendations\">\n <h2>๐ก Top Recommendations</h2>\n ${analysis.recommendations\n .slice(0, 10)\n .map(\n (rec) => `\n <div class=\"recommendation ${rec.severity.toLowerCase()}\">\n <h3>${rec.title}</h3>\n <p><strong>Type:</strong> ${rec.type} | <strong>Severity:</strong> ${rec.severity} | <strong>Effort:</strong> ${rec.effort}</p>\n <p><strong>Description:</strong> ${rec.description}</p>\n <p><strong>Solution:</strong> ${rec.solution}</p>\n <p><strong>Impact:</strong> ${rec.impact}</p>\n ${rec.route ? `<p><strong>Route:</strong> <code>${rec.route}</code></p>` : \"\"}\n ${rec.tags ? `<p><strong>Tags:</strong> ${rec.tags.map((tag) => `<span class=\"badge\">${tag}</span>`).join(\" \")}</p>` : \"\"}\n </div>\n `,\n )\n .join(\"\")}\n </div>\n\n <div class=\"routes-table\">\n <h2>๐ Route Details</h2>\n <table>\n <thead>\n <tr>\n <th>Route</th>\n <th>Methods</th>\n <th>Authentication</th>\n <th>Risk Level</th>\n <th>Complexity</th>\n <th>Performance</th>\n <th>Last Modified</th>\n </tr>\n </thead>\n <tbody>\n ${analysis.routes\n .map(\n (route) => `\n <tr>\n <td><code>${route.path}</code></td>\n <td>\n ${route.methods\n .map(\n (method) =>\n `<span class=\"method-badge method-${method.toLowerCase()}\">${method}</span>`,\n )\n .join(\"\")}\n </td>\n <td>\n <span class=\"badge ${route.hasAuth ? \"auth-secured\" : \"auth-public\"}\">\n ${route.hasAuth ? \"๐ Secured\" : \"๐ Public\"}\n </span>\n ${route.authTypes.length > 0 ? `<br><small>${route.authTypes.join(\", \")}</small>` : \"\"}\n </td>\n <td><span class=\"badge risk-${route.riskLevel.toLowerCase()}\">${route.riskLevel}</span></td>\n <td>${route.complexity || \"N/A\"}</td>\n <td>${route.performanceScore?.toFixed(1) || \"N/A\"}%</td>\n <td>${route.lastModified ? new Date(route.lastModified).toLocaleDateString() : \"N/A\"}</td>\n </tr>\n `,\n )\n .join(\"\")}\n </tbody>\n </table>\n </div>\n </div>\n\n <script>\n const riskCtx = document.getElementById('riskChart').getContext('2d');\n new Chart(riskCtx, {\n type: 'doughnut',\n data: {\n labels: Object.keys(${JSON.stringify(analysis.summary.riskDistribution)}),\n datasets: [{\n data: Object.values(${JSON.stringify(analysis.summary.riskDistribution)}),\n backgroundColor: ['#10b981', '#3b82f6', '#f59e0b', '#ef4444'],\n borderWidth: 0,\n hoverOffset: 4\n }]\n },\n options: {\n responsive: true,\n plugins: {\n legend: {\n position: 'bottom',\n labels: {\n padding: 20,\n usePointStyle: true,\n font: { size: 14 }\n }\n },\n tooltip: {\n callbacks: {\n label: function(context) {\n const total = context.dataset.data.reduce((a, b) => a + b, 0);\n const percentage = ((context.parsed * 100) / total).toFixed(1);\n return context.label + ': ' + context.parsed + ' (' + percentage + '%)';\n }\n }\n }\n }\n }\n });\n\n const methodsCtx = document.getElementById('methodsChart').getContext('2d');\n new Chart(methodsCtx, {\n type: 'bar',\n data: {\n labels: Object.keys(${JSON.stringify(analysis.summary.methodsBreakdown)}),\n datasets: [{\n label: 'Number of Routes',\n data: Object.values(${JSON.stringify(analysis.summary.methodsBreakdown)}),\n backgroundColor: [\n '#10b981', // GET\n '#3b82f6', // POST\n '#f59e0b', // PUT\n '#ef4444', // DELETE\n '#8b5cf6', // PATCH\n '#06b6d4', // HEAD\n '#84cc16' // OPTIONS\n ],\n borderRadius: 8,\n borderSkipped: false,\n }]\n },\n options: {\n responsive: true,\n plugins: {\n legend: { display: false },\n tooltip: {\n callbacks: {\n label: function(context) {\n return context.dataset.label + ': ' + context.parsed.y + ' routes';\n }\n }\n }\n },\n scales: {\n y: {\n beginAtZero: true,\n ticks: { stepSize: 1 },\n grid: { color: '#f3f4f6' }\n },\n x: {\n grid: { display: false }\n }\n }\n }\n });\n\n document.addEventListener('DOMContentLoaded', function() {\n document.querySelectorAll('.metric-card').forEach(card => {\n card.addEventListener('click', function() {\n this.style.transform = 'scale(1.02)';\n setTimeout(() => {\n this.style.transform = '';\n }, 150);\n });\n });\n\n const searchInput = document.createElement('input');\n searchInput.type = 'text';\n searchInput.placeholder = 'Search routes...';\n searchInput.style.cssText = \\`\n width: 100%;\n padding: 12px 16px;\n margin: 20px 0;\n border: 2px solid #e5e7eb;\n border-radius: 8px;\n font-size: 16px;\n outline: none;\n transition: border-color 0.2s ease;\n \\`;\n \n searchInput.addEventListener('focus', function() {\n this.style.borderColor = '#3b82f6';\n });\n \n searchInput.addEventListener('blur', function() {\n this.style.borderColor = '#e5e7eb';\n });\n\n const routesTable = document.querySelector('.routes-table table');\n routesTable.parentNode.insertBefore(searchInput, routesTable);\n\n searchInput.addEventListener('input', function() {\n const searchTerm = this.value.toLowerCase();\n const rows = routesTable.querySelectorAll('tbody tr');\n \n rows.forEach(row => {\n const text = row.textContent.toLowerCase();\n row.style.display = text.includes(searchTerm) ? '' : 'none';\n });\n });\n });\n </script>\n </body>\n </html>`\n}\n\nprogram.parse()\n\nasync function generateSecurityReportData(analysis: ApiAnalysisResult): Promise<SecurityReportData> {\n const securityRecs = analysis.recommendations.filter((r) => r.type === \"SECURITY\")\n\n return {\n vulnerabilities: {\n critical: securityRecs.filter((r) => r.severity === \"CRITICAL\"),\n high: securityRecs.filter((r) => r.severity === \"HIGH\"),\n medium: securityRecs.filter((r) => r.severity === \"MEDIUM\"),\n low: securityRecs.filter((r) => r.severity === \"LOW\"),\n },\n compliance: {\n owasp: {\n score: analysis.summary.securityScore,\n issues: securityRecs.map((r) => r.title),\n coverage: {\n \"A01:2021 โ Broken Access Control\": analysis.summary.secureRoutes > analysis.summary.publicRoutes,\n \"A02:2021 โ Cryptographic Failures\": true,\n \"A03:2021 โ Injection\": !securityRecs.some((r) => r.tags?.includes(\"injection\")),\n \"A04:2021 โ Insecure Design\": analysis.summary.maintainabilityScore > 70,\n \"A05:2021 โ Security Misconfiguration\": analysis.summary.securityScore > 80,\n },\n },\n pciDss: {\n score: analysis.summary.securityScore * 0.9,\n requirements: {\n \"Install and maintain firewall\": true,\n \"Do not use vendor-supplied defaults\": analysis.summary.securityScore > 70,\n \"Protect stored cardholder data\": true,\n \"Encrypt transmission of cardholder data\": true,\n },\n },\n },\n riskAssessment: {\n overallRisk:\n analysis.summary.securityScore > 80 ? \"LOW\" : analysis.summary.securityScore > 60 ? \"MEDIUM\" : \"HIGH\",\n riskFactors: [\n `${analysis.summary.publicRoutes} public endpoints`,\n `${securityRecs.filter((r) => r.severity === \"CRITICAL\").length} critical vulnerabilities`,\n \"Missing input validation on some routes\",\n ],\n mitigationPriority: [\n \"Implement authentication on public endpoints\",\n \"Add input validation\",\n \"Enable rate limiting\",\n \"Implement proper error handling\",\n ],\n },\n securityMetrics: {\n authenticationCoverage: (analysis.summary.secureRoutes / analysis.summary.totalRoutes) * 100,\n inputValidationCoverage:\n (analysis.routes.filter((r) => r.hasInputValidation).length / analysis.routes.length) * 100,\n encryptionUsage: 75, // Simplified\n rateLimitingCoverage: (analysis.routes.filter((r) => r.hasRateLimit).length / analysis.routes.length) * 100,\n },\n }\n}\n\nasync function generatePerformanceReportData(analysis: ApiAnalysisResult): Promise<PerformanceReportData> {\n const routes = analysis.routes\n const performanceRecs = analysis.recommendations.filter((r) => r.type === \"PERFORMANCE\")\n\n return {\n metrics: {\n averageComplexity: routes.reduce((sum, r) => sum + (r.complexity || 0), 0) / routes.length,\n averageLinesOfCode: routes.reduce((sum, r) => sum + (r.linesOfCode || 0), 0) / routes.length,\n totalDependencies: routes.reduce((sum, r) => sum + r.dependencies.length, 0),\n blockingOperations: performanceRecs.filter((r) => r.category === \"blocking\").length,\n asyncOperations: routes.filter((r) => r.dependencies.some((dep) => dep.includes(\"async\"))).length,\n },\n bottlenecks: {\n highComplexityRoutes: routes\n .filter((r) => (r.complexity || 0) > 15)\n .map((r) => ({\n path: r.path,\n complexity: r.complexity || 0,\n recommendations: [\"Break down into smaller functions\", \"Reduce nesting levels\"],\n })),\n largeRoutes: routes\n .filter((r) => (r.linesOfCode || 0) > 100)\n .map((r) => ({\n path: r.path,\n linesOfCode: r.linesOfCode || 0,\n recommendations: [\"Extract business logic\", \"Split into multiple handlers\"],\n })),\n dependencyHeavyRoutes: routes\n .filter((r) => r.dependencies.length > 5)\n .map((r) => ({\n path: r.path,\n dependencies: r.dependencies,\n recommendations: [\"Review dependency necessity\", \"Consider lazy loading\"],\n })),\n },\n optimizationOpportunities: {\n caching: [\"Implement response caching\", \"Add database query caching\"],\n asyncOptimization: [\"Convert blocking operations to async\", \"Implement parallel processing\"],\n codeReduction: [\"Remove unused code\", \"Simplify complex logic\"],\n dependencyOptimization: [\"Remove unused dependencies\", \"Bundle optimization\"],\n },\n benchmarks: {\n estimatedResponseTimes: routes.reduce(\n (acc, r) => {\n acc[r.path] = (r.complexity || 1) * 10 + r.dependencies.length * 5\n return acc\n },\n {} as Record<string, number>,\n ),\n memoryUsageEstimates: routes.reduce(\n (acc, r) => {\n acc[r.path] = (r.linesOfCode || 0) * 1024 + r.dependencies.length * 512\n return acc\n },\n {} as Record<string, number>,\n ),\n scalabilityScore: analysis.summary.performanceScore,\n },\n }\n}\n\nasync function generateTrendsReportData(trends: any[], days: number): Promise<TrendsReportData> {\n const recentTrends = trends.slice(-days)\n const first = recentTrends[0] || {}\n const last = recentTrends[recentTrends.length - 1] || {}\n\n return {\n timeRange: {\n start: new Date(Date.now() - days * 24 * 60 * 60 * 1000),\n end: new Date(),\n days,\n },\n trends: {\n routes: {\n current: last.totalRoutes || 0,\n previous: first.totalRoutes || 0,\n change: (last.totalRoutes || 0) - (first.totalRoutes || 0),\n trend:\n (last.totalRoutes || 0) > (first.totalRoutes || 0)\n ? \"INCREASING\"\n : (last.totalRoutes || 0) < (first.totalRoutes || 0)\n ? \"DECREASING\"\n : \"STABLE\",\n },\n security: {\n current: last.securityScore || 0,\n previous: first.securityScore || 0,\n change: (last.securityScore || 0) - (first.securityScore || 0),\n trend:\n (last.securityScore || 0) > (first.securityScore || 0)\n ? \"IMPROVING\"\n : (last.securityScore || 0) < (first.securityScore || 0)\n ? \"DECLINING\"\n : \"STABLE\",\n },\n performance: {\n current: last.performanceScore || 0,\n previous: first.performanceScore || 0,\n change: (last.performanceScore || 0) - (first.performanceScore || 0),\n trend:\n (last.performanceScore || 0) > (first.performanceScore || 0)\n ? \"IMPROVING\"\n : (last.performanceScore || 0) < (first.performanceScore || 0)\n ? \"DECLINING\"\n : \"STABLE\",\n },\n maintainability: {\n current: last.maintainabilityScore || 0,\n previous: first.maintainabilityScore || 0,\n change: (last.maintainabilityScore || 0) - (first.maintainabilityScore || 0),\n trend:\n (last.maintainabilityScore || 0) > (first.maintainabilityScore || 0)\n ? \"IMPROVING\"\n : (last.maintainabilityScore || 0) < (first.maintainabilityScore || 0)\n ? \"DECLINING\"\n : \"STABLE\",\n },\n },\n historicalData: recentTrends.map((trend) => ({\n date: new Date(trend.date || Date.now()),\n totalRoutes: trend.totalRoutes || 0,\n securityScore: trend.securityScore || 0,\n performanceScore: trend.performanceScore || 0,\n maintainabilityScore: trend.maintainabilityScore || 0,\n })),\n predictions: {\n nextMonth: {\n securityScore: Math.min(100, (last.securityScore || 0) + 2),\n performanceScore: Math.min(100, (last.performanceScore || 0) + 1),\n maintainabilityScore: Math.min(100, (last.maintainabilityScore || 0) + 1),\n },\n recommendations: [\n \"Continue security improvements\",\n \"Focus on performance optimization\",\n \"Maintain code quality standards\",\n ],\n },\n }\n}\n\nasync function generateComparisonReportData(baseline: any, current: any): Promise<ComparisonReportData> {\n return {\n baseline: {\n version: baseline.metadata?.version || \"unknown\",\n date: new Date(baseline.metadata?.analyzedAt || Date.now()),\n summary: baseline.summary,\n },\n current: {\n version: current.metadata?.version || \"unknown\",\n date: new Date(current.metadata?.analyzedAt || Date.now()),\n summary: current.summary,\n },\n changes: {\n routes: {\n added: [], // Simplified - would need route comparison logic\n removed: [],\n modified: [],\n },\n scores: {\n security: {\n from: baseline.summary?.securityScore || 0,\n to: current.summary?.securityScore || 0,\n change: (current.summary?.securityScore || 0) - (baseline.summary?.securityScore || 0),\n },\n performance: {\n from: baseline.summary?.performanceScore || 0,\n to: current.summary?.performanceScore || 0,\n change: (current.summary?.performanceScore || 0) - (baseline.summary?.performanceScore || 0),\n },\n maintainability: {\n from: baseline.summary?.maintainabilityScore || 0,\n to: current.summary?.maintainabilityScore || 0,\n change: (current.summary?.maintainabilityScore || 0) - (baseline.summary?.maintainabilityScore || 0),\n },\n },\n recommendations: {\n new: current.recommendations || [],\n resolved: [],\n persistent: [],\n },\n },\n regressions: [],\n improvements: [],\n }\n}\n\nexport { program }","import fs from \"fs\"\nimport path from \"path\"\nimport ts from \"typescript\"\nimport type { ApiRouteInfo, ApiAnalysisResult, AnalyzerConfig, Recommendation } from \"../types\"\nimport { DEFAULT_CONFIG } from \"../config/default-config\"\nimport { FileUtils } from \"../utils/file-utils\"\nimport { logger } from \"../utils/logger\"\nimport { SecurityAnalyzer } from \"../analyzers/security-analyzer\"\nimport { PerformanceAnalyzer } from \"../analyzers/performance-analyzer\"\nimport { getScoreColor, getSeverityWeight } from \"../utils/common\"\n\nexport class NextApiAnalyzer {\n private config: AnalyzerConfig\n private routes: ApiRouteInfo[] = []\n private startTime = 0\n\n constructor(config: Partial<AnalyzerConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config }\n }\n\n async analyzeRoutes(): Promise<ApiAnalysisResult> {\n this.startTime = Date.now()\n this.routes = []\n\n logger.info(\"Starting API routes analysis...\")\n\n const files = await FileUtils.findApiFiles(this.config)\n logger.info(`Found ${files.length} API files`)\n\n for (const file of files) {\n await this.analyzeFile(file)\n }\n\n logger.success(`Analyzed ${this.routes.length} API routes`)\n return this.generateAnalysisResult()\n }\n\n private async analyzeFile(filePath: string): Promise<void> {\n try {\n const content = fs.readFileSync(filePath, \"utf-8\")\n const fileStats = await FileUtils.getFileStats(filePath)\n const routeInfo = await this.parseRouteInfo(filePath, content, fileStats)\n this.routes.push(routeInfo)\n } catch (error) {\n logger.error(`Error analyzing file ${filePath}:`, error)\n }\n }\n\n private async parseRouteInfo(\n filePath: string,\n content: string,\n fileStats: { size: number; lastModified: Date; linesOfCode: number },\n ): Promise<ApiRouteInfo> {\n const routePath = this.getRoutePath(filePath)\n const isAppRouter = this.isAppRouterFile(filePath)\n const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true)\n\n const baseRoute: Partial<ApiRouteInfo> = {\n path: routePath,\n methods: this.extractMethods(content, sourceFile, isAppRouter) as import(\"../types\").HttpMethod[],\n hasAuth: this.detectAuth(content),\n authTypes: this.extractAuthTypes(content),\n queryParams: this.extractQueryParams(content, isAppRouter),\n pathParams: this.extractPathParams(routePath),\n bodyParams: this.extractBodyParams(content, isAppRouter),\n headers: this.extractHeaders(content),\n responseStatuses: this.extractResponseStatuses(content, isAppRouter),\n middlewares: this.extractMiddlewares(content),\n description: this.extractDescription(content),\n hasRateLimit: this.detectRateLimit(content),\n hasCors: this.detectCors(content),\n hasInputValidation: this.detectInputValidation(content),\n dependencies: this.extractDependencies(sourceFile),\n fileSize: fileStats.size,\n linesOfCode: fileStats.linesOfCode,\n lastModified: fileStats.lastModified,\n }\n\n const securityAnalysis = SecurityAnalyzer.analyzeRoute(baseRoute as ApiRouteInfo, content)\n const performanceAnalysis = PerformanceAnalyzer.analyzeRoute(baseRoute as ApiRouteInfo, content, sourceFile)\n\n return {\n ...baseRoute,\n riskLevel: securityAnalysis.riskLevel,\n complexity: performanceAnalysis.complexity,\n performanceScore: performanceAnalysis.performanceScore,\n } as ApiRouteInfo\n }\n\n private generateAnalysisResult(): ApiAnalysisResult {\n const duration = Date.now() - this.startTime\n const recommendations = this.generateRecommendations()\n\n const summary = {\n totalRoutes: this.routes.length,\n secureRoutes: this.routes.filter((r) => r.hasAuth).length,\n publicRoutes: this.routes.filter((r) => !r.hasAuth).length,\n methodsBreakdown: this.calculateMethodsBreakdown(),\n statusCodeDistribution: this.calculateStatusCodeDistribution(),\n riskDistribution: this.calculateRiskDistribution(),\n securityScore: this.calculateSecurityScore(),\n performanceScore: this.calculatePerformanceScore(),\n maintainabilityScore: this.calculateMaintainabilityScore(),\n testCoverageScore: 75,\n }\n\n return {\n routes: this.routes,\n summary,\n metadata: {\n analyzedAt: new Date(),\n version: \"3.1.0\",\n duration,\n totalFiles: this.routes.length,\n totalLinesOfCode: this.routes.reduce((sum, route) => sum + (route.linesOfCode || 0), 0),\n },\n recommendations,\n }\n }\n\n generateReport(analysis: ApiAnalysisResult): string {\n let report = \"# ๐ API Routes Analysis Report\\n\\n\"\n\n report += `**Generated:** ${analysis.metadata.analyzedAt.toLocaleString()}\\n`\n report += `**Duration:** ${analysis.metadata.duration}ms\\n`\n report += `**Files:** ${analysis.metadata.totalFiles}\\n\\n`\n\n report += \"## ๐ Summary\\n\\n\"\n report += `| Metric | Value | Status |\\n`\n report += `|--------|-------|--------|\\n`\n report += `| Total Routes | ${analysis.summary.totalRoutes} | โน๏ธ |\\n`\n report += `| Security Score | ${analysis.summary.securityScore.toFixed(1)}% | ${getScoreColor(analysis.summary.securityScore)} |\\n`\n report += `| Performance Score | ${analysis.summary.performanceScore.toFixed(1)}% | ${getScoreColor(analysis.summary.performanceScore)} |\\n\\n`\n\n if (analysis.recommendations.length > 0) {\n report += \"## ๐ก Recommendations\\n\\n\"\n analysis.recommendations\n .sort((a, b) => getSeverityWeight(b.severity) - getSeverityWeight(a.severity))\n .slice(0, 10)\n .forEach((rec, index) => {\n report += `### ${index + 1}. ${rec.title}\\n`\n report += `**Severity:** ${rec.severity} | **Type:** ${rec.type}\\n\\n`\n report += `${rec.description}\\n\\n`\n report += `**Solution:** ${rec.solution}\\n\\n`\n })\n }\n\n return report\n }\n\n private isAppRouterFile(filePath: string): boolean {\n return filePath.includes(\"/route.\") || filePath.endsWith(\"route.js\") || filePath.endsWith(\"route.ts\")\n }\n\n private getRoutePath(filePath: string): string {\n const relativePath = path.relative(this.config.apiDir, filePath)\n return (\n \"/\" +\n relativePath\n .replace(/\\\\/g, \"/\")\n .replace(/\\.(js|ts|tsx)$/, \"\")\n .replace(/\\/index$/, \"\")\n .replace(/\\/route$/, \"\")\n .replace(/\\[([^\\]]+)\\]/g, \":$1\")\n )\n }\n\n private extractMethods(content: string, sourceFile: ts.SourceFile, isAppRouter: boolean): string[] {\n const methods = new Set<string>()\n\n if (isAppRouter) {\n const httpMethods = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"HEAD\", \"OPTIONS\"]\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isFunctionDeclaration(node) && node.name && httpMethods.includes(node.name.text)) {\n methods.add(node.name.text)\n }\n })\n } else {\n const methodRegex = /req\\.method\\s*===?\\s*['\"`](\\w+)['\"`]/g\n let match\n while ((match = methodRegex.exec(content)) !== null) {\n methods.add(match[1].toUpperCase())\n }\n }\n\n return methods.size === 0 ? [\"GET\"] : Array.from(methods)\n }\n\n private detectAuth(content: string): boolean {\n return this.config.authPatterns.some((pattern) => pattern.pattern.test(content))\n }\n\n private extractAuthTypes(content: string): import(\"../types\").AuthType[] {\n return this.config.authPatterns\n .filter((pattern) => pattern.pattern.test(content))\n .map((pattern) => pattern.type as import(\"../types\").AuthType)\n }\n\n private extractQueryParams(content: string, isAppRouter: boolean): any[] {\n const params = new Set<string>()\n const regex = isAppRouter ? /searchParams\\.get$$['\"`]([^'\"`]+)['\"`]$$/g : /req\\.query\\.(\\w+)/g\n\n let match\n while ((match = regex.exec(content)) !== null) {\n params.add(match[1])\n }\n\n return Array.from(params).map((name) => ({ name, type: \"string\", required: true }))\n }\n\n private extractPathParams(routePath: string): any[] {\n const params = new Set<string>()\n const regex = /\\[([^\\]]+)\\]/g\n let match\n while ((match = regex.exec(routePath)) !== null) {\n params.add(match[1])\n }\n return Array.from(params).map((name) => ({ name, type: \"string\", required: true }))\n }\n\n private extractBodyParams(content: string, isAppRouter: boolean): any[] {\n const params = new Set<string>()\n const regex = isAppRouter ? /const\\s*\\{\\s*([^}]+)\\s*\\}\\s*=\\s*await\\s+request\\.json$$$$/g : /req\\.body\\.(\\w+)/g\n\n let match\n while ((match = regex.exec(content)) !== null) {\n if (isAppRouter) {\n const paramNames = match[1].split(\",\").map((p) => p.trim())\n paramNames.forEach((param) => params.add(param))\n } else {\n params.add(match[1])\n }\n }\n\n return Array.from(params).map((name) => ({ name, type: \"string\", required: true }))\n }\n\n private extractHeaders(content: string): string[] {\n const headers = new Set<string>()\n const patterns = [/headers\\.get$$['\"`]([^'\"`]+)['\"`]$$/g, /req\\.headers\\[['\"`]([^'\"`]+)['\"`]\\]/g]\n\n patterns.forEach((pattern) => {\n let match\n while ((match = pattern.exec(content)) !== null) {\n headers.add(match[1])\n }\n })\n\n return Array.from(headers)\n }\n\n private extractResponseStatuses(content: string, isAppRouter: boolean): number[] {\n const statuses = new Set<number>()\n\n if (isAppRouter) {\n const regex = /Response\\.json\\([^,]*,\\s*\\{\\s*status:\\s*(\\d+)/g\n let match\n while ((match = regex.exec(content)) !== null) {\n statuses.add(Number.parseInt(match[1]))\n }\n } else {\n const regex = /res\\.status$$(\\d+)$$/g\n let match\n while ((match = regex.exec(content)) !== null) {\n statuses.add(Number.parseInt(match[1]))\n }\n }\n\n return statuses.size === 0 ? [200] : Array.from(statuses).sort()\n }\n\n private extractMiddlewares(content: string): string[] {\n return this.config.middlewarePatterns\n .filter((pattern) => pattern.pattern.test(content))\n .map((pattern) => pattern.name)\n }\n\n private extractDescription(content: string): string | undefined {\n const jsDocRegex = /\\/\\*\\*\\s*\\n\\s*\\*\\s*(.+?)\\s*\\n/\n const match = content.match(jsDocRegex)\n return match ? match[1].trim() : undefined\n }\n\n private detectRateLimit(content: string): boolean {\n return /rate[_-]?limit|throttle|slowDown/i.test(content)\n }\n\n private detectCors(content: string): boolean {\n return /cors|Access-Control-Allow/i.test(content)\n }\n\n private detectInputValidation(content: string): boolean {\n return /joi\\.|yup\\.|zod\\.|validate\\(|schema\\./i.test(content)\n }\n\n private extractDependencies(sourceFile: ts.SourceFile): string[] {\n const dependencies = new Set<string>()\n\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isImportDeclaration(node)) {\n const moduleSpecifier = node.moduleSpecifier.getText().replace(/['\"]/g, \"\")\n if (!moduleSpecifier.startsWith(\".\") && !moduleSpecifier.startsWith(\"/\")) {\n dependencies.add(moduleSpecifier)\n }\n }\n })\n\n return Array.from(dependencies)\n }\n\n private generateRecommendations(): Recommendation[] {\n return []\n }\n\n private calculateMethodsBreakdown(): Record<string, number> {\n const breakdown: Record<string, number> = {}\n this.routes.forEach((route) => {\n route.methods.forEach((method) => {\n breakdown[method] = (breakdown[method] || 0) + 1\n })\n })\n return breakdown\n }\n\n private calculateStatusCodeDistribution(): Record<string, number> {\n const distribution: Record<string, number> = {}\n this.routes.forEach((route) => {\n route.responseStatuses.forEach((status) => {\n const key = status.toString()\n distribution[key] = (distribution[key] || 0) + 1\n })\n })\n return distribution\n }\n\n private calculateRiskDistribution(): Record<string, number> {\n const distribution: Record<string, number> = { LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0 }\n this.routes.forEach((route) => {\n distribution[route.riskLevel]++\n })\n return distribution\n }\n\n private calculateSecurityScore(): number {\n if (this.routes.length === 0) return 100\n const secureRoutes = this.routes.filter((r) => r.hasAuth).length\n return (secureRoutes / this.routes.length) * 100\n }\n\n private calculatePerformanceScore(): number {\n if (this.routes.length === 0) return 100\n const totalScore = this.routes.reduce((sum, route) => sum + (route.performanceScore || 100), 0)\n return totalScore / this.routes.length\n }\n\n private calculateMaintainabilityScore(): number {\n if (this.routes.length === 0) return 100\n const avgComplexity = this.routes.reduce((sum, route) => sum + (route.complexity || 1), 0) / this.routes.length\n return Math.max(0, 100 - (avgComplexity > 10 ? (avgComplexity - 10) * 5 : 0))\n }\n}\n\nexport async function analyzeApiRoutes(apiDir?: string): Promise<void> {\n const analyzer = new NextApiAnalyzer(apiDir ? { apiDir } : {})\n const analysis = await analyzer.analyzeRoutes()\n\n console.log(\"\\n=== API Routes Analysis ===\\n\")\n console.log(analyzer.generateReport(analysis))\n\n await FileUtils.writeFile(\"api-analysis.md\", analyzer.generateReport(analysis))\n console.log(\"\\nReport saved to: api-analysis.md\")\n}\n\nexport function withApiTracking(handler: any) {\n return async (req: any, res: any) => {\n const startTime = Date.now()\n const requestId = Math.random().toString(36).substring(2, 8)\n\n logger.info(`[${requestId}] ${req.method} ${req.url}`)\n\n try {\n await handler(req, res)\n } catch (error) {\n logger.error(`[${requestId}] Error:`, error)\n throw error\n } finally {\n const duration = Date.now() - startTime\n logger.info(`[${requestId}] Duration: ${duration}ms`)\n }\n }\n}","import type { AnalyzerConfig, AuthPattern, MiddlewarePattern } from \"../types\"\n\nconst AUTH_PATTERNS: AuthPattern[] = [\n { name: \"NextAuth.js\", pattern: /getServerSession|getToken|next-auth/i, type: \"NextAuth.js\", confidence: 0.9 },\n { name: \"JWT\", pattern: /jwt\\.verify|jsonwebtoken|jose/i, type: \"JWT\", confidence: 0.8 },\n { name: \"Bearer Token\", pattern: /bearer\\s+token|authorization.*bearer/i, type: \"Bearer Token\", confidence: 0.7 },\n { name: \"API Key\", pattern: /api[_-]?key|x-api-key/i, type: \"API Key\", confidence: 0.6 },\n { name: \"Session\", pattern: /req\\.session|express-session/i, type: \"Session\", confidence: 0.7 },\n { name: \"Firebase Auth\", pattern: /firebase.*auth|getAuth/i, type: \"Firebase Auth\", confidence: 0.8 },\n { name: \"Supabase Auth\", pattern: /supabase.*auth|createClient.*auth/i, type: \"Supabase Auth\", confidence: 0.8 },\n { name: \"Auth0\", pattern: /auth0|@auth0/i, type: \"Auth0\", confidence: 0.9 },\n { name: \"Passport\", pattern: /passport\\.|require.*passport/i, type: \"Passport\", confidence: 0.8 },\n]\n\nconst MIDDLEWARE_PATTERNS: MiddlewarePattern[] = [\n { name: \"CORS\", pattern: /cors\\(|Access-Control-Allow/i, category: \"security\" },\n { name: \"Helmet\", pattern: /helmet\\(|security headers/i, category: \"security\" },\n { name: \"Rate Limiting\", pattern: /rateLimit|express-rate-limit|slowDown/i, category: \"security\" },\n { name: \"Body Parser\", pattern: /bodyParser|express\\.json/i, category: \"parsing\" },\n { name: \"Multer\", pattern: /multer\\(|file upload/i, category: \"file-handling\" },\n { name: \"Validation\", pattern: /joi\\.|yup\\.|zod\\.|express-validator/i, category: \"validation\" },\n { name: \"Logging\", pattern: /morgan\\(|winston|pino/i, category: \"logging\" },\n { name: \"Compression\", pattern: /compression\\(/i, category: \"performance\" },\n { name: \"Cookie Parser\", pattern: /cookieParser|cookie-parser/i, category: \"parsing\" },\n { name: \"CSRF\", pattern: /csrf|csurf/i, category: \"security\" },\n]\n\nexport const DEFAULT_CONFIG: AnalyzerConfig = {\n apiDir: \"src/app/api\",\n outputDir: \"./api-analysis\",\n includePatterns: [\"**/*.ts\", \"**/*.js\", \"**/*.tsx\"],\n excludePatterns: [\"**/node_modules/**\", \"**/*.test.*\", \"**/*.spec.*\", \"**/*.d.ts\", \"**/dist/**\", \"**/build/**\"],\n authPatterns: AUTH_PATTERNS,\n middlewarePatterns: MIDDLEWARE_PATTERNS,\n enableTrends: false,\n enablePerformanceAnalysis: true,\n enableSecurityAnalysis: true,\n thresholds: {\n security: 80,\n performance: 70,\n maintainability: 75,\n testCoverage: 80,\n complexity: 10,\n },\n cache: {\n enabled: true,\n ttl: 3600000,\n directory: \".cache/api-analyzer\",\n },\n parallel: true,\n maxConcurrency: 4,\n}\n\nexport function validateConfig(config: AnalyzerConfig): string[] {\n const errors: string[] = []\n\n if (!config.apiDir) {\n errors.push(\"apiDir is required\")\n }\n\n if (config.thresholds.security < 0 || config.thresholds.security > 100) {\n errors.push(\"Security threshold must be between 0 and 100\")\n }\n\n if (config.thresholds.performance < 0 || config.thresholds.performance > 100) {\n errors.push(\"Performance threshold must be between 0 and 100\")\n }\n\n return errors\n}","import fs from \"fs/promises\"\nimport path from \"path\"\nimport { glob } from \"glob\"\nimport crypto from \"crypto\"\nimport type { AnalyzerConfig } from \"../types\"\nimport { logger } from \"./logger\"\n\nexport class FileUtils {\n static async findApiFiles(config: AnalyzerConfig): Promise<string[]> {\n try {\n const patterns = config.includePatterns.map((pattern) => path.join(config.apiDir, pattern).replace(/\\\\/g, \"/\"))\n\n const allFiles: string[] = []\n for (const pattern of patterns) {\n const matches = await glob(pattern, {\n ignore: config.excludePatterns,\n absolute: true,\n nodir: true,\n })\n allFiles.push(...matches)\n }\n\n const uniqueFiles = [...new Set(allFiles)]\n return uniqueFiles.filter((file) => this.isApiFile(file))\n } catch (error) {\n logger.error(\"Error finding API files:\", error)\n throw new Error(`Failed to find API files: ${error}`)\n }\n }\n\n static isApiFile(filename: string): boolean {\n const basename = path.basename(filename)\n const isTypeScriptOrJavaScript = /\\.(js|ts|tsx)$/.test(basename)\n const isRouteFile = basename === \"route.js\" || basename === \"route.ts\"\n const isInApiDirectory = filename.includes(\"/api/\") || filename.includes(\"\\\\api\\\\\")\n\n return isTypeScriptOrJavaScript && (isRouteFile || isInApiDirectory)\n }\n\n static async getFileStats(filePath: string): Promise<{\n size: number\n lastModified: Date\n linesOfCode: number\n }> {\n try {\n const [stats, content] = await Promise.all([fs.stat(filePath), fs.readFile(filePath, \"utf-8\")])\n\n const linesOfCode = content.split(\"\\n\").filter((line) => {\n const trimmed = line.trim()\n return trimmed && !trimmed.startsWith(\"//\") && !trimmed.startsWith(\"/*\")\n }).length\n\n return {\n size: stats.size,\n lastModified: stats.mtime,\n linesOfCode,\n }\n } catch (error) {\n logger.error(`Error getting file stats for ${filePath}:`, error)\n throw error\n }\n }\n\n static async ensureDirectoryExists(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true })\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw error\n }\n }\n }\n\n static async writeJsonFile(filePath: string, data: any): Promise<void> {\n await this.ensureDirectoryExists(path.dirname(filePath))\n await fs.writeFile(filePath, JSON.stringify(data, null, 2), \"utf-8\")\n }\n\n static async readJsonFile<T>(filePath: string): Promise<T | null> {\n try {\n const content = await fs.readFile(filePath, \"utf-8\")\n return JSON.parse(content) as T\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null\n }\n throw error\n }\n }\n\n static async writeFile(filePath: string, content: string): Promise<void> {\n await this.ensureDirectoryExists(path.dirname(filePath))\n await fs.writeFile(filePath, content, \"utf-8\")\n }\n\n static generateHash(content: string): string {\n return crypto.createHash(\"md5\").update(content).digest(\"hex\")\n }\n\n static async fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath)\n return true\n } catch {\n return false\n }\n }\n}","export enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nexport interface LoggerConfig {\n level: LogLevel\n colors: boolean\n prefix?: string\n}\n\nexport class Logger {\n private static instance: Logger\n private config: LoggerConfig = {\n level: LogLevel.INFO,\n colors: true,\n }\n\n static getInstance(): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger()\n }\n return Logger.instance\n }\n\n configure(config: Partial<LoggerConfig>): void {\n this.config = { ...this.config, ...config }\n }\n\n private shouldLog(level: LogLevel): boolean {\n return level >= this.config.level\n }\n\n private formatMessage(level: string, message: string, emoji: string): string {\n const prefix = this.config.prefix ? `[${this.config.prefix}] ` : \"\"\n return this.config.colors ? `${prefix}${emoji} ${message}` : `${prefix}${level}: ${message}`\n }\n\n debug(message: string, ...args: any[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n console.log(this.formatMessage(\"DEBUG\", message, \"๐\"), ...args)\n }\n }\n\n info(message: string, ...args: any[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.log(this.formatMessage(\"INFO\", message, \"โน๏ธ\"), ...args)\n }\n }\n\n success(message: string, ...args: any[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.log(this.formatMessage(\"SUCCESS\", message, \"โ
\"), ...args)\n }\n }\n\n warn(message: string, ...args: any[]): void {\n if (this.shouldLog(LogLevel.WARN)) {\n console.warn(this.formatMessage(\"WARN\", message, \"โ ๏ธ\"), ...args)\n }\n }\n\n error(message: string, ...args: any[]): void {\n if (this.shouldLog(LogLevel.ERROR)) {\n console.error(this.formatMessage(\"ERROR\", message, \"โ\"), ...args)\n }\n }\n\n progress(message: string): void {\n if (this.shouldLog(LogLevel.INFO)) {\n process.stdout.write(`โณ ${message}...\\r`)\n }\n }\n\n clearProgress(): void {\n process.stdout.write(\"\\r\\x1b[K\")\n }\n\n separator(): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.log(\"โ\".repeat(80))\n }\n }\n}\n\nexport const logger = Logger.getInstance()","import type { ApiRouteInfo, Recommendation, RiskLevel } from \"../types\"\nimport { logger } from \"../utils/logger\"\nimport { BaseAnalyzer } from \"./base-analyzer\"\nimport { SECURITY_PATTERNS, calculateRiskLevel } from \"../utils/common\"\n\ninterface SecurityVulnerability {\n name: string\n patterns: RegExp[]\n severity: \"LOW\" | \"MEDIUM\" | \"HIGH\" | \"CRITICAL\"\n score: number\n category: string\n cwe?: string\n}\n\nexport class SecurityAnalyzer extends BaseAnalyzer {\n private static readonly VULNERABILITIES: SecurityVulnerability[] = [\n {\n name: \"SQL_INJECTION\",\n patterns: [\n /query\\s*\\+\\s*['\"`]/,\n /\\$\\{[^}]*query[^}]*\\}/,\n /execute\\s*\\(\\s*['\"`].*\\$\\{/,\n /SELECT\\s+.*\\+.*FROM/i,\n /INSERT\\s+.*\\+.*VALUES/i,\n /UPDATE\\s+.*SET\\s+.*\\+/i,\n /DELETE\\s+.*WHERE\\s+.*\\+/i,\n ],\n severity: \"CRITICAL\",\n score: 40,\n category: \"injection\",\n cwe: \"CWE-89\",\n },\n {\n name: \"XSS\",\n patterns: [\n /innerHTML\\s*=\\s*.*req\\./,\n /dangerouslySetInnerHTML/,\n /document\\.write\\s*\\(.*req\\./,\n /eval\\s*\\(.*req\\./,\n /Function\\s*\\(.*req\\./,\n ],\n severity: \"HIGH\",\n score: 30,\n category: \"injection\",\n cwe: \"CWE-79\",\n },\n {\n name: \"HARDCODED_SECRETS\",\n patterns: [\n /password\\s*[:=]\\s*['\"`][^'\"`]{8,}/,\n /api[_-]?key\\s*[:=]\\s*['\"`][A-Za-z0-9]{16,}/,\n /secret\\s*[:=]\\s*['\"`][A-Za-z0-9]{16,}/,\n /token\\s*[:=]\\s*['\"`][A-Za-z0-9]{20,}/,\n /private[_-]?key\\s*[:=]\\s*['\"`][^'\"`]{20,}/,\n ],\n severity: \"CRITICAL\",\n score: 35,\n category: \"secrets\",\n cwe: \"CWE-798\",\n },\n {\n name: \"WEAK_CRYPTO\",\n patterns: [\n /md5\\s*\\(/,\n /sha1\\s*\\(/,\n /Math\\.random\\s*$$\\s*$$/,\n /crypto\\.pseudoRandomBytes/,\n /des\\s*\\(/i,\n /rc4\\s*\\(/i,\n ],\n severity: \"MEDIUM\",\n score: 15,\n category: \"cryptography\",\n cwe: \"CWE-327\",\n },\n {\n name: \"CORS_MISCONFIGURATION\",\n patterns: [\n /Access-Control-Allow-Origin.*\\*/,\n /cors\\s*\\(\\s*\\{\\s*origin\\s*:\\s*true/,\n /Access-Control-Allow-Credentials.*true.*Access-Control-Allow-Origin.*\\*/,\n ],\n severity: \"MEDIUM\",\n score: 20,\n category: \"configuration\",\n cwe: \"CWE-942\",\n },\n {\n name: \"PATH_TRAVERSAL\",\n patterns: [/\\.\\.[/\\\\]/, /path\\.join\\s*\\([^)]*req\\./, /fs\\.readFile\\s*\\([^)]*req\\./, /require\\s*\\([^)]*req\\./],\n severity: \"HIGH\",\n score: 25,\n category: \"path-traversal\",\n cwe: \"CWE-22\",\n },\n {\n name: \"COMMAND_INJECTION\",\n patterns: [/exec\\s*\\([^)]*req\\./, /spawn\\s*\\([^)]*req\\./, /system\\s*\\([^)]*req\\./, /shell\\s*\\([^)]*req\\./],\n severity: \"CRITICAL\",\n score: 45,\n category: \"injection\",\n cwe: \"CWE-78\",\n },\n ]\n\n static analyzeRoute(\n route: ApiRouteInfo,\n content: string,\n ): {\n riskLevel: RiskLevel\n recommendations: Recommendation[]\n securityScore: number\n vulnerabilities: string[]\n } {\n const recommendations: Recommendation[] = []\n const vulnerabilities: string[] = []\n let riskScore = 0\n\n try {\n if (!route.hasAuth && this.isSensitiveRoute(route)) {\n riskScore += 30\n recommendations.push(\n this.createRecommendation(\n \"MISSING_AUTHENTICATION\",\n \"SECURITY\",\n \"HIGH\",\n \"Missing Authentication\",\n `Route ${route.path} allows ${route.methods.join(\", \")} operations without authentication`,\n route.path,\n \"Add authentication middleware\",\n \"Unauthorized access to sensitive operations\",\n \"MEDIUM\",\n \"authentication\",\n [\"security\", \"auth\"],\n ),\n )\n }\n\n for (const vulnerability of this.VULNERABILITIES) {\n for (const pattern of vulnerability.patterns) {\n if (pattern.test(content)) {\n riskScore += vulnerability.score\n vulnerabilities.push(vulnerability.name)\n\n recommendations.push(\n this.createRecommendation(\n vulnerability.name,\n \"SECURITY\",\n vulnerability.severity,\n `Potential ${vulnerability.name.replace(\"_\", \" \")}`,\n `Detected pattern that may indicate ${vulnerability.name.toLowerCase().replace(\"_\", \" \")} vulnerability`,\n route.path,\n this.getVulnerabilitySolution(vulnerability.name),\n this.getVulnerabilityImpact(vulnerability.name),\n \"MEDIUM\",\n vulnerability.category,\n [\"security\", vulnerability.category],\n ),\n )\n break\n }\n }\n }\n\n Object.entries(SECURITY_PATTERNS).forEach(([vulnName, patterns]) => {\n if (patterns.some((pattern) => pattern.test(content))) {\n const severity = vulnName === \"SQL_INJECTION\" ? \"CRITICAL\" : \"HIGH\"\n const score = severity === \"CRITICAL\" ? 40 : 25\n riskScore += score\n\n recommendations.push(\n this.createRecommendation(\n vulnName,\n \"SECURITY\",\n severity,\n `Potential ${vulnName.replace(\"_\", \" \")}`,\n `Detected pattern that may indicate ${vulnName.toLowerCase().replace(\"_\", \" \")} vulnerability`,\n route.path,\n this.getVulnerabilitySolution(vulnName),\n this.getVulnerabilityImpact(vulnName),\n \"MEDIUM\",\n \"security\",\n [\"security\", vulnName.toLowerCase()],\n ),\n )\n }\n })\n\n const riskLevel = calculateRiskLevel(riskScore)\n const securityScore = Math.max(0, 100 - riskScore)\n\n logger.debug(`Security analysis for ${route.path}: score=${securityScore}, risk=${riskLevel}`)\n\n return { riskLevel, recommendations, securityScore, vulnerabilities }\n } catch (error) {\n logger.error(`Error in security analysis for ${route.path}:`, error)\n return {\n riskLevel: \"MEDIUM\",\n recommendations: [],\n securityScore: 50,\n vulnerabilities: [],\n }\n }\n }\n\n private static isSensitiveRoute(route: ApiRouteInfo): boolean {\n const sensitiveMethods = [\"POST\", \"PUT\", \"DELETE\", \"PATCH\"]\n const sensitivePathPatterns = [/\\/admin\\//i, /\\/user[s]?\\//i, /\\/auth\\//i, /\\/config\\//i, /\\/settings\\//i, /\\/payment[s]\\//i, /\\/checkout\\//i, /\\/order[s]?\\//i]\n\n return (\n route.methods.some((method) => sensitiveMethods.includes(method)) ||\n sensitivePathPatterns.some((pattern) => pattern.test(route.path))\n )\n }\n\n private static getVulnerabilitySolution(vulnerability: string): string {\n const solutions: Record<string, string> = {\n SQL_INJECTION: \"Use parameterized queries or ORM with proper escaping\",\n XSS: \"Sanitize user input and use Content Security Policy\",\n HARDCODED_SECRETS: \"Move secrets to environment variables\",\n }\n return solutions[vulnerability] || \"Review and fix the security issue\"\n }\n\n private static getVulnerabilityImpact(vulnerability: string): string {\n const impacts: Record<string, string> = {\n SQL_INJECTION: \"Database compromise and data theft\",\n XSS: \"Client-side code execution and session hijacking\",\n HARDCODED_SECRETS: \"Credential exposure and unauthorized access\",\n }\n return impacts[vulnerability] || \"Security vulnerability\"\n }\n}","import type { Recommendation, RiskLevel, Severity } from \"../types\"\n\nexport const createRecommendation = (\n id: string,\n type: \"SECURITY\" | \"PERFORMANCE\" | \"MAINTAINABILITY\" | \"TESTING\" | \"DOCUMENTATION\",\n severity: Severity,\n title: string,\n description: string,\n route: string,\n solution: string,\n impact: string,\n effort: \"LOW\" | \"MEDIUM\" | \"HIGH\",\n category: string,\n tags: string[] = [],\n codeExample?: string,\n fixExample?: string,\n): Recommendation => ({\n id: `${id}_${route.replace(/[^a-zA-Z0-9]/g, \"_\")}`,\n type,\n severity,\n title,\n description,\n route,\n solution,\n impact,\n effort,\n category,\n tags,\n codeExample,\n fixExample,\n})\n\nexport const calculateRiskLevel = (score: number): RiskLevel => {\n if (score >= 50) return \"CRITICAL\"\n if (score >= 30) return \"HIGH\"\n if (score >= 15) return \"MEDIUM\"\n return \"LOW\"\n}\n\nexport const getScoreColor = (score: number): string => {\n if (score >= 90) return \"๐ข\"\n if (score >= 70) return \"๐ก\"\n if (score >= 50) return \"๐ \"\n return \"๐ด\"\n}\n\nexport const getRiskEmoji = (risk: RiskLevel): string => {\n const emojiMap = { LOW: \"๐ข\", MEDIUM: \"๐ก\", HIGH: \"๐ \", CRITICAL: \"๐ด\" }\n return emojiMap[risk]\n}\n\nexport const getSeverityWeight = (severity: Severity): number => {\n const weights = { LOW: 1, MEDIUM: 2, HIGH: 3, CRITICAL: 4 }\n return weights[severity]\n}\n\nexport const SECURITY_PATTERNS = {\n SQL_INJECTION: [/query\\s*\\+\\s*['\"`]/, /\\$\\{[^}]*query[^}]*\\}/, /SELECT\\s+.*\\+.*FROM/i],\n XSS: [/innerHTML\\s*=\\s*.*req\\./, /dangerouslySetInnerHTML/, /eval\\s*\\(.*req\\./],\n HARDCODED_SECRETS: [\n /password\\s*[:=]\\s*['\"`][^'\"`]{8,}/,\n /api[_-]?key\\s*[:=]\\s*['\"`][A-Za-z0-9]{16,}/,\n /secret\\s*[:=]\\s*['\"`][A-Za-z0-9]{16,}/,\n ],\n}\n\nexport const PERFORMANCE_PATTERNS = {\n BLOCKING_OPERATIONS: [/fs\\.readFileSync/, /fs\\.writeFileSync/, /child_process\\.execSync/],\n INEFFICIENT_QUERIES: [/SELECT \\*/i, /\\.find$$$$/, /N\\+1/i],\n MEMORY_LEAKS: [/setInterval\\s*\\(/, /new Array\\s*\\(\\s*\\d{6,}/, /global\\./],\n}","import { createRecommendation } from \"../utils/common\"\nimport ts from \"typescript\"\n\nexport abstract class BaseAnalyzer {\n protected static createRecommendation = createRecommendation\n\n protected static extractMethods(content: string, sourceFile: ts.SourceFile, isAppRouter: boolean): string[] {\n const methods = new Set<string>()\n\n if (isAppRouter) {\n const httpMethods = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"HEAD\", \"OPTIONS\"]\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isFunctionDeclaration(node) && node.name && httpMethods.includes(node.name.text)) {\n methods.add(node.name.text)\n }\n })\n } else {\n const methodRegex = /req\\.method\\s*===?\\s*['\"`](\\w+)['\"`]/g\n let match\n while ((match = methodRegex.exec(content)) !== null) {\n methods.add(match[1].toUpperCase())\n }\n }\n\n return methods.size === 0 ? [\"GET\"] : Array.from(methods)\n }\n\n protected static extractParams(content: string, pattern: RegExp): string[] {\n const params = new Set<string>()\n let match\n while ((match = pattern.exec(content)) !== null) {\n params.add(match[1])\n }\n return Array.from(params)\n }\n\n protected static calculateComplexity(sourceFile: ts.SourceFile): number {\n let complexity = 1\n\n const visit = (node: ts.Node) => {\n switch (node.kind) {\n case ts.SyntaxKind.IfStatement:\n case ts.SyntaxKind.WhileStatement:\n case ts.SyntaxKind.ForStatement:\n case ts.SyntaxKind.SwitchStatement:\n case ts.SyntaxKind.ConditionalExpression:\n complexity++\n break\n }\n ts.forEachChild(node, visit)\n }\n\n visit(sourceFile)\n return complexity\n }\n}","import type { ApiRouteInfo, Recommendation } from \"../types\"\nimport { BaseAnalyzer } from \"./base-analyzer\"\nimport { PERFORMANCE_PATTERNS } from \"../utils/common\"\nimport type ts from \"typescript\"\n\nexport class PerformanceAnalyzer extends BaseAnalyzer {\n static analyzeRoute(\n route: ApiRouteInfo,\n content: string,\n sourceFile: ts.SourceFile,\n ): {\n performanceScore: number\n recommendations: Recommendation[]\n complexity: number\n } {\n const recommendations: Recommendation[] = []\n let performanceScore = 100\n const complexity = this.calculateComplexity(sourceFile)\n\n Object.entries(PERFORMANCE_PATTERNS).forEach(([issueName, patterns]) => {\n if (patterns.some((pattern) => pattern.test(content))) {\n const score = this.getIssueScore(issueName)\n performanceScore -= score\n\n recommendations.push(\n this.createRecommendation(\n issueName,\n \"PERFORMANCE\",\n this.getIssueSeverity(issueName),\n this.getIssueTitle(issueName),\n this.getIssueDescription(issueName),\n route.path,\n this.getIssueSolution(issueName),\n this.getIssueImpact(issueName),\n \"MEDIUM\",\n \"performance\",\n [\"performance\", issueName.toLowerCase()],\n ),\n )\n }\n })\n\n if (complexity > 10) {\n const complexityPenalty = Math.min(20, (complexity - 10) * 2)\n performanceScore -= complexityPenalty\n\n recommendations.push(\n this.createRecommendation(\n \"HIGH_COMPLEXITY\",\n \"PERFORMANCE\",\n complexity > 20 ? \"HIGH\" : \"MEDIUM\",\n \"High Cyclomatic Complexity\",\n `Route has high cyclomatic complexity (${complexity})`,\n route.path,\n \"Refactor into smaller functions and reduce nesting\",\n \"Harder to maintain and potentially slower execution\",\n \"HIGH\",\n \"complexity\",\n [\"complexity\", \"maintainability\"],\n ),\n )\n }\n\n return {\n performanceScore: Math.max(0, performanceScore),\n recommendations,\n complexity,\n }\n }\n\n private static getIssueScore(issueName: string): number {\n const scores = {\n BLOCKING_OPERATIONS: 20,\n INEFFICIENT_QUERIES: 15,\n MEMORY_LEAKS: 25,\n }\n return scores[issueName as keyof typeof scores] || 10\n }\n\n private static getIssueSeverity(issueName: string): \"LOW\" | \"MEDIUM\" | \"HIGH\" {\n const severities = {\n BLOCKING_OPERATIONS: \"HIGH\" as const,\n INEFFICIENT_QUERIES: \"MEDIUM\" as const,\n MEMORY_LEAKS: \"HIGH\" as const,\n }\n return severities[issueName as keyof typeof severities] || \"MEDIUM\"\n }\n\n private static getIssueTitle(issueName: string): string {\n const titles = {\n BLOCKING_OPERATIONS: \"Blocking Operations\",\n INEFFICIENT_QUERIES: \"Inefficient Database Queries\",\n MEMORY_LEAKS: \"Potential Memory Leaks\",\n }\n return titles[issueName as keyof typeof titles] || \"Performance Issue\"\n }\n\n private static getIssueDescription(issueName: string): string {\n const descriptions = {\n BLOCKING_OPERATIONS: \"Synchronous operations that can block the event loop\",\n INEFFICIENT_QUERIES: \"Database queries that may be inefficient\",\n MEMORY_LEAKS: \"Code patterns that may cause memory leaks\",\n }\n return descriptions[issueName as keyof typeof descriptions] || \"Performance issue detected\"\n }\n\n private static getIssueSolution(issueName: string): string {\n const solutions = {\n BLOCKING_OPERATIONS: \"Use asynchronous alternatives\",\n INEFFICIENT_QUERIES: \"Optimize queries and use proper indexing\",\n MEMORY_LEAKS: \"Ensure proper cleanup of resources\",\n }\n return solutions[issueName as keyof typeof solutions] || \"Optimize the code\"\n }\n\n private static getIssueImpact(issueName: string): string {\n const impacts = {\n BLOCKING_OPERATIONS: \"Reduced server performance and responsiveness\",\n INEFFICIENT_QUERIES: \"Slower response times and increased database load\",\n MEMORY_LEAKS: \"Memory consumption growth over time\",\n }\n return impacts[issueName as keyof typeof impacts] || \"Performance degradation\"\n }\n}","import type { AnalyzerPlugin, PluginResult, AnalysisContext, ApiRouteInfo } from \"../types\"\nimport { logger } from \"../utils/logger\"\nimport { createRecommendation } from \"../utils/common\"\n\nexport class PluginManager {\n private plugins: Map<string, AnalyzerPlugin> = new Map()\n\n async loadPlugin(plugin: AnalyzerPlugin): Promise<void> {\n this.plugins.set(plugin.name, plugin)\n logger.info(`Loaded plugin: ${plugin.name} v${plugin.version}`)\n }\n\n async runPlugins(route: ApiRouteInfo, content: string, context: AnalysisContext): Promise<PluginResult[]> {\n const results: PluginResult[] = []\n\n for (const [name, plugin] of this.plugins) {\n try {\n const result = await plugin.analyze(route, content, context)\n results.push(result)\n } catch (error) {\n logger.error(`Plugin ${name} failed for route ${route.path}:`, error)\n }\n }\n\n return results\n }\n\n getLoadedPlugins(): string[] {\n return Array.from(this.plugins.keys())\n }\n}\n\nexport class OpenApiPlugin implements AnalyzerPlugin {\n name = \"openapi-generator\"\n version = \"1.0.0\"\n\n async analyze(route: ApiRouteInfo, content: string): Promise<PluginResult> {\n const recommendations = []\n\n if (!this.hasOpenApiDocs(content)) {\n recommendations.push(\n createRecommendation(\n \"openapi_missing\",\n \"DOCUMENTATION\",\n \"LOW\",\n \"Missing OpenAPI Documentation\",\n \"Route lacks OpenAPI/Swagger documentation\",\n route.path,\n \"Add JSDoc comments with OpenAPI annotations\",\n \"Reduced API discoverability\",\n \"LOW\",\n \"documentation\",\n [\"openapi\", \"documentation\"],\n ),\n )\n }\n\n return { recommendations, metrics: {}, metadata: {} }\n }\n\n private hasOpenApiDocs(content: string): boolean {\n return /\\/\\*\\*[\\s\\S]*@swagger[\\s\\S]*\\*\\//.test(content)\n }\n}\n\nexport class TestCoveragePlugin implements AnalyzerPlugin {\n name = \"test-coverage\"\n version = \"1.0.0\"\n\n async analyze(route: ApiRouteInfo): Promise<PluginResult> {\n const recommendations = []\n\n const hasTests = false\n\n if (!hasTests) {\n recommendations.push(\n createRecommendation(\n \"test_missing\",\n \"TESTING\",\n \"MEDIUM\",\n \"Missing Test Coverage\",\n \"Route appears to lack test coverage\",\n route.path,\n \"Add unit and integration tests\",\n \"Reduced code quality and increased bug risk\",\n \"MEDIUM\",\n \"testing\",\n [\"testing\", \"quality\"],\n ),\n )\n }\n\n return { recommendations, metrics: { testCoverage: hasTests ? 80 : 0 }, metadata: {} }\n }\n}","import type { ApiAnalysisResult, AnalyzerConfig, Recommendation } from \"../types\"\nimport { FileUtils } from \"../utils/file-utils\"\nimport { logger } from \"../utils/logger\"\nimport { getScoreColor, getRiskEmoji } from \"../utils/common\"\nimport path from \"path\"\n\nexport interface UnifiedReportData {\n metadata: {\n generatedAt: Date\n version: string\n command: string\n duration: number\n configHash: string\n }\n analysis: ApiAnalysisResult\n security?: SecurityReportData\n performance?: PerformanceReportData\n trends?: TrendsReportData\n comparison?: ComparisonReportData\n insights: InsightData\n recommendations: EnhancedRecommendation[]\n}\n\nexport interface SecurityReportData {\n vulnerabilities: {\n critical: Recommendation[]\n high: Recommendation[]\n medium: Recommendation[]\n low: Recommendation[]\n }\n compliance: {\n owasp: {\n score: number\n issues: string[]\n coverage: Record<string, boolean>\n }\n pciDss: {\n score: number\n requirements: Record<string, boolean>\n }\n }\n riskAssessment: {\n overallRisk: \"LOW\" | \"MEDIUM\" | \"HIGH\" | \"CRITICAL\"\n riskFactors: string[]\n mitigationPriority: string[]\n }\n securityMetrics: {\n authenticationCoverage: number\n inputValidationCoverage: number\n encryptionUsage: number\n rateLimitingCoverage: number\n }\n}\n\nexport interface PerformanceReportData {\n metrics: {\n averageComplexity: number\n averageLinesOfCode: number\n totalDependencies: number\n blockingOperations: number\n asyncOperations: number\n }\n bottlenecks: {\n highComplexityRoutes: Array<{\n path: string\n complexity: number\n recommendations: string[]\n }>\n largeRoutes: Array<{\n path: string\n linesOfCode: number\n recommendations: string[]\n }>\n dependencyHeavyRoutes: Array<{\n path: string\n dependencies: string[]\n recommendations: string[]\n }>\n }\n optimizationOpportunities: {\n caching: string[]\n asyncOptimization: string[]\n codeReduction: string[]\n dependencyOptimization: string[]\n }\n benchmarks: {\n estimatedResponseTimes: Record<string, number>\n memoryUsageEstimates: Record<string, number>\n scalabilityScore: number\n }\n}\n\nexport interface TrendsReportData {\n timeRange: {\n start: Date\n end: Date\n days: number\n }\n trends: {\n routes: {\n current: number\n previous: number\n change: number\n trend: \"INCREASING\" | \"DECREASING\" | \"STABLE\"\n }\n security: {\n current: number\n previous: number\n change: number\n trend: \"IMPROVING\" | \"DECLINING\" | \"STABLE\"\n }\n performance: {\n current: number\n previous: number\n change: number\n trend: \"IMPROVING\" | \"DECLINING\" | \"STABLE\"\n }\n maintainability: {\n current: number\n previous: number\n change: number\n trend: \"IMPROVING\" | \"DECLINING\" | \"STABLE\"\n }\n }\n historicalData: Array<{\n date: Date\n totalRoutes: number\n securityScore: number\n performanceScore: number\n maintainabilityScore: number\n }>\n predictions: {\n nextMonth: {\n securityScore: number\n performanceScore: number\n maintainabilityScore: number\n }\n recommendations: string[]\n }\n}\n\nexport interface ComparisonReportData {\n baseline: {\n version: string\n date: Date\n summary: any\n }\n current: {\n version: string\n date: Date\n summary: any\n }\n changes: {\n routes: {\n added: string[]\n removed: string[]\n modified: string[]\n }\n scores: {\n security: { from: number; to: number; change: number }\n performance: { from: number; to: number; change: number }\n maintainability: { from: number; to: number; change: number }\n }\n recommendations: {\n new: Recommendation[]\n resolved: Recommendation[]\n persistent: Recommendation[]\n }\n }\n regressions: Array<{\n type: \"SECURITY\" | \"PERFORMANCE\" | \"MAINTAINABILITY\"\n severity: \"LOW\" | \"MEDIUM\" | \"HIGH\" | \"CRITICAL\"\n description: string\n impact: string\n routes: string[]\n }>\n improvements: Array<{\n type: \"SECURITY\" | \"PERFORMANCE\" | \"MAINTAINABILITY\"\n description: string\n impact: string\n routes: string[]\n }>\n}\n\nexport interface InsightData {\n keyFindings: string[]\n criticalIssues: string[]\n quickWins: string[]\n longTermGoals: string[]\n riskAreas: string[]\n strengths: string[]\n technicalDebt: {\n score: number\n areas: string[]\n estimatedEffort: string\n }\n architecturalRecommendations: string[]\n}\n\nexport interface EnhancedRecommendation extends Recommendation {\n priority: number\n estimatedEffort: string\n businessImpact: \"LOW\" | \"MEDIUM\" | \"HIGH\" | \"CRITICAL\"\n implementationSteps: string[]\n dependencies: string[]\n riskOfNotImplementing: string\n}\n\nexport class UnifiedReportGenerator {\n private config: AnalyzerConfig\n private outputDir: string\n\n constructor(config: AnalyzerConfig, outputDir: string) {\n this.config = config\n this.outputDir = outputDir\n }\n\n async generateUnifiedReport(\n command: string,\n analysis: ApiAnalysisResult,\n additionalData?: {\n security?: SecurityReportData\n performance?: PerformanceReportData\n trends?: TrendsReportData\n comparison?: ComparisonReportData\n },\n ): Promise<UnifiedReportData> {\n logger.info(`๐ Generating unified report for ${command} command...`)\n\n const reportData: UnifiedReportData = {\n metadata: {\n generatedAt: new Date(),\n version: \"3.1.0\",\n command,\n duration: analysis.metadata.duration,\n configHash: this.generateConfigHash(),\n },\n analysis,\n ...additionalData,\n insights: await this.generateInsights(analysis),\n recommendations: await this.enhanceRecommendations(analysis.recommendations),\n }\n\n await this.generateMarkdownReport(reportData)\n await this.generateJsonReport(reportData)\n await this.generateHtmlReport(reportData)\n await this.generateCsvReport(reportData)\n await this.generateExecutiveSummary(reportData)\n\n logger.success(`โ
Unified report generated successfully in ${this.outputDir}`)\n return reportData\n }\n\n private async generateMarkdownReport(data: UnifiedReportData): Promise<void> {\n let report = this.generateMarkdownHeader(data)\n report += this.generateExecutiveSummarySection(data)\n report += this.generateAnalysisOverviewSection(data)\n\n if (data.security) {\n report += this.generateSecuritySection(data.security)\n }\n\n if (data.performance) {\n report += this.generatePerformanceSection(data.performance)\n }\n\n if (data.trends) {\n report += this.generateTrendsSection(data.trends)\n }\n\n if (data.comparison) {\n report += this.generateComparisonSection(data.comparison)\n }\n\n report += this.generateInsightsSection(data.insights)\n report += this.generateRecommendationsSection(data.recommendations)\n report += this.generateDetailedRoutesSection(data.analysis.routes)\n report += this.generateAppendixSection(data)\n\n await FileUtils.writeFile(path.join(this.outputDir, \"unified-report.md\"), report)\n }\n\n private generateMarkdownHeader(data: UnifiedReportData): string {\n return `# ๐ Comprehensive API Analysis Report\n\n **Command:** \\`${data.metadata.command}\\` \n **Generated:** ${data.metadata.generatedAt.toLocaleString()} \n **Version:** ${data.metadata.version} \n **Duration:** ${data.metadata.duration.toFixed(2)}ms \n **Total Routes:** ${data.analysis.summary.totalRoutes} \n **Total Files:** ${data.analysis.metadata.totalFiles} \n **Lines of Code:** ${data.analysis.metadata.totalLinesOfCode.toLocaleString()} \n\n ---\n\n `\n }\n\n private generateExecutiveSummarySection(data: UnifiedReportData): string {\n const summary = data.analysis.summary\n const insights = data.insights\n\n return `## ๐ Executive Summary\n\n ### Overall Health Score\n | Metric | Score | Status | Trend |\n |--------|-------|--------|-------|\n | Security | ${summary.securityScore.toFixed(1)}% | ${getScoreColor(summary.securityScore)} | ${this.getTrendIndicator(data.trends?.trends.security)} |\n | Performance | ${summary.performanceScore.toFixed(1)}% | ${getScoreColor(summary.performanceScore)} | ${this.getTrendIndicator(data.trends?.trends.performance)} |\n | Maintainability | ${summary.maintainabilityScore.toFixed(1)}% | ${getScoreColor(summary.maintainabilityScore)} | ${this.getTrendIndicator(data.trends?.trends.maintainability)} |\n | Test Coverage | ${summary.testCoverageScore.toFixed(1)}% | ${getScoreColor(summary.testCoverageScore)} | - |\n\n ### Key Findings\n ${insights.keyFindings.map((finding) => `- ${finding}`).join(\"\\n\")}\n\n ### Critical Issues Requiring Immediate Attention\n ${insights.criticalIssues.length > 0\n ? insights.criticalIssues.map((issue) => `- โ ๏ธ ${issue}`).join(\"\\n\")\n : \"- โ
No critical issues identified\"\n }\n\n ### Quick Wins (Low Effort, High Impact)\n ${insights.quickWins.map((win) => `- ๐ฏ ${win}`).join(\"\\n\")}\n\n ---\n\n `\n }\n\n private generateAnalysisOverviewSection(data: UnifiedReportData): string {\n const summary = data.analysis.summary\n\n return `## ๐ Analysis Overview\n\n ### Route Distribution\n - **Total Routes:** ${summary.totalRoutes}\n - **Secured Routes:** ${summary.secureRoutes} (${((summary.secureRoutes / summary.totalRoutes) * 100).toFixed(1)}%)\n - **Public Routes:** ${summary.publicRoutes} (${((summary.publicRoutes / summary.totalRoutes) * 100).toFixed(1)}%)\n\n ### HTTP Methods Breakdown\n ${Object.entries(summary.methodsBreakdown)\n .filter(([_, count]) => count > 0)\n .map(([method, count]) => `- **${method}:** ${count} routes`)\n .join(\"\\n\")}\n\n ### Risk Distribution\n ${Object.entries(summary.riskDistribution)\n .map(([risk, count]) => `- ${getRiskEmoji(risk as any)} **${risk}:** ${count} routes`)\n .join(\"\\n\")}\n\n ### Response Status Codes\n ${Object.entries(summary.statusCodeDistribution)\n .map(([status, count]) => `- **${status}:** ${count} occurrences`)\n .join(\"\\n\")}\n\n ---\n\n `\n }\n\n private generateSecuritySection(security: SecurityReportData): string {\n return `## ๐ Security Analysis\n\n ### Vulnerability Assessment\n | Severity | Count | Routes Affected |\n |----------|-------|-----------------|\n | Critical | ${security.vulnerabilities.critical.length} | ${this.getAffectedRoutes(security.vulnerabilities.critical)} |\n | High | ${security.vulnerabilities.high.length} | ${this.getAffectedRoutes(security.vulnerabilities.high)} |\n | Medium | ${security.vulnerabilities.medium.length} | ${this.getAffectedRoutes(security.vulnerabilities.medium)} |\n | Low | ${security.vulnerabilities.low.length} | ${this.getAffectedRoutes(security.vulnerabilities.low)} |\n\n ### Compliance Assessment\n\n #### OWASP Top 10 Compliance\n **Score:** ${security.compliance.owasp.score.toFixed(1)}%\n\n ${Object.entries(security.compliance.owasp.coverage)\n .map(([item, compliant]) => `- ${compliant ? \"โ
\" : \"โ\"} ${item}`)\n .join(\"\\n\")}\n\n **Identified Issues:**\n ${security.compliance.owasp.issues.map((issue) => `- โ ๏ธ ${issue}`).join(\"\\n\")}\n\n #### PCI DSS Compliance\n **Score:** ${security.compliance.pciDss.score.toFixed(1)}%\n\n ${Object.entries(security.compliance.pciDss.requirements)\n .map(([req, compliant]) => `- ${compliant ? \"โ
\" : \"โ\"} ${req}`)\n .join(\"\\n\")}\n\n ### Risk Assessment\n **Overall Risk Level:** ${getRiskEmoji(security.riskAssessment.overallRisk)} ${security.riskAssessment.overallRisk}\n\n **Risk Factors:**\n ${security.riskAssessment.riskFactors.map((factor) => `- ${factor}`).join(\"\\n\")}\n\n **Mitigation Priority:**\n ${security.riskAssessment.mitigationPriority.map((item, index) => `${index + 1}. ${item}`).join(\"\\n\")}\n\n ### Security Metrics\n - **Authentication Coverage:** ${security.securityMetrics.authenticationCoverage.toFixed(1)}%\n - **Input Validation Coverage:** ${security.securityMetrics.inputValidationCoverage.toFixed(1)}%\n - **Encryption Usage:** ${security.securityMetrics.encryptionUsage.toFixed(1)}%\n - **Rate Limiting Coverage:** ${security.securityMetrics.rateLimitingCoverage.toFixed(1)}%\n\n ---\n\n `\n }\n\n private generatePerformanceSection(performance: PerformanceReportData): string {\n return `## โก Performance Analysis\n\n ### Performance Metrics\n - **Average Complexity:** ${performance.metrics.averageComplexity.toFixed(1)}\n - **Average Lines of Code:** ${Math.round(performance.metrics.averageLinesOfCode)}\n - **Total Dependencies:** ${performance.metrics.totalDependencies}\n - **Blocking Operations:** ${performance.metrics.blockingOperations}\n - **Async Operations:** ${performance.metrics.asyncOperations}\n\n ### Performance Bottlenecks\n\n #### High Complexity Routes\n ${performance.bottlenecks.highComplexityRoutes.length > 0\n ? performance.bottlenecks.highComplexityRoutes\n .map(\n (route) =>\n `- **${route.path}** (Complexity: ${route.complexity})\\n ${route.recommendations.map((rec) => ` - ${rec}`).join(\"\\n \")}`,\n )\n .join(\"\\n\")\n : \"- โ
No high complexity routes identified\"\n }\n\n #### Large Routes (High LOC)\n ${performance.bottlenecks.largeRoutes.length > 0\n ? performance.bottlenecks.largeRoutes\n .map(\n (route) =>\n `- **${route.path}** (${route.linesOfCode} LOC)\\n ${route.recommendations.map((rec) => ` - ${rec}`).join(\"\\n \")}`,\n )\n .join(\"\\n\")\n : \"- โ
No overly large routes identified\"\n }\n\n #### Dependency-Heavy Routes\n ${performance.bottlenecks.dependencyHeavyRoutes.length > 0\n ? performance.bottlenecks.dependencyHeavyRoutes\n .map(\n (route) =>\n `- **${route.path}** (${route.dependencies.length} dependencies)\\n Dependencies: ${route.dependencies.join(\", \")}\\n ${route.recommendations.map((rec) => ` - ${rec}`).join(\"\\n \")}`,\n )\n .join(\"\\n\")\n : \"- โ
No dependency-heavy routes identified\"\n }\n\n ### Optimization Opportunities\n\n #### Caching Opportunities\n ${performance.optimizationOpportunities.caching.map((opp) => `- ${opp}`).join(\"\\n\")}\n\n #### Async Optimization\n ${performance.optimizationOpportunities.asyncOptimization.map((opp) => `- ${opp}`).join(\"\\n\")}\n\n #### Code Reduction\n ${performance.optimizationOpportunities.codeReduction.map((opp) => `- ${opp}`).join(\"\\n\")}\n\n #### Dependency Optimization\n ${performance.optimizationOpportunities.dependencyOptimization.map((opp) => `- ${opp}`).join(\"\\n\")}\n\n ### Performance Benchmarks\n - **Scalability Score:** ${performance.benchmarks.scalabilityScore.toFixed(1)}%\n\n #### Estimated Response Times\n ${Object.entries(performance.benchmarks.estimatedResponseTimes)\n .map(([route, time]) => `- **${route}:** ${time}ms`)\n .join(\"\\n\")}\n\n #### Memory Usage Estimates\n ${Object.entries(performance.benchmarks.memoryUsageEstimates)\n .map(([route, memory]) => `- **${route}:** ${(memory / 1024).toFixed(1)}KB`)\n .join(\"\\n\")}\n\n ---\n\n `\n }\n\n private generateTrendsSection(trends: TrendsReportData): string {\n return `## ๐ Trends Analysis\n\n ### Time Range\n **Period:** ${trends.timeRange.start.toLocaleDateString()} - ${trends.timeRange.end.toLocaleDateString()} (${trends.timeRange.days} days)\n\n ### Trend Summary\n | Metric | Current | Previous | Change | Trend |\n |--------|---------|----------|--------|-------|\n | Routes | ${trends.trends.routes.current} | ${trends.trends.routes.previous} | ${trends.trends.routes.change >= 0 ? \"+\" : \"\"}${trends.trends.routes.change} | ${this.getTrendEmoji(trends.trends.routes.trend)} ${trends.trends.routes.trend} |\n | Security Score | ${trends.trends.security.current.toFixed(1)}% | ${trends.trends.security.previous.toFixed(1)}% | ${trends.trends.security.change >= 0 ? \"+\" : \"\"}${trends.trends.security.change.toFixed(1)}% | ${this.getTrendEmoji(trends.trends.security.trend)} ${trends.trends.security.trend} |\n | Performance Score | ${trends.trends.performance.current.toFixed(1)}% | ${trends.trends.performance.previous.toFixed(1)}% | ${trends.trends.performance.change >= 0 ? \"+\" : \"\"}${trends.trends.performance.change.toFixed(1)}% | ${this.getTrendEmoji(trends.trends.performance.trend)} ${trends.trends.performance.trend} |\n | Maintainability Score | ${trends.trends.maintainability.current.toFixed(1)}% | ${trends.trends.maintainability.previous.toFixed(1)}% | ${trends.trends.maintainability.change >= 0 ? \"+\" : \"\"}${trends.trends.maintainability.change.toFixed(1)}% | ${this.getTrendEmoji(trends.trends.maintainability.trend)} ${trends.trends.maintainability.trend} |\n\n ### Historical Data Points\n ${trends.historicalData\n .slice(-10)\n .map(\n (data) =>\n `- **${data.date.toLocaleDateString()}:** Routes: ${data.totalRoutes}, Security: ${data.securityScore.toFixed(1)}%, Performance: ${data.performanceScore.toFixed(1)}%, Maintainability: ${data.maintainabilityScore.toFixed(1)}%`,\n )\n .join(\"\\n\")}\n\n ### Predictions (Next Month)\n - **Security Score:** ${trends.predictions.nextMonth.securityScore.toFixed(1)}%\n - **Performance Score:** ${trends.predictions.nextMonth.performanceScore.toFixed(1)}%\n - **Maintainability Score:** ${trends.predictions.nextMonth.maintainabilityScore.toFixed(1)}%\n\n ### Trend-Based Recommendations\n ${trends.predictions.recommendations.map((rec) => `- ${rec}`).join(\"\\n\")}\n\n ---\n\n `\n }\n\n private generateComparisonSection(comparison: ComparisonReportData): string {\n return `## ๐ Comparison Analysis\n\n ### Version Comparison\n | Aspect | Baseline | Current |\n |--------|----------|---------|\n | Version | ${comparison.baseline.version} | ${comparison.current.version} |\n | Date | ${comparison.baseline.date.toLocaleDateString()} | ${comparison.current.date.toLocaleDateString()} |\n | Routes | ${comparison.baseline.summary.totalRoutes} | ${comparison.current.summary.totalRoutes} |\n\n ### Route Changes\n - **Added Routes:** ${comparison.changes.routes.added.length}\n ${comparison.changes.routes.added.map((route) => ` - โ
${route}`).join(\"\\n\")}\n\n - **Removed Routes:** ${comparison.changes.routes.removed.length}\n ${comparison.changes.routes.removed.map((route) => ` - โ ${route}`).join(\"\\n\")}\n\n - **Modified Routes:** ${comparison.changes.routes.modified.length}\n ${comparison.changes.routes.modified.map((route) => ` - ๐ ${route}`).join(\"\\n\")}\n\n ### Score Changes\n | Metric | From | To | Change | Impact |\n |--------|------|----|---------| -------|\n | Security | ${comparison.changes.scores.security.from.toFixed(1)}% | ${comparison.changes.scores.security.to.toFixed(1)}% | ${comparison.changes.scores.security.change >= 0 ? \"+\" : \"\"}${comparison.changes.scores.security.change.toFixed(1)}% | ${this.getChangeImpact(comparison.changes.scores.security.change)} |\n | Performance | ${comparison.changes.scores.performance.from.toFixed(1)}% | ${comparison.changes.scores.performance.to.toFixed(1)}% | ${comparison.changes.scores.performance.change >= 0 ? \"+\" : \"\"}${comparison.changes.scores.performance.change.toFixed(1)}% | ${this.getChangeImpact(comparison.changes.scores.performance.change)} |\n | Maintainability | ${comparison.changes.scores.maintainability.from.toFixed(1)}% | ${comparison.changes.scores.maintainability.to.toFixed(1)}% | ${comparison.changes.scores.maintainability.change >= 0 ? \"+\" : \"\"}${comparison.changes.scores.maintainability.change.toFixed(1)}% | ${this.getChangeImpact(comparison.changes.scores.maintainability.change)} |\n\n ### Regressions Identified\n ${comparison.regressions.length > 0\n ? comparison.regressions\n .map(\n (regression) =>\n `- **${regression.type}** (${regression.severity}): ${regression.description}\\n - Impact: ${regression.impact}\\n - Affected Routes: ${regression.routes.join(\", \")}`,\n )\n .join(\"\\n\")\n : \"- โ
No regressions identified\"\n }\n\n ### Improvements Identified\n ${comparison.improvements.length > 0\n ? comparison.improvements\n .map(\n (improvement) =>\n `- **${improvement.type}**: ${improvement.description}\\n - Impact: ${improvement.impact}\\n - Affected Routes: ${improvement.routes.join(\", \")}`,\n )\n .join(\"\\n\")\n : \"- No significant improvements identified\"\n }\n\n ### Recommendation Changes\n - **New Recommendations:** ${comparison.changes.recommendations.new.length}\n - **Resolved Recommendations:** ${comparison.changes.recommendations.resolved.length}\n - **Persistent Recommendations:** ${comparison.changes.recommendations.persistent.length}\n\n ---\n\n `\n }\n\n private generateInsightsSection(insights: InsightData): string {\n return `## ๐ก Key Insights & Analysis\n\n ### Strengths\n ${insights.strengths.map((strength) => `- โ
${strength}`).join(\"\\n\")}\n\n ### Risk Areas\n ${insights.riskAreas.map((risk) => `- โ ๏ธ ${risk}`).join(\"\\n\")}\n\n ### Technical Debt Assessment\n **Technical Debt Score:** ${insights.technicalDebt.score.toFixed(1)}/100\n\n **Problem Areas:**\n ${insights.technicalDebt.areas.map((area) => `- ${area}`).join(\"\\n\")}\n\n **Estimated Effort to Address:** ${insights.technicalDebt.estimatedEffort}\n\n ### Architectural Recommendations\n ${insights.architecturalRecommendations.map((rec) => `- ๐๏ธ ${rec}`).join(\"\\n\")}\n\n ### Long-Term Goals\n ${insights.longTermGoals.map((goal) => `- ๐ฏ ${goal}`).join(\"\\n\")}\n\n ---\n\n `\n }\n\n private generateRecommendationsSection(recommendations: EnhancedRecommendation[]): string {\n const sortedRecs = recommendations.sort((a, b) => b.priority - a.priority)\n\n return `## ๐ Detailed Recommendations\n\n ### Priority Matrix\n | Priority | Count | Business Impact |\n |----------|-------|-----------------|\n | Critical | ${sortedRecs.filter((r) => r.priority >= 90).length} | High business risk |\n | High | ${sortedRecs.filter((r) => r.priority >= 70 && r.priority < 90).length} | Significant impact |\n | Medium | ${sortedRecs.filter((r) => r.priority >= 50 && r.priority < 70).length} | Moderate impact |\n | Low | ${sortedRecs.filter((r) => r.priority < 50).length} | Minor improvements |\n\n ### Top Priority Recommendations\n\n ${sortedRecs\n .slice(0, 10)\n .map(\n (rec, index) => `\n #### ${index + 1}. ${rec.title}\n **Priority:** ${rec.priority}/100 | **Severity:** ${rec.severity} | **Business Impact:** ${rec.businessImpact} \n **Estimated Effort:** ${rec.estimatedEffort} | **Category:** ${rec.category}\n\n **Description:** ${rec.description}\n\n **Solution:** ${rec.solution}\n\n **Impact:** ${rec.impact}\n\n **Risk of Not Implementing:** ${rec.riskOfNotImplementing}\n\n **Implementation Steps:**\n ${rec.implementationSteps.map((step, i) => `${i + 1}. ${step}`).join(\"\\n\")}\n\n ${rec.dependencies.length > 0 ? `**Dependencies:** ${rec.dependencies.join(\", \")}` : \"\"}\n\n ${rec.route ? `**Affected Route:** \\`${rec.route}\\`` : \"\"}\n\n **Tags:** ${rec.tags.join(\", \")}\n\n ---\n `,\n )\n .join(\"\")}\n\n ---\n\n `\n }\n\n private generateDetailedRoutesSection(routes: any[]): string {\n return `## ๐ Detailed Route Analysis\n\n ### Route Inventory\n Total Routes: ${routes.length}\n\n ${routes\n .map(\n (route) => `\n #### \\`${route.path}\\`\n - **Methods:** ${route.methods.join(\", \")}\n - **Authentication:** ${route.hasAuth ? \"๐ Secured\" : \"๐ Public\"}\n - **Risk Level:** ${getRiskEmoji(route.riskLevel)} ${route.riskLevel}\n - **Complexity:** ${route.complexity || \"N/A\"}\n - **Performance Score:** ${route.performanceScore?.toFixed(1) || \"N/A\"}%\n - **Lines of Code:** ${route.linesOfCode || \"N/A\"}\n - **Dependencies:** ${route.dependencies.length || 0}\n - **Last Modified:** ${route.lastModified ? new Date(route.lastModified).toLocaleDateString() : \"N/A\"}\n\n ${route.authTypes.length > 0 ? `**Auth Types:** ${route.authTypes.join(\", \")}` : \"\"}\n ${route.middlewares.length > 0 ? `**Middlewares:** ${route.middlewares.join(\", \")}` : \"\"}\n ${route.description ? `**Description:** ${route.description}` : \"\"}\n\n **Features:**\n - Rate Limiting: ${route.hasRateLimit ? \"โ
\" : \"โ\"}\n - CORS: ${route.hasCors ? \"โ
\" : \"โ\"}\n - Input Validation: ${route.hasInputValidation ? \"โ
\" : \"โ\"}\n\n **Parameters:**\n - Query: ${route.queryParams.length}\n - Path: ${route.pathParams.length}\n - Body: ${route.bodyParams.length}\n\n **Response Codes:** ${route.responseStatuses.join(\", \")}\n\n ---\n `,\n )\n .join(\"\")}\n\n `\n }\n\n private generateAppendixSection(data: UnifiedReportData): string {\n return `## ๐ Appendix\n\n ### Configuration Used\n - **API Directory:** ${this.config.apiDir}\n - **Output Directory:** ${this.outputDir}\n - **Security Analysis:** ${this.config.enableSecurityAnalysis ? \"Enabled\" : \"Disabled\"}\n - **Performance Analysis:** ${this.config.enablePerformanceAnalysis ? \"Enabled\" : \"Disabled\"}\n - **Trends Analysis:** ${this.config.enableTrends ? \"Enabled\" : \"Disabled\"}\n - **Parallel Processing:** ${this.config.parallel ? \"Enabled\" : \"Disabled\"}\n - **Max Concurrency:** ${this.config.maxConcurrency}\n\n ### Thresholds\n - **Security:** ${this.config.thresholds.security}%\n - **Performance:** ${this.config.thresholds.performance}%\n - **Maintainability:** ${this.config.thresholds.maintainability}%\n - **Test Coverage:** ${this.config.thresholds.testCoverage}%\n - **Complexity:** ${this.config.thresholds.complexity}\n\n ### Glossary\n - **Cyclomatic Complexity:** A measure of code complexity based on the number of decision points\n - **Technical Debt:** The cost of additional rework caused by choosing an easy solution now instead of a better approach\n - **OWASP:** Open Web Application Security Project - industry standard for web application security\n - **PCI DSS:** Payment Card Industry Data Security Standard\n - **Risk Level:** Assessment of potential security and operational risks (LOW, MEDIUM, HIGH, CRITICAL)\n\n ### Report Generation Details\n - **Generated At:** ${data.metadata.generatedAt.toISOString()}\n - **Analysis Duration:** ${data.metadata.duration.toFixed(2)}ms\n - **Report Version:** ${data.metadata.version}\n - **Command Used:** ${data.metadata.command}\n - **Config Hash:** ${data.metadata.configHash}\n\n ---\n\n *This report was generated by Next.js API Analyzer v${data.metadata.version}*\n `\n }\n\n private async generateJsonReport(data: UnifiedReportData): Promise<void> {\n await FileUtils.writeJsonFile(path.join(this.outputDir, \"unified-report.json\"), data)\n }\n\n private async generateHtmlReport(data: UnifiedReportData): Promise<void> {\n const html = this.generateHtmlContent(data)\n await FileUtils.writeFile(path.join(this.outputDir, \"unified-report.html\"), html)\n }\n\n private async generateCsvReport(data: UnifiedReportData): Promise<void> {\n const csvContent = this.generateCsvContent(data)\n await FileUtils.writeFile(path.join(this.outputDir, \"unified-report.csv\"), csvContent)\n }\n\n private async generateExecutiveSummary(data: UnifiedReportData): Promise<void> {\n const summary = this.generateExecutiveSummaryContent(data)\n await FileUtils.writeFile(path.join(this.outputDir, \"executive-summary.md\"), summary)\n }\n\n private generateHtmlContent(data: UnifiedReportData): string {\n return `<!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Comprehensive API Analysis Report</title>\n <script src=\"https://cdn.jsdelivr.net/npm/chart.js\"></script>\n <style>\n :root {\n --primary: #3b82f6;\n --success: #10b981;\n --warning: #f59e0b;\n --danger: #ef4444;\n --dark: #1f2937;\n --light: #f8fafc;\n --border: #e5e7eb;\n }\n \n * { margin: 0; padding: 0; box-sizing: border-box; }\n \n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: var(--light);\n color: var(--dark);\n line-height: 1.6;\n }\n \n .container { max-width: 1400px; margin: 0 auto; padding: 20px; }\n \n .header {\n background: linear-gradient(135deg, var(--primary), #8b5cf6);\n color: white;\n padding: 40px;\n border-radius: 12px;\n margin-bottom: 30px;\n text-align: center;\n }\n \n .header h1 { font-size: 2.5em; margin-bottom: 10px; }\n .header p { opacity: 0.9; margin-bottom: 5px; }\n \n .metrics-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n margin-bottom: 30px;\n }\n \n .metric-card {\n background: white;\n padding: 25px;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n border-left: 4px solid var(--primary);\n }\n \n .metric-value {\n font-size: 2.5em;\n font-weight: bold;\n color: var(--primary);\n margin-bottom: 5px;\n }\n \n .metric-label {\n color: #64748b;\n text-transform: uppercase;\n font-size: 0.9em;\n font-weight: 600;\n }\n \n .section {\n background: white;\n padding: 30px;\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n margin-bottom: 30px;\n }\n \n .section h2 {\n color: var(--dark);\n margin-bottom: 20px;\n font-size: 1.8em;\n }\n \n .chart-container {\n position: relative;\n height: 300px;\n margin: 20px 0;\n }\n \n .table {\n width: 100%;\n border-collapse: collapse;\n margin: 20px 0;\n }\n \n .table th, .table td {\n padding: 12px;\n text-align: left;\n border-bottom: 1px solid var(--border);\n }\n \n .table th {\n background: var(--light);\n font-weight: 600;\n }\n \n .badge {\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 0.8em;\n font-weight: 600;\n }\n \n .badge-success { background: #dcfce7; color: #16a34a; }\n .badge-warning { background: #fef3c7; color: #d97706; }\n .badge-danger { background: #fee2e2; color: #dc2626; }\n .badge-info { background: #dbeafe; color: #2563eb; }\n \n .recommendation {\n padding: 20px;\n border-left: 4px solid var(--warning);\n background: #fffbeb;\n margin: 15px 0;\n border-radius: 8px;\n }\n \n .recommendation.critical { border-left-color: var(--danger); background: #fef2f2; }\n .recommendation.high { border-left-color: var(--warning); background: #fffbeb; }\n .recommendation.medium { border-left-color: var(--primary); background: #eff6ff; }\n .recommendation.low { border-left-color: var(--success); background: #f0fdf4; }\n \n .tabs {\n display: flex;\n border-bottom: 2px solid var(--border);\n margin-bottom: 20px;\n }\n \n .tab {\n padding: 12px 24px;\n cursor: pointer;\n border: none;\n background: none;\n font-size: 1em;\n color: #64748b;\n }\n \n .tab.active {\n color: var(--primary);\n border-bottom: 2px solid var(--primary);\n }\n \n .tab-content {\n display: none;\n }\n \n .tab-content.active {\n display: block;\n }\n \n @media (max-width: 768px) {\n .container { padding: 15px; }\n .header { padding: 30px 20px; }\n .header h1 { font-size: 2em; }\n .metric-value { font-size: 2em; }\n }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <div class=\"header\">\n <h1>๐ Comprehensive API Analysis Report</h1>\n <p><strong>Command:</strong> ${data.metadata.command}</p>\n <p><strong>Generated:</strong> ${data.metadata.generatedAt.toLocaleString()}</p>\n <p><strong>Duration:</strong> ${data.metadata.duration.toFixed(2)}ms</p>\n <p><strong>Version:</strong> ${data.metadata.version}</p>\n </div>\n\n <div class=\"metrics-grid\">\n <div class=\"metric-card\">\n <div class=\"metric-value\">๐ ${data.analysis.summary.totalRoutes}</div>\n <div class=\"metric-label\">Total Routes</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-value\">๐ ${data.analysis.summary.securityScore.toFixed(1)}%</div>\n <div class=\"metric-label\">Security Score</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-value\">โก ${data.analysis.summary.performanceScore.toFixed(1)}%</div>\n <div class=\"metric-label\">Performance Score</div>\n </div>\n <div class=\"metric-card\">\n <div class=\"metric-value\">๐ง ${data.analysis.summary.maintainabilityScore.toFixed(1)}%</div>\n <div class=\"metric-label\">Maintainability Score</div>\n </div>\n </div>\n\n <div class=\"section\">\n <h2>๐ Executive Summary</h2>\n <div class=\"tabs\">\n <button class=\"tab active\" onclick=\"showTab('overview')\">Overview</button>\n ${data.security ? '<button class=\"tab\" onclick=\"showTab(\\'security\\')\">Security</button>' : \"\"}\n ${data.performance ? '<button class=\"tab\" onclick=\"showTab(\\'performance\\')\">Performance</button>' : \"\"}\n ${data.trends ? '<button class=\"tab\" onclick=\"showTab(\\'trends\\')\">Trends</button>' : \"\"}\n ${data.comparison ? '<button class=\"tab\" onclick=\"showTab(\\'comparison\\')\">Comparison</button>' : \"\"}\n </div>\n \n <div id=\"overview\" class=\"tab-content active\">\n <h3>Key Findings</h3>\n <ul>\n ${data.insights.keyFindings.map((finding) => `<li>${finding}</li>`).join(\"\")}\n </ul>\n \n <h3>Critical Issues</h3>\n ${data.insights.criticalIssues.length > 0\n ? `<ul>${data.insights.criticalIssues.map((issue) => `<li>โ ๏ธ ${issue}</li>`).join(\"\")}</ul>`\n : \"<p>โ
No critical issues identified</p>\"\n }\n \n <h3>Quick Wins</h3>\n <ul>\n ${data.insights.quickWins.map((win) => `<li>๐ฏ ${win}</li>`).join(\"\")}\n </ul>\n </div>\n \n ${data.security\n ? `\n <div id=\"security\" class=\"tab-content\">\n <h3>Security Assessment</h3>\n <table class=\"table\">\n <thead>\n <tr>\n <th>Severity</th>\n <th>Count</th>\n <th>Status</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>Critical</td>\n <td>${data.security.vulnerabilities.critical.length}</td>\n <td><span class=\"badge badge-danger\">High Priority</span></td>\n </tr>\n <tr>\n <td>High</td>\n <td>${data.security.vulnerabilities.high.length}</td>\n <td><span class=\"badge badge-warning\">Medium Priority</span></td>\n </tr>\n <tr>\n <td>Medium</td>\n <td>${data.security.vulnerabilities.medium.length}</td>\n <td><span class=\"badge badge-info\">Low Priority</span></td>\n </tr>\n <tr>\n <td>Low</td>\n <td>${data.security.vulnerabilities.low.length}</td>\n <td><span class=\"badge badge-success\">Monitor</span></td>\n </tr>\n </tbody>\n </table>\n \n <h3>OWASP Compliance: ${data.security.compliance.owasp.score.toFixed(1)}%</h3>\n <div class=\"chart-container\">\n <canvas id=\"owaspChart\"></canvas>\n </div>\n </div>\n `\n : \"\"\n }\n \n ${data.performance\n ? `\n <div id=\"performance\" class=\"tab-content\">\n <h3>Performance Metrics</h3>\n <table class=\"table\">\n <tbody>\n <tr>\n <td>Average Complexity</td>\n <td>${data.performance.metrics.averageComplexity.toFixed(1)}</td>\n </tr>\n <tr>\n <td>Average Lines of Code</td>\n <td>${Math.round(data.performance.metrics.averageLinesOfCode)}</td>\n </tr>\n <tr>\n <td>Total Dependencies</td>\n <td>${data.performance.metrics.totalDependencies}</td>\n </tr>\n <tr>\n <td>Blocking Operations</td>\n <td>${data.performance.metrics.blockingOperations}</td>\n </tr>\n </tbody>\n </table>\n \n <h3>Scalability Score: ${data.performance.benchmarks.scalabilityScore.toFixed(1)}%</h3>\n </div>\n `\n : \"\"\n }\n \n ${data.trends\n ? `\n <div id=\"trends\" class=\"tab-content\">\n <h3>Trend Analysis (${data.trends.timeRange.days} days)</h3>\n <div class=\"chart-container\">\n <canvas id=\"trendsChart\"></canvas>\n </div>\n \n <h3>Predictions (Next Month)</h3>\n <ul>\n <li>Security Score: ${data.trends.predictions.nextMonth.securityScore.toFixed(1)}%</li>\n <li>Performance Score: ${data.trends.predictions.nextMonth.performanceScore.toFixed(1)}%</li>\n <li>Maintainability Score: ${data.trends.predictions.nextMonth.maintainabilityScore.toFixed(1)}%</li>\n </ul>\n </div>\n `\n : \"\"\n }\n \n ${data.comparison\n ? `\n <div id=\"comparison\" class=\"tab-content\">\n <h3>Version Comparison</h3>\n <table class=\"table\">\n <thead>\n <tr>\n <th>Metric</th>\n <th>Baseline</th>\n <th>Current</th>\n <th>Change</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>Security Score</td>\n <td>${data.comparison.changes.scores.security.from.toFixed(1)}%</td>\n <td>${data.comparison.changes.scores.security.to.toFixed(1)}%</td>\n <td class=\"${data.comparison.changes.scores.security.change >= 0 ? \"badge-success\" : \"badge-danger\"}\">\n ${data.comparison.changes.scores.security.change >= 0 ? \"+\" : \"\"}${data.comparison.changes.scores.security.change.toFixed(1)}%\n </td>\n </tr>\n <tr>\n <td>Performance Score</td>\n <td>${data.comparison.changes.scores.performance.from.toFixed(1)}%</td>\n <td>${data.comparison.changes.scores.performance.to.toFixed(1)}%</td>\n <td class=\"${data.comparison.changes.scores.performance.change >= 0 ? \"badge-success\" : \"badge-danger\"}\">\n ${data.comparison.changes.scores.performance.change >= 0 ? \"+\" : \"\"}${data.comparison.changes.scores.performance.change.toFixed(1)}%\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n `\n : \"\"\n }\n </div>\n\n <div class=\"section\">\n <h2>๐ก Top Recommendations</h2>\n ${data.recommendations\n .slice(0, 5)\n .map(\n (rec) => `\n <div class=\"recommendation ${rec.severity.toLowerCase()}\">\n <h3>${rec.title}</h3>\n <p><strong>Priority:</strong> ${rec.priority}/100 | <strong>Business Impact:</strong> ${rec.businessImpact}</p>\n <p><strong>Description:</strong> ${rec.description}</p>\n <p><strong>Solution:</strong> ${rec.solution}</p>\n <p><strong>Estimated Effort:</strong> ${rec.estimatedEffort}</p>\n ${rec.route ? `<p><strong>Route:</strong> <code>${rec.route}</code></p>` : \"\"}\n </div>\n `,\n )\n .join(\"\")}\n </div>\n\n <div class=\"section\">\n <h2>๐ Risk Distribution</h2>\n <div class=\"chart-container\">\n <canvas id=\"riskChart\"></canvas>\n </div>\n </div>\n </div>\n\n <script>\n function showTab(tabName) {\n // Hide all tab contents\n document.querySelectorAll('.tab-content').forEach(content => {\n content.classList.remove('active');\n });\n \n // Remove active class from all tabs\n document.querySelectorAll('.tab').forEach(tab => {\n tab.classList.remove('active');\n });\n \n // Show selected tab content\n document.getElementById(tabName).classList.add('active');\n \n // Add active class to clicked tab\n event.target.classList.add('active');\n }\n\n // Risk Distribution Chart\n const riskCtx = document.getElementById('riskChart').getContext('2d');\n new Chart(riskCtx, {\n type: 'doughnut',\n data: {\n labels: Object.keys(${JSON.stringify(data.analysis.summary.riskDistribution)}),\n datasets: [{\n data: Object.values(${JSON.stringify(data.analysis.summary.riskDistribution)}),\n backgroundColor: ['#10b981', '#3b82f6', '#f59e0b', '#ef4444'],\n borderWidth: 0\n }]\n },\n options: {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: {\n position: 'bottom'\n }\n }\n }\n });\n\n ${data.security\n ? `\n // OWASP Compliance Chart\n const owaspCtx = document.getElementById('owaspChart').getContext('2d');\n new Chart(owaspCtx, {\n type: 'bar',\n data: {\n labels: Object.keys(${JSON.stringify(data.security.compliance.owasp.coverage)}),\n datasets: [{\n label: 'Compliance',\n data: Object.values(${JSON.stringify(data.security.compliance.owasp.coverage)}).map(v => v ? 100 : 0),\n backgroundColor: Object.values(${JSON.stringify(data.security.compliance.owasp.coverage)}).map(v => v ? '#10b981' : '#ef4444')\n }]\n },\n options: {\n responsive: true,\n maintainAspectRatio: false,\n scales: {\n y: {\n beginAtZero: true,\n max: 100\n }\n }\n }\n });\n `\n : \"\"\n }\n\n ${data.trends\n ? `\n // Trends Chart\n const trendsCtx = document.getElementById('trendsChart').getContext('2d');\n new Chart(trendsCtx, {\n type: 'line',\n data: {\n labels: ${JSON.stringify(data.trends.historicalData.map((d) => new Date(d.date).toLocaleDateString()))},\n datasets: [\n {\n label: 'Security Score',\n data: ${JSON.stringify(data.trends.historicalData.map((d) => d.securityScore))},\n borderColor: '#10b981',\n backgroundColor: 'rgba(16, 185, 129, 0.1)'\n },\n {\n label: 'Performance Score',\n data: ${JSON.stringify(data.trends.historicalData.map((d) => d.performanceScore))},\n borderColor: '#3b82f6',\n backgroundColor: 'rgba(59, 130, 246, 0.1)'\n },\n {\n label: 'Maintainability Score',\n data: ${JSON.stringify(data.trends.historicalData.map((d) => d.maintainabilityScore))},\n borderColor: '#f59e0b',\n backgroundColor: 'rgba(245, 158, 11, 0.1)'\n }\n ]\n },\n options: {\n responsive: true,\n maintainAspectRatio: false,\n scales: {\n y: {\n beginAtZero: true,\n max: 100\n }\n }\n }\n });\n `\n : \"\"\n }\n </script>\n </body>\n </html>`\n }\n\n private generateCsvContent(data: UnifiedReportData): string {\n const headers = [\n \"Route\",\n \"Methods\",\n \"Authentication\",\n \"Risk Level\",\n \"Complexity\",\n \"Performance Score\",\n \"Lines of Code\",\n \"Dependencies\",\n \"Last Modified\",\n \"Security Issues\",\n \"Performance Issues\",\n ]\n\n const rows = data.analysis.routes.map((route) => [\n route.path,\n route.methods.join(\";\"),\n route.hasAuth ? \"Secured\" : \"Public\",\n route.riskLevel,\n route.complexity || 0,\n route.performanceScore?.toFixed(1) || 0,\n route.linesOfCode || 0,\n route.dependencies.length,\n route.lastModified ? new Date(route.lastModified).toISOString() : \"\",\n data.recommendations.filter((r) => r.route === route.path && r.type === \"SECURITY\").length,\n data.recommendations.filter((r) => r.route === route.path && r.type === \"PERFORMANCE\").length,\n ])\n\n return [headers.join(\",\"), ...rows.map((row) => row.join(\",\"))].join(\"\\n\")\n }\n\n private generateExecutiveSummaryContent(data: UnifiedReportData): string {\n return `# Executive Summary - API Analysis Report\n\n **Date:** ${data.metadata.generatedAt.toLocaleDateString()} \n **Command:** ${data.metadata.command} \n **Analysis Duration:** ${data.metadata.duration.toFixed(2)}ms \n\n ## Key Metrics\n - **Total API Routes:** ${data.analysis.summary.totalRoutes}\n - **Security Score:** ${data.analysis.summary.securityScore.toFixed(1)}%\n - **Performance Score:** ${data.analysis.summary.performanceScore.toFixed(1)}%\n - **Maintainability Score:** ${data.analysis.summary.maintainabilityScore.toFixed(1)}%\n\n ## Critical Findings\n ${data.insights.criticalIssues.length > 0\n ? data.insights.criticalIssues.map((issue) => `- โ ๏ธ ${issue}`).join(\"\\n\")\n : \"- โ
No critical issues identified\"\n }\n\n ## Immediate Actions Required\n ${data.recommendations\n .filter((r) => r.priority >= 90)\n .slice(0, 5)\n .map(\n (rec, index) =>\n `${index + 1}. **${rec.title}** (${rec.severity} priority)\\n - ${rec.description}\\n - Estimated effort: ${rec.estimatedEffort}`,\n )\n .join(\"\\n\\n\")}\n\n ## Business Impact Assessment\n - **High Risk Routes:** ${data.analysis.routes.filter((r) => r.riskLevel === \"HIGH\" || r.riskLevel === \"CRITICAL\").length}\n - **Unsecured Endpoints:** ${data.analysis.summary.publicRoutes}\n - **Technical Debt Score:** ${data.insights.technicalDebt.score.toFixed(1)}/100\n\n ## Recommendations Summary\n - **Total Recommendations:** ${data.recommendations.length}\n - **Critical Priority:** ${data.recommendations.filter((r) => r.priority >= 90).length}\n - **High Priority:** ${data.recommendations.filter((r) => r.priority >= 70 && r.priority < 90).length}\n - **Medium Priority:** ${data.recommendations.filter((r) => r.priority >= 50 && r.priority < 70).length}\n\n ## Next Steps\n 1. Address critical security vulnerabilities immediately\n 2. Implement quick wins for immediate improvement\n 3. Plan long-term architectural improvements\n 4. Establish regular monitoring and analysis schedule\n\n ---\n *For detailed analysis, please refer to the complete unified report.*`\n }\n\n private async generateInsights(analysis: ApiAnalysisResult): Promise<InsightData> {\n const routes = analysis.routes\n const summary = analysis.summary\n\n const keyFindings = [\n `Analyzed ${summary.totalRoutes} API routes across ${analysis.metadata.totalFiles} files`,\n `Security coverage: ${((summary.secureRoutes / summary.totalRoutes) * 100).toFixed(1)}% of routes have authentication`,\n `Average complexity: ${(routes.reduce((sum, r) => sum + (r.complexity || 0), 0) / routes.length).toFixed(1)}`,\n `${summary.riskDistribution.HIGH + summary.riskDistribution.CRITICAL} routes identified as high risk`,\n ]\n\n const criticalIssues = []\n if (summary.riskDistribution.CRITICAL > 0) {\n criticalIssues.push(`${summary.riskDistribution.CRITICAL} routes have CRITICAL risk level`)\n }\n if (summary.securityScore < 70) {\n criticalIssues.push(`Security score (${summary.securityScore.toFixed(1)}%) is below recommended threshold`)\n }\n if (summary.publicRoutes > summary.secureRoutes) {\n criticalIssues.push(`More public routes (${summary.publicRoutes}) than secured routes (${summary.secureRoutes})`)\n }\n\n const quickWins = [\n \"Add authentication to public mutating endpoints\",\n \"Implement input validation on all routes\",\n \"Add rate limiting to prevent abuse\",\n \"Enable CORS with specific origins\",\n ]\n\n const longTermGoals = [\n \"Implement comprehensive API monitoring\",\n \"Establish security-first development practices\",\n \"Create automated testing pipeline\",\n \"Design scalable architecture patterns\",\n ]\n\n const riskAreas = [\n \"Unauthenticated data modification endpoints\",\n \"Routes with high cyclomatic complexity\",\n \"Missing input validation\",\n \"Potential SQL injection vulnerabilities\",\n ]\n\n const strengths = []\n if (summary.securityScore > 80) strengths.push(\"Strong security posture\")\n if (summary.performanceScore > 80) strengths.push(\"Good performance characteristics\")\n if (summary.maintainabilityScore > 80) strengths.push(\"Maintainable codebase\")\n\n const technicalDebt = {\n score: Math.max(0, 100 - (summary.securityScore + summary.performanceScore + summary.maintainabilityScore) / 3),\n areas: [\n \"High complexity routes requiring refactoring\",\n \"Missing security controls\",\n \"Inconsistent error handling patterns\",\n \"Lack of comprehensive testing\",\n ],\n estimatedEffort: this.calculateTechnicalDebtEffort(routes.length, analysis.recommendations.length),\n }\n\n const architecturalRecommendations = [\n \"Implement centralized authentication middleware\",\n \"Create consistent error handling patterns\",\n \"Establish API versioning strategy\",\n \"Design comprehensive logging and monitoring\",\n ]\n\n return {\n keyFindings,\n criticalIssues,\n quickWins,\n longTermGoals,\n riskAreas,\n strengths,\n technicalDebt,\n architecturalRecommendations,\n }\n }\n\n private async enhanceRecommendations(recommendations: Recommendation[]): Promise<EnhancedRecommendation[]> {\n return recommendations.map((rec) => ({\n ...rec,\n priority: this.calculatePriority(rec),\n estimatedEffort: this.estimateEffort(rec),\n businessImpact: this.assessBusinessImpact(rec),\n implementationSteps: this.generateImplementationSteps(rec),\n dependencies: this.identifyDependencies(rec),\n riskOfNotImplementing: this.assessRiskOfNotImplementing(rec),\n }))\n }\n\n private calculatePriority(rec: Recommendation): number {\n let priority = 50\n\n switch (rec.severity) {\n case \"CRITICAL\":\n priority += 40\n break\n case \"HIGH\":\n priority += 30\n break\n case \"MEDIUM\":\n priority += 20\n break\n case \"LOW\":\n priority += 10\n break\n }\n\n switch (rec.type) {\n case \"SECURITY\":\n priority += 20\n break\n case \"PERFORMANCE\":\n priority += 15\n break\n case \"MAINTAINABILITY\":\n priority += 10\n break\n case \"TESTING\":\n priority += 5\n break\n }\n\n switch (rec.effort) {\n case \"LOW\":\n priority += 10\n break\n case \"MEDIUM\":\n priority += 5\n break\n case \"HIGH\":\n priority -= 5\n break\n }\n\n return Math.min(100, Math.max(0, priority))\n }\n\n private estimateEffort(rec: Recommendation): string {\n const effortMap = {\n LOW: \"1-2 hours\",\n MEDIUM: \"1-2 days\",\n HIGH: \"1-2 weeks\",\n }\n return effortMap[rec.effort] || \"1-2 days\"\n }\n\n private assessBusinessImpact(rec: Recommendation): \"LOW\" | \"MEDIUM\" | \"HIGH\" | \"CRITICAL\" {\n if (rec.type === \"SECURITY\" && (rec.severity === \"CRITICAL\" || rec.severity === \"HIGH\")) {\n return \"CRITICAL\"\n }\n if (rec.type === \"SECURITY\" || (rec.type === \"PERFORMANCE\" && rec.severity === \"HIGH\")) {\n return \"HIGH\"\n }\n if (rec.type === \"PERFORMANCE\" || rec.type === \"MAINTAINABILITY\") {\n return \"MEDIUM\"\n }\n return \"LOW\"\n }\n\n private generateImplementationSteps(rec: Recommendation): string[] {\n const baseSteps = [\n \"Review current implementation\",\n \"Plan the solution approach\",\n \"Implement the changes\",\n \"Test the implementation\",\n \"Deploy and monitor\",\n ]\n\n if (rec.type === \"SECURITY\") {\n return [\n \"Conduct security assessment\",\n \"Design security controls\",\n \"Implement security measures\",\n \"Perform security testing\",\n \"Deploy with monitoring\",\n ]\n }\n\n if (rec.type === \"PERFORMANCE\") {\n return [\n \"Profile current performance\",\n \"Identify bottlenecks\",\n \"Implement optimizations\",\n \"Benchmark improvements\",\n \"Deploy and monitor metrics\",\n ]\n }\n\n return baseSteps\n }\n\n private identifyDependencies(rec: Recommendation): string[] {\n const dependencies = []\n\n if (rec.type === \"SECURITY\" && rec.category === \"authentication\") {\n dependencies.push(\"Authentication system setup\", \"User management system\")\n }\n\n if (rec.type === \"PERFORMANCE\" && rec.category === \"caching\") {\n dependencies.push(\"Cache infrastructure\", \"Cache invalidation strategy\")\n }\n\n if (rec.category === \"testing\") {\n dependencies.push(\"Testing framework setup\", \"CI/CD pipeline\")\n }\n\n return dependencies\n }\n\n private assessRiskOfNotImplementing(rec: Recommendation): string {\n if (rec.type === \"SECURITY\") {\n return \"Potential security breach, data loss, compliance violations, and reputational damage\"\n }\n\n if (rec.type === \"PERFORMANCE\") {\n return \"Degraded user experience, increased infrastructure costs, and scalability issues\"\n }\n\n if (rec.type === \"MAINTAINABILITY\") {\n return \"Increased development time, higher bug rates, and technical debt accumulation\"\n }\n\n return \"Reduced code quality and development efficiency\"\n }\n\n private calculateTechnicalDebtEffort(routeCount: number, recommendationCount: number): string {\n const totalEffort = routeCount * 0.5 + recommendationCount * 2 // Rough estimation\n\n if (totalEffort < 40) return \"1-2 weeks\"\n if (totalEffort < 80) return \"1-2 months\"\n if (totalEffort < 160) return \"2-4 months\"\n return \"4+ months\"\n }\n\n private generateConfigHash(): string {\n const configString = JSON.stringify(this.config)\n let hash = 0\n for (let i = 0; i < configString.length; i++) {\n const char = configString.charCodeAt(i)\n hash = (hash << 5) - hash + char\n hash = hash & hash\n }\n return Math.abs(hash).toString(16)\n }\n\n private getTrendIndicator(trend?: { trend: string }): string {\n if (!trend) return \"-\"\n\n switch (trend.trend) {\n case \"IMPROVING\":\n return \"๐\"\n case \"DECLINING\":\n return \"๐\"\n case \"STABLE\":\n return \"โก๏ธ\"\n default:\n return \"-\"\n }\n }\n\n private getTrendEmoji(trend: string): string {\n switch (trend) {\n case \"IMPROVING\":\n return \"๐\"\n case \"DECLINING\":\n return \"๐\"\n case \"INCREASING\":\n return \"๐\"\n case \"DECREASING\":\n return \"๐\"\n case \"STABLE\":\n return \"โก๏ธ\"\n default:\n return \"โก๏ธ\"\n }\n }\n\n private getChangeImpact(change: number): string {\n if (Math.abs(change) < 2) return \"โก๏ธ Minimal\"\n if (change > 0) return \"๐ Positive\"\n return \"๐ Negative\"\n }\n\n private getAffectedRoutes(recommendations: Recommendation[]): string {\n const routes = new Set(recommendations.map((r) => r.route).filter(Boolean))\n return routes.size.toString()\n }\n}"],"mappings":";;;;;;;;AAAA,SAAS,eAAe;;;ACAxB,OAAOA,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,SAAQ;;;ACFf;AAAA;AAAA;AAAA;AAAA;AAEA,IAAM,gBAA+B;AAAA,EACjC,EAAE,MAAM,eAAe,SAAS,wCAAwC,MAAM,eAAe,YAAY,IAAI;AAAA,EAC7G,EAAE,MAAM,OAAO,SAAS,kCAAkC,MAAM,OAAO,YAAY,IAAI;AAAA,EACvF,EAAE,MAAM,gBAAgB,SAAS,yCAAyC,MAAM,gBAAgB,YAAY,IAAI;AAAA,EAChH,EAAE,MAAM,WAAW,SAAS,0BAA0B,MAAM,WAAW,YAAY,IAAI;AAAA,EACvF,EAAE,MAAM,WAAW,SAAS,iCAAiC,MAAM,WAAW,YAAY,IAAI;AAAA,EAC9F,EAAE,MAAM,iBAAiB,SAAS,2BAA2B,MAAM,iBAAiB,YAAY,IAAI;AAAA,EACpG,EAAE,MAAM,iBAAiB,SAAS,sCAAsC,MAAM,iBAAiB,YAAY,IAAI;AAAA,EAC/G,EAAE,MAAM,SAAS,SAAS,iBAAiB,MAAM,SAAS,YAAY,IAAI;AAAA,EAC1E,EAAE,MAAM,YAAY,SAAS,iCAAiC,MAAM,YAAY,YAAY,IAAI;AACpG;AAEA,IAAM,sBAA2C;AAAA,EAC7C,EAAE,MAAM,QAAQ,SAAS,gCAAgC,UAAU,WAAW;AAAA,EAC9E,EAAE,MAAM,UAAU,SAAS,8BAA8B,UAAU,WAAW;AAAA,EAC9E,EAAE,MAAM,iBAAiB,SAAS,0CAA0C,UAAU,WAAW;AAAA,EACjG,EAAE,MAAM,eAAe,SAAS,6BAA6B,UAAU,UAAU;AAAA,EACjF,EAAE,MAAM,UAAU,SAAS,yBAAyB,UAAU,gBAAgB;AAAA,EAC9E,EAAE,MAAM,cAAc,SAAS,wCAAwC,UAAU,aAAa;AAAA,EAC9F,EAAE,MAAM,WAAW,SAAS,0BAA0B,UAAU,UAAU;AAAA,EAC1E,EAAE,MAAM,eAAe,SAAS,kBAAkB,UAAU,cAAc;AAAA,EAC1E,EAAE,MAAM,iBAAiB,SAAS,+BAA+B,UAAU,UAAU;AAAA,EACrF,EAAE,MAAM,QAAQ,SAAS,eAAe,UAAU,WAAW;AACjE;AAEO,IAAM,iBAAiC;AAAA,EAC1C,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,iBAAiB,CAAC,WAAW,WAAW,UAAU;AAAA,EAClD,iBAAiB,CAAC,sBAAsB,eAAe,eAAe,aAAa,cAAc,aAAa;AAAA,EAC9G,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,YAAY;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,YAAY;AAAA,EAChB;AAAA,EACA,OAAO;AAAA,IACH,SAAS;AAAA,IACT,KAAK;AAAA,IACL,WAAW;AAAA,EACf;AAAA,EACA,UAAU;AAAA,EACV,gBAAgB;AACpB;AAEO,SAAS,eAAe,QAAkC;AAC7D,QAAM,SAAmB,CAAC;AAE1B,MAAI,CAAC,OAAO,QAAQ;AAChB,WAAO,KAAK,oBAAoB;AAAA,EACpC;AAEA,MAAI,OAAO,WAAW,WAAW,KAAK,OAAO,WAAW,WAAW,KAAK;AACpE,WAAO,KAAK,8CAA8C;AAAA,EAC9D;AAEA,MAAI,OAAO,WAAW,cAAc,KAAK,OAAO,WAAW,cAAc,KAAK;AAC1E,WAAO,KAAK,iDAAiD;AAAA,EACjE;AAEA,SAAO;AACX;;;ACrEA;AAAA;AAAA;AAAA;AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,YAAY;AACrB,OAAO,YAAY;;;ACHnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,IAAK,WAAL,kBAAKC,cAAL;AACH,EAAAA,oBAAA,WAAQ,KAAR;AACA,EAAAA,oBAAA,UAAO,KAAP;AACA,EAAAA,oBAAA,UAAO,KAAP;AACA,EAAAA,oBAAA,WAAQ,KAAR;AAJQ,SAAAA;AAAA,GAAA;AAaL,IAAM,SAAN,MAAM,QAAO;AAAA,EAAb;AAEH,SAAQ,SAAuB;AAAA,MAC3B,OAAO;AAAA,MACP,QAAQ;AAAA,IACZ;AAAA;AAAA,EAEA,OAAO,cAAsB;AACzB,QAAI,CAAC,QAAO,UAAU;AAClB,cAAO,WAAW,IAAI,QAAO;AAAA,IACjC;AACA,WAAO,QAAO;AAAA,EAClB;AAAA,EAEA,UAAU,QAAqC;AAC3C,SAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,GAAG,OAAO;AAAA,EAC9C;AAAA,EAEQ,UAAU,OAA0B;AACxC,WAAO,SAAS,KAAK,OAAO;AAAA,EAChC;AAAA,EAEQ,cAAc,OAAe,SAAiB,OAAuB;AACzE,UAAM,SAAS,KAAK,OAAO,SAAS,IAAI,KAAK,OAAO,MAAM,OAAO;AACjE,WAAO,KAAK,OAAO,SAAS,GAAG,MAAM,GAAG,KAAK,IAAI,OAAO,KAAK,GAAG,MAAM,GAAG,KAAK,KAAK,OAAO;AAAA,EAC9F;AAAA,EAEA,MAAM,YAAoB,MAAmB;AACzC,QAAI,KAAK,UAAU,aAAc,GAAG;AAChC,cAAQ,IAAI,KAAK,cAAc,SAAS,SAAS,WAAI,GAAG,GAAG,IAAI;AAAA,IACnE;AAAA,EACJ;AAAA,EAEA,KAAK,YAAoB,MAAmB;AACxC,QAAI,KAAK,UAAU,YAAa,GAAG;AAC/B,cAAQ,IAAI,KAAK,cAAc,QAAQ,SAAS,cAAI,GAAG,GAAG,IAAI;AAAA,IAClE;AAAA,EACJ;AAAA,EAEA,QAAQ,YAAoB,MAAmB;AAC3C,QAAI,KAAK,UAAU,YAAa,GAAG;AAC/B,cAAQ,IAAI,KAAK,cAAc,WAAW,SAAS,QAAG,GAAG,GAAG,IAAI;AAAA,IACpE;AAAA,EACJ;AAAA,EAEA,KAAK,YAAoB,MAAmB;AACxC,QAAI,KAAK,UAAU,YAAa,GAAG;AAC/B,cAAQ,KAAK,KAAK,cAAc,QAAQ,SAAS,cAAI,GAAG,GAAG,IAAI;AAAA,IACnE;AAAA,EACJ;AAAA,EAEA,MAAM,YAAoB,MAAmB;AACzC,QAAI,KAAK,UAAU,aAAc,GAAG;AAChC,cAAQ,MAAM,KAAK,cAAc,SAAS,SAAS,QAAG,GAAG,GAAG,IAAI;AAAA,IACpE;AAAA,EACJ;AAAA,EAEA,SAAS,SAAuB;AAC5B,QAAI,KAAK,UAAU,YAAa,GAAG;AAC/B,cAAQ,OAAO,MAAM,UAAK,OAAO,OAAO;AAAA,IAC5C;AAAA,EACJ;AAAA,EAEA,gBAAsB;AAClB,YAAQ,OAAO,MAAM,UAAU;AAAA,EACnC;AAAA,EAEA,YAAkB;AACd,QAAI,KAAK,UAAU,YAAa,GAAG;AAC/B,cAAQ,IAAI,SAAI,OAAO,EAAE,CAAC;AAAA,IAC9B;AAAA,EACJ;AACJ;AAEO,IAAM,SAAS,OAAO,YAAY;;;ADhFlC,IAAM,YAAN,MAAgB;AAAA,EACnB,aAAa,aAAa,QAA2C;AACjE,QAAI;AACA,YAAM,WAAW,OAAO,gBAAgB,IAAI,CAAC,YAAY,KAAK,KAAK,OAAO,QAAQ,OAAO,EAAE,QAAQ,OAAO,GAAG,CAAC;AAE9G,YAAM,WAAqB,CAAC;AAC5B,iBAAW,WAAW,UAAU;AAC5B,cAAM,UAAU,MAAM,KAAK,SAAS;AAAA,UAChC,QAAQ,OAAO;AAAA,UACf,UAAU;AAAA,UACV,OAAO;AAAA,QACX,CAAC;AACD,iBAAS,KAAK,GAAG,OAAO;AAAA,MAC5B;AAEA,YAAM,cAAc,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC;AACzC,aAAO,YAAY,OAAO,CAAC,SAAS,KAAK,UAAU,IAAI,CAAC;AAAA,IAC5D,SAAS,OAAO;AACZ,aAAO,MAAM,4BAA4B,KAAK;AAC9C,YAAM,IAAI,MAAM,6BAA6B,KAAK,EAAE;AAAA,IACxD;AAAA,EACJ;AAAA,EAEA,OAAO,UAAU,UAA2B;AACxC,UAAM,WAAW,KAAK,SAAS,QAAQ;AACvC,UAAM,2BAA2B,iBAAiB,KAAK,QAAQ;AAC/D,UAAM,cAAc,aAAa,cAAc,aAAa;AAC5D,UAAM,mBAAmB,SAAS,SAAS,OAAO,KAAK,SAAS,SAAS,SAAS;AAElF,WAAO,6BAA6B,eAAe;AAAA,EACvD;AAAA,EAEA,aAAa,aAAa,UAIvB;AACC,QAAI;AACA,YAAM,CAAC,OAAO,OAAO,IAAI,MAAM,QAAQ,IAAI,CAAC,GAAG,KAAK,QAAQ,GAAG,GAAG,SAAS,UAAU,OAAO,CAAC,CAAC;AAE9F,YAAM,cAAc,QAAQ,MAAM,IAAI,EAAE,OAAO,CAAC,SAAS;AACrD,cAAM,UAAU,KAAK,KAAK;AAC1B,eAAO,WAAW,CAAC,QAAQ,WAAW,IAAI,KAAK,CAAC,QAAQ,WAAW,IAAI;AAAA,MAC3E,CAAC,EAAE;AAEH,aAAO;AAAA,QACH,MAAM,MAAM;AAAA,QACZ,cAAc,MAAM;AAAA,QACpB;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO,MAAM,gCAAgC,QAAQ,KAAK,KAAK;AAC/D,YAAM;AAAA,IACV;AAAA,EACJ;AAAA,EAEA,aAAa,sBAAsB,SAAgC;AAC/D,QAAI;AACA,YAAM,GAAG,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,IAC/C,SAAS,OAAO;AACZ,UAAK,MAAgC,SAAS,UAAU;AACpD,cAAM;AAAA,MACV;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,aAAa,cAAc,UAAkB,MAA0B;AACnE,UAAM,KAAK,sBAAsB,KAAK,QAAQ,QAAQ,CAAC;AACvD,UAAM,GAAG,UAAU,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,OAAO;AAAA,EACvE;AAAA,EAEA,aAAa,aAAgB,UAAqC;AAC9D,QAAI;AACA,YAAM,UAAU,MAAM,GAAG,SAAS,UAAU,OAAO;AACnD,aAAO,KAAK,MAAM,OAAO;AAAA,IAC7B,SAAS,OAAO;AACZ,UAAK,MAAgC,SAAS,UAAU;AACpD,eAAO;AAAA,MACX;AACA,YAAM;AAAA,IACV;AAAA,EACJ;AAAA,EAEA,aAAa,UAAU,UAAkB,SAAgC;AACrE,UAAM,KAAK,sBAAsB,KAAK,QAAQ,QAAQ,CAAC;AACvD,UAAM,GAAG,UAAU,UAAU,SAAS,OAAO;AAAA,EACjD;AAAA,EAEA,OAAO,aAAa,SAAyB;AACzC,WAAO,OAAO,WAAW,KAAK,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAAA,EAChE;AAAA,EAEA,aAAa,WAAW,UAAoC;AACxD,QAAI;AACA,YAAM,GAAG,OAAO,QAAQ;AACxB,aAAO;AAAA,IACX,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AACJ;;;AE3GA;AAAA;AAAA;AAAA;;;ACEO,IAAM,uBAAuB,CAChC,IACA,MACA,UACA,OACA,aACA,OACA,UACA,QACA,QACA,UACA,OAAiB,CAAC,GAClB,aACA,gBACkB;AAAA,EAClB,IAAI,GAAG,EAAE,IAAI,MAAM,QAAQ,iBAAiB,GAAG,CAAC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAEO,IAAM,qBAAqB,CAAC,UAA6B;AAC5D,MAAI,SAAS,GAAI,QAAO;AACxB,MAAI,SAAS,GAAI,QAAO;AACxB,MAAI,SAAS,GAAI,QAAO;AACxB,SAAO;AACX;AAEO,IAAM,gBAAgB,CAAC,UAA0B;AACpD,MAAI,SAAS,GAAI,QAAO;AACxB,MAAI,SAAS,GAAI,QAAO;AACxB,MAAI,SAAS,GAAI,QAAO;AACxB,SAAO;AACX;AAEO,IAAM,eAAe,CAAC,SAA4B;AACrD,QAAM,WAAW,EAAE,KAAK,aAAM,QAAQ,aAAM,MAAM,aAAM,UAAU,YAAK;AACvE,SAAO,SAAS,IAAI;AACxB;AAEO,IAAM,oBAAoB,CAAC,aAA+B;AAC7D,QAAM,UAAU,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,EAAE;AAC1D,SAAO,QAAQ,QAAQ;AAC3B;AAEO,IAAM,oBAAoB;AAAA,EAC7B,eAAe,CAAC,sBAAsB,yBAAyB,sBAAsB;AAAA,EACrF,KAAK,CAAC,2BAA2B,2BAA2B,kBAAkB;AAAA,EAC9E,mBAAmB;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;AAEO,IAAM,uBAAuB;AAAA,EAChC,qBAAqB,CAAC,oBAAoB,qBAAqB,yBAAyB;AAAA,EACxF,qBAAqB,CAAC,cAAc,cAAc,OAAO;AAAA,EACzD,cAAc,CAAC,oBAAoB,2BAA2B,UAAU;AAC5E;;;ACrEA,OAAO,QAAQ;AAER,IAAe,eAAf,MAA4B;AAAA,EAG/B,OAAiB,eAAe,SAAiB,YAA2B,aAAgC;AACxG,UAAM,UAAU,oBAAI,IAAY;AAEhC,QAAI,aAAa;AACb,YAAM,cAAc,CAAC,OAAO,QAAQ,OAAO,UAAU,SAAS,QAAQ,SAAS;AAC/E,SAAG,aAAa,YAAY,CAAC,SAAS;AAClC,YAAI,GAAG,sBAAsB,IAAI,KAAK,KAAK,QAAQ,YAAY,SAAS,KAAK,KAAK,IAAI,GAAG;AACrF,kBAAQ,IAAI,KAAK,KAAK,IAAI;AAAA,QAC9B;AAAA,MACJ,CAAC;AAAA,IACL,OAAO;AACH,YAAM,cAAc;AACpB,UAAI;AACJ,cAAQ,QAAQ,YAAY,KAAK,OAAO,OAAO,MAAM;AACjD,gBAAQ,IAAI,MAAM,CAAC,EAAE,YAAY,CAAC;AAAA,MACtC;AAAA,IACJ;AAEA,WAAO,QAAQ,SAAS,IAAI,CAAC,KAAK,IAAI,MAAM,KAAK,OAAO;AAAA,EAC5D;AAAA,EAEA,OAAiB,cAAc,SAAiB,SAA2B;AACvE,UAAM,SAAS,oBAAI,IAAY;AAC/B,QAAI;AACJ,YAAQ,QAAQ,QAAQ,KAAK,OAAO,OAAO,MAAM;AAC7C,aAAO,IAAI,MAAM,CAAC,CAAC;AAAA,IACvB;AACA,WAAO,MAAM,KAAK,MAAM;AAAA,EAC5B;AAAA,EAEA,OAAiB,oBAAoB,YAAmC;AACpE,QAAI,aAAa;AAEjB,UAAM,QAAQ,CAAC,SAAkB;AAC7B,cAAQ,KAAK,MAAM;AAAA,QACf,KAAK,GAAG,WAAW;AAAA,QACnB,KAAK,GAAG,WAAW;AAAA,QACnB,KAAK,GAAG,WAAW;AAAA,QACnB,KAAK,GAAG,WAAW;AAAA,QACnB,KAAK,GAAG,WAAW;AACf;AACA;AAAA,MACR;AACA,SAAG,aAAa,MAAM,KAAK;AAAA,IAC/B;AAEA,UAAM,UAAU;AAChB,WAAO;AAAA,EACX;AACJ;AApDsB,aACD,uBAAuB;;;AFUrC,IAAM,mBAAN,cAA+B,aAAa;AAAA,EA2F/C,OAAO,aACH,OACA,SAMF;AACE,UAAM,kBAAoC,CAAC;AAC3C,UAAM,kBAA4B,CAAC;AACnC,QAAI,YAAY;AAEhB,QAAI;AACA,UAAI,CAAC,MAAM,WAAW,KAAK,iBAAiB,KAAK,GAAG;AAChD,qBAAa;AACb,wBAAgB;AAAA,UACZ,KAAK;AAAA,YACD;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,SAAS,MAAM,IAAI,WAAW,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,YACtD,MAAM;AAAA,YACN;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,CAAC,YAAY,MAAM;AAAA,UACvB;AAAA,QACJ;AAAA,MACJ;AAEA,iBAAW,iBAAiB,KAAK,iBAAiB;AAC9C,mBAAW,WAAW,cAAc,UAAU;AAC1C,cAAI,QAAQ,KAAK,OAAO,GAAG;AACvB,yBAAa,cAAc;AAC3B,4BAAgB,KAAK,cAAc,IAAI;AAEvC,4BAAgB;AAAA,cACZ,KAAK;AAAA,gBACD,cAAc;AAAA,gBACd;AAAA,gBACA,cAAc;AAAA,gBACd,aAAa,cAAc,KAAK,QAAQ,KAAK,GAAG,CAAC;AAAA,gBACjD,sCAAsC,cAAc,KAAK,YAAY,EAAE,QAAQ,KAAK,GAAG,CAAC;AAAA,gBACxF,MAAM;AAAA,gBACN,KAAK,yBAAyB,cAAc,IAAI;AAAA,gBAChD,KAAK,uBAAuB,cAAc,IAAI;AAAA,gBAC9C;AAAA,gBACA,cAAc;AAAA,gBACd,CAAC,YAAY,cAAc,QAAQ;AAAA,cACvC;AAAA,YACJ;AACA;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,aAAO,QAAQ,iBAAiB,EAAE,QAAQ,CAAC,CAAC,UAAU,QAAQ,MAAM;AAChE,YAAI,SAAS,KAAK,CAAC,YAAY,QAAQ,KAAK,OAAO,CAAC,GAAG;AACnD,gBAAM,WAAW,aAAa,kBAAkB,aAAa;AAC7D,gBAAM,QAAQ,aAAa,aAAa,KAAK;AAC7C,uBAAa;AAEb,0BAAgB;AAAA,YACZ,KAAK;AAAA,cACD;AAAA,cACA;AAAA,cACA;AAAA,cACA,aAAa,SAAS,QAAQ,KAAK,GAAG,CAAC;AAAA,cACvC,sCAAsC,SAAS,YAAY,EAAE,QAAQ,KAAK,GAAG,CAAC;AAAA,cAC9E,MAAM;AAAA,cACN,KAAK,yBAAyB,QAAQ;AAAA,cACtC,KAAK,uBAAuB,QAAQ;AAAA,cACpC;AAAA,cACA;AAAA,cACA,CAAC,YAAY,SAAS,YAAY,CAAC;AAAA,YACvC;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ,CAAC;AAED,YAAM,YAAY,mBAAmB,SAAS;AAC9C,YAAM,gBAAgB,KAAK,IAAI,GAAG,MAAM,SAAS;AAEjD,aAAO,MAAM,yBAAyB,MAAM,IAAI,WAAW,aAAa,UAAU,SAAS,EAAE;AAE7F,aAAO,EAAE,WAAW,iBAAiB,eAAe,gBAAgB;AAAA,IACxE,SAAS,OAAO;AACZ,aAAO,MAAM,kCAAkC,MAAM,IAAI,KAAK,KAAK;AACnE,aAAO;AAAA,QACH,WAAW;AAAA,QACX,iBAAiB,CAAC;AAAA,QAClB,eAAe;AAAA,QACf,iBAAiB,CAAC;AAAA,MACtB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,OAAe,iBAAiB,OAA8B;AAC1D,UAAM,mBAAmB,CAAC,QAAQ,OAAO,UAAU,OAAO;AAC1D,UAAM,wBAAwB,CAAC,cAAc,iBAAiB,aAAa,eAAe,iBAAiB,mBAAmB,iBAAiB,gBAAgB;AAE/J,WACI,MAAM,QAAQ,KAAK,CAAC,WAAW,iBAAiB,SAAS,MAAM,CAAC,KAChE,sBAAsB,KAAK,CAAC,YAAY,QAAQ,KAAK,MAAM,IAAI,CAAC;AAAA,EAExE;AAAA,EAEA,OAAe,yBAAyB,eAA+B;AACnE,UAAM,YAAoC;AAAA,MACtC,eAAe;AAAA,MACf,KAAK;AAAA,MACL,mBAAmB;AAAA,IACvB;AACA,WAAO,UAAU,aAAa,KAAK;AAAA,EACvC;AAAA,EAEA,OAAe,uBAAuB,eAA+B;AACjE,UAAM,UAAkC;AAAA,MACpC,eAAe;AAAA,MACf,KAAK;AAAA,MACL,mBAAmB;AAAA,IACvB;AACA,WAAO,QAAQ,aAAa,KAAK;AAAA,EACrC;AACJ;AA1Na,iBACe,kBAA2C;AAAA,EAC/D;AAAA,IACI,MAAM;AAAA,IACN,UAAU;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,KAAK;AAAA,EACT;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,UAAU;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,KAAK;AAAA,EACT;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,UAAU;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,KAAK;AAAA,EACT;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,UAAU;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,KAAK;AAAA,EACT;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,UAAU;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,KAAK;AAAA,EACT;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,UAAU,CAAC,aAAa,6BAA6B,+BAA+B,wBAAwB;AAAA,IAC5G,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,KAAK;AAAA,EACT;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,UAAU,CAAC,uBAAuB,wBAAwB,yBAAyB,sBAAsB;AAAA,IACzG,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,KAAK;AAAA,EACT;AACJ;;;AGvGJ;AAAA;AAAA;AAAA;AAKO,IAAM,sBAAN,cAAkC,aAAa;AAAA,EAClD,OAAO,aACH,OACA,SACA,YAKF;AACE,UAAM,kBAAoC,CAAC;AAC3C,QAAI,mBAAmB;AACvB,UAAM,aAAa,KAAK,oBAAoB,UAAU;AAEtD,WAAO,QAAQ,oBAAoB,EAAE,QAAQ,CAAC,CAAC,WAAW,QAAQ,MAAM;AACpE,UAAI,SAAS,KAAK,CAAC,YAAY,QAAQ,KAAK,OAAO,CAAC,GAAG;AACnD,cAAM,QAAQ,KAAK,cAAc,SAAS;AAC1C,4BAAoB;AAEpB,wBAAgB;AAAA,UACZ,KAAK;AAAA,YACD;AAAA,YACA;AAAA,YACA,KAAK,iBAAiB,SAAS;AAAA,YAC/B,KAAK,cAAc,SAAS;AAAA,YAC5B,KAAK,oBAAoB,SAAS;AAAA,YAClC,MAAM;AAAA,YACN,KAAK,iBAAiB,SAAS;AAAA,YAC/B,KAAK,eAAe,SAAS;AAAA,YAC7B;AAAA,YACA;AAAA,YACA,CAAC,eAAe,UAAU,YAAY,CAAC;AAAA,UAC3C;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,CAAC;AAED,QAAI,aAAa,IAAI;AACjB,YAAM,oBAAoB,KAAK,IAAI,KAAK,aAAa,MAAM,CAAC;AAC5D,0BAAoB;AAEpB,sBAAgB;AAAA,QACZ,KAAK;AAAA,UACD;AAAA,UACA;AAAA,UACA,aAAa,KAAK,SAAS;AAAA,UAC3B;AAAA,UACA,yCAAyC,UAAU;AAAA,UACnD,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,CAAC,cAAc,iBAAiB;AAAA,QACpC;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,MACH,kBAAkB,KAAK,IAAI,GAAG,gBAAgB;AAAA,MAC9C;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,OAAe,cAAc,WAA2B;AACpD,UAAM,SAAS;AAAA,MACX,qBAAqB;AAAA,MACrB,qBAAqB;AAAA,MACrB,cAAc;AAAA,IAClB;AACA,WAAO,OAAO,SAAgC,KAAK;AAAA,EACvD;AAAA,EAEA,OAAe,iBAAiB,WAA8C;AAC1E,UAAM,aAAa;AAAA,MACf,qBAAqB;AAAA,MACrB,qBAAqB;AAAA,MACrB,cAAc;AAAA,IAClB;AACA,WAAO,WAAW,SAAoC,KAAK;AAAA,EAC/D;AAAA,EAEA,OAAe,cAAc,WAA2B;AACpD,UAAM,SAAS;AAAA,MACX,qBAAqB;AAAA,MACrB,qBAAqB;AAAA,MACrB,cAAc;AAAA,IAClB;AACA,WAAO,OAAO,SAAgC,KAAK;AAAA,EACvD;AAAA,EAEA,OAAe,oBAAoB,WAA2B;AAC1D,UAAM,eAAe;AAAA,MACjB,qBAAqB;AAAA,MACrB,qBAAqB;AAAA,MACrB,cAAc;AAAA,IAClB;AACA,WAAO,aAAa,SAAsC,KAAK;AAAA,EACnE;AAAA,EAEA,OAAe,iBAAiB,WAA2B;AACvD,UAAM,YAAY;AAAA,MACd,qBAAqB;AAAA,MACrB,qBAAqB;AAAA,MACrB,cAAc;AAAA,IAClB;AACA,WAAO,UAAU,SAAmC,KAAK;AAAA,EAC7D;AAAA,EAEA,OAAe,eAAe,WAA2B;AACrD,UAAM,UAAU;AAAA,MACZ,qBAAqB;AAAA,MACrB,qBAAqB;AAAA,MACrB,cAAc;AAAA,IAClB;AACA,WAAO,QAAQ,SAAiC,KAAK;AAAA,EACzD;AACJ;;;APhHO,IAAM,kBAAN,MAAsB;AAAA,EAKzB,YAAY,SAAkC,CAAC,GAAG;AAHlD,SAAQ,SAAyB,CAAC;AAClC,SAAQ,YAAY;AAGhB,SAAK,SAAS,EAAE,GAAG,gBAAgB,GAAG,OAAO;AAAA,EACjD;AAAA,EAEA,MAAM,gBAA4C;AAC9C,SAAK,YAAY,KAAK,IAAI;AAC1B,SAAK,SAAS,CAAC;AAEf,WAAO,KAAK,iCAAiC;AAE7C,UAAM,QAAQ,MAAM,UAAU,aAAa,KAAK,MAAM;AACtD,WAAO,KAAK,SAAS,MAAM,MAAM,YAAY;AAE7C,eAAW,QAAQ,OAAO;AACtB,YAAM,KAAK,YAAY,IAAI;AAAA,IAC/B;AAEA,WAAO,QAAQ,YAAY,KAAK,OAAO,MAAM,aAAa;AAC1D,WAAO,KAAK,uBAAuB;AAAA,EACvC;AAAA,EAEA,MAAc,YAAY,UAAiC;AACvD,QAAI;AACA,YAAM,UAAUC,IAAG,aAAa,UAAU,OAAO;AACjD,YAAM,YAAY,MAAM,UAAU,aAAa,QAAQ;AACvD,YAAM,YAAY,MAAM,KAAK,eAAe,UAAU,SAAS,SAAS;AACxE,WAAK,OAAO,KAAK,SAAS;AAAA,IAC9B,SAAS,OAAO;AACZ,aAAO,MAAM,wBAAwB,QAAQ,KAAK,KAAK;AAAA,IAC3D;AAAA,EACJ;AAAA,EAEA,MAAc,eACV,UACA,SACA,WACqB;AACrB,UAAM,YAAY,KAAK,aAAa,QAAQ;AAC5C,UAAM,cAAc,KAAK,gBAAgB,QAAQ;AACjD,UAAM,aAAaC,IAAG,iBAAiB,UAAU,SAASA,IAAG,aAAa,QAAQ,IAAI;AAEtF,UAAM,YAAmC;AAAA,MACrC,MAAM;AAAA,MACN,SAAS,KAAK,eAAe,SAAS,YAAY,WAAW;AAAA,MAC7D,SAAS,KAAK,WAAW,OAAO;AAAA,MAChC,WAAW,KAAK,iBAAiB,OAAO;AAAA,MACxC,aAAa,KAAK,mBAAmB,SAAS,WAAW;AAAA,MACzD,YAAY,KAAK,kBAAkB,SAAS;AAAA,MAC5C,YAAY,KAAK,kBAAkB,SAAS,WAAW;AAAA,MACvD,SAAS,KAAK,eAAe,OAAO;AAAA,MACpC,kBAAkB,KAAK,wBAAwB,SAAS,WAAW;AAAA,MACnE,aAAa,KAAK,mBAAmB,OAAO;AAAA,MAC5C,aAAa,KAAK,mBAAmB,OAAO;AAAA,MAC5C,cAAc,KAAK,gBAAgB,OAAO;AAAA,MAC1C,SAAS,KAAK,WAAW,OAAO;AAAA,MAChC,oBAAoB,KAAK,sBAAsB,OAAO;AAAA,MACtD,cAAc,KAAK,oBAAoB,UAAU;AAAA,MACjD,UAAU,UAAU;AAAA,MACpB,aAAa,UAAU;AAAA,MACvB,cAAc,UAAU;AAAA,IAC5B;AAEA,UAAM,mBAAmB,iBAAiB,aAAa,WAA2B,OAAO;AACzF,UAAM,sBAAsB,oBAAoB,aAAa,WAA2B,SAAS,UAAU;AAE3G,WAAO;AAAA,MACH,GAAG;AAAA,MACH,WAAW,iBAAiB;AAAA,MAC5B,YAAY,oBAAoB;AAAA,MAChC,kBAAkB,oBAAoB;AAAA,IAC1C;AAAA,EACJ;AAAA,EAEQ,yBAA4C;AAChD,UAAM,WAAW,KAAK,IAAI,IAAI,KAAK;AACnC,UAAM,kBAAkB,KAAK,wBAAwB;AAErD,UAAM,UAAU;AAAA,MACZ,aAAa,KAAK,OAAO;AAAA,MACzB,cAAc,KAAK,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,MACnD,cAAc,KAAK,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE;AAAA,MACpD,kBAAkB,KAAK,0BAA0B;AAAA,MACjD,wBAAwB,KAAK,gCAAgC;AAAA,MAC7D,kBAAkB,KAAK,0BAA0B;AAAA,MACjD,eAAe,KAAK,uBAAuB;AAAA,MAC3C,kBAAkB,KAAK,0BAA0B;AAAA,MACjD,sBAAsB,KAAK,8BAA8B;AAAA,MACzD,mBAAmB;AAAA,IACvB;AAEA,WAAO;AAAA,MACH,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,UAAU;AAAA,QACN,YAAY,oBAAI,KAAK;AAAA,QACrB,SAAS;AAAA,QACT;AAAA,QACA,YAAY,KAAK,OAAO;AAAA,QACxB,kBAAkB,KAAK,OAAO,OAAO,CAAC,KAAK,UAAU,OAAO,MAAM,eAAe,IAAI,CAAC;AAAA,MAC1F;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,eAAe,UAAqC;AAChD,QAAI,SAAS;AAEb,cAAU,kBAAkB,SAAS,SAAS,WAAW,eAAe,CAAC;AAAA;AACzE,cAAU,iBAAiB,SAAS,SAAS,QAAQ;AAAA;AACrD,cAAU,cAAc,SAAS,SAAS,UAAU;AAAA;AAAA;AAEpD,cAAU;AACV,cAAU;AAAA;AACV,cAAU;AAAA;AACV,cAAU,oBAAoB,SAAS,QAAQ,WAAW;AAAA;AAC1D,cAAU,sBAAsB,SAAS,QAAQ,cAAc,QAAQ,CAAC,CAAC,OAAO,cAAc,SAAS,QAAQ,aAAa,CAAC;AAAA;AAC7H,cAAU,yBAAyB,SAAS,QAAQ,iBAAiB,QAAQ,CAAC,CAAC,OAAO,cAAc,SAAS,QAAQ,gBAAgB,CAAC;AAAA;AAAA;AAEtI,QAAI,SAAS,gBAAgB,SAAS,GAAG;AACrC,gBAAU;AACV,eAAS,gBACJ,KAAK,CAAC,GAAG,MAAM,kBAAkB,EAAE,QAAQ,IAAI,kBAAkB,EAAE,QAAQ,CAAC,EAC5E,MAAM,GAAG,EAAE,EACX,QAAQ,CAAC,KAAK,UAAU;AACrB,kBAAU,OAAO,QAAQ,CAAC,KAAK,IAAI,KAAK;AAAA;AACxC,kBAAU,iBAAiB,IAAI,QAAQ,gBAAgB,IAAI,IAAI;AAAA;AAAA;AAC/D,kBAAU,GAAG,IAAI,WAAW;AAAA;AAAA;AAC5B,kBAAU,iBAAiB,IAAI,QAAQ;AAAA;AAAA;AAAA,MAC3C,CAAC;AAAA,IACT;AAEA,WAAO;AAAA,EACX;AAAA,EAEQ,gBAAgB,UAA2B;AAC/C,WAAO,SAAS,SAAS,SAAS,KAAK,SAAS,SAAS,UAAU,KAAK,SAAS,SAAS,UAAU;AAAA,EACxG;AAAA,EAEQ,aAAa,UAA0B;AAC3C,UAAM,eAAeC,MAAK,SAAS,KAAK,OAAO,QAAQ,QAAQ;AAC/D,WACI,MACA,aACK,QAAQ,OAAO,GAAG,EAClB,QAAQ,kBAAkB,EAAE,EAC5B,QAAQ,YAAY,EAAE,EACtB,QAAQ,YAAY,EAAE,EACtB,QAAQ,iBAAiB,KAAK;AAAA,EAE3C;AAAA,EAEQ,eAAe,SAAiB,YAA2B,aAAgC;AAC/F,UAAM,UAAU,oBAAI,IAAY;AAEhC,QAAI,aAAa;AACb,YAAM,cAAc,CAAC,OAAO,QAAQ,OAAO,UAAU,SAAS,QAAQ,SAAS;AAC/E,MAAAD,IAAG,aAAa,YAAY,CAAC,SAAS;AAClC,YAAIA,IAAG,sBAAsB,IAAI,KAAK,KAAK,QAAQ,YAAY,SAAS,KAAK,KAAK,IAAI,GAAG;AACrF,kBAAQ,IAAI,KAAK,KAAK,IAAI;AAAA,QAC9B;AAAA,MACJ,CAAC;AAAA,IACL,OAAO;AACH,YAAM,cAAc;AACpB,UAAI;AACJ,cAAQ,QAAQ,YAAY,KAAK,OAAO,OAAO,MAAM;AACjD,gBAAQ,IAAI,MAAM,CAAC,EAAE,YAAY,CAAC;AAAA,MACtC;AAAA,IACJ;AAEA,WAAO,QAAQ,SAAS,IAAI,CAAC,KAAK,IAAI,MAAM,KAAK,OAAO;AAAA,EAC5D;AAAA,EAEQ,WAAW,SAA0B;AACzC,WAAO,KAAK,OAAO,aAAa,KAAK,CAAC,YAAY,QAAQ,QAAQ,KAAK,OAAO,CAAC;AAAA,EACnF;AAAA,EAEQ,iBAAiB,SAAgD;AACrE,WAAO,KAAK,OAAO,aACd,OAAO,CAAC,YAAY,QAAQ,QAAQ,KAAK,OAAO,CAAC,EACjD,IAAI,CAAC,YAAY,QAAQ,IAAmC;AAAA,EACrE;AAAA,EAEQ,mBAAmB,SAAiB,aAA6B;AACrE,UAAM,SAAS,oBAAI,IAAY;AAC/B,UAAM,QAAQ,cAAc,8CAA8C;AAE1E,QAAI;AACJ,YAAQ,QAAQ,MAAM,KAAK,OAAO,OAAO,MAAM;AAC3C,aAAO,IAAI,MAAM,CAAC,CAAC;AAAA,IACvB;AAEA,WAAO,MAAM,KAAK,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,MAAM,UAAU,UAAU,KAAK,EAAE;AAAA,EACtF;AAAA,EAEQ,kBAAkB,WAA0B;AAChD,UAAM,SAAS,oBAAI,IAAY;AAC/B,UAAM,QAAQ;AACd,QAAI;AACJ,YAAQ,QAAQ,MAAM,KAAK,SAAS,OAAO,MAAM;AAC7C,aAAO,IAAI,MAAM,CAAC,CAAC;AAAA,IACvB;AACA,WAAO,MAAM,KAAK,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,MAAM,UAAU,UAAU,KAAK,EAAE;AAAA,EACtF;AAAA,EAEQ,kBAAkB,SAAiB,aAA6B;AACpE,UAAM,SAAS,oBAAI,IAAY;AAC/B,UAAM,QAAQ,cAAc,+DAA+D;AAE3F,QAAI;AACJ,YAAQ,QAAQ,MAAM,KAAK,OAAO,OAAO,MAAM;AAC3C,UAAI,aAAa;AACb,cAAM,aAAa,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAC1D,mBAAW,QAAQ,CAAC,UAAU,OAAO,IAAI,KAAK,CAAC;AAAA,MACnD,OAAO;AACH,eAAO,IAAI,MAAM,CAAC,CAAC;AAAA,MACvB;AAAA,IACJ;AAEA,WAAO,MAAM,KAAK,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,MAAM,UAAU,UAAU,KAAK,EAAE;AAAA,EACtF;AAAA,EAEQ,eAAe,SAA2B;AAC9C,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,WAAW,CAAC,wCAAwC,sCAAsC;AAEhG,aAAS,QAAQ,CAAC,YAAY;AAC1B,UAAI;AACJ,cAAQ,QAAQ,QAAQ,KAAK,OAAO,OAAO,MAAM;AAC7C,gBAAQ,IAAI,MAAM,CAAC,CAAC;AAAA,MACxB;AAAA,IACJ,CAAC;AAED,WAAO,MAAM,KAAK,OAAO;AAAA,EAC7B;AAAA,EAEQ,wBAAwB,SAAiB,aAAgC;AAC7E,UAAM,WAAW,oBAAI,IAAY;AAEjC,QAAI,aAAa;AACb,YAAM,QAAQ;AACd,UAAI;AACJ,cAAQ,QAAQ,MAAM,KAAK,OAAO,OAAO,MAAM;AAC3C,iBAAS,IAAI,OAAO,SAAS,MAAM,CAAC,CAAC,CAAC;AAAA,MAC1C;AAAA,IACJ,OAAO;AACH,YAAM,QAAQ;AACd,UAAI;AACJ,cAAQ,QAAQ,MAAM,KAAK,OAAO,OAAO,MAAM;AAC3C,iBAAS,IAAI,OAAO,SAAS,MAAM,CAAC,CAAC,CAAC;AAAA,MAC1C;AAAA,IACJ;AAEA,WAAO,SAAS,SAAS,IAAI,CAAC,GAAG,IAAI,MAAM,KAAK,QAAQ,EAAE,KAAK;AAAA,EACnE;AAAA,EAEQ,mBAAmB,SAA2B;AAClD,WAAO,KAAK,OAAO,mBACd,OAAO,CAAC,YAAY,QAAQ,QAAQ,KAAK,OAAO,CAAC,EACjD,IAAI,CAAC,YAAY,QAAQ,IAAI;AAAA,EACtC;AAAA,EAEQ,mBAAmB,SAAqC;AAC5D,UAAM,aAAa;AACnB,UAAM,QAAQ,QAAQ,MAAM,UAAU;AACtC,WAAO,QAAQ,MAAM,CAAC,EAAE,KAAK,IAAI;AAAA,EACrC;AAAA,EAEQ,gBAAgB,SAA0B;AAC9C,WAAO,oCAAoC,KAAK,OAAO;AAAA,EAC3D;AAAA,EAEQ,WAAW,SAA0B;AACzC,WAAO,6BAA6B,KAAK,OAAO;AAAA,EACpD;AAAA,EAEQ,sBAAsB,SAA0B;AACpD,WAAO,yCAAyC,KAAK,OAAO;AAAA,EAChE;AAAA,EAEQ,oBAAoB,YAAqC;AAC7D,UAAM,eAAe,oBAAI,IAAY;AAErC,IAAAA,IAAG,aAAa,YAAY,CAAC,SAAS;AAClC,UAAIA,IAAG,oBAAoB,IAAI,GAAG;AAC9B,cAAM,kBAAkB,KAAK,gBAAgB,QAAQ,EAAE,QAAQ,SAAS,EAAE;AAC1E,YAAI,CAAC,gBAAgB,WAAW,GAAG,KAAK,CAAC,gBAAgB,WAAW,GAAG,GAAG;AACtE,uBAAa,IAAI,eAAe;AAAA,QACpC;AAAA,MACJ;AAAA,IACJ,CAAC;AAED,WAAO,MAAM,KAAK,YAAY;AAAA,EAClC;AAAA,EAEQ,0BAA4C;AAChD,WAAO,CAAC;AAAA,EACZ;AAAA,EAEQ,4BAAoD;AACxD,UAAM,YAAoC,CAAC;AAC3C,SAAK,OAAO,QAAQ,CAAC,UAAU;AAC3B,YAAM,QAAQ,QAAQ,CAAC,WAAW;AAC9B,kBAAU,MAAM,KAAK,UAAU,MAAM,KAAK,KAAK;AAAA,MACnD,CAAC;AAAA,IACL,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EAEQ,kCAA0D;AAC9D,UAAM,eAAuC,CAAC;AAC9C,SAAK,OAAO,QAAQ,CAAC,UAAU;AAC3B,YAAM,iBAAiB,QAAQ,CAAC,WAAW;AACvC,cAAM,MAAM,OAAO,SAAS;AAC5B,qBAAa,GAAG,KAAK,aAAa,GAAG,KAAK,KAAK;AAAA,MACnD,CAAC;AAAA,IACL,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EAEQ,4BAAoD;AACxD,UAAM,eAAuC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,EAAE;AACvF,SAAK,OAAO,QAAQ,CAAC,UAAU;AAC3B,mBAAa,MAAM,SAAS;AAAA,IAChC,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EAEQ,yBAAiC;AACrC,QAAI,KAAK,OAAO,WAAW,EAAG,QAAO;AACrC,UAAM,eAAe,KAAK,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAC1D,WAAQ,eAAe,KAAK,OAAO,SAAU;AAAA,EACjD;AAAA,EAEQ,4BAAoC;AACxC,QAAI,KAAK,OAAO,WAAW,EAAG,QAAO;AACrC,UAAM,aAAa,KAAK,OAAO,OAAO,CAAC,KAAK,UAAU,OAAO,MAAM,oBAAoB,MAAM,CAAC;AAC9F,WAAO,aAAa,KAAK,OAAO;AAAA,EACpC;AAAA,EAEQ,gCAAwC;AAC5C,QAAI,KAAK,OAAO,WAAW,EAAG,QAAO;AACrC,UAAM,gBAAgB,KAAK,OAAO,OAAO,CAAC,KAAK,UAAU,OAAO,MAAM,cAAc,IAAI,CAAC,IAAI,KAAK,OAAO;AACzG,WAAO,KAAK,IAAI,GAAG,OAAO,gBAAgB,MAAM,gBAAgB,MAAM,IAAI,EAAE;AAAA,EAChF;AACJ;AAEA,eAAsB,iBAAiB,QAAgC;AACnE,QAAM,WAAW,IAAI,gBAAgB,SAAS,EAAE,OAAO,IAAI,CAAC,CAAC;AAC7D,QAAM,WAAW,MAAM,SAAS,cAAc;AAE9C,UAAQ,IAAI,iCAAiC;AAC7C,UAAQ,IAAI,SAAS,eAAe,QAAQ,CAAC;AAE7C,QAAM,UAAU,UAAU,mBAAmB,SAAS,eAAe,QAAQ,CAAC;AAC9E,UAAQ,IAAI,oCAAoC;AACpD;AAEO,SAAS,gBAAgB,SAAc;AAC1C,SAAO,OAAO,KAAU,QAAa;AACjC,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,YAAY,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AAE3D,WAAO,KAAK,IAAI,SAAS,KAAK,IAAI,MAAM,IAAI,IAAI,GAAG,EAAE;AAErD,QAAI;AACA,YAAM,QAAQ,KAAK,GAAG;AAAA,IAC1B,SAAS,OAAO;AACZ,aAAO,MAAM,IAAI,SAAS,YAAY,KAAK;AAC3C,YAAM;AAAA,IACV,UAAE;AACE,YAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,aAAO,KAAK,IAAI,SAAS,eAAe,QAAQ,IAAI;AAAA,IACxD;AAAA,EACJ;AACJ;;;AQlYO,IAAM,gBAAN,MAAoB;AAAA,EAApB;AACH,SAAQ,UAAuC,oBAAI,IAAI;AAAA;AAAA,EAEvD,MAAM,WAAW,QAAuC;AACpD,SAAK,QAAQ,IAAI,OAAO,MAAM,MAAM;AACpC,WAAO,KAAK,kBAAkB,OAAO,IAAI,KAAK,OAAO,OAAO,EAAE;AAAA,EAClE;AAAA,EAEA,MAAM,WAAW,OAAqB,SAAiB,SAAmD;AACtG,UAAM,UAA0B,CAAC;AAEjC,eAAW,CAAC,MAAM,MAAM,KAAK,KAAK,SAAS;AACvC,UAAI;AACA,cAAM,SAAS,MAAM,OAAO,QAAQ,OAAO,SAAS,OAAO;AAC3D,gBAAQ,KAAK,MAAM;AAAA,MACvB,SAAS,OAAO;AACZ,eAAO,MAAM,UAAU,IAAI,qBAAqB,MAAM,IAAI,KAAK,KAAK;AAAA,MACxE;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,mBAA6B;AACzB,WAAO,MAAM,KAAK,KAAK,QAAQ,KAAK,CAAC;AAAA,EACzC;AACJ;AAEO,IAAM,gBAAN,MAA8C;AAAA,EAA9C;AACH,gBAAO;AACP,mBAAU;AAAA;AAAA,EAEV,MAAM,QAAQ,OAAqB,SAAwC;AACvE,UAAM,kBAAkB,CAAC;AAEzB,QAAI,CAAC,KAAK,eAAe,OAAO,GAAG;AAC/B,sBAAgB;AAAA,QACZ;AAAA,UACI;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,CAAC,WAAW,eAAe;AAAA,QAC/B;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO,EAAE,iBAAiB,SAAS,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,EACxD;AAAA,EAEQ,eAAe,SAA0B;AAC7C,WAAO,mCAAmC,KAAK,OAAO;AAAA,EAC1D;AACJ;AAEO,IAAM,qBAAN,MAAmD;AAAA,EAAnD;AACH,gBAAO;AACP,mBAAU;AAAA;AAAA,EAEV,MAAM,QAAQ,OAA4C;AACtD,UAAM,kBAAkB,CAAC;AAEzB,UAAM,WAAW;AAEjB,QAAI,CAAC,UAAU;AACX,sBAAgB;AAAA,QACZ;AAAA,UACI;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,CAAC,WAAW,SAAS;AAAA,QACzB;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO,EAAE,iBAAiB,SAAS,EAAE,cAAc,WAAW,KAAK,EAAE,GAAG,UAAU,CAAC,EAAE;AAAA,EACzF;AACJ;;;ATvFA,OAAOE,WAAU;AACjB,SAAS,mBAAmB;AAC5B,OAAO,WAAW;;;AULlB,OAAOC,WAAU;AA4MV,IAAM,yBAAN,MAA6B;AAAA,EAIhC,YAAY,QAAwB,WAAmB;AACnD,SAAK,SAAS;AACd,SAAK,YAAY;AAAA,EACrB;AAAA,EAEA,MAAM,sBACF,SACA,UACA,gBAM0B;AAC1B,WAAO,KAAK,2CAAoC,OAAO,aAAa;AAEpE,UAAM,aAAgC;AAAA,MAClC,UAAU;AAAA,QACN,aAAa,oBAAI,KAAK;AAAA,QACtB,SAAS;AAAA,QACT;AAAA,QACA,UAAU,SAAS,SAAS;AAAA,QAC5B,YAAY,KAAK,mBAAmB;AAAA,MACxC;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH,UAAU,MAAM,KAAK,iBAAiB,QAAQ;AAAA,MAC9C,iBAAiB,MAAM,KAAK,uBAAuB,SAAS,eAAe;AAAA,IAC/E;AAEA,UAAM,KAAK,uBAAuB,UAAU;AAC5C,UAAM,KAAK,mBAAmB,UAAU;AACxC,UAAM,KAAK,mBAAmB,UAAU;AACxC,UAAM,KAAK,kBAAkB,UAAU;AACvC,UAAM,KAAK,yBAAyB,UAAU;AAE9C,WAAO,QAAQ,mDAA8C,KAAK,SAAS,EAAE;AAC7E,WAAO;AAAA,EACX;AAAA,EAEA,MAAc,uBAAuB,MAAwC;AACzE,QAAI,SAAS,KAAK,uBAAuB,IAAI;AAC7C,cAAU,KAAK,gCAAgC,IAAI;AACnD,cAAU,KAAK,gCAAgC,IAAI;AAEnD,QAAI,KAAK,UAAU;AACf,gBAAU,KAAK,wBAAwB,KAAK,QAAQ;AAAA,IACxD;AAEA,QAAI,KAAK,aAAa;AAClB,gBAAU,KAAK,2BAA2B,KAAK,WAAW;AAAA,IAC9D;AAEA,QAAI,KAAK,QAAQ;AACb,gBAAU,KAAK,sBAAsB,KAAK,MAAM;AAAA,IACpD;AAEA,QAAI,KAAK,YAAY;AACjB,gBAAU,KAAK,0BAA0B,KAAK,UAAU;AAAA,IAC5D;AAEA,cAAU,KAAK,wBAAwB,KAAK,QAAQ;AACpD,cAAU,KAAK,+BAA+B,KAAK,eAAe;AAClE,cAAU,KAAK,8BAA8B,KAAK,SAAS,MAAM;AACjE,cAAU,KAAK,wBAAwB,IAAI;AAE3C,UAAM,UAAU,UAAUA,MAAK,KAAK,KAAK,WAAW,mBAAmB,GAAG,MAAM;AAAA,EACpF;AAAA,EAEQ,uBAAuB,MAAiC;AAC5D,WAAO;AAAA;AAAA,yBAEU,KAAK,SAAS,OAAO;AAAA,yBACrB,KAAK,SAAS,YAAY,eAAe,CAAC;AAAA,uBAC5C,KAAK,SAAS,OAAO;AAAA,wBACpB,KAAK,SAAS,SAAS,QAAQ,CAAC,CAAC;AAAA,4BAC7B,KAAK,SAAS,QAAQ,WAAW;AAAA,2BAClC,KAAK,SAAS,SAAS,UAAU;AAAA,6BAC/B,KAAK,SAAS,SAAS,iBAAiB,eAAe,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKjF;AAAA,EAEQ,gCAAgC,MAAiC;AACrE,UAAM,UAAU,KAAK,SAAS;AAC9B,UAAM,WAAW,KAAK;AAEtB,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,+BAKgB,QAAQ,cAAc,QAAQ,CAAC,CAAC,OAAO,cAAc,QAAQ,aAAa,CAAC,MAAM,KAAK,kBAAkB,KAAK,QAAQ,OAAO,QAAQ,CAAC;AAAA,kCAClI,QAAQ,iBAAiB,QAAQ,CAAC,CAAC,OAAO,cAAc,QAAQ,gBAAgB,CAAC,MAAM,KAAK,kBAAkB,KAAK,QAAQ,OAAO,WAAW,CAAC;AAAA,sCAC1I,QAAQ,qBAAqB,QAAQ,CAAC,CAAC,OAAO,cAAc,QAAQ,oBAAoB,CAAC,MAAM,KAAK,kBAAkB,KAAK,QAAQ,OAAO,eAAe,CAAC;AAAA,oCAC5J,QAAQ,kBAAkB,QAAQ,CAAC,CAAC,OAAO,cAAc,QAAQ,iBAAiB,CAAC;AAAA;AAAA;AAAA,kBAGrG,SAAS,YAAY,IAAI,CAAC,YAAY,KAAK,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,kBAGhE,SAAS,eAAe,SAAS,IACjC,SAAS,eAAe,IAAI,CAAC,UAAU,kBAAQ,KAAK,EAAE,EAAE,KAAK,IAAI,IACjE,wCACN;AAAA;AAAA;AAAA,kBAGM,SAAS,UAAU,IAAI,CAAC,QAAQ,eAAQ,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKvE;AAAA,EAEQ,gCAAgC,MAAiC;AACrE,UAAM,UAAU,KAAK,SAAS;AAE9B,WAAO;AAAA;AAAA;AAAA,sCAGuB,QAAQ,WAAW;AAAA,wCACjB,QAAQ,YAAY,MAAO,QAAQ,eAAe,QAAQ,cAAe,KAAK,QAAQ,CAAC,CAAC;AAAA,uCACzF,QAAQ,YAAY,MAAO,QAAQ,eAAe,QAAQ,cAAe,KAAK,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA,kBAG7G,OAAO,QAAQ,QAAQ,gBAAgB,EACxC,OAAO,CAAC,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,EAChC,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,OAAO,MAAM,OAAO,KAAK,SAAS,EAC3D,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,kBAGT,OAAO,QAAQ,QAAQ,gBAAgB,EACxC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,KAAK,aAAa,IAAW,CAAC,MAAM,IAAI,OAAO,KAAK,SAAS,EACpF,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,kBAGT,OAAO,QAAQ,QAAQ,sBAAsB,EAC9C,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,OAAO,MAAM,OAAO,KAAK,cAAc,EAChE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKvB;AAAA,EAEQ,wBAAwB,UAAsC;AAClE,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,+BAKgB,SAAS,gBAAgB,SAAS,MAAM,MAAM,KAAK,kBAAkB,SAAS,gBAAgB,QAAQ,CAAC;AAAA,2BAC3G,SAAS,gBAAgB,KAAK,MAAM,MAAM,KAAK,kBAAkB,SAAS,gBAAgB,IAAI,CAAC;AAAA,6BAC7F,SAAS,gBAAgB,OAAO,MAAM,MAAM,KAAK,kBAAkB,SAAS,gBAAgB,MAAM,CAAC;AAAA,0BACtG,SAAS,gBAAgB,IAAI,MAAM,MAAM,KAAK,kBAAkB,SAAS,gBAAgB,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,6BAK1F,SAAS,WAAW,MAAM,MAAM,QAAQ,CAAC,CAAC;AAAA;AAAA,kBAErD,OAAO,QAAQ,SAAS,WAAW,MAAM,QAAQ,EAClD,IAAI,CAAC,CAAC,MAAM,SAAS,MAAM,KAAK,YAAY,WAAM,QAAG,IAAI,IAAI,EAAE,EAC/D,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,kBAGT,SAAS,WAAW,MAAM,OAAO,IAAI,CAAC,UAAU,kBAAQ,KAAK,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,6BAGhE,SAAS,WAAW,OAAO,MAAM,QAAQ,CAAC,CAAC;AAAA;AAAA,kBAEtD,OAAO,QAAQ,SAAS,WAAW,OAAO,YAAY,EACvD,IAAI,CAAC,CAAC,KAAK,SAAS,MAAM,KAAK,YAAY,WAAM,QAAG,IAAI,GAAG,EAAE,EAC7D,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,0CAGe,aAAa,SAAS,eAAe,WAAW,CAAC,IAAI,SAAS,eAAe,WAAW;AAAA;AAAA;AAAA,kBAGhH,SAAS,eAAe,YAAY,IAAI,CAAC,WAAW,KAAK,MAAM,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,kBAG7E,SAAS,eAAe,mBAAmB,IAAI,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,iDAGpE,SAAS,gBAAgB,uBAAuB,QAAQ,CAAC,CAAC;AAAA,mDACxD,SAAS,gBAAgB,wBAAwB,QAAQ,CAAC,CAAC;AAAA,0CACpE,SAAS,gBAAgB,gBAAgB,QAAQ,CAAC,CAAC;AAAA,gDAC7C,SAAS,gBAAgB,qBAAqB,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpG;AAAA,EAEQ,2BAA2BC,cAA4C;AAC3E,WAAO;AAAA;AAAA;AAAA,4CAG6BA,aAAY,QAAQ,kBAAkB,QAAQ,CAAC,CAAC;AAAA,+CAC7C,KAAK,MAAMA,aAAY,QAAQ,kBAAkB,CAAC;AAAA,4CACrDA,aAAY,QAAQ,iBAAiB;AAAA,6CACpCA,aAAY,QAAQ,kBAAkB;AAAA,0CACzCA,aAAY,QAAQ,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA,kBAK3DA,aAAY,YAAY,qBAAqB,SAAS,IACtDA,aAAY,YAAY,qBACrB;AAAA,MACG,CAAC,UACG,OAAO,MAAM,IAAI,mBAAmB,MAAM,UAAU;AAAA,IAAQ,MAAM,gBAAgB,IAAI,CAAC,QAAQ,OAAO,GAAG,EAAE,EAAE,KAAK,MAAM,CAAC;AAAA,IACjI,EACC,KAAK,IAAI,IACZ,+CACN;AAAA;AAAA;AAAA,kBAGMA,aAAY,YAAY,YAAY,SAAS,IAC7CA,aAAY,YAAY,YACrB;AAAA,MACG,CAAC,UACG,OAAO,MAAM,IAAI,OAAO,MAAM,WAAW;AAAA,IAAY,MAAM,gBAAgB,IAAI,CAAC,QAAQ,OAAO,GAAG,EAAE,EAAE,KAAK,MAAM,CAAC;AAAA,IAC1H,EACC,KAAK,IAAI,IACZ,4CACN;AAAA;AAAA;AAAA,kBAGMA,aAAY,YAAY,sBAAsB,SAAS,IACvDA,aAAY,YAAY,sBACrB;AAAA,MACG,CAAC,UACG,OAAO,MAAM,IAAI,OAAO,MAAM,aAAa,MAAM;AAAA,kBAAmC,MAAM,aAAa,KAAK,IAAI,CAAC;AAAA,IAAO,MAAM,gBAAgB,IAAI,CAAC,QAAQ,OAAO,GAAG,EAAE,EAAE,KAAK,MAAM,CAAC;AAAA,IAC7L,EACC,KAAK,IAAI,IACZ,gDACN;AAAA;AAAA;AAAA;AAAA;AAAA,kBAKMA,aAAY,0BAA0B,QAAQ,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,kBAGjFA,aAAY,0BAA0B,kBAAkB,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,kBAG3FA,aAAY,0BAA0B,cAAc,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,kBAGvFA,aAAY,0BAA0B,uBAAuB,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,2CAGvEA,aAAY,WAAW,iBAAiB,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA,kBAG3E,OAAO,QAAQA,aAAY,WAAW,sBAAsB,EAC7D,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM,OAAO,KAAK,OAAO,IAAI,IAAI,EAClD,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,kBAGT,OAAO,QAAQA,aAAY,WAAW,oBAAoB,EAC3D,IAAI,CAAC,CAAC,OAAO,MAAM,MAAM,OAAO,KAAK,QAAQ,SAAS,MAAM,QAAQ,CAAC,CAAC,IAAI,EAC1E,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKvB;AAAA,EAEQ,sBAAsB,QAAkC;AAC5D,WAAO;AAAA;AAAA;AAAA,8BAGe,OAAO,UAAU,MAAM,mBAAmB,CAAC,MAAM,OAAO,UAAU,IAAI,mBAAmB,CAAC,KAAK,OAAO,UAAU,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,6BAKrH,OAAO,OAAO,OAAO,OAAO,MAAM,OAAO,OAAO,OAAO,QAAQ,MAAM,OAAO,OAAO,OAAO,UAAU,IAAI,MAAM,EAAE,GAAG,OAAO,OAAO,OAAO,MAAM,MAAM,KAAK,cAAc,OAAO,OAAO,OAAO,KAAK,CAAC,IAAI,OAAO,OAAO,OAAO,KAAK;AAAA,qCACxN,OAAO,OAAO,SAAS,QAAQ,QAAQ,CAAC,CAAC,OAAO,OAAO,OAAO,SAAS,SAAS,QAAQ,CAAC,CAAC,OAAO,OAAO,OAAO,SAAS,UAAU,IAAI,MAAM,EAAE,GAAG,OAAO,OAAO,SAAS,OAAO,QAAQ,CAAC,CAAC,OAAO,KAAK,cAAc,OAAO,OAAO,SAAS,KAAK,CAAC,IAAI,OAAO,OAAO,SAAS,KAAK;AAAA,wCAC7Q,OAAO,OAAO,YAAY,QAAQ,QAAQ,CAAC,CAAC,OAAO,OAAO,OAAO,YAAY,SAAS,QAAQ,CAAC,CAAC,OAAO,OAAO,OAAO,YAAY,UAAU,IAAI,MAAM,EAAE,GAAG,OAAO,OAAO,YAAY,OAAO,QAAQ,CAAC,CAAC,OAAO,KAAK,cAAc,OAAO,OAAO,YAAY,KAAK,CAAC,IAAI,OAAO,OAAO,YAAY,KAAK;AAAA,4CAC9R,OAAO,OAAO,gBAAgB,QAAQ,QAAQ,CAAC,CAAC,OAAO,OAAO,OAAO,gBAAgB,SAAS,QAAQ,CAAC,CAAC,OAAO,OAAO,OAAO,gBAAgB,UAAU,IAAI,MAAM,EAAE,GAAG,OAAO,OAAO,gBAAgB,OAAO,QAAQ,CAAC,CAAC,OAAO,KAAK,cAAc,OAAO,OAAO,gBAAgB,KAAK,CAAC,IAAI,OAAO,OAAO,gBAAgB,KAAK;AAAA;AAAA;AAAA,kBAGpV,OAAO,eACR,MAAM,GAAG,EACT;AAAA,MACG,CAAC,SACG,OAAO,KAAK,KAAK,mBAAmB,CAAC,eAAe,KAAK,WAAW,eAAe,KAAK,cAAc,QAAQ,CAAC,CAAC,mBAAmB,KAAK,iBAAiB,QAAQ,CAAC,CAAC,uBAAuB,KAAK,qBAAqB,QAAQ,CAAC,CAAC;AAAA,IACtO,EACC,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,wCAGa,OAAO,YAAY,UAAU,cAAc,QAAQ,CAAC,CAAC;AAAA,2CAClD,OAAO,YAAY,UAAU,iBAAiB,QAAQ,CAAC,CAAC;AAAA,+CACpD,OAAO,YAAY,UAAU,qBAAqB,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA,kBAGzF,OAAO,YAAY,gBAAgB,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpF;AAAA,EAEQ,0BAA0B,YAA0C;AACxE,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,8BAKe,WAAW,SAAS,OAAO,MAAM,WAAW,QAAQ,OAAO;AAAA,2BAC9D,WAAW,SAAS,KAAK,mBAAmB,CAAC,MAAM,WAAW,QAAQ,KAAK,mBAAmB,CAAC;AAAA,6BAC7F,WAAW,SAAS,QAAQ,WAAW,MAAM,WAAW,QAAQ,QAAQ,WAAW;AAAA;AAAA;AAAA,sCAG1E,WAAW,QAAQ,OAAO,MAAM,MAAM;AAAA,kBAC1D,WAAW,QAAQ,OAAO,MAAM,IAAI,CAAC,UAAU,cAAS,KAAK,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,wCAErD,WAAW,QAAQ,OAAO,QAAQ,MAAM;AAAA,kBAC9D,WAAW,QAAQ,OAAO,QAAQ,IAAI,CAAC,UAAU,cAAS,KAAK,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,yCAEtD,WAAW,QAAQ,OAAO,SAAS,MAAM;AAAA,kBAChE,WAAW,QAAQ,OAAO,SAAS,IAAI,CAAC,UAAU,iBAAU,KAAK,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,+BAKlE,WAAW,QAAQ,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,OAAO,WAAW,QAAQ,OAAO,SAAS,GAAG,QAAQ,CAAC,CAAC,OAAO,WAAW,QAAQ,OAAO,SAAS,UAAU,IAAI,MAAM,EAAE,GAAG,WAAW,QAAQ,OAAO,SAAS,OAAO,QAAQ,CAAC,CAAC,OAAO,KAAK,gBAAgB,WAAW,QAAQ,OAAO,SAAS,MAAM,CAAC;AAAA,kCACnS,WAAW,QAAQ,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,OAAO,WAAW,QAAQ,OAAO,YAAY,GAAG,QAAQ,CAAC,CAAC,OAAO,WAAW,QAAQ,OAAO,YAAY,UAAU,IAAI,MAAM,EAAE,GAAG,WAAW,QAAQ,OAAO,YAAY,OAAO,QAAQ,CAAC,CAAC,OAAO,KAAK,gBAAgB,WAAW,QAAQ,OAAO,YAAY,MAAM,CAAC;AAAA,sCACjT,WAAW,QAAQ,OAAO,gBAAgB,KAAK,QAAQ,CAAC,CAAC,OAAO,WAAW,QAAQ,OAAO,gBAAgB,GAAG,QAAQ,CAAC,CAAC,OAAO,WAAW,QAAQ,OAAO,gBAAgB,UAAU,IAAI,MAAM,EAAE,GAAG,WAAW,QAAQ,OAAO,gBAAgB,OAAO,QAAQ,CAAC,CAAC,OAAO,KAAK,gBAAgB,WAAW,QAAQ,OAAO,gBAAgB,MAAM,CAAC;AAAA;AAAA;AAAA,kBAG7V,WAAW,YAAY,SAAS,IAChC,WAAW,YACR;AAAA,MACG,CAAC,eACG,OAAO,WAAW,IAAI,OAAO,WAAW,QAAQ,MAAM,WAAW,WAAW;AAAA,cAAiB,WAAW,MAAM;AAAA,uBAA0B,WAAW,OAAO,KAAK,IAAI,CAAC;AAAA,IAC5K,EACC,KAAK,IAAI,IACZ,oCACN;AAAA;AAAA;AAAA,kBAGM,WAAW,aAAa,SAAS,IACjC,WAAW,aACR;AAAA,MACG,CAAC,gBACG,OAAO,YAAY,IAAI,OAAO,YAAY,WAAW;AAAA,cAAiB,YAAY,MAAM;AAAA,uBAA0B,YAAY,OAAO,KAAK,IAAI,CAAC;AAAA,IACvJ,EACC,KAAK,IAAI,IACZ,0CACN;AAAA;AAAA;AAAA,6CAGiC,WAAW,QAAQ,gBAAgB,IAAI,MAAM;AAAA,kDACxC,WAAW,QAAQ,gBAAgB,SAAS,MAAM;AAAA,oDAChD,WAAW,QAAQ,gBAAgB,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpG;AAAA,EAEQ,wBAAwB,UAA+B;AAC3D,WAAO;AAAA;AAAA;AAAA,kBAGG,SAAS,UAAU,IAAI,CAAC,aAAa,YAAO,QAAQ,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,kBAGlE,SAAS,UAAU,IAAI,CAAC,SAAS,kBAAQ,IAAI,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,4CAGjC,SAAS,cAAc,MAAM,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA,kBAGjE,SAAS,cAAc,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,mDAEjC,SAAS,cAAc,eAAe;AAAA;AAAA;AAAA,kBAGvE,SAAS,6BAA6B,IAAI,CAAC,QAAQ,qBAAS,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,kBAG7E,SAAS,cAAc,IAAI,CAAC,SAAS,eAAQ,IAAI,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAK7E;AAAA,EAEQ,+BAA+B,iBAAmD;AACtF,UAAM,aAAa,gBAAgB,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AAEzE,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,+BAKgB,WAAW,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,MAAM;AAAA,2BACrD,WAAW,OAAO,CAAC,MAAM,EAAE,YAAY,MAAM,EAAE,WAAW,EAAE,EAAE,MAAM;AAAA,6BAClE,WAAW,OAAO,CAAC,MAAM,EAAE,YAAY,MAAM,EAAE,WAAW,EAAE,EAAE,MAAM;AAAA,0BACvE,WAAW,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,MAAM;AAAA;AAAA;AAAA;AAAA,kBAIxD,WACD,MAAM,GAAG,EAAE,EACX;AAAA,MACG,CAAC,KAAK,UAAU;AAAA,uBACb,QAAQ,CAAC,KAAK,IAAI,KAAK;AAAA,gCACd,IAAI,QAAQ,wBAAwB,IAAI,QAAQ,2BAA2B,IAAI,cAAc;AAAA,wCACrF,IAAI,eAAe,oBAAoB,IAAI,QAAQ;AAAA;AAAA,mCAExD,IAAI,WAAW;AAAA;AAAA,gCAElB,IAAI,QAAQ;AAAA;AAAA,8BAEd,IAAI,MAAM;AAAA;AAAA,gDAEQ,IAAI,qBAAqB;AAAA;AAAA;AAAA,kBAGvD,IAAI,oBAAoB,IAAI,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,kBAExE,IAAI,aAAa,SAAS,IAAI,qBAAqB,IAAI,aAAa,KAAK,IAAI,CAAC,KAAK,EAAE;AAAA;AAAA,kBAErF,IAAI,QAAQ,yBAAyB,IAAI,KAAK,OAAO,EAAE;AAAA;AAAA,4BAE7C,IAAI,KAAK,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,IAI/B,EACC,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKrB;AAAA,EAEQ,8BAA8B,QAAuB;AACzD,WAAO;AAAA;AAAA;AAAA,gCAGiB,OAAO,MAAM;AAAA;AAAA,kBAE3B,OACD;AAAA,MACG,CAAC,UAAU;AAAA,yBACN,MAAM,IAAI;AAAA,iCACF,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,wCACjB,MAAM,UAAU,sBAAe,kBAAW;AAAA,oCAC9C,aAAa,MAAM,SAAS,CAAC,IAAI,MAAM,SAAS;AAAA,oCAChD,MAAM,cAAc,KAAK;AAAA,2CAClB,MAAM,kBAAkB,QAAQ,CAAC,KAAK,KAAK;AAAA,uCAC/C,MAAM,eAAe,KAAK;AAAA,sCAC3B,MAAM,aAAa,UAAU,CAAC;AAAA,uCAC7B,MAAM,eAAe,IAAI,KAAK,MAAM,YAAY,EAAE,mBAAmB,IAAI,KAAK;AAAA;AAAA,kBAEnG,MAAM,UAAU,SAAS,IAAI,mBAAmB,MAAM,UAAU,KAAK,IAAI,CAAC,KAAK,EAAE;AAAA,kBACjF,MAAM,YAAY,SAAS,IAAI,oBAAoB,MAAM,YAAY,KAAK,IAAI,CAAC,KAAK,EAAE;AAAA,kBACtF,MAAM,cAAc,oBAAoB,MAAM,WAAW,KAAK,EAAE;AAAA;AAAA;AAAA,mCAG/C,MAAM,eAAe,WAAM,QAAG;AAAA,0BACvC,MAAM,UAAU,WAAM,QAAG;AAAA,sCACb,MAAM,qBAAqB,WAAM,QAAG;AAAA;AAAA;AAAA,2BAG/C,MAAM,YAAY,MAAM;AAAA,0BACzB,MAAM,WAAW,MAAM;AAAA,0BACvB,MAAM,WAAW,MAAM;AAAA;AAAA,sCAEX,MAAM,iBAAiB,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,IAIvD,EACC,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA,EAGrB;AAAA,EAEQ,wBAAwB,MAAiC;AAC7D,WAAO;AAAA;AAAA;AAAA,uCAGwB,KAAK,OAAO,MAAM;AAAA,0CACf,KAAK,SAAS;AAAA,2CACb,KAAK,OAAO,yBAAyB,YAAY,UAAU;AAAA,8CACxD,KAAK,OAAO,4BAA4B,YAAY,UAAU;AAAA,yCACnE,KAAK,OAAO,eAAe,YAAY,UAAU;AAAA,6CAC7C,KAAK,OAAO,WAAW,YAAY,UAAU;AAAA,yCACjD,KAAK,OAAO,cAAc;AAAA;AAAA;AAAA,kCAGjC,KAAK,OAAO,WAAW,QAAQ;AAAA,qCAC5B,KAAK,OAAO,WAAW,WAAW;AAAA,yCAC9B,KAAK,OAAO,WAAW,eAAe;AAAA,uCACxC,KAAK,OAAO,WAAW,YAAY;AAAA,oCACtC,KAAK,OAAO,WAAW,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAU/B,KAAK,SAAS,YAAY,YAAY,CAAC;AAAA,2CAClC,KAAK,SAAS,SAAS,QAAQ,CAAC,CAAC;AAAA,wCACpC,KAAK,SAAS,OAAO;AAAA,sCACvB,KAAK,SAAS,OAAO;AAAA,qCACtB,KAAK,SAAS,UAAU;AAAA;AAAA;AAAA;AAAA,sEAIS,KAAK,SAAS,OAAO;AAAA;AAAA,EAEvF;AAAA,EAEA,MAAc,mBAAmB,MAAwC;AACrE,UAAM,UAAU,cAAcD,MAAK,KAAK,KAAK,WAAW,qBAAqB,GAAG,IAAI;AAAA,EACxF;AAAA,EAEA,MAAc,mBAAmB,MAAwC;AACrE,UAAM,OAAO,KAAK,oBAAoB,IAAI;AAC1C,UAAM,UAAU,UAAUA,MAAK,KAAK,KAAK,WAAW,qBAAqB,GAAG,IAAI;AAAA,EACpF;AAAA,EAEA,MAAc,kBAAkB,MAAwC;AACpE,UAAM,aAAa,KAAK,mBAAmB,IAAI;AAC/C,UAAM,UAAU,UAAUA,MAAK,KAAK,KAAK,WAAW,oBAAoB,GAAG,UAAU;AAAA,EACzF;AAAA,EAEA,MAAc,yBAAyB,MAAwC;AAC3E,UAAM,UAAU,KAAK,gCAAgC,IAAI;AACzD,UAAM,UAAU,UAAUA,MAAK,KAAK,KAAK,WAAW,sBAAsB,GAAG,OAAO;AAAA,EACxF;AAAA,EAEQ,oBAAoB,MAAiC;AACzD,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2DA4K4C,KAAK,SAAS,OAAO;AAAA,6DACnB,KAAK,SAAS,YAAY,eAAe,CAAC;AAAA,4DAC3C,KAAK,SAAS,SAAS,QAAQ,CAAC,CAAC;AAAA,2DAClC,KAAK,SAAS,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,sEAKjB,KAAK,SAAS,QAAQ,WAAW;AAAA;AAAA;AAAA;AAAA,sEAIjC,KAAK,SAAS,QAAQ,cAAc,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,mEAI/C,KAAK,SAAS,QAAQ,iBAAiB,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,sEAIhD,KAAK,SAAS,QAAQ,qBAAqB,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCASlF,KAAK,WAAW,wEAA0E,EAAE;AAAA,kCAC5F,KAAK,cAAc,8EAAgF,EAAE;AAAA,kCACrG,KAAK,SAAS,oEAAsE,EAAE;AAAA,kCACtF,KAAK,aAAa,4EAA8E,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAM9F,KAAK,SAAS,YAAY,IAAI,CAAC,YAAY,OAAO,OAAO,OAAO,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,kCAI9E,KAAK,SAAS,eAAe,SAAS,IACtD,OAAO,KAAK,SAAS,eAAe,IAAI,CAAC,UAAU,oBAAU,KAAK,OAAO,EAAE,KAAK,EAAE,CAAC,UACnF,6CACN;AAAA;AAAA;AAAA;AAAA,sCAI0B,KAAK,SAAS,UAAU,IAAI,CAAC,QAAQ,iBAAU,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,8BAI3E,KAAK,WACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kDAcgC,KAAK,SAAS,gBAAgB,SAAS,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,kDAK7C,KAAK,SAAS,gBAAgB,KAAK,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,kDAKzC,KAAK,SAAS,gBAAgB,OAAO,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,kDAK3C,KAAK,SAAS,gBAAgB,IAAI,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wDAMlC,KAAK,SAAS,WAAW,MAAM,MAAM,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,gCAMrF,EACN;AAAA;AAAA,8BAEkB,KAAK,cACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kDAOgC,KAAK,YAAY,QAAQ,kBAAkB,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,kDAIrD,KAAK,MAAM,KAAK,YAAY,QAAQ,kBAAkB,CAAC;AAAA;AAAA;AAAA;AAAA,kDAIvD,KAAK,YAAY,QAAQ,iBAAiB;AAAA;AAAA;AAAA;AAAA,kDAI1C,KAAK,YAAY,QAAQ,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,yDAKpC,KAAK,YAAY,WAAW,iBAAiB,QAAQ,CAAC,CAAC;AAAA;AAAA,gCAG9F,EACN;AAAA;AAAA,8BAEkB,KAAK,SACjB;AAAA;AAAA,sDAEoC,KAAK,OAAO,UAAU,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0DAOtB,KAAK,OAAO,YAAY,UAAU,cAAc,QAAQ,CAAC,CAAC;AAAA,6DACvD,KAAK,OAAO,YAAY,UAAU,iBAAiB,QAAQ,CAAC,CAAC;AAAA,iEACzD,KAAK,OAAO,YAAY,UAAU,qBAAqB,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA,gCAIhH,EACN;AAAA;AAAA,8BAEkB,KAAK,aACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kDAegC,KAAK,WAAW,QAAQ,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC;AAAA,kDACvD,KAAK,WAAW,QAAQ,OAAO,SAAS,GAAG,QAAQ,CAAC,CAAC;AAAA,yDAC9C,KAAK,WAAW,QAAQ,OAAO,SAAS,UAAU,IAAI,kBAAkB,cAAc;AAAA,kDAC7F,KAAK,WAAW,QAAQ,OAAO,SAAS,UAAU,IAAI,MAAM,EAAE,GAAG,KAAK,WAAW,QAAQ,OAAO,SAAS,OAAO,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,kDAK1H,KAAK,WAAW,QAAQ,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC;AAAA,kDAC1D,KAAK,WAAW,QAAQ,OAAO,YAAY,GAAG,QAAQ,CAAC,CAAC;AAAA,yDACjD,KAAK,WAAW,QAAQ,OAAO,YAAY,UAAU,IAAI,kBAAkB,cAAc;AAAA,kDAChG,KAAK,WAAW,QAAQ,OAAO,YAAY,UAAU,IAAI,MAAM,EAAE,GAAG,KAAK,WAAW,QAAQ,OAAO,YAAY,OAAO,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAOhK,EACN;AAAA;AAAA;AAAA;AAAA;AAAA,8BAKkB,KAAK,gBAClB,MAAM,GAAG,CAAC,EACV;AAAA,MACG,CAAC,QAAQ;AAAA,6DACgC,IAAI,SAAS,YAAY,CAAC;AAAA,0CAC7C,IAAI,KAAK;AAAA,oEACiB,IAAI,QAAQ,4CAA4C,IAAI,cAAc;AAAA,uEACvE,IAAI,WAAW;AAAA,oEAClB,IAAI,QAAQ;AAAA,4EACJ,IAAI,eAAe;AAAA,sCACzD,IAAI,QAAQ,oCAAoC,IAAI,KAAK,gBAAgB,EAAE;AAAA;AAAA;AAAA,IAGjG,EACC,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sDAmC6B,KAAK,UAAU,KAAK,SAAS,QAAQ,gBAAgB,CAAC;AAAA;AAAA,0DAElD,KAAK,UAAU,KAAK,SAAS,QAAQ,gBAAgB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAgBtF,KAAK,WACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sDAMoC,KAAK,UAAU,KAAK,SAAS,WAAW,MAAM,QAAQ,CAAC;AAAA;AAAA;AAAA,0DAGnD,KAAK,UAAU,KAAK,SAAS,WAAW,MAAM,QAAQ,CAAC;AAAA,qEAC5C,KAAK,UAAU,KAAK,SAAS,WAAW,MAAM,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAe1G,EACN;AAAA;AAAA,0BAEc,KAAK,SACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0CAMwB,KAAK,UAAU,KAAK,OAAO,eAAe,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,gDAItF,KAAK,UAAU,KAAK,OAAO,eAAe,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gDAMtE,KAAK,UAAU,KAAK,OAAO,eAAe,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gDAMzE,KAAK,UAAU,KAAK,OAAO,eAAe,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAkB3G,EACN;AAAA;AAAA;AAAA;AAAA,EAIR;AAAA,EAEQ,mBAAmB,MAAiC;AACxD,UAAM,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAEA,UAAM,OAAO,KAAK,SAAS,OAAO,IAAI,CAAC,UAAU;AAAA,MAC7C,MAAM;AAAA,MACN,MAAM,QAAQ,KAAK,GAAG;AAAA,MACtB,MAAM,UAAU,YAAY;AAAA,MAC5B,MAAM;AAAA,MACN,MAAM,cAAc;AAAA,MACpB,MAAM,kBAAkB,QAAQ,CAAC,KAAK;AAAA,MACtC,MAAM,eAAe;AAAA,MACrB,MAAM,aAAa;AAAA,MACnB,MAAM,eAAe,IAAI,KAAK,MAAM,YAAY,EAAE,YAAY,IAAI;AAAA,MAClE,KAAK,gBAAgB,OAAO,CAAC,MAAM,EAAE,UAAU,MAAM,QAAQ,EAAE,SAAS,UAAU,EAAE;AAAA,MACpF,KAAK,gBAAgB,OAAO,CAAC,MAAM,EAAE,UAAU,MAAM,QAAQ,EAAE,SAAS,aAAa,EAAE;AAAA,IAC3F,CAAC;AAED,WAAO,CAAC,QAAQ,KAAK,GAAG,GAAG,GAAG,KAAK,IAAI,CAAC,QAAQ,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,EAC7E;AAAA,EAEQ,gCAAgC,MAAiC;AACrE,WAAO;AAAA;AAAA,4BAEa,KAAK,SAAS,YAAY,mBAAmB,CAAC;AAAA,+BAC3C,KAAK,SAAS,OAAO;AAAA,yCACX,KAAK,SAAS,SAAS,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA,0CAGhC,KAAK,SAAS,QAAQ,WAAW;AAAA,wCACnC,KAAK,SAAS,QAAQ,cAAc,QAAQ,CAAC,CAAC;AAAA,2CAC3C,KAAK,SAAS,QAAQ,iBAAiB,QAAQ,CAAC,CAAC;AAAA,+CAC7C,KAAK,SAAS,QAAQ,qBAAqB,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA,kBAGlF,KAAK,SAAS,eAAe,SAAS,IACtC,KAAK,SAAS,eAAe,IAAI,CAAC,UAAU,kBAAQ,KAAK,EAAE,EAAE,KAAK,IAAI,IACtE,wCACN;AAAA;AAAA;AAAA,kBAGM,KAAK,gBACN,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,EAC9B,MAAM,GAAG,CAAC,EACV;AAAA,MACG,CAAC,KAAK,UACF,GAAG,QAAQ,CAAC,OAAO,IAAI,KAAK,OAAO,IAAI,QAAQ;AAAA,OAAoB,IAAI,WAAW;AAAA,yBAA4B,IAAI,eAAe;AAAA,IACzI,EACC,KAAK,MAAM,CAAC;AAAA;AAAA;AAAA,0CAGa,KAAK,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,cAAc,UAAU,EAAE,cAAc,UAAU,EAAE,MAAM;AAAA,6CAC5F,KAAK,SAAS,QAAQ,YAAY;AAAA,8CACjC,KAAK,SAAS,cAAc,MAAM,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA,+CAG3C,KAAK,gBAAgB,MAAM;AAAA,2CAC/B,KAAK,gBAAgB,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,MAAM;AAAA,uCAC/D,KAAK,gBAAgB,OAAO,CAAC,MAAM,EAAE,YAAY,MAAM,EAAE,WAAW,EAAE,EAAE,MAAM;AAAA,yCAC5E,KAAK,gBAAgB,OAAO,CAAC,MAAM,EAAE,YAAY,MAAM,EAAE,WAAW,EAAE,EAAE,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUnH;AAAA,EAEA,MAAc,iBAAiB,UAAmD;AAC9E,UAAM,SAAS,SAAS;AACxB,UAAM,UAAU,SAAS;AAEzB,UAAM,cAAc;AAAA,MAChB,YAAY,QAAQ,WAAW,sBAAsB,SAAS,SAAS,UAAU;AAAA,MACjF,uBAAwB,QAAQ,eAAe,QAAQ,cAAe,KAAK,QAAQ,CAAC,CAAC;AAAA,MACrF,wBAAwB,OAAO,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,cAAc,IAAI,CAAC,IAAI,OAAO,QAAQ,QAAQ,CAAC,CAAC;AAAA,MAC3G,GAAG,QAAQ,iBAAiB,OAAO,QAAQ,iBAAiB,QAAQ;AAAA,IACxE;AAEA,UAAM,iBAAiB,CAAC;AACxB,QAAI,QAAQ,iBAAiB,WAAW,GAAG;AACvC,qBAAe,KAAK,GAAG,QAAQ,iBAAiB,QAAQ,kCAAkC;AAAA,IAC9F;AACA,QAAI,QAAQ,gBAAgB,IAAI;AAC5B,qBAAe,KAAK,mBAAmB,QAAQ,cAAc,QAAQ,CAAC,CAAC,mCAAmC;AAAA,IAC9G;AACA,QAAI,QAAQ,eAAe,QAAQ,cAAc;AAC7C,qBAAe,KAAK,uBAAuB,QAAQ,YAAY,0BAA0B,QAAQ,YAAY,GAAG;AAAA,IACpH;AAEA,UAAM,YAAY;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAEA,UAAM,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAEA,UAAM,YAAY;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAEA,UAAM,YAAY,CAAC;AACnB,QAAI,QAAQ,gBAAgB,GAAI,WAAU,KAAK,yBAAyB;AACxE,QAAI,QAAQ,mBAAmB,GAAI,WAAU,KAAK,kCAAkC;AACpF,QAAI,QAAQ,uBAAuB,GAAI,WAAU,KAAK,uBAAuB;AAE7E,UAAM,gBAAgB;AAAA,MAClB,OAAO,KAAK,IAAI,GAAG,OAAO,QAAQ,gBAAgB,QAAQ,mBAAmB,QAAQ,wBAAwB,CAAC;AAAA,MAC9G,OAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,MACA,iBAAiB,KAAK,6BAA6B,OAAO,QAAQ,SAAS,gBAAgB,MAAM;AAAA,IACrG;AAEA,UAAM,+BAA+B;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAEA,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAc,uBAAuB,iBAAsE;AACvG,WAAO,gBAAgB,IAAI,CAAC,SAAS;AAAA,MACjC,GAAG;AAAA,MACH,UAAU,KAAK,kBAAkB,GAAG;AAAA,MACpC,iBAAiB,KAAK,eAAe,GAAG;AAAA,MACxC,gBAAgB,KAAK,qBAAqB,GAAG;AAAA,MAC7C,qBAAqB,KAAK,4BAA4B,GAAG;AAAA,MACzD,cAAc,KAAK,qBAAqB,GAAG;AAAA,MAC3C,uBAAuB,KAAK,4BAA4B,GAAG;AAAA,IAC/D,EAAE;AAAA,EACN;AAAA,EAEQ,kBAAkB,KAA6B;AACnD,QAAI,WAAW;AAEf,YAAQ,IAAI,UAAU;AAAA,MAClB,KAAK;AACD,oBAAY;AACZ;AAAA,MACJ,KAAK;AACD,oBAAY;AACZ;AAAA,MACJ,KAAK;AACD,oBAAY;AACZ;AAAA,MACJ,KAAK;AACD,oBAAY;AACZ;AAAA,IACR;AAEA,YAAQ,IAAI,MAAM;AAAA,MACd,KAAK;AACD,oBAAY;AACZ;AAAA,MACJ,KAAK;AACD,oBAAY;AACZ;AAAA,MACJ,KAAK;AACD,oBAAY;AACZ;AAAA,MACJ,KAAK;AACD,oBAAY;AACZ;AAAA,IACR;AAEA,YAAQ,IAAI,QAAQ;AAAA,MAChB,KAAK;AACD,oBAAY;AACZ;AAAA,MACJ,KAAK;AACD,oBAAY;AACZ;AAAA,MACJ,KAAK;AACD,oBAAY;AACZ;AAAA,IACR;AAEA,WAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,QAAQ,CAAC;AAAA,EAC9C;AAAA,EAEQ,eAAe,KAA6B;AAChD,UAAM,YAAY;AAAA,MACd,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,IACV;AACA,WAAO,UAAU,IAAI,MAAM,KAAK;AAAA,EACpC;AAAA,EAEQ,qBAAqB,KAA6D;AACtF,QAAI,IAAI,SAAS,eAAe,IAAI,aAAa,cAAc,IAAI,aAAa,SAAS;AACrF,aAAO;AAAA,IACX;AACA,QAAI,IAAI,SAAS,cAAe,IAAI,SAAS,iBAAiB,IAAI,aAAa,QAAS;AACpF,aAAO;AAAA,IACX;AACA,QAAI,IAAI,SAAS,iBAAiB,IAAI,SAAS,mBAAmB;AAC9D,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,4BAA4B,KAA+B;AAC/D,UAAM,YAAY;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAEA,QAAI,IAAI,SAAS,YAAY;AACzB,aAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,IAAI,SAAS,eAAe;AAC5B,aAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEQ,qBAAqB,KAA+B;AACxD,UAAM,eAAe,CAAC;AAEtB,QAAI,IAAI,SAAS,cAAc,IAAI,aAAa,kBAAkB;AAC9D,mBAAa,KAAK,+BAA+B,wBAAwB;AAAA,IAC7E;AAEA,QAAI,IAAI,SAAS,iBAAiB,IAAI,aAAa,WAAW;AAC1D,mBAAa,KAAK,wBAAwB,6BAA6B;AAAA,IAC3E;AAEA,QAAI,IAAI,aAAa,WAAW;AAC5B,mBAAa,KAAK,2BAA2B,gBAAgB;AAAA,IACjE;AAEA,WAAO;AAAA,EACX;AAAA,EAEQ,4BAA4B,KAA6B;AAC7D,QAAI,IAAI,SAAS,YAAY;AACzB,aAAO;AAAA,IACX;AAEA,QAAI,IAAI,SAAS,eAAe;AAC5B,aAAO;AAAA,IACX;AAEA,QAAI,IAAI,SAAS,mBAAmB;AAChC,aAAO;AAAA,IACX;AAEA,WAAO;AAAA,EACX;AAAA,EAEQ,6BAA6B,YAAoB,qBAAqC;AAC1F,UAAM,cAAc,aAAa,MAAM,sBAAsB;AAE7D,QAAI,cAAc,GAAI,QAAO;AAC7B,QAAI,cAAc,GAAI,QAAO;AAC7B,QAAI,cAAc,IAAK,QAAO;AAC9B,WAAO;AAAA,EACX;AAAA,EAEQ,qBAA6B;AACjC,UAAM,eAAe,KAAK,UAAU,KAAK,MAAM;AAC/C,QAAI,OAAO;AACX,aAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC1C,YAAM,OAAO,aAAa,WAAW,CAAC;AACtC,cAAQ,QAAQ,KAAK,OAAO;AAC5B,aAAO,OAAO;AAAA,IAClB;AACA,WAAO,KAAK,IAAI,IAAI,EAAE,SAAS,EAAE;AAAA,EACrC;AAAA,EAEQ,kBAAkB,OAAmC;AACzD,QAAI,CAAC,MAAO,QAAO;AAEnB,YAAQ,MAAM,OAAO;AAAA,MACjB,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX;AACI,eAAO;AAAA,IACf;AAAA,EACJ;AAAA,EAEQ,cAAc,OAAuB;AACzC,YAAQ,OAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX;AACI,eAAO;AAAA,IACf;AAAA,EACJ;AAAA,EAEQ,gBAAgB,QAAwB;AAC5C,QAAI,KAAK,IAAI,MAAM,IAAI,EAAG,QAAO;AACjC,QAAI,SAAS,EAAG,QAAO;AACvB,WAAO;AAAA,EACX;AAAA,EAEQ,kBAAkB,iBAA2C;AACjE,UAAM,SAAS,IAAI,IAAI,gBAAgB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,OAAO,CAAC;AAC1E,WAAO,OAAO,KAAK,SAAS;AAAA,EAChC;AACJ;;;AVvlDA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QAAQ,KAAK,mBAAmB,EAAE,YAAY,6BAA6B,EAAE,QAAQ,OAAO;AAE5F,QACK,OAAO,iBAAiB,wBAAwB,EAChD,OAAO,eAAe,iBAAiB,EACvC,OAAO,uBAAuB,yBAAyB,EACvD,OAAO,cAAc,wBAAwB,EAC7C,KAAK,aAAa,CAAC,gBAAgB;AAChC,QAAM,OAAO,YAAY,KAAK;AAC9B,MAAI,KAAK,OAAO;AACZ,WAAO,UAAU,EAAE,qBAAsB,CAAC;AAAA,EAC9C,WAAW,KAAK,SAAS;AACrB,WAAO,UAAU,EAAE,qBAAsB,CAAC;AAAA,EAC9C;AAEA,MAAI,KAAK,SAAS;AACd,WAAO,UAAU,EAAE,QAAQ,MAAM,CAAC;AAAA,EACtC;AACJ,CAAC;AAEL,QACK,QAAQ,SAAS,EACjB,YAAY,oBAAoB,EAChC,OAAO,yBAAyB,iBAAiB,aAAa,EAC9D,OAAO,4BAA4B,oBAAoB,gBAAgB,EACvE,OAAO,yBAAyB,uCAAuC,IAAI,EAC3E,OAAO,oBAAoB,qCAAqC,KAAK,EACrE,OAAO,cAAc,8BAA8B,IAAI,EACvD,OAAO,8BAA8B,sCAAsC,GAAG,EAC9E,OAAO,WAAW,6CAA6C,IAAI,EACnE,OAAO,uBAAuB,2CAA2C,EACzE,OAAO,iCAAiC,+CAA+C,EACvF,OAAO,cAAc,4BAA4B,EACjD,OAAO,iBAAiB,+BAA+B,EACvD,OAAO,OAAO,YAAY;AACvB,QAAM,YAAY,YAAY,IAAI;AAElC,MAAI;AACA,WAAO,KAAK,oCAA6B;AAEzC,UAAM,SAAS,MAAM,WAAW,QAAQ,QAAQ;AAAA,MAC5C,QAAQ,QAAQ;AAAA,MAChB,WAAW,QAAQ;AAAA,MACnB,cAAc,QAAQ;AAAA,MACtB,UAAU,QAAQ;AAAA,MAClB,gBAAgB,OAAO,SAAS,QAAQ,cAAc;AAAA,MACtD,OAAO,EAAE,GAAG,eAAe,OAAO,SAAS,QAAQ,MAAM;AAAA,IAC7D,CAAC;AAED,QAAI,QAAQ,iBAAiB;AACzB,aAAO,gBAAgB,KAAK,GAAG,QAAQ,gBAAgB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,CAAC;AAAA,IAClG;AAEA,QAAI,QAAQ,UAAU;AAClB,aAAO,yBAAyB;AAChC,aAAO,4BAA4B;AAAA,IACvC;AAEA,QAAI,QAAQ,aAAa;AACrB,aAAO,4BAA4B;AACnC,aAAO,yBAAyB;AAAA,IACpC;AAEA,UAAM,eAAe,eAAe,MAAM;AAC1C,QAAI,aAAa,SAAS,GAAG;AACzB,aAAO,MAAM,kCAAkC;AAC/C,mBAAa,QAAQ,CAAC,UAAU,OAAO,MAAM,OAAO,KAAK,EAAE,CAAC;AAC5D,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,WAAW,IAAI,gBAAgB,MAAM;AAE3C,QAAI,QAAQ,SAAS;AACjB,YAAM,gBAAgB,IAAI,cAAc;AACxC,YAAM,cAAc,QAAQ,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC;AAE1E,iBAAW,cAAc,aAAa;AAClC,YAAI,eAAe,WAAW;AAC1B,gBAAM,cAAc,WAAW,IAAI,cAAc,CAAC;AAAA,QACtD,WAAW,eAAe,iBAAiB;AACvC,gBAAM,cAAc,WAAW,IAAI,mBAAmB,CAAC;AAAA,QAC3D;AAAA,MACJ;AAAA,IACJ;AAEA,UAAM,WAAW,MAAM,SAAS,cAAc;AAE9C,UAAM,UAAU,QAAQ,WAAW,QAAQ,CAAC,MAAM,QAAQ,MAAM,IAAI,CAAC,QAAQ,MAAM;AAEnF,eAAW,UAAU,SAAS;AAC1B,YAAM,eAAe,UAAU,UAAU,QAAQ,OAAO,SAAS;AAAA,IACrE;AAEA,WAAO,KAAK,6BAAsB;AAClC,WAAO,KAAK,aAAa,SAAS,QAAQ,WAAW,EAAE;AACvD,WAAO,KAAK,qBAAqB,SAAS,QAAQ,cAAc,QAAQ,CAAC,CAAC,GAAG;AAC7E,WAAO,KAAK,wBAAwB,SAAS,QAAQ,iBAAiB,QAAQ,CAAC,CAAC,GAAG;AACnF,WAAO,KAAK,sBAAsB,SAAS,gBAAgB,MAAM,EAAE;AAEnE,mBAAe,QAAQ;AAEvB,UAAM,WAAW,YAAY,IAAI,IAAI;AACrC,WAAO,QAAQ,+CAA0C,OAAO,SAAS,EAAE;AAC3E,WAAO,QAAQ,+BAA0B,SAAS,QAAQ,CAAC,CAAC,yBAAyB,OAAO,SAAS,EAAE;AAEvG,UAAM,kBAAkB,IAAI,uBAAuB,QAAQ,OAAO,SAAS;AAC3E,UAAM,gBAAgB,sBAAsB,WAAW,QAAQ;AAAA,EACnE,SAAS,OAAO;AACZ,WAAO,MAAM,oBAAoB,KAAK;AACtC,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ,CAAC;AAEL,QACK,QAAQ,UAAU,EAClB,YAAY,2BAA2B,EACvC,OAAO,yBAAyB,iBAAiB,aAAa,EAC9D,OAAO,4BAA4B,sBAAsB,IAAI,EAC7D,OAAO,uBAAuB,2CAA2C,EACzE,OAAO,kBAAkB,0CAA0C,EACnE,OAAO,iBAAiB,qDAAqD,IAAI,EACjF,OAAO,2BAA2B,qDAAqD,EACvF,OAAO,iCAAiC,yCAAyC,EACjF,OAAO,OAAO,YAAY;AACvB,QAAM,YAAY,YAAY,IAAI;AAElC,MAAI;AACA,WAAO,KAAK,wCAAiC;AAE7C,UAAM,SAAS,MAAM,WAAW,QAAQ,QAAQ;AAAA,MAC5C,QAAQ,QAAQ;AAAA,MAChB,wBAAwB;AAAA,MACxB,2BAA2B;AAAA,IAC/B,CAAC;AAED,UAAM,WAAW,IAAI,gBAAgB,MAAM;AAC3C,UAAM,WAAW,MAAM,SAAS,cAAc;AAC9C,UAAM,YAAY,OAAO,SAAS,QAAQ,SAAS;AAEnD,WAAO,KAAK,mCAAuB,SAAS,QAAQ,cAAc,QAAQ,CAAC,CAAC,GAAG;AAE/E,0BAAsB,UAAU;AAAA,MAC5B,YAAY,QAAQ;AAAA,MACpB,YAAY,QAAQ;AAAA,IACxB,CAAC;AAED,QAAI,QAAQ,aAAa;AACrB,YAAM,YAAY,UAAU,OAAO,SAAS;AAC5C,aAAO,QAAQ,uDAAgD;AAAA,IACnE;AAEA,QAAI,QAAQ,mBAAmB,SAAS,QAAQ,gBAAgB,WAAW;AACvE,aAAO,MAAM,0CAAqC,SAAS,IAAI;AAC/D,aAAO,MAAM,yBAAoB,SAAS,QAAQ,cAAc,QAAQ,CAAC,CAAC,wBAAwB,SAAS,GAAG;AAC9G,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,WAAO,QAAQ,iCAA4B;AAC3C,UAAM,WAAW,YAAY,IAAI,IAAI;AACrC,WAAO,QAAQ,8CAAkC,SAAS,QAAQ,CAAC,CAAC,KAAK;AAEzE,UAAM,eAAmC,MAAM,2BAA2B,QAAQ;AAClF,UAAM,kBAAkB,IAAI,uBAAuB,QAAQ,OAAO,SAAS;AAC3E,UAAM,gBAAgB,sBAAsB,YAAY,UAAU,EAAE,UAAU,aAAa,CAAC;AAAA,EAChG,SAAS,OAAO;AACZ,WAAO,MAAM,6BAA6B,KAAK;AAC/C,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ,CAAC;AAEL,QACK,QAAQ,aAAa,EACrB,YAAY,+EAA+E,EAC3F,OAAO,yBAAyB,4BAA4B,aAAa,EACzE,OAAO,eAAe,4BAA4B,EAClD,OAAO,mCAAmC,qCAAqC,IAAI,EACnF,OAAO,qBAAqB,mCAAmC,IAAI,EACnE,OAAO,uBAAuB,mCAAmC,IAAI,EACrE,OAAO,oBAAoB,mCAAmC,IAAI,EAClE,OAAO,OAAO,YAAY;AACvB,QAAM,YAAY,YAAY,IAAI;AAElC,MAAI;AACA,WAAO,KAAK,wCAAmC;AAE/C,UAAM,SAAS,MAAM,WAAW,QAAQ,QAAQ;AAAA,MAC5C,QAAQ,QAAQ;AAAA,MAChB,2BAA2B;AAAA,MAC3B,wBAAwB;AAAA,MACxB,YAAY;AAAA,QACR,GAAG,eAAe;AAAA,QAClB,YAAY,OAAO,SAAS,QAAQ,mBAAmB;AAAA,MAC3D;AAAA,IACJ,CAAC;AAED,UAAM,WAAW,IAAI,gBAAgB,MAAM;AAC3C,UAAM,WAAW,MAAM,SAAS,cAAc;AAE9C,6BAAyB,UAAU;AAAA,MAC/B,WAAW,QAAQ;AAAA,MACnB,gBAAgB,QAAQ;AAAA,MACxB,kBAAkB,QAAQ;AAAA,MAC1B,eAAe,QAAQ;AAAA,IAC3B,CAAC;AAED,QAAI,QAAQ,WAAW;AACnB,aAAO,KAAK,6CAAsC;AAClD,YAAM,yBAAyB,QAAQ;AAAA,IAC3C;AAEA,UAAM,WAAW,YAAY,IAAI,IAAI;AACrC,WAAO,QAAQ,2CAAsC,SAAS,QAAQ,CAAC,CAAC,KAAK;AAE7E,UAAM,kBAAyC,MAAM,8BAA8B,QAAQ;AAC3F,UAAM,kBAAkB,IAAI,uBAAuB,QAAQ,OAAO,SAAS;AAC3E,UAAM,gBAAgB,sBAAsB,eAAe,UAAU,EAAE,aAAa,gBAAgB,CAAC;AAAA,EACzG,SAAS,OAAO;AACZ,WAAO,MAAM,gCAAgC,KAAK;AAClD,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ,CAAC;AAEL,QACK,QAAQ,QAAQ,EAChB,YAAY,yDAAyD,EACrE,OAAO,yBAAyB,4BAA4B,aAAa,EACzE,OAAO,mBAAmB,6BAA6B,IAAI,EAC3D,OAAO,gBAAgB,0BAA0B,EACjD,OAAO,sBAAsB,oCAAoC,EACjE,OAAO,qBAAqB,6BAA6B,EACzD,OAAO,OAAO,YAAY;AACvB,MAAI;AACA,WAAO,KAAK,+BAAwB;AAEpC,UAAM,aAAaE,MAAK,KAAK,kBAAkB,aAAa;AAC5D,UAAM,SAAS,MAAM,UAAU,aAAa,UAAU;AAEtD,QAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG;AAC/C,aAAO,KAAK,oEAAoE;AAChF;AAAA,IACJ;AAEA,wBAAoB,QAAQ,OAAO,SAAS,QAAQ,IAAI,GAAG;AAAA,MACvD,WAAW,QAAQ;AAAA,MACnB,iBAAiB,QAAQ;AAAA,MACzB,UAAU,QAAQ;AAAA,IACtB,CAAC;AAED,UAAM,aAA+B,MAAM,yBAAyB,QAAQ,OAAO,SAAS,QAAQ,IAAI,CAAC;AACzG,UAAM,SAAS,MAAM,WAAW,QAAQ,MAAM;AAC9C,UAAM,WAAW,EAAE,SAAS,EAAE,eAAe,GAAG,kBAAkB,GAAG,sBAAsB,EAAE,EAAE;AAC/F,UAAM,kBAAkB,IAAI,uBAAuB,QAAQ,gBAAgB;AAC3E,UAAM,gBAAgB,sBAAsB,UAAU,UAAU,EAAE,QAAQ,WAAW,CAAC;AAAA,EAC1F,SAAS,OAAO;AACZ,WAAO,MAAM,2BAA2B,KAAK;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ,CAAC;AAEL,QACK,QAAQ,8BAA8B,EACtC,YAAY,iEAAiE,EAC7E,OAAO,qBAAqB,gCAAgC,IAAI,EAChE,OAAO,eAAe,2BAA2B,EACjD,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,OAAO,UAAU,SAAS,YAAY;AAC1C,MAAI;AACA,WAAO,KAAK,yCAAkC;AAE9C,UAAM,CAAC,cAAc,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,MAClD,UAAU,aAAa,QAAQ;AAAA,MAC/B,UAAU,aAAa,OAAO;AAAA,IAClC,CAAC;AAED,QAAI,CAAC,gBAAgB,CAAC,aAAa;AAC/B,aAAO,MAAM,iCAAiC;AAC9C,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,4BAAwB,cAAc,aAAa;AAAA,MAC/C,QAAQ,QAAQ;AAAA,MAChB,UAAU,QAAQ;AAAA,MAClB,gBAAgB,QAAQ;AAAA,IAC5B,CAAC;AAED,UAAM,SAAS,MAAM,WAAW,QAAQ,MAAM;AAC9C,UAAM,iBAAuC,MAAM,6BAA6B,cAAc,WAAW;AACzG,UAAM,kBAAkB,IAAI,uBAAuB,QAAQ,gBAAgB;AAC3E,UAAM,gBAAgB,sBAAsB,WAAW,aAAkC,EAAE,YAAY,eAAe,CAAC;AAAA,EAC3H,SAAS,OAAO;AACZ,WAAO,MAAM,sBAAsB,KAAK;AACxC,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ,CAAC;AAEL,QACK,QAAQ,SAAS,EACjB,YAAY,uCAAuC,EACnD,SAAS,aAAa,4DAA4D,EAClF,SAAS,YAAY,aAAa,EAClC,OAAO,OAAO,SAAS,WAAW;AAC/B,MAAI;AACA,UAAM,gBAAgB,IAAI,cAAc;AAExC,YAAQ,SAAS;AAAA,MACb,KAAK;AACD,cAAM,UAAU,cAAc,iBAAiB;AAC/C,eAAO,KAAK,2BAAoB;AAChC,gBAAQ,QAAQ,CAAC,SAAS,OAAO,KAAK,OAAO,IAAI,EAAE,CAAC;AACpD;AAAA,MAEJ,KAAK;AACD,YAAI,CAAC,QAAQ;AACT,iBAAO,MAAM,yBAAyB;AACtC,kBAAQ,KAAK,CAAC;AAAA,QAClB;AACA,eAAO,KAAK,sBAAsB,MAAM,EAAE;AAC1C;AAAA,MAEJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,eAAO,KAAK,GAAG,OAAO,YAAY,MAAM,EAAE;AAC1C;AAAA,MAEJ;AACI,eAAO,MAAM,2BAA2B,OAAO,EAAE;AACjD,gBAAQ,KAAK,CAAC;AAAA,IACtB;AAAA,EACJ,SAAS,OAAO;AACZ,WAAO,MAAM,6BAA6B,KAAK;AAC/C,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ,CAAC;AAEL,QACK,QAAQ,iBAAiB,EACzB,YAAY,6BAA6B,EACzC,OAAO,uBAAuB,gCAAgC,EAC9D,OAAO,OAAO,YAAY;AACvB,MAAI;AACA,UAAM,SAAS,MAAM,WAAW,QAAQ,MAAM;AAC9C,UAAM,SAAS,eAAe,MAAM;AAEpC,QAAI,OAAO,WAAW,GAAG;AACrB,aAAO,QAAQ,+BAA0B;AAAA,IAC7C,OAAO;AACH,aAAO,MAAM,yCAAoC;AACjD,aAAO,QAAQ,CAAC,UAAU,OAAO,MAAM,OAAO,KAAK,EAAE,CAAC;AACtD,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ,SAAS,OAAO;AACZ,WAAO,MAAM,oCAAoC,KAAK;AACtD,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ,CAAC;AAEL,QACK,QAAQ,MAAM,EACd,YAAY,+BAA+B,EAC3C,OAAO,eAAe,kCAAkC,EACxD,OAAO,yBAAyB,2CAA2C,OAAO,EAClF,OAAO,OAAO,YAAY;AACvB,MAAI;AACA,UAAM,aAAa;AAEnB,QAAK,MAAM,UAAU,WAAW,UAAU,KAAM,CAAC,QAAQ,OAAO;AAC5D,aAAO,KAAK,8DAA8D;AAC1E;AAAA,IACJ;AAEA,UAAM,YAAY;AAAA,MACd,OAAO;AAAA,MACP,UAAU,EAAE,GAAG,gBAAgB,wBAAwB,MAAM,2BAA2B,MAAM;AAAA,MAC9F,aAAa,EAAE,GAAG,gBAAgB,2BAA2B,MAAM,wBAAwB,MAAM;AAAA,IACrG;AAEA,UAAM,WAAW,QAAQ,YAAY;AACrC,UAAM,SAAS,UAAU,QAAQ,QAAkC,KAAK,UAAU;AAClF,UAAM,UAAU,cAAc,4BAA4B,MAAM;AAEhE,UAAM,UAAU,cAAc,YAAY,MAAM;AAChD,WAAO,QAAQ,0CAAqC,QAAQ,QAAQ,WAAW;AAC/E,WAAO,QAAQ,sCAAiC,UAAU,EAAE;AAC5D,WAAO,KAAK,4BAAqB,QAAQ,EAAE;AAAA,EAC/C,SAAS,OAAO;AACZ,WAAO,MAAM,mCAAmC,KAAK;AACrD,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ,CAAC;AAEL,eAAe,WAAW,YAAqB,YAAqC,CAAC,GAA4B;AAC7G,MAAI,SAAkC,CAAC;AAEvC,QAAM,cAAc,CAAC,YAAY,4BAA4B,0BAA0B,oBAAoB,EAAE;AAAA,IACzG;AAAA,EACJ;AAEA,aAAWA,SAAQ,aAAa;AAC5B,QAAI,MAAM,UAAU,WAAWA,KAAK,GAAG;AACnC,UAAI;AACA,iBAAU,MAAM,UAAU,aAAaA,KAAK,KAAM,CAAC;AACnD,eAAO,MAAM,8BAA8BA,KAAI,EAAE;AACjD;AAAA,MACJ,SAAS,OAAO;AACZ,eAAO,KAAK,8BAA8BA,KAAI,KAAK,KAAK;AAAA,MAC5D;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO,EAAE,GAAG,gBAAgB,GAAG,QAAQ,GAAG,UAAU;AACxD;AAEA,eAAe,eACX,UACA,UACA,QACA,WACa;AACb,QAAM,UAAU,sBAAsB,SAAS;AAE/C,UAAQ,QAAQ;AAAA,IACZ,KAAK;AACD,YAAM,WAAW,SAAS,eAAe,QAAQ;AACjD,YAAM,UAAU,UAAUA,MAAK,KAAK,WAAW,oBAAoB,GAAG,QAAQ;AAC9E,aAAO,KAAK,8BAAuBA,MAAK,KAAK,WAAW,oBAAoB,CAAC,EAAE;AAC/E;AAAA,IAEJ,KAAK;AACD,YAAM,UAAU,cAAcA,MAAK,KAAK,WAAW,oBAAoB,GAAG,QAAQ;AAClF,aAAO,KAAK,wBAAiBA,MAAK,KAAK,WAAW,oBAAoB,CAAC,EAAE;AACzE;AAAA,IAEJ,KAAK;AACD,YAAM,aAAa,mBAAmB,QAAQ;AAC9C,YAAM,UAAU,UAAUA,MAAK,KAAK,WAAW,sBAAsB,GAAG,UAAU;AAClF,aAAO,KAAK,0BAAmBA,MAAK,KAAK,WAAW,sBAAsB,CAAC,EAAE;AAC7E;AAAA,EACR;AACJ;AAEA,SAAS,eAAe,UAAmC;AACvD,SAAO,UAAU;AACjB,SAAO,KAAK,MAAM,KAAK,4BAAqB,CAAC;AAC7C,SAAO,UAAU;AAEjB,QAAM,UAAU,SAAS;AAEzB,UAAQ,IAAI,MAAM,KAAK,mBAAY,GAAG,QAAQ,WAAW;AACzD,UAAQ,IAAI,MAAM,MAAM,2BAAoB,GAAG,GAAG,QAAQ,cAAc,QAAQ,CAAC,CAAC,GAAG;AACrF,UAAQ,IAAI,MAAM,KAAK,2BAAsB,GAAG,GAAG,QAAQ,iBAAiB,QAAQ,CAAC,CAAC,GAAG;AACzF,UAAQ,IAAI,MAAM,QAAQ,kCAA2B,GAAG,GAAG,QAAQ,qBAAqB,QAAQ,CAAC,CAAC,GAAG;AACrG,UAAQ,IAAI,MAAM,OAAO,0BAAmB,GAAG,GAAG,QAAQ,kBAAkB,QAAQ,CAAC,CAAC,GAAG;AAEzF,MAAI,SAAS,gBAAgB,SAAS,GAAG;AACrC,YAAQ,IAAI,MAAM,OAAO,4BAAqB,GAAG,SAAS,gBAAgB,MAAM;AAEhF,UAAM,iBAAiB,SAAS,gBAAgB;AAAA,MAC5C,CAAC,KAAK,QAAQ;AACV,YAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,KAAK;AAC/C,eAAO;AAAA,MACX;AAAA,MACA,CAAC;AAAA,IACL;AAEA,QAAI,eAAe,SAAU,SAAQ,IAAI,MAAM,IAAI,yBAAkB,eAAe,QAAQ,EAAE,CAAC;AAC/F,QAAI,eAAe,KAAM,SAAQ,IAAI,MAAM,OAAO,yBAAe,eAAe,IAAI,EAAE,CAAC;AACvF,QAAI,eAAe,OAAQ,SAAQ,IAAI,MAAM,KAAK,2BAAiB,eAAe,MAAM,EAAE,CAAC;AAC3F,QAAI,eAAe,IAAK,SAAQ,IAAI,MAAM,MAAM,iBAAY,eAAe,GAAG,EAAE,CAAC;AAAA,EACrF;AAEA,SAAO,UAAU;AACrB;AAEA,SAAS,sBAAsB,UAA6B,UAAe,CAAC,GAAS;AACjF,SAAO,UAAU;AACjB,SAAO,KAAK,MAAM,KAAK,iCAA0B,CAAC;AAClD,SAAO,UAAU;AAEjB,QAAM,UAAU,SAAS;AAEzB,UAAQ,IAAI,MAAM,MAAM,kCAAsB,GAAG,GAAG,QAAQ,cAAc,QAAQ,CAAC,CAAC,GAAG;AACvF,UAAQ,IAAI,MAAM,KAAK,0BAAmB,GAAG,GAAG,QAAQ,YAAY,IAAI,QAAQ,WAAW,EAAE;AAC7F,UAAQ,IAAI,MAAM,IAAI,0BAAmB,GAAG,QAAQ,YAAY;AAEhE,UAAQ,IAAI,MAAM,KAAK,gCAAyB,CAAC;AACjD,SAAO,QAAQ,QAAQ,gBAAgB,EAAE,QAAQ,CAAC,CAAC,MAAM,KAAK,MAAM;AAChE,UAAM,QAAQ,EAAE,UAAU,aAAM,MAAM,aAAM,QAAQ,aAAM,KAAK,YAAK,EAAE,IAAI,KAAK;AAC/E,UAAM,QAAQ,EAAE,UAAU,MAAM,KAAK,MAAM,MAAM,QAAQ,QAAQ,MAAM,MAAM,KAAK,MAAM,MAAM,EAAE,IAAI,KAAK,MAAM;AAC/G,YAAQ,IAAI,MAAM,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;AAAA,EAC5D,CAAC;AAED,QAAM,eAAe,SAAS,gBAAgB,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU;AACjF,MAAI,aAAa,SAAS,GAAG;AACzB,YAAQ,IAAI,MAAM,KAAK,kCAA2B,CAAC;AACnD,iBAAa,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAC,KAAK,UAAU;AAC7C,YAAM,gBAAgB,EAAE,UAAU,aAAM,MAAM,gBAAM,QAAQ,gBAAM,KAAK,SAAI,EAAE,IAAI,QAAQ,KAAK;AAC9F,cAAQ,IAAI,KAAK,QAAQ,CAAC,KAAK,aAAa,IAAI,IAAI,KAAK,EAAE;AAC3D,UAAI,IAAI,MAAO,SAAQ,IAAI,yBAAkB,IAAI,KAAK,EAAE;AACxD,UAAI,QAAQ,cAAc,IAAI,MAAM,SAAS,KAAK,GAAG;AACjD,gBAAQ,IAAI,8BAAkB,IAAI,KAAK,KAAK,CAAC,QAAQ,IAAI,WAAW,MAAM,CAAC,KAAK,KAAK,EAAE;AAAA,MAC3F;AAAA,IACJ,CAAC;AAAA,EACL;AAEA,SAAO,UAAU;AACrB;AAEA,SAAS,yBAAyB,UAA6B,UAAe,CAAC,GAAS;AACpF,SAAO,UAAU;AACjB,SAAO,KAAK,MAAM,KAAK,oCAA+B,CAAC;AACvD,SAAO,UAAU;AAEjB,QAAM,UAAU,SAAS;AACzB,QAAM,SAAS,SAAS;AAExB,UAAQ,IAAI,MAAM,KAAK,2BAAsB,GAAG,GAAG,QAAQ,iBAAiB,QAAQ,CAAC,CAAC,GAAG;AAEzF,QAAM,gBAAgB,OAAO,OAAO,CAAC,KAAK,UAAU,OAAO,MAAM,cAAc,IAAI,CAAC,IAAI,OAAO;AAC/F,UAAQ,IAAI,MAAM,KAAK,+BAAwB,GAAG,cAAc,QAAQ,CAAC,CAAC;AAE1E,QAAM,iBAAiB,OAAO,OAAO,CAAC,KAAK,UAAU,OAAO,MAAM,eAAe,IAAI,CAAC,IAAI,OAAO;AACjG,UAAQ,IAAI,MAAM,QAAQ,kCAA2B,GAAG,KAAK,MAAM,cAAc,CAAC;AAElF,MAAI,QAAQ,gBAAgB;AACxB,UAAM,sBAAsB,OAAO,OAAO,CAAC,KAAK,UAAU,OAAQ,MAAc,kBAAkB,IAAI,CAAC;AACvG,YAAQ,IAAI,MAAM,OAAO,mCAA4B,GAAG,IAAI,sBAAsB,MAAM,QAAQ,CAAC,CAAC,IAAI;AAAA,EAC1G;AAEA,QAAM,uBAAuB,OAAO,OAAO,CAAC,OAAO,EAAE,cAAc,KAAK,EAAE;AAC1E,MAAI,qBAAqB,SAAS,GAAG;AACjC,YAAQ,IAAI,MAAM,KAAK,qCAA8B,CAAC;AACtD,yBAAqB,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAC,UAAU;AAChD,cAAQ,IAAI,eAAQ,MAAM,IAAI,iBAAiB,MAAM,UAAU,GAAG;AAAA,IACtE,CAAC;AAAA,EACL;AAEA,QAAM,kBAAkB,SAAS,gBAAgB,OAAO,CAAC,MAAM,EAAE,SAAS,aAAa;AACvF,MAAI,gBAAgB,SAAS,GAAG;AAC5B,YAAQ,IAAI,MAAM,KAAK,8BAAyB,CAAC;AACjD,UAAM,aAAa,gBAAgB;AAAA,MAC/B,CAAC,KAAK,QAAQ;AACV,YAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,KAAK;AAC/C,eAAO;AAAA,MACX;AAAA,MACA,CAAC;AAAA,IACL;AAEA,WAAO,QAAQ,UAAU,EAAE,QAAQ,CAAC,CAAC,MAAM,KAAK,MAAM;AAClD,YAAM,QAAQ,EAAE,UAAU,aAAM,SAAS,aAAM,QAAQ,aAAM,UAAU,mBAAO,OAAO,YAAK,EAAE,IAAI,KAAK;AACrG,cAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;AAAA,IACrD,CAAC;AAAA,EACL;AAEA,SAAO,UAAU;AACrB;AAEA,SAAS,oBAAoB,QAAe,MAAc,UAAe,CAAC,GAAS;AAC/E,SAAO,UAAU;AACjB,SAAO,KAAK,MAAM,KAAK,mCAA4B,IAAI,QAAQ,CAAC;AAChE,SAAO,UAAU;AAEjB,QAAM,eAAe,OAAO,MAAM,CAAC,IAAI;AAEvC,MAAI,aAAa,SAAS,GAAG;AACzB,WAAO,KAAK,oCAAoC;AAChD;AAAA,EACJ;AAEA,QAAM,QAAQ,aAAa,CAAC;AAC5B,QAAM,OAAO,aAAa,aAAa,SAAS,CAAC;AAEjD,QAAM,UAAU;AAAA,IACZ,QAAQ,KAAK,cAAc,MAAM;AAAA,IACjC,UAAU,KAAK,gBAAgB,MAAM;AAAA,IACrC,aAAa,KAAK,mBAAmB,MAAM;AAAA,IAC3C,iBAAiB,KAAK,uBAAuB,MAAM;AAAA,EACvD;AAEA,UAAQ;AAAA,IACJ,MAAM,KAAK,wBAAiB;AAAA,IAC5B,GAAG,MAAM,WAAW,WAAM,KAAK,WAAW;AAAA,IAC1C,QAAQ,UAAU,IAAI,MAAM,MAAM,KAAK,QAAQ,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,QAAQ,MAAM,GAAG;AAAA,EAC/F;AAEA,UAAQ;AAAA,IACJ,MAAM,MAAM,2BAAoB;AAAA,IAChC,GAAG,MAAM,cAAc,QAAQ,CAAC,CAAC,YAAO,KAAK,cAAc,QAAQ,CAAC,CAAC;AAAA,IACrE,QAAQ,YAAY,IACd,MAAM,MAAM,KAAK,QAAQ,SAAS,QAAQ,CAAC,CAAC,IAAI,IAChD,MAAM,IAAI,IAAI,QAAQ,SAAS,QAAQ,CAAC,CAAC,IAAI;AAAA,EACvD;AAEA,UAAQ;AAAA,IACJ,MAAM,KAAK,2BAAsB;AAAA,IACjC,GAAG,MAAM,iBAAiB,QAAQ,CAAC,CAAC,YAAO,KAAK,iBAAiB,QAAQ,CAAC,CAAC;AAAA,IAC3E,QAAQ,eAAe,IACjB,MAAM,MAAM,KAAK,QAAQ,YAAY,QAAQ,CAAC,CAAC,IAAI,IACnD,MAAM,IAAI,IAAI,QAAQ,YAAY,QAAQ,CAAC,CAAC,IAAI;AAAA,EAC1D;AAEA,UAAQ;AAAA,IACJ,MAAM,QAAQ,kCAA2B;AAAA,IACzC,GAAG,MAAM,qBAAqB,QAAQ,CAAC,CAAC,YAAO,KAAK,qBAAqB,QAAQ,CAAC,CAAC;AAAA,IACnF,QAAQ,mBAAmB,IACrB,MAAM,MAAM,KAAK,QAAQ,gBAAgB,QAAQ,CAAC,CAAC,IAAI,IACvD,MAAM,IAAI,IAAI,QAAQ,gBAAgB,QAAQ,CAAC,CAAC,IAAI;AAAA,EAC9D;AAEA,QAAM,gBAAgB,QAAQ,WAAW,QAAQ,cAAc,QAAQ,mBAAmB;AAC1F,QAAM,aAAa,eAAe,IAAI,cAAO,eAAe,KAAK,cAAO;AACxE,QAAM,YAAY,eAAe,IAAI,cAAc,eAAe,KAAK,cAAc;AAErF,UAAQ,IAAI,MAAM,KAAK;AAAA,EAAK,UAAU,mBAAmB,SAAS,EAAE,CAAC;AAErE,MAAI,QAAQ,WAAW;AACnB,WAAO,KAAK,sCAA+B;AAAA,EAC/C;AAEA,SAAO,UAAU;AACrB;AAEA,SAAS,wBAAwB,UAAe,SAAc,UAAe,CAAC,GAAS;AACnF,SAAO,UAAU;AACjB,SAAO,KAAK,MAAM,KAAK,6BAAsB,CAAC;AAC9C,SAAO,UAAU;AAEjB,QAAM,UAAU;AAAA,IACZ,QAAQ,QAAQ,QAAQ,cAAc,SAAS,QAAQ;AAAA,IACvD,UAAU,QAAQ,QAAQ,gBAAgB,SAAS,QAAQ;AAAA,IAC3D,aAAa,QAAQ,QAAQ,mBAAmB,SAAS,QAAQ;AAAA,IACjE,iBAAiB,QAAQ,QAAQ,uBAAuB,SAAS,QAAQ;AAAA,EAC7E;AAEA,UAAQ;AAAA,IACJ,MAAM,KAAK,mBAAY;AAAA,IACvB,GAAG,SAAS,QAAQ,WAAW,WAAM,QAAQ,QAAQ,WAAW;AAAA,IAChE,QAAQ,UAAU,IAAI,MAAM,MAAM,KAAK,QAAQ,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,QAAQ,MAAM,GAAG;AAAA,EAC/F;AAEA,UAAQ;AAAA,IACJ,MAAM,MAAM,2BAAoB;AAAA,IAChC,GAAG,SAAS,QAAQ,cAAc,QAAQ,CAAC,CAAC,YAAO,QAAQ,QAAQ,cAAc,QAAQ,CAAC,CAAC;AAAA,IAC3F,QAAQ,YAAY,IACd,MAAM,MAAM,KAAK,QAAQ,SAAS,QAAQ,CAAC,CAAC,IAAI,IAChD,MAAM,IAAI,IAAI,QAAQ,SAAS,QAAQ,CAAC,CAAC,IAAI;AAAA,EACvD;AAEA,UAAQ;AAAA,IACJ,MAAM,KAAK,2BAAsB;AAAA,IACjC,GAAG,SAAS,QAAQ,iBAAiB,QAAQ,CAAC,CAAC,YAAO,QAAQ,QAAQ,iBAAiB,QAAQ,CAAC,CAAC;AAAA,IACjG,QAAQ,eAAe,IACjB,MAAM,MAAM,KAAK,QAAQ,YAAY,QAAQ,CAAC,CAAC,IAAI,IACnD,MAAM,IAAI,IAAI,QAAQ,YAAY,QAAQ,CAAC,CAAC,IAAI;AAAA,EAC1D;AAEA,MAAI,QAAQ,gBAAgB;AACxB,UAAM,cAAc,CAAC;AACrB,QAAI,QAAQ,WAAW,GAAI,aAAY,KAAK,wCAAwC;AACpF,QAAI,QAAQ,cAAc,GAAI,aAAY,KAAK,2CAA2C;AAC1F,QAAI,QAAQ,SAAS,EAAG,aAAY,KAAK,uBAAuB;AAEhE,QAAI,YAAY,SAAS,GAAG;AACxB,cAAQ,IAAI,MAAM,KAAK,uCAA6B,CAAC;AACrD,kBAAY,QAAQ,CAAC,eAAe,QAAQ,IAAI,MAAM,IAAI,OAAO,UAAU,EAAE,CAAC,CAAC;AAAA,IACnF,OAAO;AACH,cAAQ,IAAI,MAAM,MAAM,8CAAyC,CAAC;AAAA,IACtE;AAAA,EACJ;AAEA,SAAO,UAAU;AACrB;AAEA,eAAe,YAAY,UAA6B,WAAkC;AACtF,QAAM,QAAQ;AAAA,IACV,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,MACF;AAAA,QACI,MAAM;AAAA,UACF,QAAQ;AAAA,YACJ,MAAM;AAAA,YACN,SAAS;AAAA,YACT,gBAAgB;AAAA,YAChB,OAAO,SAAS,gBACX,OAAO,CAAC,QAAQ,IAAI,SAAS,UAAU,EACvC,IAAI,CAAC,SAAS;AAAA,cACX,IAAI,IAAI;AAAA,cACR,MAAM,IAAI;AAAA,cACV,kBAAkB,EAAE,MAAM,IAAI,YAAY;AAAA,cAC1C,iBAAiB,EAAE,MAAM,IAAI,SAAS;AAAA,cACtC,sBAAsB,EAAE,OAAO,IAAI,SAAS,YAAY,EAAE;AAAA,cAC1D,YAAY;AAAA,gBACR,UAAU,IAAI;AAAA,gBACd,MAAM,IAAI;AAAA,cACd;AAAA,YACJ,EAAE;AAAA,UACV;AAAA,QACJ;AAAA,QACA,SAAS,SAAS,gBACb,OAAO,CAAC,QAAQ,IAAI,SAAS,UAAU,EACvC,IAAI,CAAC,SAAS;AAAA,UACX,QAAQ,IAAI;AAAA,UACZ,OACI,IAAI,aAAa,cAAc,IAAI,aAAa,SAC1C,UACA,IAAI,aAAa,WACb,YACA;AAAA,UACd,SAAS,EAAE,MAAM,IAAI,YAAY;AAAA,UACjC,WAAW,IAAI,QACT;AAAA,YACE;AAAA,cACI,kBAAkB;AAAA,gBACd,kBAAkB,EAAE,KAAK,IAAI,MAAM;AAAA,cACvC;AAAA,YACJ;AAAA,UACJ,IACE,CAAC;AAAA,QACX,EAAE;AAAA,MACV;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,UAAU,cAAcA,MAAK,KAAK,WAAW,wBAAwB,GAAG,KAAK;AACvF;AAEA,eAAe,yBAAyB,UAA4C;AAChF,SAAO,KAAK,kDAA2C;AAEvD,QAAM,uBAAuB,SAAS,OAAO,OAAO,CAAC,OAAO,EAAE,cAAc,KAAK,EAAE;AACnF,MAAI,qBAAqB,SAAS,GAAG;AACjC,WAAO,KAAK,iBAAO,qBAAqB,MAAM,wDAAwD;AAAA,EAC1G;AAEA,SAAO,QAAQ,yCAAoC;AACvD;AAEA,SAAS,mBAAmB,UAAqC;AAC7D,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0CAqP+B,IAAI,KAAK,SAAS,SAAS,UAAU,EAAE,eAAe,CAAC;AAAA,mDAC9C,SAAS,SAAS,SAAS,QAAQ,CAAC,CAAC;AAAA,qCACnD,SAAS,SAAS,OAAO,WAAM,SAAS,SAAS,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,kEAKrC,SAAS,QAAQ,WAAW;AAAA;AAAA;AAAA;AAAA,kEAI5B,SAAS,QAAQ,cAAc,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,+DAI1C,SAAS,QAAQ,iBAAiB,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,kEAI3C,SAAS,QAAQ,qBAAqB,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,kEAIhD,SAAS,QAAQ,kBAAkB,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sDAOlD,SAAS,QAAQ,YAAY;AAAA;AAAA;AAAA;AAAA,sDAI7B,SAAS,QAAQ,YAAY;AAAA;AAAA;AAAA;AAAA,sDAI7B,SAAS,gBAAgB,MAAM;AAAA;AAAA;AAAA;AAAA,sDAI/B,SAAS,SAAS,iBAAiB,eAAe,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAiB/E,SAAS,gBACtB,MAAM,GAAG,EAAE,EACX;AAAA,IACG,CAAC,QAAQ;AAAA,yDACgC,IAAI,SAAS,YAAY,CAAC;AAAA,sCAC7C,IAAI,KAAK;AAAA,4DACa,IAAI,IAAI,iCAAiC,IAAI,QAAQ,+BAA+B,IAAI,MAAM;AAAA,mEACvF,IAAI,WAAW;AAAA,gEAClB,IAAI,QAAQ;AAAA,8DACd,IAAI,MAAM;AAAA,kCACtC,IAAI,QAAQ,oCAAoC,IAAI,KAAK,gBAAgB,EAAE;AAAA,kCAC3E,IAAI,OAAO,6BAA6B,IAAI,KAAK,IAAI,CAAC,QAAQ,uBAAuB,GAAG,SAAS,EAAE,KAAK,GAAG,CAAC,SAAS,EAAE;AAAA;AAAA;AAAA,EAG7I,EACC,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAkBa,SAAS,OAC9B;AAAA,IACG,CAAC,UAAU;AAAA;AAAA,oDAEyB,MAAM,IAAI;AAAA;AAAA,8CAEhB,MAAM,QAC3B;AAAA,MACG,CAAC,WACG,oCAAoC,OAAO,YAAY,CAAC,KAAK,MAAM;AAAA,IAC3E,EACC,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA,iEAGgC,MAAM,UAAU,iBAAiB,aAAa;AAAA,kDAC7D,MAAM,UAAU,sBAAe,kBAAW;AAAA;AAAA,8CAE9C,MAAM,UAAU,SAAS,IAAI,cAAc,MAAM,UAAU,KAAK,IAAI,CAAC,aAAa,EAAE;AAAA;AAAA,sEAE5D,MAAM,UAAU,YAAY,CAAC,KAAK,MAAM,SAAS;AAAA,8CACzE,MAAM,cAAc,KAAK;AAAA,8CACzB,MAAM,kBAAkB,QAAQ,CAAC,KAAK,KAAK;AAAA,8CAC3C,MAAM,eAAe,IAAI,KAAK,MAAM,YAAY,EAAE,mBAAmB,IAAI,KAAK;AAAA;AAAA;AAAA,EAGhH,EACC,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kDAW6B,KAAK,UAAU,SAAS,QAAQ,gBAAgB,CAAC;AAAA;AAAA,sDAE7C,KAAK,UAAU,SAAS,QAAQ,gBAAgB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kDAkCrD,KAAK,UAAU,SAAS,QAAQ,gBAAgB,CAAC;AAAA;AAAA;AAAA,sDAG7C,KAAK,UAAU,SAAS,QAAQ,gBAAgB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuFvG;AAEA,QAAQ,MAAM;AAEd,eAAe,2BAA2B,UAA0D;AAChG,QAAM,eAAe,SAAS,gBAAgB,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU;AAEjF,SAAO;AAAA,IACH,iBAAiB;AAAA,MACb,UAAU,aAAa,OAAO,CAAC,MAAM,EAAE,aAAa,UAAU;AAAA,MAC9D,MAAM,aAAa,OAAO,CAAC,MAAM,EAAE,aAAa,MAAM;AAAA,MACtD,QAAQ,aAAa,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ;AAAA,MAC1D,KAAK,aAAa,OAAO,CAAC,MAAM,EAAE,aAAa,KAAK;AAAA,IACxD;AAAA,IACA,YAAY;AAAA,MACR,OAAO;AAAA,QACH,OAAO,SAAS,QAAQ;AAAA,QACxB,QAAQ,aAAa,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,QACvC,UAAU;AAAA,UACN,yCAAoC,SAAS,QAAQ,eAAe,SAAS,QAAQ;AAAA,UACrF,0CAAqC;AAAA,UACrC,6BAAwB,CAAC,aAAa,KAAK,CAAC,MAAM,EAAE,MAAM,SAAS,WAAW,CAAC;AAAA,UAC/E,mCAA8B,SAAS,QAAQ,uBAAuB;AAAA,UACtE,6CAAwC,SAAS,QAAQ,gBAAgB;AAAA,QAC7E;AAAA,MACJ;AAAA,MACA,QAAQ;AAAA,QACJ,OAAO,SAAS,QAAQ,gBAAgB;AAAA,QACxC,cAAc;AAAA,UACV,iCAAiC;AAAA,UACjC,uCAAuC,SAAS,QAAQ,gBAAgB;AAAA,UACxE,kCAAkC;AAAA,UAClC,2CAA2C;AAAA,QAC/C;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,gBAAgB;AAAA,MACZ,aACI,SAAS,QAAQ,gBAAgB,KAAK,QAAQ,SAAS,QAAQ,gBAAgB,KAAK,WAAW;AAAA,MACnG,aAAa;AAAA,QACT,GAAG,SAAS,QAAQ,YAAY;AAAA,QAChC,GAAG,aAAa,OAAO,CAAC,MAAM,EAAE,aAAa,UAAU,EAAE,MAAM;AAAA,QAC/D;AAAA,MACJ;AAAA,MACA,oBAAoB;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,iBAAiB;AAAA,MACb,wBAAyB,SAAS,QAAQ,eAAe,SAAS,QAAQ,cAAe;AAAA,MACzF,yBACK,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,kBAAkB,EAAE,SAAS,SAAS,OAAO,SAAU;AAAA,MAC5F,iBAAiB;AAAA;AAAA,MACjB,sBAAuB,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,SAAS,OAAO,SAAU;AAAA,IAC5G;AAAA,EACJ;AACJ;AAEA,eAAe,8BAA8B,UAA6D;AACtG,QAAM,SAAS,SAAS;AACxB,QAAM,kBAAkB,SAAS,gBAAgB,OAAO,CAAC,MAAM,EAAE,SAAS,aAAa;AAEvF,SAAO;AAAA,IACH,SAAS;AAAA,MACL,mBAAmB,OAAO,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,cAAc,IAAI,CAAC,IAAI,OAAO;AAAA,MACpF,oBAAoB,OAAO,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,eAAe,IAAI,CAAC,IAAI,OAAO;AAAA,MACtF,mBAAmB,OAAO,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,aAAa,QAAQ,CAAC;AAAA,MAC3E,oBAAoB,gBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,UAAU,EAAE;AAAA,MAC7E,iBAAiB,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,KAAK,CAAC,QAAQ,IAAI,SAAS,OAAO,CAAC,CAAC,EAAE;AAAA,IAC/F;AAAA,IACA,aAAa;AAAA,MACT,sBAAsB,OACjB,OAAO,CAAC,OAAO,EAAE,cAAc,KAAK,EAAE,EACtC,IAAI,CAAC,OAAO;AAAA,QACT,MAAM,EAAE;AAAA,QACR,YAAY,EAAE,cAAc;AAAA,QAC5B,iBAAiB,CAAC,qCAAqC,uBAAuB;AAAA,MAClF,EAAE;AAAA,MACN,aAAa,OACR,OAAO,CAAC,OAAO,EAAE,eAAe,KAAK,GAAG,EACxC,IAAI,CAAC,OAAO;AAAA,QACT,MAAM,EAAE;AAAA,QACR,aAAa,EAAE,eAAe;AAAA,QAC9B,iBAAiB,CAAC,0BAA0B,8BAA8B;AAAA,MAC9E,EAAE;AAAA,MACN,uBAAuB,OAClB,OAAO,CAAC,MAAM,EAAE,aAAa,SAAS,CAAC,EACvC,IAAI,CAAC,OAAO;AAAA,QACT,MAAM,EAAE;AAAA,QACR,cAAc,EAAE;AAAA,QAChB,iBAAiB,CAAC,+BAA+B,uBAAuB;AAAA,MAC5E,EAAE;AAAA,IACV;AAAA,IACA,2BAA2B;AAAA,MACvB,SAAS,CAAC,8BAA8B,4BAA4B;AAAA,MACpE,mBAAmB,CAAC,wCAAwC,+BAA+B;AAAA,MAC3F,eAAe,CAAC,sBAAsB,wBAAwB;AAAA,MAC9D,wBAAwB,CAAC,8BAA8B,qBAAqB;AAAA,IAChF;AAAA,IACA,YAAY;AAAA,MACR,wBAAwB,OAAO;AAAA,QAC3B,CAAC,KAAK,MAAM;AACR,cAAI,EAAE,IAAI,KAAK,EAAE,cAAc,KAAK,KAAK,EAAE,aAAa,SAAS;AACjE,iBAAO;AAAA,QACX;AAAA,QACA,CAAC;AAAA,MACL;AAAA,MACA,sBAAsB,OAAO;AAAA,QACzB,CAAC,KAAK,MAAM;AACR,cAAI,EAAE,IAAI,KAAK,EAAE,eAAe,KAAK,OAAO,EAAE,aAAa,SAAS;AACpE,iBAAO;AAAA,QACX;AAAA,QACA,CAAC;AAAA,MACL;AAAA,MACA,kBAAkB,SAAS,QAAQ;AAAA,IACvC;AAAA,EACJ;AACJ;AAEA,eAAe,yBAAyB,QAAe,MAAyC;AAC5F,QAAM,eAAe,OAAO,MAAM,CAAC,IAAI;AACvC,QAAM,QAAQ,aAAa,CAAC,KAAK,CAAC;AAClC,QAAM,OAAO,aAAa,aAAa,SAAS,CAAC,KAAK,CAAC;AAEvD,SAAO;AAAA,IACH,WAAW;AAAA,MACP,OAAO,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,KAAK,GAAI;AAAA,MACvD,KAAK,oBAAI,KAAK;AAAA,MACd;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,MACJ,QAAQ;AAAA,QACJ,SAAS,KAAK,eAAe;AAAA,QAC7B,UAAU,MAAM,eAAe;AAAA,QAC/B,SAAS,KAAK,eAAe,MAAM,MAAM,eAAe;AAAA,QACxD,QACK,KAAK,eAAe,MAAM,MAAM,eAAe,KAC1C,gBACC,KAAK,eAAe,MAAM,MAAM,eAAe,KAC5C,eACA;AAAA,MAClB;AAAA,MACA,UAAU;AAAA,QACN,SAAS,KAAK,iBAAiB;AAAA,QAC/B,UAAU,MAAM,iBAAiB;AAAA,QACjC,SAAS,KAAK,iBAAiB,MAAM,MAAM,iBAAiB;AAAA,QAC5D,QACK,KAAK,iBAAiB,MAAM,MAAM,iBAAiB,KAC9C,eACC,KAAK,iBAAiB,MAAM,MAAM,iBAAiB,KAChD,cACA;AAAA,MAClB;AAAA,MACA,aAAa;AAAA,QACT,SAAS,KAAK,oBAAoB;AAAA,QAClC,UAAU,MAAM,oBAAoB;AAAA,QACpC,SAAS,KAAK,oBAAoB,MAAM,MAAM,oBAAoB;AAAA,QAClE,QACK,KAAK,oBAAoB,MAAM,MAAM,oBAAoB,KACpD,eACC,KAAK,oBAAoB,MAAM,MAAM,oBAAoB,KACtD,cACA;AAAA,MAClB;AAAA,MACA,iBAAiB;AAAA,QACb,SAAS,KAAK,wBAAwB;AAAA,QACtC,UAAU,MAAM,wBAAwB;AAAA,QACxC,SAAS,KAAK,wBAAwB,MAAM,MAAM,wBAAwB;AAAA,QAC1E,QACK,KAAK,wBAAwB,MAAM,MAAM,wBAAwB,KAC5D,eACC,KAAK,wBAAwB,MAAM,MAAM,wBAAwB,KAC9D,cACA;AAAA,MAClB;AAAA,IACJ;AAAA,IACA,gBAAgB,aAAa,IAAI,CAAC,WAAW;AAAA,MACzC,MAAM,IAAI,KAAK,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,MACvC,aAAa,MAAM,eAAe;AAAA,MAClC,eAAe,MAAM,iBAAiB;AAAA,MACtC,kBAAkB,MAAM,oBAAoB;AAAA,MAC5C,sBAAsB,MAAM,wBAAwB;AAAA,IACxD,EAAE;AAAA,IACF,aAAa;AAAA,MACT,WAAW;AAAA,QACP,eAAe,KAAK,IAAI,MAAM,KAAK,iBAAiB,KAAK,CAAC;AAAA,QAC1D,kBAAkB,KAAK,IAAI,MAAM,KAAK,oBAAoB,KAAK,CAAC;AAAA,QAChE,sBAAsB,KAAK,IAAI,MAAM,KAAK,wBAAwB,KAAK,CAAC;AAAA,MAC5E;AAAA,MACA,iBAAiB;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AACJ;AAEA,eAAe,6BAA6B,UAAe,SAA6C;AACpG,SAAO;AAAA,IACH,UAAU;AAAA,MACN,SAAS,SAAS,UAAU,WAAW;AAAA,MACvC,MAAM,IAAI,KAAK,SAAS,UAAU,cAAc,KAAK,IAAI,CAAC;AAAA,MAC1D,SAAS,SAAS;AAAA,IACtB;AAAA,IACA,SAAS;AAAA,MACL,SAAS,QAAQ,UAAU,WAAW;AAAA,MACtC,MAAM,IAAI,KAAK,QAAQ,UAAU,cAAc,KAAK,IAAI,CAAC;AAAA,MACzD,SAAS,QAAQ;AAAA,IACrB;AAAA,IACA,SAAS;AAAA,MACL,QAAQ;AAAA,QACJ,OAAO,CAAC;AAAA;AAAA,QACR,SAAS,CAAC;AAAA,QACV,UAAU,CAAC;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,QACJ,UAAU;AAAA,UACN,MAAM,SAAS,SAAS,iBAAiB;AAAA,UACzC,IAAI,QAAQ,SAAS,iBAAiB;AAAA,UACtC,SAAS,QAAQ,SAAS,iBAAiB,MAAM,SAAS,SAAS,iBAAiB;AAAA,QACxF;AAAA,QACA,aAAa;AAAA,UACT,MAAM,SAAS,SAAS,oBAAoB;AAAA,UAC5C,IAAI,QAAQ,SAAS,oBAAoB;AAAA,UACzC,SAAS,QAAQ,SAAS,oBAAoB,MAAM,SAAS,SAAS,oBAAoB;AAAA,QAC9F;AAAA,QACA,iBAAiB;AAAA,UACb,MAAM,SAAS,SAAS,wBAAwB;AAAA,UAChD,IAAI,QAAQ,SAAS,wBAAwB;AAAA,UAC7C,SAAS,QAAQ,SAAS,wBAAwB,MAAM,SAAS,SAAS,wBAAwB;AAAA,QACtG;AAAA,MACJ;AAAA,MACA,iBAAiB;AAAA,QACb,KAAK,QAAQ,mBAAmB,CAAC;AAAA,QACjC,UAAU,CAAC;AAAA,QACX,YAAY,CAAC;AAAA,MACjB;AAAA,IACJ;AAAA,IACA,aAAa,CAAC;AAAA,IACd,cAAc,CAAC;AAAA,EACnB;AACJ;","names":["fs","path","ts","LogLevel","fs","ts","path","path","path","performance","path"]}