@digilogiclabs/create-saas-app 2.2.0 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/index.js +2 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/cli/commands/add.d.ts +6 -0
- package/dist/cli/commands/add.d.ts.map +1 -0
- package/dist/cli/commands/add.js +39 -0
- package/dist/cli/commands/add.js.map +1 -0
- package/dist/cli/commands/create.d.ts +45 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +175 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/index.d.ts +4 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +20 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/update.d.ts +6 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +68 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +61 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/prompts/index.d.ts +2 -0
- package/dist/cli/prompts/index.d.ts.map +1 -0
- package/dist/cli/prompts/index.js +18 -0
- package/dist/cli/prompts/index.js.map +1 -0
- package/dist/cli/prompts/project-setup.d.ts +5 -0
- package/dist/cli/prompts/project-setup.d.ts.map +1 -0
- package/dist/cli/prompts/project-setup.js +359 -0
- package/dist/cli/prompts/project-setup.js.map +1 -0
- package/dist/cli/utils/git.d.ts +9 -0
- package/dist/cli/utils/git.d.ts.map +1 -0
- package/dist/cli/utils/git.js +77 -0
- package/dist/cli/utils/git.js.map +1 -0
- package/dist/cli/utils/index.d.ts +5 -0
- package/dist/cli/utils/index.d.ts.map +1 -0
- package/dist/cli/utils/index.js +21 -0
- package/dist/cli/utils/index.js.map +1 -0
- package/dist/cli/utils/logger.d.ts +16 -0
- package/dist/cli/utils/logger.d.ts.map +1 -0
- package/dist/cli/utils/logger.js +55 -0
- package/dist/cli/utils/logger.js.map +1 -0
- package/dist/cli/utils/package-manager.d.ts +8 -0
- package/dist/cli/utils/package-manager.d.ts.map +1 -0
- package/dist/cli/utils/package-manager.js +92 -0
- package/dist/cli/utils/package-manager.js.map +1 -0
- package/dist/cli/utils/spinner.d.ts +7 -0
- package/dist/cli/utils/spinner.d.ts.map +1 -0
- package/dist/cli/utils/spinner.js +48 -0
- package/dist/cli/utils/spinner.js.map +1 -0
- package/dist/cli/validators/dependencies.d.ts +15 -0
- package/dist/cli/validators/dependencies.d.ts.map +1 -0
- package/dist/cli/validators/dependencies.js +108 -0
- package/dist/cli/validators/dependencies.js.map +1 -0
- package/dist/cli/validators/index.d.ts +3 -0
- package/dist/cli/validators/index.d.ts.map +1 -0
- package/dist/cli/validators/index.js +19 -0
- package/dist/cli/validators/index.js.map +1 -0
- package/dist/cli/validators/project-name.d.ts +5 -0
- package/dist/cli/validators/project-name.d.ts.map +1 -0
- package/dist/cli/validators/project-name.js +151 -0
- package/dist/cli/validators/project-name.js.map +1 -0
- package/dist/generators/file-processor.d.ts +28 -0
- package/dist/generators/file-processor.d.ts.map +1 -0
- package/dist/generators/file-processor.js +224 -0
- package/dist/generators/file-processor.js.map +1 -0
- package/dist/generators/index.d.ts +4 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +20 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/package-installer.d.ts +29 -0
- package/dist/generators/package-installer.d.ts.map +1 -0
- package/dist/generators/package-installer.js +177 -0
- package/dist/generators/package-installer.js.map +1 -0
- package/package.json +1 -1
- package/dist/index.js +0 -1837
- package/dist/index.js.map +0 -1
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/create.ts","../src/cli/utils/logger.ts","../src/cli/utils/spinner.ts","../src/cli/validators/project-name.ts","../src/cli/validators/dependencies.ts","../src/cli/prompts/project-setup.ts","../src/generators/template-generator.ts","../src/generators/package-installer.ts","../src/cli/utils/package-manager.ts","../src/cli/utils/git.ts","../src/cli/commands/add.ts","../src/cli/commands/update.ts","../package.json"],"sourcesContent":["import { Command } from 'commander';\nimport { createProject } from './commands/create';\nimport { addFeature } from './commands/add';\nimport { updateDependencies } from './commands/update';\nimport { logger } from './utils/logger';\nimport packageJson from '../../package.json';\n\nconst program = new Command();\n\nprogram\n .name('create-saas-app')\n .description('Create modern SaaS applications with Digi Logic Labs packages')\n .version(packageJson.version);\n\nprogram\n .command('create')\n .alias('c')\n .description('Create a new SaaS application')\n .argument('<platform>', 'Platform: web, mobile, or both')\n .argument('[template]', 'Template: base, dashboard, saas (web) | base, tabs, stack (mobile)')\n .argument('[name]', 'Project name')\n .option('-a, --auth <provider>', 'Auth provider: firebase, supabase')\n .option('-d, --database <provider>', 'Database provider: supabase, firebase')\n .option('-t, --theme <theme>', 'Theme: default, corporate, startup')\n .option('-c, --theme-color <color>', 'Theme color: blue, green, purple, orange, red, slate')\n .option('--default-theme <mode>', 'Default theme mode: light, dark, system')\n .option('--with-ai [capabilities]', 'Enable AI features (text,audio,video,rag,knowledge or all)')\n .option('--ai-provider <provider>', 'AI provider: openai, anthropic, gemini')\n .option('--no-install', 'Skip package installation')\n .option('--no-git', 'Skip git initialization')\n .option('-y, --yes', 'Skip interactive prompts')\n .action(createProject);\n\nprogram\n .command('add')\n .alias('a')\n .description('Add features to existing project')\n .argument('<feature>', 'Feature to add: auth, billing, analytics, etc.')\n .option('-p, --provider <provider>', 'Service provider')\n .action(addFeature);\n\nprogram\n .command('update')\n .alias('u')\n .description('Update Digi Logic Labs dependencies')\n .option('--check', 'Check for updates without installing')\n .action(updateDependencies);\n\n// Handle unknown commands\nprogram.on('command:*', () => {\n logger.error(`Unknown command: ${program.args.join(' ')}`);\n logger.info('Run \"create-saas-app --help\" for available commands');\n process.exit(1);\n});\n\n// Show help if no arguments provided\nif (!process.argv.slice(2).length) {\n program.outputHelp();\n process.exit(0);\n}\n\nprogram.parse();\n\nexport default program;\n","import path from 'path';\nimport { logger } from '../utils/logger';\nimport { spinner } from '../utils/spinner';\nimport { validateProjectName, validateProjectPath } from '../validators/project-name';\nimport { validateNodeVersion } from '../validators/dependencies';\nimport { getProjectPrompts } from '../prompts/project-setup';\nimport { TemplateGenerator } from '../../generators/template-generator';\nimport { PackageInstaller } from '../../generators/package-installer';\nimport { initializeGit } from '../utils/git';\n\ninterface CreateOptions {\n auth?: string;\n database?: string;\n theme?: string;\n themeColor?: string;\n defaultTheme?: string;\n tier?: string;\n withAi?: string | boolean;\n aiProvider?: string;\n install?: boolean;\n git?: boolean;\n yes?: boolean;\n}\n\n/**\n * Project tier determines the scope and feature set of the generated project.\n * - micro: Single feature MVP (auth only, minimal deps)\n * - starter: Basic SaaS (auth + payments)\n * - pro: Full SaaS (auth + payments + AI)\n * - enterprise: Full platform (all features + observability + workers)\n */\nexport type ProjectTier = 'micro' | 'starter' | 'pro' | 'enterprise';\n\nexport interface ProjectConfig {\n platform: 'web' | 'mobile' | 'both';\n template: string;\n name: string;\n tier: ProjectTier;\n auth: 'firebase' | 'supabase' | 'keycloak';\n database: 'postgresql' | 'supabase' | 'firebase';\n theme: 'default' | 'corporate' | 'startup';\n themeColor: 'blue' | 'green' | 'purple' | 'orange' | 'red' | 'slate';\n defaultTheme: 'light' | 'dark' | 'system';\n ai: {\n enabled: boolean;\n capabilities: string[];\n provider: 'openai' | 'anthropic' | 'gemini';\n };\n install: boolean;\n git: boolean;\n}\n\nexport async function createProject(\n platform: string,\n template?: string,\n name?: string,\n options: CreateOptions & { themeColor?: string; defaultTheme?: string } = {}\n) {\n try {\n // Validate Node.js version\n if (!(await validateNodeVersion())) {\n process.exit(1);\n }\n\n // Validate platform\n const validPlatforms = ['web', 'mobile', 'both'];\n if (!validPlatforms.includes(platform)) {\n logger.error(`Invalid platform: ${platform}. Must be one of: ${validPlatforms.join(', ')}`);\n process.exit(1);\n }\n\n // Parse AI capabilities\n const parseAiCapabilities = (\n withAi?: string | boolean\n ): { enabled: boolean; capabilities: string[] } => {\n if (!withAi) return { enabled: false, capabilities: [] };\n if (withAi === true) return { enabled: true, capabilities: ['text'] };\n if (withAi === 'all')\n return { enabled: true, capabilities: ['text', 'audio', 'video', 'rag'] };\n return { enabled: true, capabilities: withAi.split(',').map((c) => c.trim()) };\n };\n\n const aiConfig = parseAiCapabilities(options.withAi);\n\n // Auto-select template based on AI capabilities\n const selectTemplateForAI = (capabilities: string[], baseTemplate?: string): string => {\n if (!aiConfig.enabled) return baseTemplate || 'base';\n\n const hasAudio = capabilities.includes('audio');\n const hasVideo = capabilities.includes('video');\n const hasText = capabilities.includes('text');\n const hasRAG = capabilities.includes('rag') || capabilities.includes('knowledge');\n\n // Use RAG template if RAG/knowledge capabilities are requested\n if (hasRAG) return 'ui-auth-payments-ai-rag';\n\n // Use comprehensive AI template for other AI capabilities\n if (hasVideo || hasAudio || hasText) return 'ui-auth-payments-ai';\n\n return baseTemplate || 'ui-auth-payments-ai';\n };\n\n // Determine tier from options or AI config\n const determineTier = (): ProjectTier => {\n if (options.tier) return options.tier as ProjectTier;\n if (aiConfig.enabled) return 'pro';\n return 'starter';\n };\n\n // Set up initial configuration\n let config: ProjectConfig = {\n platform: platform as 'web' | 'mobile' | 'both',\n template: selectTemplateForAI(aiConfig.capabilities, template),\n name: name || 'my-saas-app',\n tier: determineTier(),\n auth: (options.auth as 'firebase' | 'supabase' | 'keycloak') || 'supabase',\n database: (options.database as 'postgresql' | 'supabase' | 'firebase') || 'supabase',\n theme: (options.theme as 'default' | 'corporate' | 'startup') || 'default',\n themeColor:\n (options.themeColor as 'blue' | 'green' | 'purple' | 'orange' | 'red' | 'slate') || 'blue',\n defaultTheme: (options.defaultTheme as 'light' | 'dark' | 'system') || 'system',\n ai: {\n enabled: aiConfig.enabled,\n capabilities: aiConfig.capabilities,\n provider: (options.aiProvider as 'openai' | 'anthropic' | 'gemini') || 'openai',\n },\n install: options.install !== false,\n git: options.git !== false,\n };\n\n // Interactive prompts if not in yes mode\n if (!options.yes) {\n config = await getProjectPrompts(config);\n }\n\n // Validate project name\n if (!validateProjectName(config.name)) {\n process.exit(1);\n }\n\n const projectPath = path.resolve(process.cwd(), config.name);\n\n // Validate project path\n if (!(await validateProjectPath(projectPath))) {\n process.exit(1);\n }\n\n // Display configuration\n logger.title('🚀 Creating your SaaS application');\n logger.info(`Platform: ${config.platform}`);\n logger.info(`Tier: ${config.tier}`);\n logger.info(`Template: ${config.template}`);\n logger.info(`Project: ${config.name}`);\n logger.info(`Auth: ${config.auth}`);\n logger.info(`Database: ${config.database}`);\n logger.info(`Theme: ${config.theme}`);\n logger.info(`Theme Color: ${config.themeColor}`);\n logger.info(`Default Theme: ${config.defaultTheme}`);\n if (config.ai.enabled) {\n logger.info(`AI: Enabled (${config.ai.capabilities.join(', ')}) - ${config.ai.provider}`);\n }\n logger.newLine();\n\n // Generate project structure\n const templateSpinner = spinner('Generating project structure...');\n try {\n const generator = new TemplateGenerator(config);\n await generator.generate(projectPath);\n templateSpinner.succeed('Project structure created');\n } catch (_error) {\n templateSpinner.fail('Failed to generate project structure');\n throw _error;\n }\n\n // Install dependencies\n if (config.install) {\n const installSpinner = spinner('Installing dependencies...');\n try {\n const installer = new PackageInstaller(projectPath);\n await installer.install();\n installSpinner.succeed('Dependencies installed');\n } catch (_error) {\n installSpinner.fail('Failed to install dependencies');\n logger.warn('You can install dependencies manually by running:');\n logger.code(`cd ${config.name} && npm install`);\n }\n }\n\n // Initialize git repository\n if (config.git) {\n const gitSpinner = spinner('Initializing git repository...');\n try {\n await initializeGit(projectPath);\n gitSpinner.succeed('Git repository initialized');\n } catch (_error) {\n gitSpinner.fail('Failed to initialize git repository');\n logger.warn('You can initialize git manually by running:');\n logger.code(`cd ${config.name} && git init`);\n }\n }\n\n // Success message with next steps\n logger.newLine();\n logger.success('🎉 Project created successfully!');\n logger.newLine();\n\n logger.title('Next steps:');\n logger.code(`cd ${config.name}`);\n\n if (!config.install) {\n logger.code('npm install');\n }\n\n if (config.platform === 'web' || config.platform === 'both') {\n logger.code('npm run dev');\n logger.info('Open http://localhost:3000 in your browser');\n }\n\n if (config.platform === 'mobile' || config.platform === 'both') {\n logger.code('npx expo start');\n logger.info('Scan QR code with Expo Go app');\n }\n\n logger.newLine();\n logger.info('📚 Documentation: https://docs.digilogiclabs.com');\n logger.info('💬 Support: https://discord.gg/digilogiclabs');\n } catch (error) {\n logger.error('Failed to create project:');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\n\nexport const logger = {\n info: (message: string, ...args: unknown[]) => {\n console.log(chalk.blue('ℹ'), message, ...args);\n },\n\n success: (message: string, ...args: unknown[]) => {\n console.log(chalk.green('✓'), message, ...args);\n },\n\n warn: (message: string, ...args: unknown[]) => {\n console.log(chalk.yellow('⚠'), message, ...args);\n },\n\n error: (message: string, ...args: unknown[]) => {\n console.log(chalk.red('✗'), message, ...args);\n },\n\n debug: (message: string, ...args: unknown[]) => {\n if (process.env.DEBUG) {\n console.log(chalk.gray('🐛'), message, ...args);\n }\n },\n\n log: (message: string, ...args: unknown[]) => {\n console.log(message, ...args);\n },\n\n newLine: () => {\n console.log();\n },\n\n divider: () => {\n console.log(chalk.gray('─'.repeat(50)));\n },\n\n title: (message: string) => {\n console.log();\n console.log(chalk.bold.cyan(message));\n console.log(chalk.gray('─'.repeat(message.length)));\n },\n\n step: (step: number, total: number, message: string) => {\n console.log(chalk.cyan(`[${step}/${total}]`), message);\n },\n\n highlight: (message: string) => {\n console.log(chalk.bold.magenta(message));\n },\n\n code: (code: string) => {\n console.log(chalk.gray(' ' + code));\n },\n\n list: (items: string[]) => {\n items.forEach((item) => {\n console.log(chalk.gray(' •'), item);\n });\n },\n};\n","import ora, { Ora } from 'ora';\nimport chalk from 'chalk';\n\nexport function spinner(text: string): Ora {\n return ora({\n text: chalk.gray(text),\n spinner: 'dots',\n color: 'cyan',\n }).start();\n}\n\nexport function createSpinner(text: string): Ora {\n return ora({\n text: chalk.gray(text),\n spinner: 'dots',\n color: 'cyan',\n });\n}\n\nexport function successSpinner(text: string): Ora {\n return ora({\n text: chalk.green(text),\n spinner: 'dots',\n color: 'green',\n });\n}\n\nexport function errorSpinner(text: string): Ora {\n return ora({\n text: chalk.red(text),\n spinner: 'dots',\n color: 'red',\n });\n}\n\nexport function warnSpinner(text: string): Ora {\n return ora({\n text: chalk.yellow(text),\n spinner: 'dots',\n color: 'yellow',\n });\n}\n","import validateNpmPackageName from 'validate-npm-package-name';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { logger } from '../utils/logger';\n\nexport function validateProjectName(name: string): boolean {\n // Check if name is empty\n if (!name || name.trim().length === 0) {\n logger.error('Project name cannot be empty');\n return false;\n }\n\n // Check npm package name validity\n const validation = validateNpmPackageName(name);\n\n if (!validation.validForNewPackages) {\n logger.error('Invalid project name:');\n\n if (validation.errors) {\n validation.errors.forEach((error) => logger.error(` • ${error}`));\n }\n\n if (validation.warnings) {\n validation.warnings.forEach((warning) => logger.warn(` • ${warning}`));\n }\n\n return false;\n }\n\n // Check for reserved names\n const reservedNames = [\n 'node_modules',\n 'package.json',\n 'package-lock.json',\n 'yarn.lock',\n 'pnpm-lock.yaml',\n '.git',\n '.gitignore',\n 'README.md',\n 'LICENSE',\n 'src',\n 'dist',\n 'build',\n 'public',\n 'static',\n 'assets',\n 'components',\n 'pages',\n 'app',\n 'lib',\n 'utils',\n 'hooks',\n 'types',\n 'styles',\n 'config',\n 'test',\n 'tests',\n '__tests__',\n 'spec',\n 'specs',\n 'docs',\n 'documentation',\n ];\n\n if (reservedNames.includes(name.toLowerCase())) {\n logger.error(`Project name \"${name}\" is reserved. Please choose a different name.`);\n return false;\n }\n\n // Check for common problematic patterns\n if (name.startsWith('.')) {\n logger.error('Project name cannot start with a dot');\n return false;\n }\n\n if (name.startsWith('-')) {\n logger.error('Project name cannot start with a hyphen');\n return false;\n }\n\n if (name.endsWith('-')) {\n logger.error('Project name cannot end with a hyphen');\n return false;\n }\n\n if (name.includes('..')) {\n logger.error('Project name cannot contain consecutive dots');\n return false;\n }\n\n if (name.includes('//')) {\n logger.error('Project name cannot contain consecutive slashes');\n return false;\n }\n\n // Check length\n if (name.length > 214) {\n logger.error('Project name is too long (max 214 characters)');\n return false;\n }\n\n return true;\n}\n\nexport async function validateProjectPath(projectPath: string): Promise<boolean> {\n try {\n // Check if directory already exists\n if (await fs.pathExists(projectPath)) {\n const stats = await fs.stat(projectPath);\n\n if (stats.isDirectory()) {\n const files = await fs.readdir(projectPath);\n\n if (files.length > 0) {\n logger.error(`Directory \"${path.basename(projectPath)}\" already exists and is not empty`);\n return false;\n }\n } else {\n logger.error(`A file with the name \"${path.basename(projectPath)}\" already exists`);\n return false;\n }\n }\n\n // Check if parent directory is writable\n const parentDir = path.dirname(projectPath);\n\n try {\n await fs.access(parentDir, fs.constants.W_OK);\n } catch {\n logger.error(`Cannot write to directory \"${parentDir}\"`);\n return false;\n }\n\n return true;\n } catch (error) {\n logger.error('Failed to validate project path:', error);\n return false;\n }\n}\n\nexport function sanitizeProjectName(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/^-+|-+$/g, '')\n .replace(/-+/g, '-');\n}\n\nexport function suggestProjectName(name: string): string {\n const sanitized = sanitizeProjectName(name);\n\n if (validateProjectName(sanitized)) {\n return sanitized;\n }\n\n // If still invalid, add a prefix\n const suggested = `my-${sanitized}`;\n\n if (validateProjectName(suggested)) {\n return suggested;\n }\n\n // Last resort\n return 'my-saas-app';\n}\n","import semver from 'semver';\nimport execa from 'execa';\nimport { logger } from '../utils/logger';\n\nexport interface DependencyInfo {\n name: string;\n version: string;\n latest?: string;\n outdated?: boolean;\n}\n\nexport async function validateNodeVersion(): Promise<boolean> {\n const nodeVersion = process.version;\n const minVersion = '16.0.0';\n\n if (!semver.gte(nodeVersion, minVersion)) {\n logger.error(\n `Node.js version ${minVersion} or higher is required. Current version: ${nodeVersion}`\n );\n return false;\n }\n\n return true;\n}\n\nexport async function checkPackageExists(packageName: string): Promise<boolean> {\n try {\n await execa('npm', ['view', packageName, 'version']);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function getLatestVersion(packageName: string): Promise<string | null> {\n try {\n const result = await execa('npm', ['view', packageName, 'version']);\n return result.stdout.trim();\n } catch {\n return null;\n }\n}\n\nexport async function validateDependencies(dependencies: string[]): Promise<DependencyInfo[]> {\n const results: DependencyInfo[] = [];\n\n for (const dep of dependencies) {\n const [name, version] =\n dep.includes('@') && !dep.startsWith('@') ? dep.split('@') : [dep, 'latest'];\n\n try {\n const latest = await getLatestVersion(name);\n\n if (!latest) {\n logger.warn(`Package \"${name}\" not found in npm registry`);\n continue;\n }\n\n const resolvedVersion = version === 'latest' ? latest : version;\n const outdated = version !== 'latest' && semver.lt(resolvedVersion, latest);\n\n results.push({\n name,\n version: resolvedVersion,\n latest,\n outdated,\n });\n } catch (error) {\n logger.warn(`Failed to validate package \"${name}\":`, error);\n }\n }\n\n return results;\n}\n\nexport function validateVersionRange(version: string): boolean {\n try {\n return semver.validRange(version) !== null;\n } catch {\n return false;\n }\n}\n\nexport function isValidSemver(version: string): boolean {\n return semver.valid(version) !== null;\n}\n\nexport function compareVersions(version1: string, version2: string): number {\n try {\n return semver.compare(version1, version2);\n } catch {\n return 0;\n }\n}\n\nexport function getVersionSuggestion(currentVersion: string, latestVersion: string): string {\n if (!isValidSemver(currentVersion) || !isValidSemver(latestVersion)) {\n return latestVersion;\n }\n\n const current = semver.parse(currentVersion);\n const latest = semver.parse(latestVersion);\n\n if (!current || !latest) {\n return latestVersion;\n }\n\n // If major version is different, suggest latest\n if (current.major !== latest.major) {\n return `^${latestVersion}`;\n }\n\n // If minor version is different, suggest latest minor\n if (current.minor !== latest.minor) {\n return `~${latestVersion}`;\n }\n\n // If only patch is different, suggest exact latest\n return latestVersion;\n}\n","import inquirer from 'inquirer';\nimport { ProjectConfig, ProjectTier } from '../commands/create';\nimport { validateProjectName, suggestProjectName } from '../validators/project-name';\nimport { logger } from '../utils/logger';\n\n/**\n * Tier descriptions for the CLI selection\n */\nconst TIER_CHOICES = [\n {\n name: '🚀 Micro - Single feature MVP (auth only, minimal deps)',\n value: 'micro' as ProjectTier,\n },\n {\n name: '💼 Starter - Basic SaaS (auth + payments) [Recommended]',\n value: 'starter' as ProjectTier,\n },\n {\n name: '⚡ Pro - Full SaaS (auth + payments + AI)',\n value: 'pro' as ProjectTier,\n },\n {\n name: '🏢 Enterprise - Full platform (all features + observability)',\n value: 'enterprise' as ProjectTier,\n },\n];\n\nexport async function getProjectPrompts(initialConfig: ProjectConfig): Promise<ProjectConfig> {\n logger.title('🛠️ Project Configuration');\n\n const questions = [\n {\n type: 'input',\n name: 'name',\n message: 'Project name:',\n default: initialConfig.name,\n validate: (input: string) => {\n if (!validateProjectName(input)) {\n const suggestion = suggestProjectName(input);\n return `Invalid project name. Try: ${suggestion}`;\n }\n return true;\n },\n filter: (input: string) => input.trim(),\n },\n {\n type: 'list',\n name: 'platform',\n message: 'Select platform:',\n choices: [\n { name: '🌐 Web (Next.js)', value: 'web' },\n { name: '📱 Mobile (Expo)', value: 'mobile' },\n { name: '🚀 Both (Full-stack)', value: 'both' },\n ],\n default: initialConfig.platform,\n },\n {\n type: 'list',\n name: 'tier',\n message: 'Select project tier:',\n choices: TIER_CHOICES,\n default: initialConfig.tier || 'starter',\n },\n {\n type: 'list',\n name: 'template',\n message: 'Select template:',\n choices: (answers: { platform: string }) => {\n if (answers.platform === 'web') {\n return [\n // ═══════════════════════════════════════════════════════════════\n // STARTER TEMPLATES (Recommended for new projects)\n // ═══════════════════════════════════════════════════════════════\n new inquirer.Separator('─── Starter Templates ───'),\n {\n name: '💼 Micro-SaaS - Single feature MVP (subscriptions, analytics)',\n value: 'micro-saas',\n },\n {\n name: '💳 UI + Auth + Payments - Complete SaaS foundation [Recommended]',\n value: 'ui-auth-payments',\n },\n\n // ═══════════════════════════════════════════════════════════════\n // VERTICAL TEMPLATES (Industry-specific)\n // ═══════════════════════════════════════════════════════════════\n new inquirer.Separator('─── Vertical Templates ───'),\n {\n name: '🛒 Marketplace - Multi-vendor platform (products, orders, vendors)',\n value: 'marketplace',\n },\n {\n name: '🤖 AI Platform - LLM-powered SaaS (chat, model selection)',\n value: 'ai-platform',\n },\n {\n name: '📡 IoT Dashboard - Device monitoring & telemetry',\n value: 'iot-dashboard',\n },\n\n // ═══════════════════════════════════════════════════════════════\n // CORE TEMPLATES (Building blocks)\n // ═══════════════════════════════════════════════════════════════\n new inquirer.Separator('─── Core Templates ───'),\n {\n name: '📄 Base - Clean Next.js 15 starter',\n value: 'base',\n },\n {\n name: '🎨 UI Only - Components library showcase (no auth)',\n value: 'ui-only',\n },\n {\n name: '🔐 UI + Auth - Modern authentication flow',\n value: 'ui-auth',\n },\n\n // ═══════════════════════════════════════════════════════════════\n // AI-POWERED TEMPLATES\n // ═══════════════════════════════════════════════════════════════\n new inquirer.Separator('─── AI-Powered Templates ───'),\n {\n name: '🤖 AI + Auth - Text & chat AI integration',\n value: 'ui-auth-ai',\n },\n {\n name: '🤖 AI + Auth + Payments - Full AI SaaS platform',\n value: 'ui-auth-payments-ai',\n },\n\n // ═══════════════════════════════════════════════════════════════\n // MEDIA TEMPLATES\n // ═══════════════════════════════════════════════════════════════\n new inquirer.Separator('─── Media Templates ───'),\n {\n name: '🎵 Audio SaaS - Music streaming & audio processing',\n value: 'ui-auth-payments-audio',\n },\n {\n name: '🎬 Video SaaS - Video streaming & media platform',\n value: 'ui-auth-payments-video',\n },\n\n // ═══════════════════════════════════════════════════════════════\n // DEVELOPMENT TEMPLATES\n // ═══════════════════════════════════════════════════════════════\n new inquirer.Separator('─── Development Templates ───'),\n {\n name: '🧪 UI Package Test - Component testing environment',\n value: 'ui-package-test',\n },\n ];\n } else if (answers.platform === 'mobile') {\n return [\n {\n name: '📱 Base - React Native + Expo starter',\n value: 'base',\n },\n {\n name: '💳 UI + Auth + Payments - Full mobile SaaS (v0.22.0)',\n value: 'ui-auth-payments',\n },\n {\n name: '🤖 AI + Auth + Payments - Mobile AI SaaS with generation tools',\n value: 'ui-auth-payments-ai',\n },\n ];\n } else {\n // Both platform - show available cross-platform options\n return [\n {\n name: '🚀 Full Stack - Web + Mobile SaaS platform',\n value: 'ui-auth-payments',\n },\n {\n name: '🤖 AI Full Stack - Web + Mobile AI platform',\n value: 'ui-auth-payments-ai',\n },\n ];\n }\n },\n default: initialConfig.template,\n },\n {\n type: 'list',\n name: 'auth',\n message: 'Select authentication provider:',\n choices: [\n { name: '🔑 Keycloak - Self-hosted OIDC (recommended)', value: 'keycloak' },\n { name: '⚡ Supabase - Open source alternative', value: 'supabase' },\n { name: \"🔥 Firebase - Google's platform\", value: 'firebase' },\n ],\n default: initialConfig.auth,\n },\n {\n type: 'list',\n name: 'database',\n message: 'Select database provider:',\n choices: (answers: { auth: string }) => {\n const choices = [\n {\n name: '🐘 PostgreSQL + Drizzle - Self-hosted, full control (recommended)',\n value: 'postgresql',\n },\n { name: '⚡ Supabase - PostgreSQL with real-time & dashboard', value: 'supabase' },\n { name: '🔥 Firebase - NoSQL with real-time', value: 'firebase' },\n ];\n\n // For Firebase auth, suggest Firebase DB first\n if (answers.auth === 'firebase') {\n return choices.reverse();\n }\n\n return choices;\n },\n default: (answers: { auth: string }) => {\n // Keycloak pairs best with self-hosted PostgreSQL\n if (answers.auth === 'keycloak') return 'postgresql';\n if (answers.auth === 'firebase') return 'firebase';\n return 'supabase';\n },\n },\n {\n type: 'list',\n name: 'theme',\n message: 'Select theme:',\n choices: [\n { name: '🎨 Default - Clean and modern', value: 'default' },\n { name: '🏢 Corporate - Professional business theme', value: 'corporate' },\n { name: '🚀 Startup - Bold and innovative', value: 'startup' },\n ],\n default: initialConfig.theme,\n },\n {\n type: 'list',\n name: 'themeColor',\n message: 'Select theme color:',\n choices: [\n { name: '🔵 Blue - Classic and trustworthy', value: 'blue' },\n { name: '🟢 Green - Fresh and natural', value: 'green' },\n { name: '🟣 Purple - Creative and modern', value: 'purple' },\n { name: '🟠 Orange - Energetic and friendly', value: 'orange' },\n { name: '🔴 Red - Bold and attention-grabbing', value: 'red' },\n { name: '⚫ Slate - Professional and minimal', value: 'slate' },\n ],\n default: initialConfig.themeColor,\n },\n {\n type: 'list',\n name: 'defaultTheme',\n message: 'Select default theme mode:',\n choices: [\n { name: '🌙 System - Follow system preference', value: 'system' },\n { name: '☀️ Light - Always light mode', value: 'light' },\n { name: '🌙 Dark - Always dark mode', value: 'dark' },\n ],\n default: initialConfig.defaultTheme,\n },\n {\n type: 'confirm',\n name: 'install',\n message: 'Install dependencies?',\n default: initialConfig.install,\n },\n {\n type: 'confirm',\n name: 'git',\n message: 'Initialize git repository?',\n default: initialConfig.git,\n },\n ];\n\n const answers = await inquirer.prompt(questions);\n\n return {\n ...initialConfig,\n ...answers,\n } as ProjectConfig;\n}\n\nexport async function getAuthSetupPrompts(authProvider: string) {\n logger.title(`🔐 ${authProvider} Configuration`);\n\n if (authProvider === 'firebase') {\n const questions = [\n {\n type: 'input',\n name: 'projectId',\n message: 'Firebase Project ID:',\n validate: (input: string) => input.length > 0 || 'Project ID is required',\n },\n {\n type: 'input',\n name: 'apiKey',\n message: 'Firebase API Key:',\n validate: (input: string) => input.length > 0 || 'API Key is required',\n },\n {\n type: 'input',\n name: 'authDomain',\n message: 'Firebase Auth Domain:',\n validate: (input: string) => input.length > 0 || 'Auth Domain is required',\n },\n ];\n\n return await inquirer.prompt(questions);\n } else if (authProvider === 'supabase') {\n const questions = [\n {\n type: 'input',\n name: 'url',\n message: 'Supabase URL:',\n validate: (input: string) => {\n if (!input.length) return 'URL is required';\n if (!input.startsWith('https://')) return 'URL must start with https://';\n return true;\n },\n },\n {\n type: 'input',\n name: 'anonKey',\n message: 'Supabase Anon Key:',\n validate: (input: string) => input.length > 0 || 'Anon Key is required',\n },\n ];\n\n return await inquirer.prompt(questions);\n }\n\n return {};\n}\n\nexport async function getThemeCustomizationPrompts(theme: string) {\n logger.title(`🎨 ${theme} Theme Customization`);\n\n const questions = [\n {\n type: 'input',\n name: 'primaryColor',\n message: 'Primary color (hex):',\n default: theme === 'corporate' ? '#1e40af' : theme === 'startup' ? '#7c3aed' : '#3b82f6',\n validate: (input: string) => {\n if (!/^#[0-9A-F]{6}$/i.test(input)) {\n return 'Please enter a valid hex color (e.g., #3b82f6)';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'fontFamily',\n message: 'Font family:',\n default: theme === 'corporate' ? 'Inter' : theme === 'startup' ? 'Poppins' : 'System UI',\n },\n {\n type: 'confirm',\n name: 'darkMode',\n message: 'Enable dark mode support?',\n default: true,\n },\n ];\n\n return await inquirer.prompt(questions);\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport mustache from 'mustache';\nimport { glob } from 'glob';\nimport { ProjectConfig, ProjectTier } from '../cli/commands/create';\nimport { logger } from '../cli/utils/logger';\n\n/**\n * Tier-based feature configuration\n * Determines which DLL packages and features are included per tier\n */\nconst TIER_FEATURES: Record<\n ProjectTier,\n {\n platformCore: boolean;\n appSdk: boolean;\n auth: boolean;\n payments: boolean;\n ai: boolean;\n observability: boolean;\n workers: boolean;\n beta: boolean;\n }\n> = {\n micro: {\n platformCore: true,\n appSdk: true,\n auth: true,\n payments: false,\n ai: false,\n observability: false,\n workers: false,\n beta: true,\n },\n starter: {\n platformCore: true,\n appSdk: true,\n auth: true,\n payments: true,\n ai: false,\n observability: false,\n workers: false,\n beta: true,\n },\n pro: {\n platformCore: true,\n appSdk: true,\n auth: true,\n payments: true,\n ai: true,\n observability: true,\n workers: false,\n beta: true,\n },\n enterprise: {\n platformCore: true,\n appSdk: true,\n auth: true,\n payments: true,\n ai: true,\n observability: true,\n workers: true,\n beta: true,\n },\n};\n\nexport interface TemplateContext {\n projectName: string;\n platform: string;\n template: string;\n tier: ProjectTier;\n auth: string;\n database: string;\n theme: string;\n themeColor: string;\n defaultTheme: string;\n ai: {\n enabled: boolean;\n capabilities: string[];\n provider: string;\n hasText: boolean;\n hasAudio: boolean;\n hasVideo: boolean;\n };\n // Tier-derived feature flags for templates\n features: {\n platformCore: boolean;\n appSdk: boolean;\n auth: boolean;\n payments: boolean;\n ai: boolean;\n observability: boolean;\n workers: boolean;\n beta: boolean;\n };\n packageName: string;\n className: string;\n camelCaseName: string;\n kebabCaseName: string;\n titleCaseName: string;\n slugNameCamelCase: string;\n description: string;\n author: string;\n year: number;\n generatedDate: string;\n generatorVersion: string;\n // DLL package versions\n platformCoreVersion: string;\n appSdkVersion: string;\n uiVersion: string;\n authVersion: string;\n paymentsVersion: string;\n aiVersion: string;\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n scripts: Record<string, string>;\n}\n\nexport class TemplateGenerator {\n private config: ProjectConfig;\n private context: TemplateContext;\n private templatesDir: string;\n\n constructor(config: ProjectConfig) {\n this.config = config;\n // Always use the templates directory relative to __dirname\n // In the built package, templates are copied to dist/templates\n // __dirname is dist/generators, so we need to go up one level\n this.templatesDir = path.join(__dirname, '..', 'templates');\n this.context = this.createTemplateContext();\n }\n\n private createTemplateContext(): TemplateContext {\n const projectName = this.config.name;\n const packageName = projectName.toLowerCase().replace(/[^a-z0-9-]/g, '-');\n const className = this.toPascalCase(projectName);\n const camelCaseName = this.toCamelCase(projectName);\n const kebabCaseName = packageName;\n const titleCaseName = this.toTitleCase(projectName);\n const slugNameCamelCase = this.toCamelCase(packageName);\n\n // Get tier features\n const tier = this.config.tier || 'starter';\n const features = TIER_FEATURES[tier];\n\n const dependencies = this.getDependencies();\n const generatedDate = new Date().toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n\n // Determine tier description for template\n const tierDescriptions: Record<ProjectTier, string> = {\n micro: 'minimal',\n starter: 'standard',\n pro: 'AI-powered',\n enterprise: 'enterprise-grade',\n };\n\n return {\n projectName,\n platform: this.config.platform,\n template: this.config.template,\n tier,\n auth: this.config.auth,\n database: this.config.database,\n theme: this.config.theme,\n themeColor: this.config.themeColor,\n defaultTheme: this.config.defaultTheme,\n ai: {\n enabled: this.config.ai.enabled || features.ai,\n capabilities: this.config.ai.capabilities,\n provider: this.config.ai.provider,\n hasText: this.config.ai.capabilities.includes('text'),\n hasAudio: this.config.ai.capabilities.includes('audio'),\n hasVideo: this.config.ai.capabilities.includes('video'),\n },\n features,\n packageName,\n className,\n camelCaseName,\n kebabCaseName,\n titleCaseName,\n slugNameCamelCase,\n description: `A ${tierDescriptions[tier]} SaaS application built with DLL Platform`,\n author: 'Digi Logic Labs',\n year: new Date().getFullYear(),\n generatedDate,\n generatorVersion: '2.0.0',\n // DLL package versions\n platformCoreVersion:\n dependencies['@digilogiclabs/platform-core']?.replace('^', '') || '1.1.0',\n appSdkVersion: dependencies['@digilogiclabs/app-sdk']?.replace('^', '') || '1.0.0',\n uiVersion: dependencies['@digilogiclabs/saas-factory-ui']?.replace('^', '') || '1.0.1',\n authVersion: dependencies['@digilogiclabs/saas-factory-auth']?.replace('^', '') || '1.0.0',\n paymentsVersion:\n dependencies['@digilogiclabs/saas-factory-payments']?.replace('^', '') || '1.0.0',\n aiVersion: dependencies['@digilogiclabs/saas-factory-ai']?.replace('^', '') || '1.0.0',\n dependencies,\n devDependencies: this.getDevDependencies(),\n scripts: this.getScripts(),\n };\n }\n\n private getDependencies(): Record<string, string> {\n const baseDeps: Record<string, string> = {};\n const tier = this.config.tier || 'starter';\n const features = TIER_FEATURES[tier];\n\n // ═══════════════════════════════════════════════════════════════\n // DLL PLATFORM CORE PACKAGES (tier-based)\n // ═══════════════════════════════════════════════════════════════\n\n // Platform Core - Always included for all tiers (infrastructure abstraction)\n if (features.platformCore) {\n baseDeps['@digilogiclabs/platform-core'] = '^1.9.0';\n }\n\n // App SDK - Always included for React apps (unified hooks)\n if (features.appSdk && (this.config.platform === 'web' || this.config.platform === 'both')) {\n baseDeps['@digilogiclabs/app-sdk'] = '^1.0.0';\n }\n\n // UI Components - included for most templates\n if (\n [\n 'ui-only',\n 'ui-auth',\n 'ui-auth-payments',\n 'ui-auth-payments-audio',\n 'ui-auth-payments-video',\n 'ui-auth-payments-ai',\n 'ui-auth-payments-ai-rag',\n // New vertical templates\n 'micro-saas',\n 'marketplace',\n 'ai-platform',\n 'iot-dashboard',\n ].includes(this.config.template)\n ) {\n baseDeps['@digilogiclabs/saas-factory-ui'] = '^1.1.0';\n }\n\n // Auth package (tier: micro+)\n if (features.auth && this.config.template !== 'base' && this.config.template !== 'ui-only') {\n baseDeps['@digilogiclabs/saas-factory-auth'] = '^3.0.0';\n }\n\n // Payments package (tier: starter+)\n if (\n features.payments &&\n (this.config.template.includes('payments') || ['starter', 'pro', 'enterprise'].includes(tier))\n ) {\n baseDeps['@digilogiclabs/saas-factory-payments'] = '^3.0.0';\n }\n\n // AI packages (tier: pro+ or AI-focused templates)\n if (\n features.ai &&\n (this.config.ai.enabled ||\n this.config.template.includes('-ai') ||\n this.config.template === 'ai-platform')\n ) {\n baseDeps['@digilogiclabs/saas-factory-ai'] = '^6.0.0';\n baseDeps['@digilogiclabs/saas-factory-ai-types'] = '^1.0.0';\n // Add AI SDK for ai-platform template\n if (this.config.template === 'ai-platform') {\n baseDeps['ai'] = '^4.0.0';\n baseDeps['@ai-sdk/openai'] = '^1.0.0';\n baseDeps['@ai-sdk/anthropic'] = '^1.0.0';\n }\n }\n\n // IoT Dashboard specific dependencies\n if (this.config.template === 'iot-dashboard') {\n baseDeps['recharts'] = '^2.14.0';\n baseDeps['date-fns'] = '^4.1.0';\n }\n\n // Marketplace specific dependencies\n if (this.config.template === 'marketplace') {\n baseDeps['stripe'] = '^17.4.0';\n }\n\n // ═══════════════════════════════════════════════════════════════\n // PLATFORM DEPENDENCIES (web/mobile)\n // ═══════════════════════════════════════════════════════════════\n\n if (this.config.platform === 'web' || this.config.platform === 'both') {\n Object.assign(baseDeps, {\n next: '^15.5.0',\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n tailwindcss: '^4.0.0',\n typescript: '^5.8.0',\n clsx: '^2.1.0',\n 'class-variance-authority': '^0.7.0',\n 'tailwind-merge': '^2.6.0',\n 'next-themes': '^0.4.0',\n 'lucide-react': '^0.460.0',\n });\n }\n\n if (this.config.platform === 'mobile' || this.config.platform === 'both') {\n Object.assign(baseDeps, {\n expo: '~52.0.0',\n 'react-native': '0.76.0',\n '@expo/vector-icons': '^14.0.0',\n '@react-navigation/native': '^7.0.0',\n '@react-navigation/bottom-tabs': '^7.0.0',\n 'react-native-screens': '~4.0.0',\n 'react-native-safe-area-context': '4.12.0',\n 'react-native-gesture-handler': '~2.20.0',\n 'expo-router': '~4.0.0',\n });\n\n // Stripe for mobile if payments enabled\n if (features.payments) {\n baseDeps['@stripe/stripe-react-native'] = '^0.39.0';\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // AUTH PROVIDER SDKS\n // ═══════════════════════════════════════════════════════════════\n\n if (this.config.auth === 'firebase') {\n baseDeps['firebase'] = '^11.0.0';\n } else if (this.config.auth === 'supabase') {\n baseDeps['@supabase/supabase-js'] = '^2.46.0';\n if (this.config.platform === 'web' || this.config.platform === 'both') {\n baseDeps['@supabase/ssr'] = '^0.5.0';\n }\n } else if (this.config.auth === 'keycloak') {\n if (this.config.platform === 'web' || this.config.platform === 'both') {\n baseDeps['next-auth'] = '^5.0.0-beta.30';\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // INFRASTRUCTURE DEPENDENCIES\n // ═══════════════════════════════════════════════════════════════\n\n // Redis (starter+ tiers — rate limiting, caching)\n if (features.payments || features.ai || features.observability) {\n baseDeps['ioredis'] = '^5.6.0';\n }\n\n // Database (PostgreSQL + Drizzle)\n if (this.config.database === 'postgresql') {\n baseDeps['drizzle-orm'] = '^0.43.0';\n baseDeps['postgres'] = '^3.4.0';\n baseDeps['dotenv'] = '^16.4.0';\n }\n\n // Stripe (starter+ tiers — payments)\n if (features.payments) {\n baseDeps['stripe'] = '^17.4.0';\n }\n\n // Resend (starter+ tiers — transactional email)\n if (features.payments) {\n baseDeps['resend'] = '^4.0.0';\n }\n\n // Server-only guard\n baseDeps['server-only'] = '^0.0.1';\n\n return baseDeps;\n }\n\n private getDevDependencies(): Record<string, string> {\n const baseDeps: Record<string, string> = {\n '@types/node': '^22.0.0',\n eslint: '^9.0.0',\n prettier: '^3.4.0',\n typescript: '^5.7.0',\n };\n\n if (this.config.platform === 'web' || this.config.platform === 'both') {\n Object.assign(baseDeps, {\n '@types/react': '^19.0.0',\n '@types/react-dom': '^19.0.0',\n });\n }\n\n // Drizzle Kit for PostgreSQL\n if (this.config.database === 'postgresql') {\n baseDeps['drizzle-kit'] = '^0.30.0';\n }\n\n // Add testing dependencies for pro+ tiers\n const tier = this.config.tier || 'starter';\n if (['pro', 'enterprise'].includes(tier)) {\n Object.assign(baseDeps, {\n vitest: '^2.1.0',\n '@testing-library/react': '^16.0.0',\n '@testing-library/jest-dom': '^6.6.0',\n });\n }\n\n return baseDeps;\n }\n\n private getScripts(): Record<string, string> {\n const scripts: Record<string, string> = {};\n\n if (this.config.platform === 'web' || this.config.platform === 'both') {\n Object.assign(scripts, {\n dev: 'next dev',\n build: 'next build',\n start: 'next start',\n lint: 'next lint',\n });\n }\n\n if (this.config.platform === 'mobile' || this.config.platform === 'both') {\n Object.assign(scripts, {\n start: 'expo start',\n android: 'expo start --android',\n ios: 'expo start --ios',\n web: 'expo start --web',\n });\n }\n\n return scripts;\n }\n\n public async generate(outputPath: string): Promise<void> {\n try {\n // Ensure output directory exists\n await fs.ensureDir(outputPath);\n\n // Generate based on platform\n if (this.config.platform === 'web') {\n await this.generateWebProject(outputPath);\n } else if (this.config.platform === 'mobile') {\n await this.generateMobileProject(outputPath);\n } else if (this.config.platform === 'both') {\n await this.generateWebProject(outputPath);\n await this.generateMobileProject(path.join(outputPath, 'mobile'));\n }\n\n // Copy shared resources\n await this.copySharedResources(outputPath);\n\n // Patch package.json with aligned dependency versions\n await this.patchPackageJson(outputPath);\n\n logger.debug('Template generation completed');\n } catch (error) {\n logger.error('Template generation failed:', error);\n throw error;\n }\n }\n\n private async generateWebProject(outputPath: string): Promise<void> {\n const templatePath = path.join(this.templatesDir, 'web', this.config.template);\n await this.copyTemplate(templatePath, outputPath);\n }\n\n private async generateMobileProject(outputPath: string): Promise<void> {\n // Map web templates to mobile templates where applicable\n let mobileTemplate = this.config.template;\n\n // If we don't have a mobile version, try to find the closest match\n if (!(await fs.pathExists(path.join(this.templatesDir, 'mobile', mobileTemplate)))) {\n // Map web templates to available mobile templates\n if (mobileTemplate.includes('-ai-rag')) {\n mobileTemplate = 'ui-auth-payments-ai-rag';\n } else if (mobileTemplate.includes('-ai') || mobileTemplate === 'ui-auth-payments-ai') {\n mobileTemplate = 'ui-auth-payments-ai';\n } else if (mobileTemplate.startsWith('ui-auth-payments')) {\n mobileTemplate = 'ui-auth-payments';\n } else if (mobileTemplate.startsWith('ui-auth')) {\n // Use the ui-auth-payments template for other ui-auth variants\n mobileTemplate = 'ui-auth-payments';\n } else if (mobileTemplate.startsWith('ui-')) {\n mobileTemplate = 'base';\n }\n }\n\n const templatePath = path.join(this.templatesDir, 'mobile', mobileTemplate);\n await this.copyTemplate(templatePath, outputPath);\n\n // Create assets directory and basic assets for mobile projects\n await this.createMobileAssets(outputPath);\n }\n\n private async copyTemplate(templatePath: string, outputPath: string): Promise<void> {\n const templateDir = path.join(templatePath, 'template');\n\n if (!(await fs.pathExists(templateDir))) {\n throw new Error(`Template not found: ${templateDir}`);\n }\n await this.copyAndProcessFiles(templateDir, outputPath);\n }\n\n private async copyAndProcessFiles(sourceDir: string, targetDir: string): Promise<void> {\n if (!(await fs.pathExists(sourceDir))) {\n logger.debug(`Template source directory not found: ${sourceDir}`);\n return;\n }\n\n const files = await glob('**/*', {\n cwd: sourceDir,\n dot: true,\n nodir: true,\n });\n\n for (const file of files) {\n const sourcePath = path.join(sourceDir, file);\n const targetPath = path.join(targetDir, file);\n\n await fs.ensureDir(path.dirname(targetPath));\n\n const content = await fs.readFile(sourcePath, 'utf-8');\n\n if (this.isTextFile(file)) {\n // Check if file contains mustache variables before processing\n const hasMustacheVars = content.includes('{{') && content.includes('}}');\n const ext = path.extname(file).toLowerCase();\n\n // For JSX/TSX files without mustache variables, skip processing to preserve template literals\n if (['.tsx', '.jsx'].includes(ext) && !hasMustacheVars) {\n await fs.writeFile(targetPath, content);\n } else if (hasMustacheVars) {\n // Only process files that actually have mustache variables\n // For JSX/TSX files, we need to protect template literals during mustache processing\n if (['.tsx', '.jsx'].includes(ext)) {\n // Step 1: Replace template literals and JSX object literals with placeholders\n const templateLiterals: string[] = [];\n let protectedContent = content.replace(/\\$\\{([^}]+)\\}/g, (match, _variable) => {\n templateLiterals.push(match);\n return `__TEMPLATE_LITERAL_${templateLiterals.length - 1}__`;\n });\n\n // Step 1.5: Protect JSX object literals {{ }} from mustache processing\n const jsxObjectLiterals: string[] = [];\n protectedContent = this.protectJSXObjectLiterals(protectedContent, jsxObjectLiterals);\n\n // Step 2: Process mustache variables\n const processedContent = mustache.render(protectedContent, this.context);\n\n // Step 3: Restore template literals and JSX object literals\n let finalContent = processedContent.replace(\n /__TEMPLATE_LITERAL_(\\d+)__/g,\n (match, index) => {\n return templateLiterals[parseInt(index)];\n }\n );\n\n // Step 4: Restore JSX object literals\n finalContent = finalContent.replace(/__JSX_OBJECT_(\\d+)__/g, (match, index) => {\n return jsxObjectLiterals[parseInt(index)];\n });\n\n await fs.writeFile(targetPath, finalContent);\n } else {\n // For non-JSX files, process normally\n const processedContent = mustache.render(content, this.context);\n await fs.writeFile(targetPath, processedContent);\n }\n } else {\n // Copy other text files directly\n await fs.writeFile(targetPath, content);\n }\n } else {\n await fs.copy(sourcePath, targetPath);\n }\n }\n }\n\n private async copySharedResources(outputPath: string): Promise<void> {\n // Skip copying shared resources for UI-only templates\n if (this.config.template === 'ui-only') {\n logger.debug('Skipping shared resources for UI-only template');\n return;\n }\n\n const sharedPath = path.join(this.templatesDir, 'shared');\n const isWeb = this.config.platform === 'web' || this.config.platform === 'both';\n const tier = this.config.tier || 'starter';\n const features = TIER_FEATURES[tier];\n\n // ═══════════════════════════════════════════════════════════════\n // AUTH — provider-specific config (Keycloak: auth.config.ts + auth.ts + federated-logout)\n // ═══════════════════════════════════════════════════════════════\n if (isWeb) {\n const authPath = path.join(sharedPath, 'auth', this.config.auth, 'web');\n await this.copyAndProcessFiles(authPath, outputPath);\n }\n\n // ═══════════════════════════════════════════════════════════════\n // DATABASE — provider-specific setup (PostgreSQL/Drizzle or Supabase)\n // ═══════════════════════════════════════════════════════════════\n if (isWeb) {\n const dbPath = path.join(sharedPath, 'database', this.config.database, 'web');\n await this.copyAndProcessFiles(dbPath, outputPath);\n }\n\n // ═══════════════════════════════════════════════════════════════\n // THEME — theme-specific configuration\n // ═══════════════════════════════════════════════════════════════\n const themePath = path.join(sharedPath, 'themes', this.config.theme);\n await this.copyAndProcessFiles(themePath, outputPath);\n\n // ═══════════════════════════════════════════════════════════════\n // BETA GATE — all tiers (API routes + client wrapper)\n // ═══════════════════════════════════════════════════════════════\n if (features.beta && isWeb) {\n const betaPath = path.join(sharedPath, 'beta', 'web');\n if (await fs.pathExists(betaPath)) {\n await this.copyAndProcessFiles(betaPath, path.join(outputPath, 'src'));\n logger.debug('Copied beta gate templates');\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // ENVIRONMENT CONFIG — centralized env validation (all tiers)\n // ═══════════════════════════════════════════════════════════════\n if (isWeb) {\n const configPath = path.join(sharedPath, 'config', 'web');\n if (await fs.pathExists(configPath)) {\n await this.copyAndProcessFiles(configPath, outputPath);\n logger.debug('Copied environment config template');\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // REDIS — client + rate limit store (starter+ tiers)\n // ═══════════════════════════════════════════════════════════════\n if (isWeb && (features.payments || features.ai || features.observability)) {\n const redisPath = path.join(sharedPath, 'redis', 'web');\n if (await fs.pathExists(redisPath)) {\n await this.copyAndProcessFiles(redisPath, outputPath);\n logger.debug('Copied Redis client template');\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // API SECURITY — wrapper + rate limiting (all tiers)\n // ═══════════════════════════════════════════════════════════════\n if (isWeb) {\n const securityPath = path.join(sharedPath, 'security', 'web');\n if (await fs.pathExists(securityPath)) {\n await this.copyAndProcessFiles(securityPath, outputPath);\n logger.debug('Copied API security wrapper template');\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // MIDDLEWARE — route protection + auth (all tiers)\n // ═══════════════════════════════════════════════════════════════\n if (isWeb && this.config.auth === 'keycloak') {\n const middlewarePath = path.join(sharedPath, 'middleware', 'web');\n if (await fs.pathExists(middlewarePath)) {\n await this.copyAndProcessFiles(middlewarePath, outputPath);\n logger.debug('Copied middleware template');\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // HEALTH CHECK — container readiness (all tiers)\n // ═══════════════════════════════════════════════════════════════\n if (isWeb) {\n const healthPath = path.join(sharedPath, 'health', 'web');\n if (await fs.pathExists(healthPath)) {\n await this.copyAndProcessFiles(healthPath, outputPath);\n logger.debug('Copied health check endpoint template');\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // STRIPE WEBHOOKS — payment lifecycle (starter+ tiers)\n // ═══════════════════════════════════════════════════════════════\n if (isWeb && features.payments) {\n const paymentsPath = path.join(sharedPath, 'payments', 'web');\n if (await fs.pathExists(paymentsPath)) {\n await this.copyAndProcessFiles(paymentsPath, outputPath);\n logger.debug('Copied Stripe webhook handler template');\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // AUDIT LOGGING — admin visibility (all authenticated apps)\n // ═══════════════════════════════════════════════════════════════\n if (isWeb && features.auth) {\n const auditPath = path.join(sharedPath, 'audit', 'web');\n if (await fs.pathExists(auditPath)) {\n await this.copyAndProcessFiles(auditPath, outputPath);\n logger.debug('Copied audit logging template');\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // EMAIL BRANDING — transactional emails (all authenticated apps)\n // ═══════════════════════════════════════════════════════════════\n if (isWeb && features.auth) {\n const emailPath = path.join(sharedPath, 'email', 'web');\n if (await fs.pathExists(emailPath)) {\n await this.copyAndProcessFiles(emailPath, outputPath);\n logger.debug('Copied email branding template');\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // PLATFORM-CORE INIT — singleton adapter wiring (all tiers)\n // ═══════════════════════════════════════════════════════════════\n if (isWeb) {\n const platformPath = path.join(sharedPath, 'platform', 'web');\n if (await fs.pathExists(platformPath)) {\n await this.copyAndProcessFiles(platformPath, outputPath);\n logger.debug('Copied platform-core initialization template');\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // LEGAL PAGES — Terms of Service + Privacy Policy (all tiers)\n // ═══════════════════════════════════════════════════════════════\n if (isWeb) {\n const legalPath = path.join(sharedPath, 'legal', 'web');\n if (await fs.pathExists(legalPath)) {\n await this.copyAndProcessFiles(legalPath, outputPath);\n logger.debug('Copied legal page templates (terms, privacy)');\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // ERROR PAGES — 404, error boundary, global error (all tiers)\n // ═══════════════════════════════════════════════════════════════\n if (isWeb) {\n const errorPagesPath = path.join(sharedPath, 'error-pages', 'web');\n if (await fs.pathExists(errorPagesPath)) {\n await this.copyAndProcessFiles(errorPagesPath, outputPath);\n logger.debug('Copied error page templates (not-found, error, global-error)');\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // SEO — sitemap.ts + robots.ts (all tiers)\n // ═══════════════════════════════════════════════════════════════\n if (isWeb) {\n const seoPath = path.join(sharedPath, 'seo', 'web');\n if (await fs.pathExists(seoPath)) {\n await this.copyAndProcessFiles(seoPath, outputPath);\n logger.debug('Copied SEO templates (sitemap, robots)');\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // UTILS — common utility functions + API response helpers (all tiers)\n // ═══════════════════════════════════════════════════════════════\n if (isWeb) {\n const utilsPath = path.join(sharedPath, 'utils', 'web');\n if (await fs.pathExists(utilsPath)) {\n await this.copyAndProcessFiles(utilsPath, outputPath);\n logger.debug('Copied utility templates (utils, api-response)');\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // COOKIE CONSENT — GDPR compliance banner (all tiers)\n // ═══════════════════════════════════════════════════════════════\n if (isWeb) {\n const cookiePath = path.join(sharedPath, 'cookie-consent', 'web');\n if (await fs.pathExists(cookiePath)) {\n await this.copyAndProcessFiles(cookiePath, outputPath);\n logger.debug('Copied cookie consent component template');\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // OBSERVABILITY — audit + error reporting helpers (all tiers)\n // ═══════════════════════════════════════════════════════════════\n if (isWeb) {\n const obsPath = path.join(sharedPath, 'observability', 'web');\n if (await fs.pathExists(obsPath)) {\n await this.copyAndProcessFiles(obsPath, outputPath);\n logger.debug('Copied observability template');\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // CACHE — TTL presets + HTTP cache headers (all tiers)\n // ═══════════════════════════════════════════════════════════════\n if (isWeb) {\n const cachePath = path.join(sharedPath, 'cache', 'web');\n if (await fs.pathExists(cachePath)) {\n await this.copyAndProcessFiles(cachePath, outputPath);\n logger.debug('Copied cache utility template');\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // LOADING — skeleton components + default loading.tsx (all tiers)\n // ═══════════════════════════════════════════════════════════════\n if (isWeb) {\n const loadingPath = path.join(sharedPath, 'loading', 'web');\n if (await fs.pathExists(loadingPath)) {\n await this.copyAndProcessFiles(loadingPath, outputPath);\n logger.debug('Copied loading skeleton templates');\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // ADMIN — layout + nav component (keycloak auth only)\n // ═══════════════════════════════════════════════════════════════\n if (isWeb && this.config.auth === 'keycloak') {\n const adminPath = path.join(sharedPath, 'admin', 'web');\n if (await fs.pathExists(adminPath)) {\n await this.copyAndProcessFiles(adminPath, outputPath);\n logger.debug('Copied admin layout + nav templates');\n }\n }\n\n // ═══════════════════════════════════════════════════════════════\n // .env.example — dynamic env var reference\n // ═══════════════════════════════════════════════════════════════\n if (isWeb) {\n const envExample = this.generateEnvExample(features);\n await fs.writeFile(path.join(outputPath, '.env.example'), envExample);\n logger.debug('Generated .env.example');\n }\n }\n\n /**\n * Patch the generated package.json to merge aligned dependency versions.\n * Base templates may have stale versions — this ensures the output\n * always matches production-aligned versions from getDependencies().\n */\n private async patchPackageJson(outputPath: string): Promise<void> {\n const pkgPath = path.join(outputPath, 'package.json');\n if (!(await fs.pathExists(pkgPath))) return;\n\n const pkg = await fs.readJson(pkgPath);\n const deps = this.context.dependencies;\n const devDeps = this.context.devDependencies;\n\n // Merge dependencies — our versions take precedence over template defaults\n pkg.dependencies = { ...(pkg.dependencies || {}), ...deps };\n pkg.devDependencies = { ...(pkg.devDependencies || {}), ...devDeps };\n\n // Clean up any obsolete/duplicate deps that moved between deps and devDeps\n // (e.g., typescript might be in both)\n for (const key of Object.keys(pkg.devDependencies)) {\n if (key === 'typescript') continue; // typescript can be in both\n if (pkg.dependencies[key]) {\n delete pkg.devDependencies[key];\n }\n }\n\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n logger.debug('Patched package.json with aligned dependency versions');\n }\n\n /**\n * Generate .env.example dynamically based on auth, database, and tier selections.\n */\n private generateEnvExample(features: (typeof TIER_FEATURES)[ProjectTier]): string {\n const lines: string[] = [\n '# ═══════════════════════════════════════════════════════════════',\n `# ${this.config.name} — Environment Variables`,\n '# Copy this file to .env.local and fill in the values.',\n '# ═══════════════════════════════════════════════════════════════',\n '',\n '# ── App ──────────────────────────────────────────────────────',\n 'NODE_ENV=development',\n 'NEXT_PUBLIC_APP_URL=http://localhost:3000',\n '',\n ];\n\n // Auth\n if (this.config.auth === 'keycloak') {\n lines.push(\n '# ── Auth (Keycloak + Auth.js) ─────────────────────────────────',\n 'AUTH_SECRET= # openssl rand -base64 32',\n 'KEYCLOAK_ISSUER=https://auth.example.com/realms/my-realm',\n 'KEYCLOAK_CLIENT_ID=my-app',\n 'KEYCLOAK_CLIENT_SECRET=',\n ''\n );\n } else if (this.config.auth === 'supabase') {\n lines.push(\n '# ── Auth (Supabase) ───────────────────────────────────────────',\n 'NEXT_PUBLIC_SUPABASE_URL=https://xxx.supabase.co',\n 'NEXT_PUBLIC_SUPABASE_ANON_KEY=',\n 'SUPABASE_SERVICE_ROLE_KEY=',\n ''\n );\n } else if (this.config.auth === 'firebase') {\n lines.push(\n '# ── Auth (Firebase) ───────────────────────────────────────────',\n 'NEXT_PUBLIC_FIREBASE_API_KEY=',\n 'NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=',\n 'NEXT_PUBLIC_FIREBASE_PROJECT_ID=',\n ''\n );\n }\n\n // Database\n if (this.config.database === 'postgresql') {\n lines.push(\n '# ── Database (PostgreSQL) ─────────────────────────────────────',\n 'DATABASE_URL=postgres://user:password@localhost:5432/myapp',\n ''\n );\n } else if (this.config.database === 'supabase') {\n lines.push(\n '# ── Database (Supabase) ───────────────────────────────────────',\n 'NEXT_PUBLIC_SUPABASE_URL=https://xxx.supabase.co',\n 'NEXT_PUBLIC_SUPABASE_ANON_KEY=',\n 'SUPABASE_SERVICE_ROLE_KEY=',\n ''\n );\n }\n\n // Redis (starter+)\n if (features.payments || features.ai || features.observability) {\n lines.push(\n '# ── Cache (Redis) ─────────────────────────────────────────────',\n 'REDIS_URL=redis://localhost:6379',\n 'REDIS_KEY_PREFIX=myapp: # Isolate keys per app',\n ''\n );\n }\n\n // Payments (starter+)\n if (features.payments) {\n lines.push(\n '# ── Payments (Stripe) ─────────────────────────────────────────',\n 'STRIPE_PUBLISHABLE_KEY=pk_test_...',\n 'STRIPE_SECRET_KEY=sk_test_...',\n 'STRIPE_WEBHOOK_SECRET=whsec_...',\n ''\n );\n }\n\n // Email (starter+)\n if (features.payments) {\n lines.push(\n '# ── Email (Resend) ────────────────────────────────────────────',\n 'RESEND_API_KEY=re_...',\n 'EMAIL_FROM=noreply@example.com',\n ''\n );\n }\n\n // AI (pro+)\n if (features.ai) {\n lines.push(\n '# ── AI ────────────────────────────────────────────────────────',\n 'OPENAI_API_KEY=sk-...',\n '# ANTHROPIC_API_KEY=sk-ant-...',\n ''\n );\n }\n\n // Admin / Cron secrets\n lines.push(\n '# ── Security ──────────────────────────────────────────────────',\n 'ADMIN_SECRET= # openssl rand -base64 32',\n 'CRON_SECRET= # openssl rand -base64 32',\n ''\n );\n\n // Beta (if enabled)\n if (features.beta) {\n lines.push(\n '# ── Beta Access ───────────────────────────────────────────────',\n 'BETA_ENABLED=true',\n 'BETA_CODES=CODE1,CODE2 # Comma-separated invite codes',\n ''\n );\n }\n\n return lines.join('\\n');\n }\n\n private protectJSXObjectLiterals(content: string, jsxObjectLiterals: string[]): string {\n let result = '';\n let i = 0;\n\n while (i < content.length) {\n if (content.substr(i, 2) === '{{') {\n // Found potential JSX object literal\n let braceCount = 0;\n const start = i;\n let j = i;\n\n // Count braces to find the complete object literal\n while (j < content.length) {\n if (content[j] === '{') {\n braceCount++;\n } else if (content[j] === '}') {\n braceCount--;\n if (braceCount === 0) {\n break;\n }\n }\n j++;\n }\n\n if (braceCount === 0 && j < content.length) {\n // Found complete {{ ... }} block\n const fullMatch = content.substring(start, j + 1);\n const innerContent = content.substring(start + 2, j - 1);\n\n // Check if this looks like a JSX object literal (not a mustache variable)\n if (this.isJSXObjectLiteral(innerContent)) {\n jsxObjectLiterals.push(fullMatch);\n result += `__JSX_OBJECT_${jsxObjectLiterals.length - 1}__`;\n i = j + 1;\n } else {\n // Keep mustache variable as-is\n result += content[i];\n i++;\n }\n } else {\n // Incomplete braces, just add the character\n result += content[i];\n i++;\n }\n } else {\n result += content[i];\n i++;\n }\n }\n\n return result;\n }\n\n private isJSXObjectLiteral(content: string): boolean {\n // JSX object literals typically have:\n // - Property assignments with colons\n // - Commas separating properties\n // - Whitespace/newlines\n // - Array literals with square brackets\n // - Function calls\n\n // Simple heuristics to distinguish JSX from mustache variables\n return (\n content.includes(':') || // Property assignments\n content.includes(',') || // Multiple properties\n content.includes('[') || // Arrays\n content.includes('(') || // Function calls\n content.match(/\\s+/) !== null || // Whitespace\n content.includes('\\\\n') || // Newlines\n content.length > 20 // Complex expressions\n );\n }\n\n private isTextFile(filename: string): boolean {\n const textExtensions = [\n '.js',\n '.jsx',\n '.ts',\n '.tsx',\n '.json',\n '.md',\n '.txt',\n '.yml',\n '.yaml',\n '.xml',\n '.html',\n '.css',\n '.scss',\n '.sass',\n '.less',\n '.mjs',\n '.cjs',\n '.env',\n '.gitignore',\n '.eslintrc',\n '.prettierrc',\n '.editorconfig',\n '.nvmrc',\n // Infrastructure files (Terraform, Kubernetes)\n '.tf',\n '.tfvars',\n '.hcl',\n ];\n\n const ext = path.extname(filename).toLowerCase();\n return textExtensions.includes(ext) || !ext;\n }\n\n private toPascalCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]/g, ' ')\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n }\n\n private toCamelCase(str: string): string {\n const pascal = this.toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n }\n\n private toTitleCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]/g, ' ')\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n }\n\n private async createMobileAssets(outputPath: string): Promise<void> {\n const assetsDir = path.join(outputPath, 'assets');\n await fs.ensureDir(assetsDir);\n\n // Create a simple placeholder image (1x1 pixel transparent PNG)\n const placeholderImage = Buffer.from(\n 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==',\n 'base64'\n );\n\n // Create all required asset files\n const assetFiles = ['icon.png', 'splash.png', 'adaptive-icon.png', 'favicon.png'];\n\n for (const assetFile of assetFiles) {\n await fs.writeFile(path.join(assetsDir, assetFile), placeholderImage);\n }\n\n logger.debug(`Created assets directory with ${assetFiles.length} placeholder files`);\n }\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport execa from 'execa';\nimport {\n detectPackageManager,\n getInstallCommand,\n isPackageManagerAvailable,\n} from '../cli/utils/package-manager';\nimport { logger } from '../cli/utils/logger';\n\nexport class PackageInstaller {\n private projectPath: string;\n\n constructor(projectPath: string) {\n this.projectPath = projectPath;\n }\n\n public async install(): Promise<void> {\n try {\n // Check if package.json exists\n const packageJsonPath = path.join(this.projectPath, 'package.json');\n if (!(await fs.pathExists(packageJsonPath))) {\n throw new Error('package.json not found in project directory');\n }\n\n // Detect package manager\n const packageManager = await detectPackageManager(this.projectPath);\n\n // Verify package manager is available\n if (!(await isPackageManagerAvailable(packageManager))) {\n throw new Error(`Package manager \"${packageManager}\" is not available`);\n }\n\n logger.debug(`Installing dependencies with ${packageManager}...`);\n\n // Get install command\n const command = await getInstallCommand(packageManager);\n\n // Add --legacy-peer-deps flag for npm\n if (packageManager === 'npm') {\n command.push('--legacy-peer-deps');\n }\n\n // Run installation\n await execa(command[0], command.slice(1), {\n cwd: this.projectPath,\n stdio: 'pipe',\n });\n\n logger.debug('Dependencies installed successfully');\n } catch (error) {\n logger.error('Package installation failed:', error);\n throw error;\n }\n }\n\n public async installDependencies(dependencies: string[], dev = false): Promise<void> {\n try {\n if (dependencies.length === 0) {\n return;\n }\n\n const packageManager = await detectPackageManager(this.projectPath);\n\n if (!(await isPackageManagerAvailable(packageManager))) {\n throw new Error(`Package manager \"${packageManager}\" is not available`);\n }\n\n logger.debug(`Installing ${dev ? 'dev ' : ''}dependencies: ${dependencies.join(', ')}`);\n\n // Get add command\n const command =\n packageManager === 'yarn'\n ? ['yarn', 'add', ...(dev ? ['-D'] : []), ...dependencies]\n : packageManager === 'pnpm'\n ? ['pnpm', 'add', ...(dev ? ['-D'] : []), ...dependencies]\n : [\n 'npm',\n 'install',\n ...(dev ? ['--save-dev'] : []),\n '--legacy-peer-deps',\n ...dependencies,\n ];\n\n // Run installation\n await execa(command[0], command.slice(1), {\n cwd: this.projectPath,\n stdio: 'pipe',\n });\n\n logger.debug(`${dev ? 'Dev d' : 'D'}ependencies installed successfully`);\n } catch (error) {\n logger.error(`Failed to install ${dev ? 'dev ' : ''}dependencies:`, error);\n throw error;\n }\n }\n\n public async updatePackageJson(\n updates: Partial<{\n name: string;\n version: string;\n description: string;\n author: string;\n license: string;\n scripts: Record<string, string>;\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n keywords: string[];\n repository: unknown;\n bugs: unknown;\n homepage: string;\n }>\n ): Promise<void> {\n try {\n const packageJsonPath = path.join(this.projectPath, 'package.json');\n\n if (!(await fs.pathExists(packageJsonPath))) {\n throw new Error('package.json not found');\n }\n\n const packageJson = await fs.readJson(packageJsonPath);\n const updatedPackageJson = { ...packageJson, ...updates };\n\n await fs.writeJson(packageJsonPath, updatedPackageJson, { spaces: 2 });\n\n logger.debug('package.json updated successfully');\n } catch (error) {\n logger.error('Failed to update package.json:', error);\n throw error;\n }\n }\n\n public async addScript(name: string, command: string): Promise<void> {\n try {\n const packageJsonPath = path.join(this.projectPath, 'package.json');\n const packageJson = await fs.readJson(packageJsonPath);\n\n if (!packageJson.scripts) {\n packageJson.scripts = {};\n }\n\n packageJson.scripts[name] = command;\n\n await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 });\n\n logger.debug(`Script \"${name}\" added to package.json`);\n } catch (error) {\n logger.error(`Failed to add script \"${name}\":`, error);\n throw error;\n }\n }\n\n public async removeScript(name: string): Promise<void> {\n try {\n const packageJsonPath = path.join(this.projectPath, 'package.json');\n const packageJson = await fs.readJson(packageJsonPath);\n\n if (packageJson.scripts && packageJson.scripts[name]) {\n delete packageJson.scripts[name];\n await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 });\n logger.debug(`Script \"${name}\" removed from package.json`);\n }\n } catch (error) {\n logger.error(`Failed to remove script \"${name}\":`, error);\n throw error;\n }\n }\n\n public async getDependencies(): Promise<{\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n }> {\n try {\n const packageJsonPath = path.join(this.projectPath, 'package.json');\n const packageJson = await fs.readJson(packageJsonPath);\n\n return {\n dependencies: packageJson.dependencies || {},\n devDependencies: packageJson.devDependencies || {},\n };\n } catch (error) {\n logger.error('Failed to read dependencies:', error);\n return { dependencies: {}, devDependencies: {} };\n }\n }\n\n public async hasLockFile(): Promise<boolean> {\n const lockFiles = ['package-lock.json', 'yarn.lock', 'pnpm-lock.yaml'];\n\n for (const lockFile of lockFiles) {\n if (await fs.pathExists(path.join(this.projectPath, lockFile))) {\n return true;\n }\n }\n\n return false;\n }\n\n public async cleanInstall(): Promise<void> {\n try {\n // Remove node_modules and lock files\n const nodeModulesPath = path.join(this.projectPath, 'node_modules');\n const lockFiles = ['package-lock.json', 'yarn.lock', 'pnpm-lock.yaml'];\n\n if (await fs.pathExists(nodeModulesPath)) {\n await fs.remove(nodeModulesPath);\n }\n\n for (const lockFile of lockFiles) {\n const lockPath = path.join(this.projectPath, lockFile);\n if (await fs.pathExists(lockPath)) {\n await fs.remove(lockPath);\n }\n }\n\n // Fresh install\n await this.install();\n\n logger.debug('Clean install completed');\n } catch (error) {\n logger.error('Clean install failed:', error);\n throw error;\n }\n }\n}\n","import execa from 'execa';\nimport fs from 'fs-extra';\nimport path from 'path';\n\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm';\n\nexport async function detectPackageManager(projectPath?: string): Promise<PackageManager> {\n const cwd = projectPath || process.cwd();\n\n // Check for lock files\n const lockFiles = [\n { file: 'pnpm-lock.yaml', manager: 'pnpm' as PackageManager },\n { file: 'yarn.lock', manager: 'yarn' as PackageManager },\n { file: 'package-lock.json', manager: 'npm' as PackageManager },\n ];\n\n for (const { file, manager } of lockFiles) {\n if (await fs.pathExists(path.join(cwd, file))) {\n return manager;\n }\n }\n\n // Check for package manager availability\n const managers: PackageManager[] = ['pnpm', 'yarn', 'npm'];\n\n for (const manager of managers) {\n try {\n await execa(manager, ['--version']);\n return manager;\n } catch {\n // Continue to next manager\n }\n }\n\n // Default to npm\n return 'npm';\n}\n\nexport async function getInstallCommand(packageManager: PackageManager): Promise<string[]> {\n switch (packageManager) {\n case 'yarn':\n return ['yarn', 'install'];\n case 'pnpm':\n return ['pnpm', 'install'];\n default:\n return ['npm', 'install'];\n }\n}\n\nexport async function getAddCommand(\n packageManager: PackageManager,\n packages: string[],\n dev = false\n): Promise<string[]> {\n const devFlag = dev ? (packageManager === 'npm' ? '--save-dev' : '-D') : '';\n\n switch (packageManager) {\n case 'yarn':\n return ['yarn', 'add', ...(dev ? ['-D'] : []), ...packages];\n case 'pnpm':\n return ['pnpm', 'add', ...(dev ? ['-D'] : []), ...packages];\n default:\n return ['npm', 'install', ...(devFlag ? [devFlag] : []), ...packages];\n }\n}\n\nexport async function getRunCommand(\n packageManager: PackageManager,\n script: string\n): Promise<string[]> {\n switch (packageManager) {\n case 'yarn':\n return ['yarn', script];\n case 'pnpm':\n return ['pnpm', script];\n default:\n return ['npm', 'run', script];\n }\n}\n\nexport async function isPackageManagerAvailable(packageManager: PackageManager): Promise<boolean> {\n try {\n await execa(packageManager, ['--version']);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getPackageManagerDisplayName(packageManager: PackageManager): string {\n switch (packageManager) {\n case 'yarn':\n return 'Yarn';\n case 'pnpm':\n return 'pnpm';\n default:\n return 'npm';\n }\n}\n","import execa from 'execa';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { logger } from './logger';\n\nexport async function initializeGit(projectPath: string): Promise<void> {\n try {\n // Check if git is available\n await execa('git', ['--version']);\n\n // Initialize git repository\n await execa('git', ['init'], { cwd: projectPath });\n\n // Add all files\n await execa('git', ['add', '.'], { cwd: projectPath });\n\n // Create initial commit\n await execa('git', ['commit', '-m', 'Initial commit from @digilogiclabs/create-saas-app'], {\n cwd: projectPath,\n });\n\n logger.debug('Git repository initialized successfully');\n } catch (error) {\n logger.warn('Git initialization failed. You can initialize it manually later.');\n logger.debug('Git error:', error);\n }\n}\n\nexport async function isGitRepository(projectPath: string): Promise<boolean> {\n try {\n const gitDir = path.join(projectPath, '.git');\n return await fs.pathExists(gitDir);\n } catch {\n return false;\n }\n}\n\nexport async function getGitUserInfo(): Promise<{ name?: string; email?: string }> {\n try {\n const [nameResult, emailResult] = await Promise.allSettled([\n execa('git', ['config', '--global', 'user.name']),\n execa('git', ['config', '--global', 'user.email']),\n ]);\n\n return {\n name: nameResult.status === 'fulfilled' ? nameResult.value.stdout : undefined,\n email: emailResult.status === 'fulfilled' ? emailResult.value.stdout : undefined,\n };\n } catch {\n return {};\n }\n}\n\nexport async function hasGitChanges(projectPath: string): Promise<boolean> {\n try {\n const result = await execa('git', ['status', '--porcelain'], { cwd: projectPath });\n return result.stdout.trim().length > 0;\n } catch {\n return false;\n }\n}\n\nexport async function commitChanges(projectPath: string, message: string): Promise<void> {\n try {\n await execa('git', ['add', '.'], { cwd: projectPath });\n await execa('git', ['commit', '-m', message], { cwd: projectPath });\n } catch (error) {\n logger.warn('Failed to commit changes');\n logger.debug('Git commit error:', error);\n }\n}\n","import { logger } from '../utils/logger';\nimport { spinner } from '../utils/spinner';\n\ninterface AddOptions {\n provider?: string;\n}\n\nexport async function addFeature(feature: string, _options: AddOptions = {}) {\n try {\n logger.title(`Adding ${feature} feature`);\n\n const validFeatures = [\n 'auth',\n 'billing',\n 'analytics',\n 'teams',\n 'notifications',\n 'admin',\n 'api',\n 'docs',\n ];\n\n if (!validFeatures.includes(feature)) {\n logger.error(`Invalid feature: ${feature}`);\n logger.info('Available features:');\n logger.list(validFeatures);\n process.exit(1);\n }\n\n const addSpinner = spinner(`Adding ${feature} feature...`);\n\n // Simulate feature addition (placeholder for now)\n await new Promise((resolve) => setTimeout(resolve, 2000));\n\n addSpinner.succeed(`${feature} feature added successfully`);\n\n logger.newLine();\n logger.success('Feature added successfully!');\n logger.info(\"Don't forget to update your environment variables if needed.\");\n } catch (error) {\n logger.error('Failed to add feature:');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import { logger } from '../utils/logger';\nimport { spinner } from '../utils/spinner';\nimport { detectPackageManager, getAddCommand } from '../utils/package-manager';\nimport execa from 'execa';\n\ninterface UpdateOptions {\n check?: boolean;\n}\n\nconst DIGILOGIC_PACKAGES = [\n '@digilogiclabs/saas-factory-ui',\n '@digilogiclabs/saas-factory-auth',\n '@digilogiclabs/saas-factory-billing',\n '@digilogiclabs/saas-factory-analytics',\n];\n\nexport async function updateDependencies(options: UpdateOptions = {}) {\n try {\n logger.title('Updating Digi Logic Labs dependencies');\n\n const packageManager = await detectPackageManager();\n logger.info(`Using package manager: ${packageManager}`);\n\n if (options.check) {\n const checkSpinner = spinner('Checking for updates...');\n\n // Check for outdated packages\n try {\n const result = await execa(packageManager, ['outdated', ...DIGILOGIC_PACKAGES], {\n reject: false,\n });\n\n checkSpinner.succeed('Update check completed');\n\n if (result.stdout) {\n logger.info('Available updates:');\n logger.log(result.stdout);\n } else {\n logger.success('All Digi Logic Labs packages are up to date!');\n }\n } catch (error) {\n checkSpinner.fail('Failed to check for updates');\n throw error;\n }\n } else {\n const updateSpinner = spinner('Updating packages...');\n\n try {\n // Update packages\n const command = await getAddCommand(packageManager, DIGILOGIC_PACKAGES);\n await execa(command[0], command.slice(1), {\n stdio: 'inherit',\n });\n\n updateSpinner.succeed('Packages updated successfully');\n\n logger.newLine();\n logger.success('All Digi Logic Labs packages have been updated!');\n logger.info(\"Don't forget to test your application after updating.\");\n } catch (error) {\n updateSpinner.fail('Failed to update packages');\n throw error;\n }\n }\n } catch (error) {\n logger.error('Failed to update dependencies:');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","{\n \"name\": \"@digilogiclabs/create-saas-app\",\n \"version\": \"2.1.0\",\n \"description\": \"Create modern SaaS applications with DLL Platform - tier-aware scaffolding with platform-core and app-sdk\",\n \"main\": \"dist/cli/index.js\",\n \"bin\": {\n \"create-saas-app\": \"bin/index.js\"\n },\n \"scripts\": {\n \"build\": \"tsc --project tsconfig.build.json && npm run copy-templates\",\n \"copy-templates\": \"node -e \\\"require('fs-extra').copySync('src/templates', 'dist/templates')\\\"\",\n \"dev\": \"tsup --watch\",\n \"test\": \"jest --passWithNoTests\",\n \"test:templates\": \"tsx scripts/test-all-templates.ts\",\n \"lint\": \"eslint src\",\n \"lint:fix\": \"eslint src --fix\",\n \"type-check\": \"tsc --noEmit --skipLibCheck\",\n \"validate\": \"tsx scripts/validate-templates.ts\",\n \"changeset\": \"changeset\",\n \"version\": \"changeset version\",\n \"release\": \"npm run build && changeset publish\",\n \"prepublishOnly\": \"npm run build && npm run lint && npm run type-check\"\n },\n \"keywords\": [\n \"cli\",\n \"saas\",\n \"template\",\n \"nextjs\",\n \"react-native\",\n \"expo\",\n \"typescript\",\n \"tailwind\",\n \"firebase\",\n \"supabase\",\n \"digilogiclabs\"\n ],\n \"author\": \"Digi Logic Labs\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/DigiLogicLabs/dll-platform.git\",\n \"directory\": \"packages/cli\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/DigiLogicLabs/dll-platform/issues\"\n },\n \"homepage\": \"https://github.com/DigiLogicLabs/dll-platform/tree/main/packages/cli#readme\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"src/templates\",\n \"README.md\",\n \"CHANGELOG.md\",\n \"LICENSE\"\n ],\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"dependencies\": {\n \"chalk\": \"^4.1.2\",\n \"commander\": \"^11.1.0\",\n \"cosmiconfig\": \"^8.3.6\",\n \"execa\": \"^5.1.1\",\n \"fs-extra\": \"^11.1.1\",\n \"glob\": \"^10.3.10\",\n \"inquirer\": \"^9.2.12\",\n \"listr2\": \"^7.0.2\",\n \"mustache\": \"^4.2.0\",\n \"ora\": \"^5.4.1\",\n \"semver\": \"^7.5.4\",\n \"validate-npm-package-name\": \"^5.0.0\",\n \"zod\": \"^3.22.4\"\n },\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.26.2\",\n \"@supabase/supabase-js\": \"^2.39.2\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/inquirer\": \"^9.0.7\",\n \"@types/jest\": \"^29.5.6\",\n \"@types/mustache\": \"^4.2.5\",\n \"@types/node\": \"^20.8.7\",\n \"@types/semver\": \"^7.5.4\",\n \"@types/validate-npm-package-name\": \"^4.0.2\",\n \"eslint\": \"^8.57.1\",\n \"eslint-config-prettier\": \"^9.1.2\",\n \"eslint-plugin-prettier\": \"^5.5.4\",\n \"firebase\": \"^10.7.1\",\n \"globals\": \"^16.3.0\",\n \"jest\": \"^29.7.0\",\n \"prettier\": \"^3.0.3\",\n \"ts-jest\": \"^29.1.1\",\n \"tsup\": \"^8.0.0\",\n \"tsx\": \"^4.20.0\",\n \"typescript\": \"^5.7.0\",\n \"typescript-eslint\": \"^8.40.0\"\n },\n \"peerDependencies\": {\n \"typescript\": \">=4.9.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"directories\": {\n \"doc\": \"docs\",\n \"test\": \"tests\"\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAwB;;;ACAxB,IAAAA,eAAiB;;;ACAjB,mBAAkB;AAEX,IAAM,SAAS;AAAA,EACpB,MAAM,CAAC,YAAoB,SAAoB;AAC7C,YAAQ,IAAI,aAAAC,QAAM,KAAK,QAAG,GAAG,SAAS,GAAG,IAAI;AAAA,EAC/C;AAAA,EAEA,SAAS,CAAC,YAAoB,SAAoB;AAChD,YAAQ,IAAI,aAAAA,QAAM,MAAM,QAAG,GAAG,SAAS,GAAG,IAAI;AAAA,EAChD;AAAA,EAEA,MAAM,CAAC,YAAoB,SAAoB;AAC7C,YAAQ,IAAI,aAAAA,QAAM,OAAO,QAAG,GAAG,SAAS,GAAG,IAAI;AAAA,EACjD;AAAA,EAEA,OAAO,CAAC,YAAoB,SAAoB;AAC9C,YAAQ,IAAI,aAAAA,QAAM,IAAI,QAAG,GAAG,SAAS,GAAG,IAAI;AAAA,EAC9C;AAAA,EAEA,OAAO,CAAC,YAAoB,SAAoB;AAC9C,QAAI,QAAQ,IAAI,OAAO;AACrB,cAAQ,IAAI,aAAAA,QAAM,KAAK,WAAI,GAAG,SAAS,GAAG,IAAI;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,KAAK,CAAC,YAAoB,SAAoB;AAC5C,YAAQ,IAAI,SAAS,GAAG,IAAI;AAAA,EAC9B;AAAA,EAEA,SAAS,MAAM;AACb,YAAQ,IAAI;AAAA,EACd;AAAA,EAEA,SAAS,MAAM;AACb,YAAQ,IAAI,aAAAA,QAAM,KAAK,SAAI,OAAO,EAAE,CAAC,CAAC;AAAA,EACxC;AAAA,EAEA,OAAO,CAAC,YAAoB;AAC1B,YAAQ,IAAI;AACZ,YAAQ,IAAI,aAAAA,QAAM,KAAK,KAAK,OAAO,CAAC;AACpC,YAAQ,IAAI,aAAAA,QAAM,KAAK,SAAI,OAAO,QAAQ,MAAM,CAAC,CAAC;AAAA,EACpD;AAAA,EAEA,MAAM,CAAC,MAAc,OAAe,YAAoB;AACtD,YAAQ,IAAI,aAAAA,QAAM,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,GAAG,OAAO;AAAA,EACvD;AAAA,EAEA,WAAW,CAAC,YAAoB;AAC9B,YAAQ,IAAI,aAAAA,QAAM,KAAK,QAAQ,OAAO,CAAC;AAAA,EACzC;AAAA,EAEA,MAAM,CAAC,SAAiB;AACtB,YAAQ,IAAI,aAAAA,QAAM,KAAK,OAAO,IAAI,CAAC;AAAA,EACrC;AAAA,EAEA,MAAM,CAAC,UAAoB;AACzB,UAAM,QAAQ,CAAC,SAAS;AACtB,cAAQ,IAAI,aAAAA,QAAM,KAAK,UAAK,GAAG,IAAI;AAAA,IACrC,CAAC;AAAA,EACH;AACF;;;AC5DA,iBAAyB;AACzB,IAAAC,gBAAkB;AAEX,SAAS,QAAQ,MAAmB;AACzC,aAAO,WAAAC,SAAI;AAAA,IACT,MAAM,cAAAC,QAAM,KAAK,IAAI;AAAA,IACrB,SAAS;AAAA,IACT,OAAO;AAAA,EACT,CAAC,EAAE,MAAM;AACX;;;ACTA,uCAAmC;AACnC,kBAAiB;AACjB,sBAAe;AAGR,SAAS,oBAAoB,MAAuB;AAEzD,MAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,WAAW,GAAG;AACrC,WAAO,MAAM,8BAA8B;AAC3C,WAAO;AAAA,EACT;AAGA,QAAM,iBAAa,iCAAAC,SAAuB,IAAI;AAE9C,MAAI,CAAC,WAAW,qBAAqB;AACnC,WAAO,MAAM,uBAAuB;AAEpC,QAAI,WAAW,QAAQ;AACrB,iBAAW,OAAO,QAAQ,CAAC,UAAU,OAAO,MAAM,YAAO,KAAK,EAAE,CAAC;AAAA,IACnE;AAEA,QAAI,WAAW,UAAU;AACvB,iBAAW,SAAS,QAAQ,CAAC,YAAY,OAAO,KAAK,YAAO,OAAO,EAAE,CAAC;AAAA,IACxE;AAEA,WAAO;AAAA,EACT;AAGA,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,cAAc,SAAS,KAAK,YAAY,CAAC,GAAG;AAC9C,WAAO,MAAM,iBAAiB,IAAI,gDAAgD;AAClF,WAAO;AAAA,EACT;AAGA,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,WAAO,MAAM,sCAAsC;AACnD,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,WAAO,MAAM,yCAAyC;AACtD,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,GAAG,GAAG;AACtB,WAAO,MAAM,uCAAuC;AACpD,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,IAAI,GAAG;AACvB,WAAO,MAAM,8CAA8C;AAC3D,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,IAAI,GAAG;AACvB,WAAO,MAAM,iDAAiD;AAC9D,WAAO;AAAA,EACT;AAGA,MAAI,KAAK,SAAS,KAAK;AACrB,WAAO,MAAM,+CAA+C;AAC5D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAsB,oBAAoB,aAAuC;AAC/E,MAAI;AAEF,QAAI,MAAM,gBAAAC,QAAG,WAAW,WAAW,GAAG;AACpC,YAAM,QAAQ,MAAM,gBAAAA,QAAG,KAAK,WAAW;AAEvC,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,QAAQ,MAAM,gBAAAA,QAAG,QAAQ,WAAW;AAE1C,YAAI,MAAM,SAAS,GAAG;AACpB,iBAAO,MAAM,cAAc,YAAAC,QAAK,SAAS,WAAW,CAAC,mCAAmC;AACxF,iBAAO;AAAA,QACT;AAAA,MACF,OAAO;AACL,eAAO,MAAM,yBAAyB,YAAAA,QAAK,SAAS,WAAW,CAAC,kBAAkB;AAClF,eAAO;AAAA,MACT;AAAA,IACF;AAGA,UAAM,YAAY,YAAAA,QAAK,QAAQ,WAAW;AAE1C,QAAI;AACF,YAAM,gBAAAD,QAAG,OAAO,WAAW,gBAAAA,QAAG,UAAU,IAAI;AAAA,IAC9C,QAAQ;AACN,aAAO,MAAM,8BAA8B,SAAS,GAAG;AACvD,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,MAAM,oCAAoC,KAAK;AACtD,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,MAAsB;AACxD,SAAO,KACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,EACtB,QAAQ,OAAO,GAAG;AACvB;AAEO,SAAS,mBAAmB,MAAsB;AACvD,QAAM,YAAY,oBAAoB,IAAI;AAE1C,MAAI,oBAAoB,SAAS,GAAG;AAClC,WAAO;AAAA,EACT;AAGA,QAAM,YAAY,MAAM,SAAS;AAEjC,MAAI,oBAAoB,SAAS,GAAG;AAClC,WAAO;AAAA,EACT;AAGA,SAAO;AACT;;;ACpKA,oBAAmB;AACnB,mBAAkB;AAUlB,eAAsB,sBAAwC;AAC5D,QAAM,cAAc,QAAQ;AAC5B,QAAM,aAAa;AAEnB,MAAI,CAAC,cAAAE,QAAO,IAAI,aAAa,UAAU,GAAG;AACxC,WAAO;AAAA,MACL,mBAAmB,UAAU,4CAA4C,WAAW;AAAA,IACtF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;ACvBA,sBAAqB;AAQrB,IAAM,eAAe;AAAA,EACnB;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACF;AAEA,eAAsB,kBAAkB,eAAsD;AAC5F,SAAO,MAAM,wCAA4B;AAEzC,QAAM,YAAY;AAAA,IAChB;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,cAAc;AAAA,MACvB,UAAU,CAAC,UAAkB;AAC3B,YAAI,CAAC,oBAAoB,KAAK,GAAG;AAC/B,gBAAM,aAAa,mBAAmB,KAAK;AAC3C,iBAAO,8BAA8B,UAAU;AAAA,QACjD;AACA,eAAO;AAAA,MACT;AAAA,MACA,QAAQ,CAAC,UAAkB,MAAM,KAAK;AAAA,IACxC;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,2BAAoB,OAAO,MAAM;AAAA,QACzC,EAAE,MAAM,2BAAoB,OAAO,SAAS;AAAA,QAC5C,EAAE,MAAM,+BAAwB,OAAO,OAAO;AAAA,MAChD;AAAA,MACA,SAAS,cAAc;AAAA,IACzB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS,cAAc,QAAQ;AAAA,IACjC;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,CAACC,aAAkC;AAC1C,YAAIA,SAAQ,aAAa,OAAO;AAC9B,iBAAO;AAAA;AAAA;AAAA;AAAA,YAIL,IAAI,gBAAAC,QAAS,UAAU,yDAA2B;AAAA,YAClD;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA;AAAA;AAAA;AAAA,YAKA,IAAI,gBAAAA,QAAS,UAAU,0DAA4B;AAAA,YACnD;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA;AAAA;AAAA;AAAA,YAKA,IAAI,gBAAAA,QAAS,UAAU,sDAAwB;AAAA,YAC/C;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA;AAAA;AAAA;AAAA,YAKA,IAAI,gBAAAA,QAAS,UAAU,4DAA8B;AAAA,YACrD;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA;AAAA;AAAA;AAAA,YAKA,IAAI,gBAAAA,QAAS,UAAU,uDAAyB;AAAA,YAChD;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA;AAAA;AAAA;AAAA,YAKA,IAAI,gBAAAA,QAAS,UAAU,6DAA+B;AAAA,YACtD;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF,WAAWD,SAAQ,aAAa,UAAU;AACxC,iBAAO;AAAA,YACL;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF,OAAO;AAEL,iBAAO;AAAA,YACL;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,SAAS,cAAc;AAAA,IACzB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,uDAAgD,OAAO,WAAW;AAAA,QAC1E,EAAE,MAAM,6CAAwC,OAAO,WAAW;AAAA,QAClE,EAAE,MAAM,0CAAmC,OAAO,WAAW;AAAA,MAC/D;AAAA,MACA,SAAS,cAAc;AAAA,IACzB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,CAACA,aAA8B;AACtC,cAAM,UAAU;AAAA,UACd;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,UACA,EAAE,MAAM,2DAAsD,OAAO,WAAW;AAAA,UAChF,EAAE,MAAM,6CAAsC,OAAO,WAAW;AAAA,QAClE;AAGA,YAAIA,SAAQ,SAAS,YAAY;AAC/B,iBAAO,QAAQ,QAAQ;AAAA,QACzB;AAEA,eAAO;AAAA,MACT;AAAA,MACA,SAAS,CAACA,aAA8B;AAEtC,YAAIA,SAAQ,SAAS,WAAY,QAAO;AACxC,YAAIA,SAAQ,SAAS,WAAY,QAAO;AACxC,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,wCAAiC,OAAO,UAAU;AAAA,QAC1D,EAAE,MAAM,qDAA8C,OAAO,YAAY;AAAA,QACzE,EAAE,MAAM,2CAAoC,OAAO,UAAU;AAAA,MAC/D;AAAA,MACA,SAAS,cAAc;AAAA,IACzB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,4CAAqC,OAAO,OAAO;AAAA,QAC3D,EAAE,MAAM,uCAAgC,OAAO,QAAQ;AAAA,QACvD,EAAE,MAAM,0CAAmC,OAAO,SAAS;AAAA,QAC3D,EAAE,MAAM,6CAAsC,OAAO,SAAS;AAAA,QAC9D,EAAE,MAAM,+CAAwC,OAAO,MAAM;AAAA,QAC7D,EAAE,MAAM,2CAAsC,OAAO,QAAQ;AAAA,MAC/D;AAAA,MACA,SAAS,cAAc;AAAA,IACzB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,+CAAwC,OAAO,SAAS;AAAA,QAChE,EAAE,MAAM,0CAAgC,OAAO,QAAQ;AAAA,QACvD,EAAE,MAAM,qCAA8B,OAAO,OAAO;AAAA,MACtD;AAAA,MACA,SAAS,cAAc;AAAA,IACzB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,cAAc;AAAA,IACzB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,cAAc;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,gBAAAC,QAAS,OAAO,SAAS;AAE/C,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;;;ACtRA,IAAAC,eAAiB;AACjB,IAAAC,mBAAe;AACf,sBAAqB;AACrB,kBAAqB;AAQrB,IAAM,gBAYF;AAAA,EACF,OAAO;AAAA,IACL,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,IAAI;AAAA,IACJ,eAAe;AAAA,IACf,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,IAAI;AAAA,IACJ,eAAe;AAAA,IACf,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA,KAAK;AAAA,IACH,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,IAAI;AAAA,IACJ,eAAe;AAAA,IACf,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA,YAAY;AAAA,IACV,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,IAAI;AAAA,IACJ,eAAe;AAAA,IACf,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AACF;AAsDO,IAAM,oBAAN,MAAwB;AAAA,EAK7B,YAAY,QAAuB;AACjC,SAAK,SAAS;AAId,SAAK,eAAe,aAAAC,QAAK,KAAK,WAAW,MAAM,WAAW;AAC1D,SAAK,UAAU,KAAK,sBAAsB;AAAA,EAC5C;AAAA,EAEQ,wBAAyC;AAC/C,UAAM,cAAc,KAAK,OAAO;AAChC,UAAM,cAAc,YAAY,YAAY,EAAE,QAAQ,eAAe,GAAG;AACxE,UAAM,YAAY,KAAK,aAAa,WAAW;AAC/C,UAAM,gBAAgB,KAAK,YAAY,WAAW;AAClD,UAAM,gBAAgB;AACtB,UAAM,gBAAgB,KAAK,YAAY,WAAW;AAClD,UAAM,oBAAoB,KAAK,YAAY,WAAW;AAGtD,UAAM,OAAO,KAAK,OAAO,QAAQ;AACjC,UAAM,WAAW,cAAc,IAAI;AAEnC,UAAM,eAAe,KAAK,gBAAgB;AAC1C,UAAM,iBAAgB,oBAAI,KAAK,GAAE,mBAAmB,SAAS;AAAA,MAC3D,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,IACP,CAAC;AAGD,UAAM,mBAAgD;AAAA,MACpD,OAAO;AAAA,MACP,SAAS;AAAA,MACT,KAAK;AAAA,MACL,YAAY;AAAA,IACd;AAEA,WAAO;AAAA,MACL;AAAA,MACA,UAAU,KAAK,OAAO;AAAA,MACtB,UAAU,KAAK,OAAO;AAAA,MACtB;AAAA,MACA,MAAM,KAAK,OAAO;AAAA,MAClB,UAAU,KAAK,OAAO;AAAA,MACtB,OAAO,KAAK,OAAO;AAAA,MACnB,YAAY,KAAK,OAAO;AAAA,MACxB,cAAc,KAAK,OAAO;AAAA,MAC1B,IAAI;AAAA,QACF,SAAS,KAAK,OAAO,GAAG,WAAW,SAAS;AAAA,QAC5C,cAAc,KAAK,OAAO,GAAG;AAAA,QAC7B,UAAU,KAAK,OAAO,GAAG;AAAA,QACzB,SAAS,KAAK,OAAO,GAAG,aAAa,SAAS,MAAM;AAAA,QACpD,UAAU,KAAK,OAAO,GAAG,aAAa,SAAS,OAAO;AAAA,QACtD,UAAU,KAAK,OAAO,GAAG,aAAa,SAAS,OAAO;AAAA,MACxD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,KAAK,iBAAiB,IAAI,CAAC;AAAA,MACxC,QAAQ;AAAA,MACR,OAAM,oBAAI,KAAK,GAAE,YAAY;AAAA,MAC7B;AAAA,MACA,kBAAkB;AAAA;AAAA,MAElB,qBACE,aAAa,8BAA8B,GAAG,QAAQ,KAAK,EAAE,KAAK;AAAA,MACpE,eAAe,aAAa,wBAAwB,GAAG,QAAQ,KAAK,EAAE,KAAK;AAAA,MAC3E,WAAW,aAAa,gCAAgC,GAAG,QAAQ,KAAK,EAAE,KAAK;AAAA,MAC/E,aAAa,aAAa,kCAAkC,GAAG,QAAQ,KAAK,EAAE,KAAK;AAAA,MACnF,iBACE,aAAa,sCAAsC,GAAG,QAAQ,KAAK,EAAE,KAAK;AAAA,MAC5E,WAAW,aAAa,gCAAgC,GAAG,QAAQ,KAAK,EAAE,KAAK;AAAA,MAC/E;AAAA,MACA,iBAAiB,KAAK,mBAAmB;AAAA,MACzC,SAAS,KAAK,WAAW;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,kBAA0C;AAChD,UAAM,WAAmC,CAAC;AAC1C,UAAM,OAAO,KAAK,OAAO,QAAQ;AACjC,UAAM,WAAW,cAAc,IAAI;AAOnC,QAAI,SAAS,cAAc;AACzB,eAAS,8BAA8B,IAAI;AAAA,IAC7C;AAGA,QAAI,SAAS,WAAW,KAAK,OAAO,aAAa,SAAS,KAAK,OAAO,aAAa,SAAS;AAC1F,eAAS,wBAAwB,IAAI;AAAA,IACvC;AAGA,QACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,SAAS,KAAK,OAAO,QAAQ,GAC/B;AACA,eAAS,gCAAgC,IAAI;AAAA,IAC/C;AAGA,QAAI,SAAS,QAAQ,KAAK,OAAO,aAAa,UAAU,KAAK,OAAO,aAAa,WAAW;AAC1F,eAAS,kCAAkC,IAAI;AAAA,IACjD;AAGA,QACE,SAAS,aACR,KAAK,OAAO,SAAS,SAAS,UAAU,KAAK,CAAC,WAAW,OAAO,YAAY,EAAE,SAAS,IAAI,IAC5F;AACA,eAAS,sCAAsC,IAAI;AAAA,IACrD;AAGA,QACE,SAAS,OACR,KAAK,OAAO,GAAG,WACd,KAAK,OAAO,SAAS,SAAS,KAAK,KACnC,KAAK,OAAO,aAAa,gBAC3B;AACA,eAAS,gCAAgC,IAAI;AAC7C,eAAS,sCAAsC,IAAI;AAEnD,UAAI,KAAK,OAAO,aAAa,eAAe;AAC1C,iBAAS,IAAI,IAAI;AACjB,iBAAS,gBAAgB,IAAI;AAC7B,iBAAS,mBAAmB,IAAI;AAAA,MAClC;AAAA,IACF;AAGA,QAAI,KAAK,OAAO,aAAa,iBAAiB;AAC5C,eAAS,UAAU,IAAI;AACvB,eAAS,UAAU,IAAI;AAAA,IACzB;AAGA,QAAI,KAAK,OAAO,aAAa,eAAe;AAC1C,eAAS,QAAQ,IAAI;AAAA,IACvB;AAMA,QAAI,KAAK,OAAO,aAAa,SAAS,KAAK,OAAO,aAAa,QAAQ;AACrE,aAAO,OAAO,UAAU;AAAA,QACtB,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,MAAM;AAAA,QACN,4BAA4B;AAAA,QAC5B,kBAAkB;AAAA,QAClB,eAAe;AAAA,QACf,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH;AAEA,QAAI,KAAK,OAAO,aAAa,YAAY,KAAK,OAAO,aAAa,QAAQ;AACxE,aAAO,OAAO,UAAU;AAAA,QACtB,MAAM;AAAA,QACN,gBAAgB;AAAA,QAChB,sBAAsB;AAAA,QACtB,4BAA4B;AAAA,QAC5B,iCAAiC;AAAA,QACjC,wBAAwB;AAAA,QACxB,kCAAkC;AAAA,QAClC,gCAAgC;AAAA,QAChC,eAAe;AAAA,MACjB,CAAC;AAGD,UAAI,SAAS,UAAU;AACrB,iBAAS,6BAA6B,IAAI;AAAA,MAC5C;AAAA,IACF;AAMA,QAAI,KAAK,OAAO,SAAS,YAAY;AACnC,eAAS,UAAU,IAAI;AAAA,IACzB,WAAW,KAAK,OAAO,SAAS,YAAY;AAC1C,eAAS,uBAAuB,IAAI;AACpC,UAAI,KAAK,OAAO,aAAa,SAAS,KAAK,OAAO,aAAa,QAAQ;AACrE,iBAAS,eAAe,IAAI;AAAA,MAC9B;AAAA,IACF,WAAW,KAAK,OAAO,SAAS,YAAY;AAC1C,UAAI,KAAK,OAAO,aAAa,SAAS,KAAK,OAAO,aAAa,QAAQ;AACrE,iBAAS,WAAW,IAAI;AAAA,MAC1B;AAAA,IACF;AAOA,QAAI,SAAS,YAAY,SAAS,MAAM,SAAS,eAAe;AAC9D,eAAS,SAAS,IAAI;AAAA,IACxB;AAGA,QAAI,KAAK,OAAO,aAAa,cAAc;AACzC,eAAS,aAAa,IAAI;AAC1B,eAAS,UAAU,IAAI;AACvB,eAAS,QAAQ,IAAI;AAAA,IACvB;AAGA,QAAI,SAAS,UAAU;AACrB,eAAS,QAAQ,IAAI;AAAA,IACvB;AAGA,QAAI,SAAS,UAAU;AACrB,eAAS,QAAQ,IAAI;AAAA,IACvB;AAGA,aAAS,aAAa,IAAI;AAE1B,WAAO;AAAA,EACT;AAAA,EAEQ,qBAA6C;AACnD,UAAM,WAAmC;AAAA,MACvC,eAAe;AAAA,MACf,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,IACd;AAEA,QAAI,KAAK,OAAO,aAAa,SAAS,KAAK,OAAO,aAAa,QAAQ;AACrE,aAAO,OAAO,UAAU;AAAA,QACtB,gBAAgB;AAAA,QAChB,oBAAoB;AAAA,MACtB,CAAC;AAAA,IACH;AAGA,QAAI,KAAK,OAAO,aAAa,cAAc;AACzC,eAAS,aAAa,IAAI;AAAA,IAC5B;AAGA,UAAM,OAAO,KAAK,OAAO,QAAQ;AACjC,QAAI,CAAC,OAAO,YAAY,EAAE,SAAS,IAAI,GAAG;AACxC,aAAO,OAAO,UAAU;AAAA,QACtB,QAAQ;AAAA,QACR,0BAA0B;AAAA,QAC1B,6BAA6B;AAAA,MAC/B,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,aAAqC;AAC3C,UAAM,UAAkC,CAAC;AAEzC,QAAI,KAAK,OAAO,aAAa,SAAS,KAAK,OAAO,aAAa,QAAQ;AACrE,aAAO,OAAO,SAAS;AAAA,QACrB,KAAK;AAAA,QACL,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,QAAI,KAAK,OAAO,aAAa,YAAY,KAAK,OAAO,aAAa,QAAQ;AACxE,aAAO,OAAO,SAAS;AAAA,QACrB,OAAO;AAAA,QACP,SAAS;AAAA,QACT,KAAK;AAAA,QACL,KAAK;AAAA,MACP,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,SAAS,YAAmC;AACvD,QAAI;AAEF,YAAM,iBAAAC,QAAG,UAAU,UAAU;AAG7B,UAAI,KAAK,OAAO,aAAa,OAAO;AAClC,cAAM,KAAK,mBAAmB,UAAU;AAAA,MAC1C,WAAW,KAAK,OAAO,aAAa,UAAU;AAC5C,cAAM,KAAK,sBAAsB,UAAU;AAAA,MAC7C,WAAW,KAAK,OAAO,aAAa,QAAQ;AAC1C,cAAM,KAAK,mBAAmB,UAAU;AACxC,cAAM,KAAK,sBAAsB,aAAAD,QAAK,KAAK,YAAY,QAAQ,CAAC;AAAA,MAClE;AAGA,YAAM,KAAK,oBAAoB,UAAU;AAGzC,YAAM,KAAK,iBAAiB,UAAU;AAEtC,aAAO,MAAM,+BAA+B;AAAA,IAC9C,SAAS,OAAO;AACd,aAAO,MAAM,+BAA+B,KAAK;AACjD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,mBAAmB,YAAmC;AAClE,UAAM,eAAe,aAAAA,QAAK,KAAK,KAAK,cAAc,OAAO,KAAK,OAAO,QAAQ;AAC7E,UAAM,KAAK,aAAa,cAAc,UAAU;AAAA,EAClD;AAAA,EAEA,MAAc,sBAAsB,YAAmC;AAErE,QAAI,iBAAiB,KAAK,OAAO;AAGjC,QAAI,CAAE,MAAM,iBAAAC,QAAG,WAAW,aAAAD,QAAK,KAAK,KAAK,cAAc,UAAU,cAAc,CAAC,GAAI;AAElF,UAAI,eAAe,SAAS,SAAS,GAAG;AACtC,yBAAiB;AAAA,MACnB,WAAW,eAAe,SAAS,KAAK,KAAK,mBAAmB,uBAAuB;AACrF,yBAAiB;AAAA,MACnB,WAAW,eAAe,WAAW,kBAAkB,GAAG;AACxD,yBAAiB;AAAA,MACnB,WAAW,eAAe,WAAW,SAAS,GAAG;AAE/C,yBAAiB;AAAA,MACnB,WAAW,eAAe,WAAW,KAAK,GAAG;AAC3C,yBAAiB;AAAA,MACnB;AAAA,IACF;AAEA,UAAM,eAAe,aAAAA,QAAK,KAAK,KAAK,cAAc,UAAU,cAAc;AAC1E,UAAM,KAAK,aAAa,cAAc,UAAU;AAGhD,UAAM,KAAK,mBAAmB,UAAU;AAAA,EAC1C;AAAA,EAEA,MAAc,aAAa,cAAsB,YAAmC;AAClF,UAAM,cAAc,aAAAA,QAAK,KAAK,cAAc,UAAU;AAEtD,QAAI,CAAE,MAAM,iBAAAC,QAAG,WAAW,WAAW,GAAI;AACvC,YAAM,IAAI,MAAM,uBAAuB,WAAW,EAAE;AAAA,IACtD;AACA,UAAM,KAAK,oBAAoB,aAAa,UAAU;AAAA,EACxD;AAAA,EAEA,MAAc,oBAAoB,WAAmB,WAAkC;AACrF,QAAI,CAAE,MAAM,iBAAAA,QAAG,WAAW,SAAS,GAAI;AACrC,aAAO,MAAM,wCAAwC,SAAS,EAAE;AAChE;AAAA,IACF;AAEA,UAAM,QAAQ,UAAM,kBAAK,QAAQ;AAAA,MAC/B,KAAK;AAAA,MACL,KAAK;AAAA,MACL,OAAO;AAAA,IACT,CAAC;AAED,eAAW,QAAQ,OAAO;AACxB,YAAM,aAAa,aAAAD,QAAK,KAAK,WAAW,IAAI;AAC5C,YAAM,aAAa,aAAAA,QAAK,KAAK,WAAW,IAAI;AAE5C,YAAM,iBAAAC,QAAG,UAAU,aAAAD,QAAK,QAAQ,UAAU,CAAC;AAE3C,YAAM,UAAU,MAAM,iBAAAC,QAAG,SAAS,YAAY,OAAO;AAErD,UAAI,KAAK,WAAW,IAAI,GAAG;AAEzB,cAAM,kBAAkB,QAAQ,SAAS,IAAI,KAAK,QAAQ,SAAS,IAAI;AACvE,cAAM,MAAM,aAAAD,QAAK,QAAQ,IAAI,EAAE,YAAY;AAG3C,YAAI,CAAC,QAAQ,MAAM,EAAE,SAAS,GAAG,KAAK,CAAC,iBAAiB;AACtD,gBAAM,iBAAAC,QAAG,UAAU,YAAY,OAAO;AAAA,QACxC,WAAW,iBAAiB;AAG1B,cAAI,CAAC,QAAQ,MAAM,EAAE,SAAS,GAAG,GAAG;AAElC,kBAAM,mBAA6B,CAAC;AACpC,gBAAI,mBAAmB,QAAQ,QAAQ,kBAAkB,CAAC,OAAO,cAAc;AAC7E,+BAAiB,KAAK,KAAK;AAC3B,qBAAO,sBAAsB,iBAAiB,SAAS,CAAC;AAAA,YAC1D,CAAC;AAGD,kBAAM,oBAA8B,CAAC;AACrC,+BAAmB,KAAK,yBAAyB,kBAAkB,iBAAiB;AAGpF,kBAAM,mBAAmB,gBAAAC,QAAS,OAAO,kBAAkB,KAAK,OAAO;AAGvE,gBAAI,eAAe,iBAAiB;AAAA,cAClC;AAAA,cACA,CAAC,OAAO,UAAU;AAChB,uBAAO,iBAAiB,SAAS,KAAK,CAAC;AAAA,cACzC;AAAA,YACF;AAGA,2BAAe,aAAa,QAAQ,yBAAyB,CAAC,OAAO,UAAU;AAC7E,qBAAO,kBAAkB,SAAS,KAAK,CAAC;AAAA,YAC1C,CAAC;AAED,kBAAM,iBAAAD,QAAG,UAAU,YAAY,YAAY;AAAA,UAC7C,OAAO;AAEL,kBAAM,mBAAmB,gBAAAC,QAAS,OAAO,SAAS,KAAK,OAAO;AAC9D,kBAAM,iBAAAD,QAAG,UAAU,YAAY,gBAAgB;AAAA,UACjD;AAAA,QACF,OAAO;AAEL,gBAAM,iBAAAA,QAAG,UAAU,YAAY,OAAO;AAAA,QACxC;AAAA,MACF,OAAO;AACL,cAAM,iBAAAA,QAAG,KAAK,YAAY,UAAU;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,oBAAoB,YAAmC;AAEnE,QAAI,KAAK,OAAO,aAAa,WAAW;AACtC,aAAO,MAAM,gDAAgD;AAC7D;AAAA,IACF;AAEA,UAAM,aAAa,aAAAD,QAAK,KAAK,KAAK,cAAc,QAAQ;AACxD,UAAM,QAAQ,KAAK,OAAO,aAAa,SAAS,KAAK,OAAO,aAAa;AACzE,UAAM,OAAO,KAAK,OAAO,QAAQ;AACjC,UAAM,WAAW,cAAc,IAAI;AAKnC,QAAI,OAAO;AACT,YAAM,WAAW,aAAAA,QAAK,KAAK,YAAY,QAAQ,KAAK,OAAO,MAAM,KAAK;AACtE,YAAM,KAAK,oBAAoB,UAAU,UAAU;AAAA,IACrD;AAKA,QAAI,OAAO;AACT,YAAM,SAAS,aAAAA,QAAK,KAAK,YAAY,YAAY,KAAK,OAAO,UAAU,KAAK;AAC5E,YAAM,KAAK,oBAAoB,QAAQ,UAAU;AAAA,IACnD;AAKA,UAAM,YAAY,aAAAA,QAAK,KAAK,YAAY,UAAU,KAAK,OAAO,KAAK;AACnE,UAAM,KAAK,oBAAoB,WAAW,UAAU;AAKpD,QAAI,SAAS,QAAQ,OAAO;AAC1B,YAAM,WAAW,aAAAA,QAAK,KAAK,YAAY,QAAQ,KAAK;AACpD,UAAI,MAAM,iBAAAC,QAAG,WAAW,QAAQ,GAAG;AACjC,cAAM,KAAK,oBAAoB,UAAU,aAAAD,QAAK,KAAK,YAAY,KAAK,CAAC;AACrE,eAAO,MAAM,4BAA4B;AAAA,MAC3C;AAAA,IACF;AAKA,QAAI,OAAO;AACT,YAAM,aAAa,aAAAA,QAAK,KAAK,YAAY,UAAU,KAAK;AACxD,UAAI,MAAM,iBAAAC,QAAG,WAAW,UAAU,GAAG;AACnC,cAAM,KAAK,oBAAoB,YAAY,UAAU;AACrD,eAAO,MAAM,oCAAoC;AAAA,MACnD;AAAA,IACF;AAKA,QAAI,UAAU,SAAS,YAAY,SAAS,MAAM,SAAS,gBAAgB;AACzE,YAAM,YAAY,aAAAD,QAAK,KAAK,YAAY,SAAS,KAAK;AACtD,UAAI,MAAM,iBAAAC,QAAG,WAAW,SAAS,GAAG;AAClC,cAAM,KAAK,oBAAoB,WAAW,UAAU;AACpD,eAAO,MAAM,8BAA8B;AAAA,MAC7C;AAAA,IACF;AAKA,QAAI,OAAO;AACT,YAAM,eAAe,aAAAD,QAAK,KAAK,YAAY,YAAY,KAAK;AAC5D,UAAI,MAAM,iBAAAC,QAAG,WAAW,YAAY,GAAG;AACrC,cAAM,KAAK,oBAAoB,cAAc,UAAU;AACvD,eAAO,MAAM,sCAAsC;AAAA,MACrD;AAAA,IACF;AAKA,QAAI,SAAS,KAAK,OAAO,SAAS,YAAY;AAC5C,YAAM,iBAAiB,aAAAD,QAAK,KAAK,YAAY,cAAc,KAAK;AAChE,UAAI,MAAM,iBAAAC,QAAG,WAAW,cAAc,GAAG;AACvC,cAAM,KAAK,oBAAoB,gBAAgB,UAAU;AACzD,eAAO,MAAM,4BAA4B;AAAA,MAC3C;AAAA,IACF;AAKA,QAAI,OAAO;AACT,YAAM,aAAa,aAAAD,QAAK,KAAK,YAAY,UAAU,KAAK;AACxD,UAAI,MAAM,iBAAAC,QAAG,WAAW,UAAU,GAAG;AACnC,cAAM,KAAK,oBAAoB,YAAY,UAAU;AACrD,eAAO,MAAM,uCAAuC;AAAA,MACtD;AAAA,IACF;AAKA,QAAI,SAAS,SAAS,UAAU;AAC9B,YAAM,eAAe,aAAAD,QAAK,KAAK,YAAY,YAAY,KAAK;AAC5D,UAAI,MAAM,iBAAAC,QAAG,WAAW,YAAY,GAAG;AACrC,cAAM,KAAK,oBAAoB,cAAc,UAAU;AACvD,eAAO,MAAM,wCAAwC;AAAA,MACvD;AAAA,IACF;AAKA,QAAI,SAAS,SAAS,MAAM;AAC1B,YAAM,YAAY,aAAAD,QAAK,KAAK,YAAY,SAAS,KAAK;AACtD,UAAI,MAAM,iBAAAC,QAAG,WAAW,SAAS,GAAG;AAClC,cAAM,KAAK,oBAAoB,WAAW,UAAU;AACpD,eAAO,MAAM,+BAA+B;AAAA,MAC9C;AAAA,IACF;AAKA,QAAI,SAAS,SAAS,MAAM;AAC1B,YAAM,YAAY,aAAAD,QAAK,KAAK,YAAY,SAAS,KAAK;AACtD,UAAI,MAAM,iBAAAC,QAAG,WAAW,SAAS,GAAG;AAClC,cAAM,KAAK,oBAAoB,WAAW,UAAU;AACpD,eAAO,MAAM,gCAAgC;AAAA,MAC/C;AAAA,IACF;AAKA,QAAI,OAAO;AACT,YAAM,eAAe,aAAAD,QAAK,KAAK,YAAY,YAAY,KAAK;AAC5D,UAAI,MAAM,iBAAAC,QAAG,WAAW,YAAY,GAAG;AACrC,cAAM,KAAK,oBAAoB,cAAc,UAAU;AACvD,eAAO,MAAM,8CAA8C;AAAA,MAC7D;AAAA,IACF;AAKA,QAAI,OAAO;AACT,YAAM,YAAY,aAAAD,QAAK,KAAK,YAAY,SAAS,KAAK;AACtD,UAAI,MAAM,iBAAAC,QAAG,WAAW,SAAS,GAAG;AAClC,cAAM,KAAK,oBAAoB,WAAW,UAAU;AACpD,eAAO,MAAM,8CAA8C;AAAA,MAC7D;AAAA,IACF;AAKA,QAAI,OAAO;AACT,YAAM,iBAAiB,aAAAD,QAAK,KAAK,YAAY,eAAe,KAAK;AACjE,UAAI,MAAM,iBAAAC,QAAG,WAAW,cAAc,GAAG;AACvC,cAAM,KAAK,oBAAoB,gBAAgB,UAAU;AACzD,eAAO,MAAM,8DAA8D;AAAA,MAC7E;AAAA,IACF;AAKA,QAAI,OAAO;AACT,YAAM,UAAU,aAAAD,QAAK,KAAK,YAAY,OAAO,KAAK;AAClD,UAAI,MAAM,iBAAAC,QAAG,WAAW,OAAO,GAAG;AAChC,cAAM,KAAK,oBAAoB,SAAS,UAAU;AAClD,eAAO,MAAM,wCAAwC;AAAA,MACvD;AAAA,IACF;AAKA,QAAI,OAAO;AACT,YAAM,YAAY,aAAAD,QAAK,KAAK,YAAY,SAAS,KAAK;AACtD,UAAI,MAAM,iBAAAC,QAAG,WAAW,SAAS,GAAG;AAClC,cAAM,KAAK,oBAAoB,WAAW,UAAU;AACpD,eAAO,MAAM,gDAAgD;AAAA,MAC/D;AAAA,IACF;AAKA,QAAI,OAAO;AACT,YAAM,aAAa,aAAAD,QAAK,KAAK,YAAY,kBAAkB,KAAK;AAChE,UAAI,MAAM,iBAAAC,QAAG,WAAW,UAAU,GAAG;AACnC,cAAM,KAAK,oBAAoB,YAAY,UAAU;AACrD,eAAO,MAAM,0CAA0C;AAAA,MACzD;AAAA,IACF;AAKA,QAAI,OAAO;AACT,YAAM,UAAU,aAAAD,QAAK,KAAK,YAAY,iBAAiB,KAAK;AAC5D,UAAI,MAAM,iBAAAC,QAAG,WAAW,OAAO,GAAG;AAChC,cAAM,KAAK,oBAAoB,SAAS,UAAU;AAClD,eAAO,MAAM,+BAA+B;AAAA,MAC9C;AAAA,IACF;AAKA,QAAI,OAAO;AACT,YAAM,YAAY,aAAAD,QAAK,KAAK,YAAY,SAAS,KAAK;AACtD,UAAI,MAAM,iBAAAC,QAAG,WAAW,SAAS,GAAG;AAClC,cAAM,KAAK,oBAAoB,WAAW,UAAU;AACpD,eAAO,MAAM,+BAA+B;AAAA,MAC9C;AAAA,IACF;AAKA,QAAI,OAAO;AACT,YAAM,cAAc,aAAAD,QAAK,KAAK,YAAY,WAAW,KAAK;AAC1D,UAAI,MAAM,iBAAAC,QAAG,WAAW,WAAW,GAAG;AACpC,cAAM,KAAK,oBAAoB,aAAa,UAAU;AACtD,eAAO,MAAM,mCAAmC;AAAA,MAClD;AAAA,IACF;AAKA,QAAI,SAAS,KAAK,OAAO,SAAS,YAAY;AAC5C,YAAM,YAAY,aAAAD,QAAK,KAAK,YAAY,SAAS,KAAK;AACtD,UAAI,MAAM,iBAAAC,QAAG,WAAW,SAAS,GAAG;AAClC,cAAM,KAAK,oBAAoB,WAAW,UAAU;AACpD,eAAO,MAAM,qCAAqC;AAAA,MACpD;AAAA,IACF;AAKA,QAAI,OAAO;AACT,YAAM,aAAa,KAAK,mBAAmB,QAAQ;AACnD,YAAM,iBAAAA,QAAG,UAAU,aAAAD,QAAK,KAAK,YAAY,cAAc,GAAG,UAAU;AACpE,aAAO,MAAM,wBAAwB;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,iBAAiB,YAAmC;AAChE,UAAM,UAAU,aAAAA,QAAK,KAAK,YAAY,cAAc;AACpD,QAAI,CAAE,MAAM,iBAAAC,QAAG,WAAW,OAAO,EAAI;AAErC,UAAM,MAAM,MAAM,iBAAAA,QAAG,SAAS,OAAO;AACrC,UAAM,OAAO,KAAK,QAAQ;AAC1B,UAAM,UAAU,KAAK,QAAQ;AAG7B,QAAI,eAAe,EAAE,GAAI,IAAI,gBAAgB,CAAC,GAAI,GAAG,KAAK;AAC1D,QAAI,kBAAkB,EAAE,GAAI,IAAI,mBAAmB,CAAC,GAAI,GAAG,QAAQ;AAInE,eAAW,OAAO,OAAO,KAAK,IAAI,eAAe,GAAG;AAClD,UAAI,QAAQ,aAAc;AAC1B,UAAI,IAAI,aAAa,GAAG,GAAG;AACzB,eAAO,IAAI,gBAAgB,GAAG;AAAA,MAChC;AAAA,IACF;AAEA,UAAM,iBAAAA,QAAG,UAAU,SAAS,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC9C,WAAO,MAAM,uDAAuD;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,UAAuD;AAChF,UAAM,QAAkB;AAAA,MACtB;AAAA,MACA,KAAK,KAAK,OAAO,IAAI;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,QAAI,KAAK,OAAO,SAAS,YAAY;AACnC,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,WAAW,KAAK,OAAO,SAAS,YAAY;AAC1C,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,WAAW,KAAK,OAAO,SAAS,YAAY;AAC1C,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,OAAO,aAAa,cAAc;AACzC,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,WAAW,KAAK,OAAO,aAAa,YAAY;AAC9C,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,QAAI,SAAS,YAAY,SAAS,MAAM,SAAS,eAAe;AAC9D,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,QAAI,SAAS,UAAU;AACrB,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,QAAI,SAAS,UAAU;AACrB,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,QAAI,SAAS,IAAI;AACf,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,QAAI,SAAS,MAAM;AACjB,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,yBAAyB,SAAiB,mBAAqC;AACrF,QAAI,SAAS;AACb,QAAI,IAAI;AAER,WAAO,IAAI,QAAQ,QAAQ;AACzB,UAAI,QAAQ,OAAO,GAAG,CAAC,MAAM,MAAM;AAEjC,YAAI,aAAa;AACjB,cAAM,QAAQ;AACd,YAAI,IAAI;AAGR,eAAO,IAAI,QAAQ,QAAQ;AACzB,cAAI,QAAQ,CAAC,MAAM,KAAK;AACtB;AAAA,UACF,WAAW,QAAQ,CAAC,MAAM,KAAK;AAC7B;AACA,gBAAI,eAAe,GAAG;AACpB;AAAA,YACF;AAAA,UACF;AACA;AAAA,QACF;AAEA,YAAI,eAAe,KAAK,IAAI,QAAQ,QAAQ;AAE1C,gBAAM,YAAY,QAAQ,UAAU,OAAO,IAAI,CAAC;AAChD,gBAAM,eAAe,QAAQ,UAAU,QAAQ,GAAG,IAAI,CAAC;AAGvD,cAAI,KAAK,mBAAmB,YAAY,GAAG;AACzC,8BAAkB,KAAK,SAAS;AAChC,sBAAU,gBAAgB,kBAAkB,SAAS,CAAC;AACtD,gBAAI,IAAI;AAAA,UACV,OAAO;AAEL,sBAAU,QAAQ,CAAC;AACnB;AAAA,UACF;AAAA,QACF,OAAO;AAEL,oBAAU,QAAQ,CAAC;AACnB;AAAA,QACF;AAAA,MACF,OAAO;AACL,kBAAU,QAAQ,CAAC;AACnB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,SAA0B;AASnD,WACE,QAAQ,SAAS,GAAG;AAAA,IACpB,QAAQ,SAAS,GAAG;AAAA,IACpB,QAAQ,SAAS,GAAG;AAAA,IACpB,QAAQ,SAAS,GAAG;AAAA,IACpB,QAAQ,MAAM,KAAK,MAAM;AAAA,IACzB,QAAQ,SAAS,KAAK;AAAA,IACtB,QAAQ,SAAS;AAAA,EAErB;AAAA,EAEQ,WAAW,UAA2B;AAC5C,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,MAAM,aAAAD,QAAK,QAAQ,QAAQ,EAAE,YAAY;AAC/C,WAAO,eAAe,SAAS,GAAG,KAAK,CAAC;AAAA,EAC1C;AAAA,EAEQ,aAAa,KAAqB;AACxC,WAAO,IACJ,QAAQ,iBAAiB,GAAG,EAC5B,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY,CAAC,EACxE,KAAK,EAAE;AAAA,EACZ;AAAA,EAEQ,YAAY,KAAqB;AACvC,UAAM,SAAS,KAAK,aAAa,GAAG;AACpC,WAAO,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC;AAAA,EACxD;AAAA,EAEQ,YAAY,KAAqB;AACvC,WAAO,IACJ,QAAQ,iBAAiB,GAAG,EAC5B,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY,CAAC,EACxE,KAAK,GAAG;AAAA,EACb;AAAA,EAEA,MAAc,mBAAmB,YAAmC;AAClE,UAAM,YAAY,aAAAA,QAAK,KAAK,YAAY,QAAQ;AAChD,UAAM,iBAAAC,QAAG,UAAU,SAAS;AAG5B,UAAM,mBAAmB,OAAO;AAAA,MAC9B;AAAA,MACA;AAAA,IACF;AAGA,UAAM,aAAa,CAAC,YAAY,cAAc,qBAAqB,aAAa;AAEhF,eAAW,aAAa,YAAY;AAClC,YAAM,iBAAAA,QAAG,UAAU,aAAAD,QAAK,KAAK,WAAW,SAAS,GAAG,gBAAgB;AAAA,IACtE;AAEA,WAAO,MAAM,iCAAiC,WAAW,MAAM,oBAAoB;AAAA,EACrF;AACF;;;ACxmCA,IAAAG,eAAiB;AACjB,IAAAC,mBAAe;AACf,IAAAC,gBAAkB;;;ACFlB,IAAAC,gBAAkB;AAClB,IAAAC,mBAAe;AACf,IAAAC,eAAiB;AAIjB,eAAsB,qBAAqB,aAA+C;AACxF,QAAM,MAAM,eAAe,QAAQ,IAAI;AAGvC,QAAM,YAAY;AAAA,IAChB,EAAE,MAAM,kBAAkB,SAAS,OAAyB;AAAA,IAC5D,EAAE,MAAM,aAAa,SAAS,OAAyB;AAAA,IACvD,EAAE,MAAM,qBAAqB,SAAS,MAAwB;AAAA,EAChE;AAEA,aAAW,EAAE,MAAM,QAAQ,KAAK,WAAW;AACzC,QAAI,MAAM,iBAAAC,QAAG,WAAW,aAAAC,QAAK,KAAK,KAAK,IAAI,CAAC,GAAG;AAC7C,aAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,WAA6B,CAAC,QAAQ,QAAQ,KAAK;AAEzD,aAAW,WAAW,UAAU;AAC9B,QAAI;AACF,gBAAM,cAAAC,SAAM,SAAS,CAAC,WAAW,CAAC;AAClC,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,SAAO;AACT;AAEA,eAAsB,kBAAkB,gBAAmD;AACzF,UAAQ,gBAAgB;AAAA,IACtB,KAAK;AACH,aAAO,CAAC,QAAQ,SAAS;AAAA,IAC3B,KAAK;AACH,aAAO,CAAC,QAAQ,SAAS;AAAA,IAC3B;AACE,aAAO,CAAC,OAAO,SAAS;AAAA,EAC5B;AACF;AAEA,eAAsB,cACpB,gBACA,UACA,MAAM,OACa;AACnB,QAAM,UAAU,MAAO,mBAAmB,QAAQ,eAAe,OAAQ;AAEzE,UAAQ,gBAAgB;AAAA,IACtB,KAAK;AACH,aAAO,CAAC,QAAQ,OAAO,GAAI,MAAM,CAAC,IAAI,IAAI,CAAC,GAAI,GAAG,QAAQ;AAAA,IAC5D,KAAK;AACH,aAAO,CAAC,QAAQ,OAAO,GAAI,MAAM,CAAC,IAAI,IAAI,CAAC,GAAI,GAAG,QAAQ;AAAA,IAC5D;AACE,aAAO,CAAC,OAAO,WAAW,GAAI,UAAU,CAAC,OAAO,IAAI,CAAC,GAAI,GAAG,QAAQ;AAAA,EACxE;AACF;AAgBA,eAAsB,0BAA0B,gBAAkD;AAChG,MAAI;AACF,cAAM,cAAAC,SAAM,gBAAgB,CAAC,WAAW,CAAC;AACzC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AD7EO,IAAM,mBAAN,MAAuB;AAAA,EAG5B,YAAY,aAAqB;AAC/B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,MAAa,UAAyB;AACpC,QAAI;AAEF,YAAM,kBAAkB,aAAAC,QAAK,KAAK,KAAK,aAAa,cAAc;AAClE,UAAI,CAAE,MAAM,iBAAAC,QAAG,WAAW,eAAe,GAAI;AAC3C,cAAM,IAAI,MAAM,6CAA6C;AAAA,MAC/D;AAGA,YAAM,iBAAiB,MAAM,qBAAqB,KAAK,WAAW;AAGlE,UAAI,CAAE,MAAM,0BAA0B,cAAc,GAAI;AACtD,cAAM,IAAI,MAAM,oBAAoB,cAAc,oBAAoB;AAAA,MACxE;AAEA,aAAO,MAAM,gCAAgC,cAAc,KAAK;AAGhE,YAAM,UAAU,MAAM,kBAAkB,cAAc;AAGtD,UAAI,mBAAmB,OAAO;AAC5B,gBAAQ,KAAK,oBAAoB;AAAA,MACnC;AAGA,gBAAM,cAAAC,SAAM,QAAQ,CAAC,GAAG,QAAQ,MAAM,CAAC,GAAG;AAAA,QACxC,KAAK,KAAK;AAAA,QACV,OAAO;AAAA,MACT,CAAC;AAED,aAAO,MAAM,qCAAqC;AAAA,IACpD,SAAS,OAAO;AACd,aAAO,MAAM,gCAAgC,KAAK;AAClD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAa,oBAAoB,cAAwB,MAAM,OAAsB;AACnF,QAAI;AACF,UAAI,aAAa,WAAW,GAAG;AAC7B;AAAA,MACF;AAEA,YAAM,iBAAiB,MAAM,qBAAqB,KAAK,WAAW;AAElE,UAAI,CAAE,MAAM,0BAA0B,cAAc,GAAI;AACtD,cAAM,IAAI,MAAM,oBAAoB,cAAc,oBAAoB;AAAA,MACxE;AAEA,aAAO,MAAM,cAAc,MAAM,SAAS,EAAE,iBAAiB,aAAa,KAAK,IAAI,CAAC,EAAE;AAGtF,YAAM,UACJ,mBAAmB,SACf,CAAC,QAAQ,OAAO,GAAI,MAAM,CAAC,IAAI,IAAI,CAAC,GAAI,GAAG,YAAY,IACvD,mBAAmB,SACjB,CAAC,QAAQ,OAAO,GAAI,MAAM,CAAC,IAAI,IAAI,CAAC,GAAI,GAAG,YAAY,IACvD;AAAA,QACE;AAAA,QACA;AAAA,QACA,GAAI,MAAM,CAAC,YAAY,IAAI,CAAC;AAAA,QAC5B;AAAA,QACA,GAAG;AAAA,MACL;AAGR,gBAAM,cAAAA,SAAM,QAAQ,CAAC,GAAG,QAAQ,MAAM,CAAC,GAAG;AAAA,QACxC,KAAK,KAAK;AAAA,QACV,OAAO;AAAA,MACT,CAAC;AAED,aAAO,MAAM,GAAG,MAAM,UAAU,GAAG,oCAAoC;AAAA,IACzE,SAAS,OAAO;AACd,aAAO,MAAM,qBAAqB,MAAM,SAAS,EAAE,iBAAiB,KAAK;AACzE,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAa,kBACX,SAce;AACf,QAAI;AACF,YAAM,kBAAkB,aAAAF,QAAK,KAAK,KAAK,aAAa,cAAc;AAElE,UAAI,CAAE,MAAM,iBAAAC,QAAG,WAAW,eAAe,GAAI;AAC3C,cAAM,IAAI,MAAM,wBAAwB;AAAA,MAC1C;AAEA,YAAM,cAAc,MAAM,iBAAAA,QAAG,SAAS,eAAe;AACrD,YAAM,qBAAqB,EAAE,GAAG,aAAa,GAAG,QAAQ;AAExD,YAAM,iBAAAA,QAAG,UAAU,iBAAiB,oBAAoB,EAAE,QAAQ,EAAE,CAAC;AAErE,aAAO,MAAM,mCAAmC;AAAA,IAClD,SAAS,OAAO;AACd,aAAO,MAAM,kCAAkC,KAAK;AACpD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAa,UAAU,MAAc,SAAgC;AACnE,QAAI;AACF,YAAM,kBAAkB,aAAAD,QAAK,KAAK,KAAK,aAAa,cAAc;AAClE,YAAM,cAAc,MAAM,iBAAAC,QAAG,SAAS,eAAe;AAErD,UAAI,CAAC,YAAY,SAAS;AACxB,oBAAY,UAAU,CAAC;AAAA,MACzB;AAEA,kBAAY,QAAQ,IAAI,IAAI;AAE5B,YAAM,iBAAAA,QAAG,UAAU,iBAAiB,aAAa,EAAE,QAAQ,EAAE,CAAC;AAE9D,aAAO,MAAM,WAAW,IAAI,yBAAyB;AAAA,IACvD,SAAS,OAAO;AACd,aAAO,MAAM,yBAAyB,IAAI,MAAM,KAAK;AACrD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAa,aAAa,MAA6B;AACrD,QAAI;AACF,YAAM,kBAAkB,aAAAD,QAAK,KAAK,KAAK,aAAa,cAAc;AAClE,YAAM,cAAc,MAAM,iBAAAC,QAAG,SAAS,eAAe;AAErD,UAAI,YAAY,WAAW,YAAY,QAAQ,IAAI,GAAG;AACpD,eAAO,YAAY,QAAQ,IAAI;AAC/B,cAAM,iBAAAA,QAAG,UAAU,iBAAiB,aAAa,EAAE,QAAQ,EAAE,CAAC;AAC9D,eAAO,MAAM,WAAW,IAAI,6BAA6B;AAAA,MAC3D;AAAA,IACF,SAAS,OAAO;AACd,aAAO,MAAM,4BAA4B,IAAI,MAAM,KAAK;AACxD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAa,kBAGV;AACD,QAAI;AACF,YAAM,kBAAkB,aAAAD,QAAK,KAAK,KAAK,aAAa,cAAc;AAClE,YAAM,cAAc,MAAM,iBAAAC,QAAG,SAAS,eAAe;AAErD,aAAO;AAAA,QACL,cAAc,YAAY,gBAAgB,CAAC;AAAA,QAC3C,iBAAiB,YAAY,mBAAmB,CAAC;AAAA,MACnD;AAAA,IACF,SAAS,OAAO;AACd,aAAO,MAAM,gCAAgC,KAAK;AAClD,aAAO,EAAE,cAAc,CAAC,GAAG,iBAAiB,CAAC,EAAE;AAAA,IACjD;AAAA,EACF;AAAA,EAEA,MAAa,cAAgC;AAC3C,UAAM,YAAY,CAAC,qBAAqB,aAAa,gBAAgB;AAErE,eAAW,YAAY,WAAW;AAChC,UAAI,MAAM,iBAAAA,QAAG,WAAW,aAAAD,QAAK,KAAK,KAAK,aAAa,QAAQ,CAAC,GAAG;AAC9D,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,eAA8B;AACzC,QAAI;AAEF,YAAM,kBAAkB,aAAAA,QAAK,KAAK,KAAK,aAAa,cAAc;AAClE,YAAM,YAAY,CAAC,qBAAqB,aAAa,gBAAgB;AAErE,UAAI,MAAM,iBAAAC,QAAG,WAAW,eAAe,GAAG;AACxC,cAAM,iBAAAA,QAAG,OAAO,eAAe;AAAA,MACjC;AAEA,iBAAW,YAAY,WAAW;AAChC,cAAM,WAAW,aAAAD,QAAK,KAAK,KAAK,aAAa,QAAQ;AACrD,YAAI,MAAM,iBAAAC,QAAG,WAAW,QAAQ,GAAG;AACjC,gBAAM,iBAAAA,QAAG,OAAO,QAAQ;AAAA,QAC1B;AAAA,MACF;AAGA,YAAM,KAAK,QAAQ;AAEnB,aAAO,MAAM,yBAAyB;AAAA,IACxC,SAAS,OAAO;AACd,aAAO,MAAM,yBAAyB,KAAK;AAC3C,YAAM;AAAA,IACR;AAAA,EACF;AACF;;;AEhOA,IAAAE,gBAAkB;AAElB,IAAAC,mBAAe;AAGf,eAAsB,cAAc,aAAoC;AACtE,MAAI;AAEF,cAAM,cAAAC,SAAM,OAAO,CAAC,WAAW,CAAC;AAGhC,cAAM,cAAAA,SAAM,OAAO,CAAC,MAAM,GAAG,EAAE,KAAK,YAAY,CAAC;AAGjD,cAAM,cAAAA,SAAM,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,KAAK,YAAY,CAAC;AAGrD,cAAM,cAAAA,SAAM,OAAO,CAAC,UAAU,MAAM,oDAAoD,GAAG;AAAA,MACzF,KAAK;AAAA,IACP,CAAC;AAED,WAAO,MAAM,yCAAyC;AAAA,EACxD,SAAS,OAAO;AACd,WAAO,KAAK,kEAAkE;AAC9E,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC;AACF;;;AT0BA,eAAsB,cACpB,UACA,UACA,MACA,UAA0E,CAAC,GAC3E;AACA,MAAI;AAEF,QAAI,CAAE,MAAM,oBAAoB,GAAI;AAClC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,iBAAiB,CAAC,OAAO,UAAU,MAAM;AAC/C,QAAI,CAAC,eAAe,SAAS,QAAQ,GAAG;AACtC,aAAO,MAAM,qBAAqB,QAAQ,qBAAqB,eAAe,KAAK,IAAI,CAAC,EAAE;AAC1F,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,sBAAsB,CAC1B,WACiD;AACjD,UAAI,CAAC,OAAQ,QAAO,EAAE,SAAS,OAAO,cAAc,CAAC,EAAE;AACvD,UAAI,WAAW,KAAM,QAAO,EAAE,SAAS,MAAM,cAAc,CAAC,MAAM,EAAE;AACpE,UAAI,WAAW;AACb,eAAO,EAAE,SAAS,MAAM,cAAc,CAAC,QAAQ,SAAS,SAAS,KAAK,EAAE;AAC1E,aAAO,EAAE,SAAS,MAAM,cAAc,OAAO,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;AAAA,IAC/E;AAEA,UAAM,WAAW,oBAAoB,QAAQ,MAAM;AAGnD,UAAM,sBAAsB,CAAC,cAAwB,iBAAkC;AACrF,UAAI,CAAC,SAAS,QAAS,QAAO,gBAAgB;AAE9C,YAAM,WAAW,aAAa,SAAS,OAAO;AAC9C,YAAM,WAAW,aAAa,SAAS,OAAO;AAC9C,YAAM,UAAU,aAAa,SAAS,MAAM;AAC5C,YAAM,SAAS,aAAa,SAAS,KAAK,KAAK,aAAa,SAAS,WAAW;AAGhF,UAAI,OAAQ,QAAO;AAGnB,UAAI,YAAY,YAAY,QAAS,QAAO;AAE5C,aAAO,gBAAgB;AAAA,IACzB;AAGA,UAAM,gBAAgB,MAAmB;AACvC,UAAI,QAAQ,KAAM,QAAO,QAAQ;AACjC,UAAI,SAAS,QAAS,QAAO;AAC7B,aAAO;AAAA,IACT;AAGA,QAAI,SAAwB;AAAA,MAC1B;AAAA,MACA,UAAU,oBAAoB,SAAS,cAAc,QAAQ;AAAA,MAC7D,MAAM,QAAQ;AAAA,MACd,MAAM,cAAc;AAAA,MACpB,MAAO,QAAQ,QAAiD;AAAA,MAChE,UAAW,QAAQ,YAAuD;AAAA,MAC1E,OAAQ,QAAQ,SAAiD;AAAA,MACjE,YACG,QAAQ,cAA2E;AAAA,MACtF,cAAe,QAAQ,gBAAgD;AAAA,MACvE,IAAI;AAAA,QACF,SAAS,SAAS;AAAA,QAClB,cAAc,SAAS;AAAA,QACvB,UAAW,QAAQ,cAAoD;AAAA,MACzE;AAAA,MACA,SAAS,QAAQ,YAAY;AAAA,MAC7B,KAAK,QAAQ,QAAQ;AAAA,IACvB;AAGA,QAAI,CAAC,QAAQ,KAAK;AAChB,eAAS,MAAM,kBAAkB,MAAM;AAAA,IACzC;AAGA,QAAI,CAAC,oBAAoB,OAAO,IAAI,GAAG;AACrC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,cAAc,aAAAC,QAAK,QAAQ,QAAQ,IAAI,GAAG,OAAO,IAAI;AAG3D,QAAI,CAAE,MAAM,oBAAoB,WAAW,GAAI;AAC7C,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,WAAO,MAAM,0CAAmC;AAChD,WAAO,KAAK,aAAa,OAAO,QAAQ,EAAE;AAC1C,WAAO,KAAK,SAAS,OAAO,IAAI,EAAE;AAClC,WAAO,KAAK,aAAa,OAAO,QAAQ,EAAE;AAC1C,WAAO,KAAK,YAAY,OAAO,IAAI,EAAE;AACrC,WAAO,KAAK,SAAS,OAAO,IAAI,EAAE;AAClC,WAAO,KAAK,aAAa,OAAO,QAAQ,EAAE;AAC1C,WAAO,KAAK,UAAU,OAAO,KAAK,EAAE;AACpC,WAAO,KAAK,gBAAgB,OAAO,UAAU,EAAE;AAC/C,WAAO,KAAK,kBAAkB,OAAO,YAAY,EAAE;AACnD,QAAI,OAAO,GAAG,SAAS;AACrB,aAAO,KAAK,gBAAgB,OAAO,GAAG,aAAa,KAAK,IAAI,CAAC,OAAO,OAAO,GAAG,QAAQ,EAAE;AAAA,IAC1F;AACA,WAAO,QAAQ;AAGf,UAAM,kBAAkB,QAAQ,iCAAiC;AACjE,QAAI;AACF,YAAM,YAAY,IAAI,kBAAkB,MAAM;AAC9C,YAAM,UAAU,SAAS,WAAW;AACpC,sBAAgB,QAAQ,2BAA2B;AAAA,IACrD,SAAS,QAAQ;AACf,sBAAgB,KAAK,sCAAsC;AAC3D,YAAM;AAAA,IACR;AAGA,QAAI,OAAO,SAAS;AAClB,YAAM,iBAAiB,QAAQ,4BAA4B;AAC3D,UAAI;AACF,cAAM,YAAY,IAAI,iBAAiB,WAAW;AAClD,cAAM,UAAU,QAAQ;AACxB,uBAAe,QAAQ,wBAAwB;AAAA,MACjD,SAAS,QAAQ;AACf,uBAAe,KAAK,gCAAgC;AACpD,eAAO,KAAK,mDAAmD;AAC/D,eAAO,KAAK,MAAM,OAAO,IAAI,iBAAiB;AAAA,MAChD;AAAA,IACF;AAGA,QAAI,OAAO,KAAK;AACd,YAAM,aAAa,QAAQ,gCAAgC;AAC3D,UAAI;AACF,cAAM,cAAc,WAAW;AAC/B,mBAAW,QAAQ,4BAA4B;AAAA,MACjD,SAAS,QAAQ;AACf,mBAAW,KAAK,qCAAqC;AACrD,eAAO,KAAK,6CAA6C;AACzD,eAAO,KAAK,MAAM,OAAO,IAAI,cAAc;AAAA,MAC7C;AAAA,IACF;AAGA,WAAO,QAAQ;AACf,WAAO,QAAQ,yCAAkC;AACjD,WAAO,QAAQ;AAEf,WAAO,MAAM,aAAa;AAC1B,WAAO,KAAK,MAAM,OAAO,IAAI,EAAE;AAE/B,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO,KAAK,aAAa;AAAA,IAC3B;AAEA,QAAI,OAAO,aAAa,SAAS,OAAO,aAAa,QAAQ;AAC3D,aAAO,KAAK,aAAa;AACzB,aAAO,KAAK,4CAA4C;AAAA,IAC1D;AAEA,QAAI,OAAO,aAAa,YAAY,OAAO,aAAa,QAAQ;AAC9D,aAAO,KAAK,gBAAgB;AAC5B,aAAO,KAAK,+BAA+B;AAAA,IAC7C;AAEA,WAAO,QAAQ;AACf,WAAO,KAAK,yDAAkD;AAC9D,WAAO,KAAK,qDAA8C;AAAA,EAC5D,SAAS,OAAO;AACd,WAAO,MAAM,2BAA2B;AACxC,WAAO,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACnE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AUhOA,eAAsB,WAAW,SAAiB,WAAuB,CAAC,GAAG;AAC3E,MAAI;AACF,WAAO,MAAM,UAAU,OAAO,UAAU;AAExC,UAAM,gBAAgB;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,CAAC,cAAc,SAAS,OAAO,GAAG;AACpC,aAAO,MAAM,oBAAoB,OAAO,EAAE;AAC1C,aAAO,KAAK,qBAAqB;AACjC,aAAO,KAAK,aAAa;AACzB,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,aAAa,QAAQ,UAAU,OAAO,aAAa;AAGzD,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAI,CAAC;AAExD,eAAW,QAAQ,GAAG,OAAO,6BAA6B;AAE1D,WAAO,QAAQ;AACf,WAAO,QAAQ,6BAA6B;AAC5C,WAAO,KAAK,8DAA8D;AAAA,EAC5E,SAAS,OAAO;AACd,WAAO,MAAM,wBAAwB;AACrC,WAAO,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACnE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ACzCA,IAAAC,gBAAkB;AAMlB,IAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,eAAsB,mBAAmB,UAAyB,CAAC,GAAG;AACpE,MAAI;AACF,WAAO,MAAM,uCAAuC;AAEpD,UAAM,iBAAiB,MAAM,qBAAqB;AAClD,WAAO,KAAK,0BAA0B,cAAc,EAAE;AAEtD,QAAI,QAAQ,OAAO;AACjB,YAAM,eAAe,QAAQ,yBAAyB;AAGtD,UAAI;AACF,cAAM,SAAS,UAAM,cAAAC,SAAM,gBAAgB,CAAC,YAAY,GAAG,kBAAkB,GAAG;AAAA,UAC9E,QAAQ;AAAA,QACV,CAAC;AAED,qBAAa,QAAQ,wBAAwB;AAE7C,YAAI,OAAO,QAAQ;AACjB,iBAAO,KAAK,oBAAoB;AAChC,iBAAO,IAAI,OAAO,MAAM;AAAA,QAC1B,OAAO;AACL,iBAAO,QAAQ,8CAA8C;AAAA,QAC/D;AAAA,MACF,SAAS,OAAO;AACd,qBAAa,KAAK,6BAA6B;AAC/C,cAAM;AAAA,MACR;AAAA,IACF,OAAO;AACL,YAAM,gBAAgB,QAAQ,sBAAsB;AAEpD,UAAI;AAEF,cAAM,UAAU,MAAM,cAAc,gBAAgB,kBAAkB;AACtE,kBAAM,cAAAA,SAAM,QAAQ,CAAC,GAAG,QAAQ,MAAM,CAAC,GAAG;AAAA,UACxC,OAAO;AAAA,QACT,CAAC;AAED,sBAAc,QAAQ,+BAA+B;AAErD,eAAO,QAAQ;AACf,eAAO,QAAQ,iDAAiD;AAChE,eAAO,KAAK,uDAAuD;AAAA,MACrE,SAAS,OAAO;AACd,sBAAc,KAAK,2BAA2B;AAC9C,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO,MAAM,gCAAgC;AAC7C,WAAO,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACnE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ACrEA;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,MAAQ;AAAA,EACR,KAAO;AAAA,IACL,mBAAmB;AAAA,EACrB;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,kBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,kBAAkB;AAAA,IAClB,MAAQ;AAAA,IACR,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,gBAAkB;AAAA,EACpB;AAAA,EACA,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,QAAU;AAAA,EACV,SAAW;AAAA,EACX,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,IACN,KAAO;AAAA,EACT;AAAA,EACA,UAAY;AAAA,EACZ,OAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,MAAQ;AAAA,EACV;AAAA,EACA,cAAgB;AAAA,IACd,OAAS;AAAA,IACT,WAAa;AAAA,IACb,aAAe;AAAA,IACf,OAAS;AAAA,IACT,YAAY;AAAA,IACZ,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,QAAU;AAAA,IACV,6BAA6B;AAAA,IAC7B,KAAO;AAAA,EACT;AAAA,EACA,iBAAmB;AAAA,IACjB,mBAAmB;AAAA,IACnB,yBAAyB;AAAA,IACzB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,oCAAoC;AAAA,IACpC,QAAU;AAAA,IACV,0BAA0B;AAAA,IAC1B,0BAA0B;AAAA,IAC1B,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,WAAW;AAAA,IACX,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,YAAc;AAAA,IACd,qBAAqB;AAAA,EACvB;AAAA,EACA,kBAAoB;AAAA,IAClB,YAAc;AAAA,EAChB;AAAA,EACA,eAAiB;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,KAAO;AAAA,IACP,MAAQ;AAAA,EACV;AACF;;;AbnGA,IAAM,UAAU,IAAI,yBAAQ;AAE5B,QACG,KAAK,iBAAiB,EACtB,YAAY,+DAA+D,EAC3E,QAAQ,gBAAY,OAAO;AAE9B,QACG,QAAQ,QAAQ,EAChB,MAAM,GAAG,EACT,YAAY,+BAA+B,EAC3C,SAAS,cAAc,gCAAgC,EACvD,SAAS,cAAc,oEAAoE,EAC3F,SAAS,UAAU,cAAc,EACjC,OAAO,yBAAyB,mCAAmC,EACnE,OAAO,6BAA6B,uCAAuC,EAC3E,OAAO,uBAAuB,oCAAoC,EAClE,OAAO,6BAA6B,sDAAsD,EAC1F,OAAO,0BAA0B,yCAAyC,EAC1E,OAAO,4BAA4B,4DAA4D,EAC/F,OAAO,4BAA4B,wCAAwC,EAC3E,OAAO,gBAAgB,2BAA2B,EAClD,OAAO,YAAY,yBAAyB,EAC5C,OAAO,aAAa,0BAA0B,EAC9C,OAAO,aAAa;AAEvB,QACG,QAAQ,KAAK,EACb,MAAM,GAAG,EACT,YAAY,kCAAkC,EAC9C,SAAS,aAAa,gDAAgD,EACtE,OAAO,6BAA6B,kBAAkB,EACtD,OAAO,UAAU;AAEpB,QACG,QAAQ,QAAQ,EAChB,MAAM,GAAG,EACT,YAAY,qCAAqC,EACjD,OAAO,WAAW,sCAAsC,EACxD,OAAO,kBAAkB;AAG5B,QAAQ,GAAG,aAAa,MAAM;AAC5B,SAAO,MAAM,oBAAoB,QAAQ,KAAK,KAAK,GAAG,CAAC,EAAE;AACzD,SAAO,KAAK,qDAAqD;AACjE,UAAQ,KAAK,CAAC;AAChB,CAAC;AAGD,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,QAAQ;AACjC,UAAQ,WAAW;AACnB,UAAQ,KAAK,CAAC;AAChB;AAEA,QAAQ,MAAM;AAEd,IAAO,gBAAQ;","names":["import_path","chalk","import_chalk","ora","chalk","validateNpmPackageName","fs","path","semver","answers","inquirer","import_path","import_fs_extra","path","fs","mustache","import_path","import_fs_extra","import_execa","import_execa","import_fs_extra","import_path","fs","path","execa","execa","path","fs","execa","import_execa","import_fs_extra","execa","path","import_execa","execa"]}
|