resuml 1.8.2 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/mcp/server.ts","../../node_modules/tsup/assets/cjs_shims.js","../../src/core.ts","../../src/ats/i18n/en.ts","../../src/ats/i18n/de.ts","../../src/ats/i18n/index.ts","../../src/ats/genericChecks.ts","../../src/ats/jdMatcher.ts","../../src/ats/scoring.ts","../../src/ats/index.ts","../../src/utils/themeLoader.ts","../../src/utils/resumeTemplate.ts","../../src/utils/themeInfo.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { processResumeData } from '../core';\nimport { analyzeAts } from '../ats/index';\nimport { loadTheme } from '../utils/themeLoader';\nimport { generateResumeYaml } from '../utils/resumeTemplate';\nimport { KNOWN_THEMES, isThemeInstalled, getInstalledVersion } from '../utils/themeInfo';\n\n// Redirect console.log to stderr so it doesn't corrupt the MCP stdio channel\nconst originalLog = console.log;\nconst originalWarn = console.warn;\n\nfunction suppressStdout() {\n console.log = (...args: unknown[]) => { console.error('[resuml]', ...args); };\n console.warn = (...args: unknown[]) => { console.error('[resuml]', ...args); };\n}\n\nfunction restoreStdout() {\n console.log = originalLog;\n console.warn = originalWarn;\n}\n\nfunction createServer(): McpServer {\n const server = new McpServer({\n name: 'resuml',\n version: '1.0.0',\n });\n\n // ── resuml_init_resume ──────────────────────────────────────────────\n\n server.registerTool(\n 'resuml_init_resume',\n {\n title: 'Init Resume',\n description: 'Generate a starter resume YAML template following the JSON Resume schema',\n inputSchema: {\n name: z.string().optional().describe('Full name for the resume'),\n title: z.string().optional().describe('Professional title/label'),\n email: z.string().optional().describe('Email address'),\n },\n },\n ({ name, title, email }) => {\n const yaml = generateResumeYaml(\n name ?? 'Your Name',\n email ?? 'email@example.com',\n title ?? 'Professional Title',\n );\n return { content: [{ type: 'text' as const, text: yaml }] };\n },\n );\n\n // ── resuml_validate ─────────────────────────────────────────────────\n\n server.registerTool(\n 'resuml_validate',\n {\n title: 'Validate Resume',\n description: 'Validate resume YAML against the JSON Resume schema',\n inputSchema: {\n yaml: z.string().describe('Resume content in YAML format'),\n },\n },\n async ({ yaml }) => {\n suppressStdout();\n try {\n await processResumeData([yaml]);\n restoreStdout();\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ valid: true, errors: [] }, null, 2) }],\n };\n } catch (e: unknown) {\n restoreStdout();\n const message = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ valid: false, errors: [message] }, null, 2) }],\n };\n }\n },\n );\n\n // ── resuml_ats_check ────────────────────────────────────────────────\n\n server.registerTool(\n 'resuml_ats_check',\n {\n title: 'ATS Check',\n description: 'Run ATS (Applicant Tracking System) analysis on a resume, optionally matching against a job description',\n inputSchema: {\n yaml: z.string().describe('Resume content in YAML format'),\n jobDescription: z.string().optional().describe('Job description text to match keywords against'),\n language: z.enum(['en', 'de']).optional().describe('Language for analysis (default: en)'),\n },\n },\n async ({ yaml, jobDescription, language }) => {\n suppressStdout();\n try {\n const resume = await processResumeData([yaml]);\n const result = analyzeAts(resume, {\n language: language ?? 'en',\n jobDescription,\n });\n restoreStdout();\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (e: unknown) {\n restoreStdout();\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ error: e instanceof Error ? e.message : String(e) }) }],\n isError: true,\n };\n }\n },\n );\n\n // ── resuml_render ───────────────────────────────────────────────────\n\n server.registerTool(\n 'resuml_render',\n {\n title: 'Render Resume',\n description: 'Render a resume to HTML using a specified theme',\n inputSchema: {\n yaml: z.string().describe('Resume content in YAML format'),\n theme: z.string().default('even').describe('Theme name (e.g. even, stackoverflow, elegant, paper, kendall)'),\n },\n },\n async ({ yaml, theme }) => {\n suppressStdout();\n try {\n const resume = await processResumeData([yaml]);\n const themeModule = loadTheme(theme, { autoInstall: false });\n const html = await themeModule.render(resume as unknown as Record<string, unknown>);\n restoreStdout();\n return { content: [{ type: 'text' as const, text: html }] };\n } catch (e: unknown) {\n restoreStdout();\n const message = e instanceof Error ? e.message : String(e);\n const hint = message.includes('Cannot find module')\n ? `. Install with: resuml themes --install ${theme}`\n : '';\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ error: message + hint }) }],\n isError: true,\n };\n }\n },\n );\n\n // ── resuml_list_themes ──────────────────────────────────────────────\n\n server.registerTool(\n 'resuml_list_themes',\n {\n title: 'List Themes',\n description: 'List available resume themes with their installation status',\n },\n () => {\n const themes = KNOWN_THEMES.map((t) => ({\n name: t.name,\n package: t.pkg,\n description: t.description,\n installed: isThemeInstalled(t.pkg),\n version: getInstalledVersion(t.pkg),\n }));\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ themes }, null, 2) }],\n };\n },\n );\n\n // ── resuml_export_pdf ───────────────────────────────────────────────\n\n server.registerTool(\n 'resuml_export_pdf',\n {\n title: 'Export PDF',\n description: 'Export a resume as PDF (requires Playwright to be installed)',\n inputSchema: {\n yaml: z.string().describe('Resume content in YAML format'),\n theme: z.string().default('even').describe('Theme name'),\n format: z.enum(['A4', 'Letter']).default('A4').describe('Paper format'),\n },\n },\n async ({ yaml, theme, format }) => {\n suppressStdout();\n try {\n const resume = await processResumeData([yaml]);\n const themeModule = loadTheme(theme, { autoInstall: false });\n const html = await themeModule.render(resume as unknown as Record<string, unknown>);\n\n let chromium;\n try {\n const pw = await import('playwright');\n chromium = pw.chromium;\n } catch {\n restoreStdout();\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ error: 'Playwright is not installed. Run: npm install playwright' }) }],\n isError: true,\n };\n }\n\n const browser = await chromium.launch({ headless: true });\n const page = await browser.newPage();\n await page.setContent(html, { waitUntil: 'networkidle' });\n const margin = '10mm';\n const pdfBuffer = await page.pdf({\n format,\n printBackground: true,\n margin: { top: margin, bottom: margin, left: margin, right: margin },\n });\n await browser.close();\n restoreStdout();\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n pdf: Buffer.from(pdfBuffer).toString('base64'),\n encoding: 'base64',\n format,\n }),\n }],\n };\n } catch (e: unknown) {\n restoreStdout();\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ error: e instanceof Error ? e.message : String(e) }) }],\n isError: true,\n };\n }\n },\n );\n\n return server;\n}\n\nexport async function startMcpServer(): Promise<void> {\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n typeof document === 'undefined'\n ? new URL(`file:${__filename}`).href\n : (document.currentScript && document.currentScript.src) ||\n new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","// Placeholder for core logic\n\nimport { parse } from 'yaml';\nimport merge from 'lodash.merge';\nimport { validate } from '@jsonresume/schema';\nimport type { ResumeSchema as Resume } from './types/resume';\n\nexport type { Resume };\n\n/**\n * Merges and validates resume data objects against the JSON Resume schema.\n * @param yamlContents - An array of YAML strings containing resume data.\n * @returns The merged and validated resume data.\n * @throws Error if validation fails.\n */\nexport async function processResumeData(yamlContents: string[]): Promise<Resume> {\n if (yamlContents.length === 0) {\n throw new Error('No YAML content provided for processing.');\n }\n\n // Parse YAML content and filter out invalid objects\n const dataObjects = yamlContents\n .map((content) => {\n try {\n return parse(content) as Partial<Resume>;\n } catch (error) {\n console.warn('Failed to parse YAML content:', error);\n return null;\n }\n })\n .filter((data): data is Partial<Resume> => typeof data === 'object' && data !== null);\n\n if (dataObjects.length === 0) {\n throw new Error('No valid YAML content found after parsing.');\n }\n\n // Custom array merge to ensure arrays are concatenated\n const customizer = (objValue: unknown, srcValue: unknown) => {\n if (Array.isArray(objValue)) {\n return (objValue as unknown[]).concat(srcValue as unknown[]);\n }\n return undefined; // Let lodash handle it\n };\n\n // Merge data: Concatenate arrays, deep merge objects\n const mergedData = dataObjects.reduce((acc, data) => merge(acc, data, customizer), {}) as Resume;\n\n // Validate using the official JSON Resume validator\n return new Promise((resolve, reject) => {\n validate(mergedData, (errors, isValid) => {\n if (!isValid) {\n reject(\n new Error(`Resume data failed schema validation: ${JSON.stringify(errors, null, 2)}`)\n );\n } else {\n resolve(mergedData);\n }\n });\n });\n}\n","export interface LanguageData {\n actionVerbs: string[];\n pronouns: string[];\n stopWords: string[];\n}\n\nconst en: LanguageData = {\n actionVerbs: [\n // Leadership & Management\n 'achieved', 'administered', 'advanced', 'allocated', 'approved', 'assigned',\n 'authorized', 'chaired', 'consolidated', 'coordinated', 'delegated', 'directed',\n 'established', 'executed', 'headed', 'hired', 'hosted', 'led', 'managed',\n 'mentored', 'motivated', 'orchestrated', 'organized', 'oversaw', 'planned',\n 'presided', 'prioritized', 'produced', 'recruited', 'spearheaded', 'supervised',\n // Technical & Engineering\n 'architected', 'automated', 'built', 'coded', 'configured', 'debugged',\n 'deployed', 'designed', 'developed', 'devised', 'engineered', 'implemented',\n 'installed', 'integrated', 'launched', 'maintained', 'migrated', 'modernized',\n 'optimized', 'overhauled', 'programmed', 'prototyped', 'refactored',\n 'reengineered', 'resolved', 'restructured', 'revamped', 'scaled',\n 'standardized', 'streamlined', 'tested', 'troubleshot', 'upgraded',\n // Achievement & Impact\n 'accelerated', 'accomplished', 'boosted', 'completed', 'contributed',\n 'converted', 'decreased', 'delivered', 'doubled', 'earned', 'eliminated',\n 'exceeded', 'expanded', 'expedited', 'generated', 'grew', 'improved',\n 'increased', 'maximized', 'minimized', 'outperformed', 'pioneered',\n 'recovered', 'reduced', 'saved', 'simplified', 'solved', 'surpassed',\n 'transformed', 'tripled',\n // Communication & Collaboration\n 'advised', 'advocated', 'briefed', 'collaborated', 'communicated',\n 'consulted', 'convinced', 'counseled', 'defined', 'demonstrated',\n 'documented', 'educated', 'facilitated', 'guided', 'influenced',\n 'informed', 'instructed', 'liaised', 'negotiated', 'partnered',\n 'persuaded', 'presented', 'promoted', 'proposed', 'published',\n 'recommended', 'represented', 'trained',\n // Analysis & Research\n 'analyzed', 'assessed', 'audited', 'benchmarked', 'calculated',\n 'compared', 'compiled', 'conducted', 'discovered', 'evaluated',\n 'examined', 'explored', 'forecasted', 'identified', 'inspected',\n 'interpreted', 'investigated', 'mapped', 'measured', 'modeled',\n 'monitored', 'quantified', 'researched', 'reviewed', 'surveyed',\n 'synthesized', 'tracked', 'validated', 'verified',\n // Creation & Innovation\n 'conceptualized', 'crafted', 'created', 'customized', 'formulated',\n 'founded', 'initiated', 'innovated', 'introduced', 'invented',\n 'originated', 'shaped',\n ],\n pronouns: ['i', 'me', 'my', 'mine', 'myself', 'we', 'our', 'ours'],\n stopWords: [\n 'a', 'an', 'the', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for',\n 'of', 'with', 'by', 'from', 'is', 'was', 'are', 'were', 'be', 'been',\n 'being', 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would',\n 'could', 'should', 'may', 'might', 'shall', 'can', 'this', 'that',\n 'these', 'those', 'it', 'its', 'as', 'if', 'not', 'no', 'so', 'up',\n 'out', 'about', 'into', 'over', 'after', 'before', 'between', 'under',\n 'above', 'below', 'all', 'each', 'every', 'both', 'few', 'more',\n 'most', 'other', 'some', 'such', 'than', 'too', 'very',\n ],\n};\n\nexport default en;\n","import type { LanguageData } from './en';\n\nconst de: LanguageData = {\n actionVerbs: [\n // Führung & Management\n 'geleitet', 'geführt', 'koordiniert', 'organisiert', 'verwaltet',\n 'delegiert', 'beaufsichtigt', 'betreut', 'eingestellt', 'motiviert',\n 'verantwortet', 'gesteuert', 'überwacht', 'priorisiert', 'geplant',\n // Technik & Entwicklung\n 'entwickelt', 'implementiert', 'programmiert', 'konfiguriert', 'automatisiert',\n 'deployt', 'gebaut', 'entworfen', 'integriert', 'migriert', 'modernisiert',\n 'optimiert', 'refaktoriert', 'skaliert', 'standardisiert', 'getestet',\n 'aufgebaut', 'eingeführt', 'bereitgestellt', 'umgesetzt',\n // Leistung & Ergebnisse\n 'verbessert', 'gesteigert', 'reduziert', 'beschleunigt', 'erreicht',\n 'übertroffen', 'erweitert', 'vereinfacht', 'gelöst', 'transformiert',\n 'erhöht', 'verdoppelt', 'verdreifacht', 'generiert', 'gespart',\n 'maximiert', 'minimiert', 'eliminiert', 'geliefert', 'abgeschlossen',\n // Kommunikation & Zusammenarbeit\n 'beraten', 'präsentiert', 'dokumentiert', 'geschult', 'trainiert',\n 'vermittelt', 'kommuniziert', 'verhandelt', 'zusammengearbeitet',\n 'unterstützt', 'gefördert', 'empfohlen', 'vorgestellt', 'publiziert',\n // Analyse & Forschung\n 'analysiert', 'bewertet', 'evaluiert', 'untersucht', 'erforscht',\n 'identifiziert', 'gemessen', 'überwacht', 'validiert', 'verifiziert',\n 'geprüft', 'verglichen', 'recherchiert', 'quantifiziert',\n // Kreation & Innovation\n 'konzipiert', 'erstellt', 'gestaltet', 'initiiert', 'innoviert',\n 'eingeführt', 'gegründet', 'formuliert',\n ],\n pronouns: ['ich', 'mich', 'mir', 'mein', 'meine', 'meinem', 'meiner', 'meines', 'wir', 'unser', 'unsere'],\n stopWords: [\n 'ein', 'eine', 'einer', 'eines', 'einem', 'der', 'die', 'das', 'den',\n 'dem', 'des', 'und', 'oder', 'aber', 'in', 'an', 'auf', 'zu', 'für',\n 'von', 'mit', 'bei', 'aus', 'ist', 'war', 'sind', 'waren', 'wird',\n 'wurde', 'werden', 'hat', 'hatte', 'haben', 'hatten', 'sein', 'kann',\n 'könnte', 'soll', 'sollte', 'muss', 'musste', 'darf', 'diese',\n 'dieser', 'dieses', 'diesem', 'diesen', 'als', 'wenn', 'nicht',\n 'kein', 'keine', 'so', 'auch', 'noch', 'schon', 'nach', 'vor',\n 'über', 'unter', 'zwischen', 'durch', 'ohne', 'um', 'bis',\n 'alle', 'jede', 'jeder', 'jedes', 'mehr', 'viel', 'sehr',\n ],\n};\n\nexport default de;\n","import en from './en';\nimport de from './de';\nimport type { LanguageData } from './en';\n\nexport type { LanguageData };\n\nconst languages: Record<string, LanguageData> = { en, de };\n\nexport function getLanguageData(language: string): LanguageData {\n return languages[language] ?? languages['en'] ?? en;\n}\n","import type { ResumeSchema } from '../types/resume';\nimport type { AtsCheck } from './types';\nimport { getLanguageData } from './i18n/index';\n\ntype CheckFn = (resume: ResumeSchema, language: string) => AtsCheck;\n\nfunction wordCount(text: string): number {\n return text.trim().split(/\\s+/).filter(Boolean).length;\n}\n\nfunction getFirstWord(text: string): string {\n return text.trim().split(/\\s+/)[0]?.toLowerCase().replace(/[^a-zA-ZäöüßÄÖÜàáâãéèêëíìîïóòôõúùûüñç]/g, '') || '';\n}\n\nconst contactComplete: CheckFn = (resume) => {\n const b = resume.basics;\n const hasName = !!b?.name;\n const hasEmail = !!b?.email;\n const hasPhone = !!b?.phone;\n const hasCity = !!b?.location?.city;\n const fields = [hasName, hasEmail, hasPhone, hasCity];\n const presentCount = fields.filter(Boolean).length;\n const passed = presentCount === fields.length;\n const missing: string[] = [];\n if (!hasName) missing.push('name');\n if (!hasEmail) missing.push('email');\n if (!hasPhone) missing.push('phone');\n if (!hasCity) missing.push('location.city');\n\n return {\n id: 'contact-complete',\n category: 'contact',\n weight: 'high',\n passed,\n score: Math.round((presentCount / fields.length) * 100),\n message: passed\n ? 'Contact information is complete.'\n : `Missing contact fields: ${missing.join(', ')}.`,\n suggestion: passed ? undefined : `Add the following to your basics section: ${missing.join(', ')}.`,\n };\n};\n\nconst hasSummary: CheckFn = (resume) => {\n const summary = resume.basics?.summary?.trim();\n if (!summary) {\n return {\n id: 'has-summary',\n category: 'content',\n weight: 'high',\n passed: false,\n score: 0,\n message: 'No professional summary found.',\n suggestion: 'Add a 2-4 sentence professional summary to your basics section highlighting your experience and key skills.',\n };\n }\n const words = wordCount(summary);\n const tooShort = words < 15;\n const tooLong = words > 100;\n const passed = !tooShort && !tooLong;\n let score = 100;\n if (tooShort) score = Math.round((words / 15) * 60);\n if (tooLong) score = Math.max(60, 100 - (words - 100));\n\n return {\n id: 'has-summary',\n category: 'content',\n weight: 'high',\n passed,\n score,\n message: tooShort\n ? `Summary is too short (${words} words). Aim for 15-100 words.`\n : tooLong\n ? `Summary is too long (${words} words). Aim for 15-100 words.`\n : `Summary length is good (${words} words).`,\n suggestion: tooShort\n ? 'Expand your summary to describe your experience, expertise, and career goals in 15-100 words.'\n : tooLong\n ? 'Shorten your summary to the most impactful 15-100 words. Focus on key achievements and expertise.'\n : undefined,\n };\n};\n\nconst hasLinkedin: CheckFn = (resume) => {\n const profiles = resume.basics?.profiles || [];\n const linkedin = profiles.find(\n (p) => p.network?.toLowerCase() === 'linkedin' || p.url?.toLowerCase().includes('linkedin.com')\n );\n return {\n id: 'has-linkedin',\n category: 'contact',\n weight: 'medium',\n passed: !!linkedin,\n score: linkedin ? 100 : 0,\n message: linkedin ? 'LinkedIn profile found.' : 'No LinkedIn profile found.',\n suggestion: linkedin ? undefined : 'Add a LinkedIn profile to your basics.profiles section.',\n };\n};\n\nconst workHighlights: CheckFn = (resume) => {\n const work = resume.work || [];\n if (work.length === 0) {\n return {\n id: 'work-highlights',\n category: 'content',\n weight: 'high',\n passed: false,\n score: 0,\n message: 'No work experience entries found.',\n suggestion: 'Add work experience entries with highlights describing your accomplishments.',\n };\n }\n const minHighlights = 2;\n const entriesWithEnough = work.filter((w) => (w.highlights?.length || 0) >= minHighlights);\n const passed = entriesWithEnough.length === work.length;\n const score = Math.round((entriesWithEnough.length / work.length) * 100);\n const lacking = work\n .filter((w) => (w.highlights?.length || 0) < minHighlights)\n .map((w) => `\"${w.position || 'Unknown'} at ${w.name || 'Unknown'}\" (${w.highlights?.length || 0} highlights)`);\n\n return {\n id: 'work-highlights',\n category: 'content',\n weight: 'high',\n passed,\n score,\n message: passed\n ? 'All work entries have sufficient highlights.'\n : `Some work entries need more highlights: ${lacking.join('; ')}.`,\n suggestion: passed\n ? undefined\n : `Add at least ${minHighlights} bullet-point highlights to each work entry describing specific accomplishments.`,\n };\n};\n\nconst actionVerbs: CheckFn = (resume, language) => {\n const langData = getLanguageData(language);\n const verbs = new Set(langData.actionVerbs);\n const allHighlights: { text: string; source: string }[] = [];\n\n for (const w of resume.work || []) {\n for (const h of w.highlights || []) {\n allHighlights.push({ text: h, source: `${w.position || ''} at ${w.name || ''}` });\n }\n }\n for (const p of resume.projects || []) {\n for (const h of p.highlights || []) {\n allHighlights.push({ text: h, source: `project \"${p.name || ''}\"` });\n }\n }\n for (const v of resume.volunteer || []) {\n for (const h of v.highlights || []) {\n allHighlights.push({ text: h, source: `volunteer at ${v.organization || ''}` });\n }\n }\n\n if (allHighlights.length === 0) {\n return {\n id: 'action-verbs',\n category: 'content',\n weight: 'high',\n passed: false,\n score: 0,\n message: 'No highlights found to check for action verbs.',\n suggestion: 'Add highlights to your work, project, or volunteer entries starting with strong action verbs.',\n };\n }\n\n const withActionVerb = allHighlights.filter((h) => verbs.has(getFirstWord(h.text)));\n const withoutActionVerb = allHighlights.filter((h) => !verbs.has(getFirstWord(h.text)));\n const passed = withoutActionVerb.length === 0;\n const score = Math.round((withActionVerb.length / allHighlights.length) * 100);\n\n const examples = withoutActionVerb.slice(0, 3).map(\n (h) => `\"${h.text.substring(0, 60)}${h.text.length > 60 ? '...' : ''}\" (${h.source})`\n );\n\n return {\n id: 'action-verbs',\n category: 'content',\n weight: 'high',\n passed,\n score,\n message: passed\n ? 'All highlights start with action verbs.'\n : `${withoutActionVerb.length} of ${allHighlights.length} highlights don't start with an action verb.`,\n suggestion: passed\n ? undefined\n : `Start each highlight with a strong action verb (e.g., \"Developed\", \"Implemented\", \"Led\"). Fix: ${examples.join('; ')}.`,\n };\n};\n\nconst quantifiedImpact: CheckFn = (resume) => {\n const quantPattern = /\\d+%?|\\$[\\d,]+|[\\d,]+\\+?\\s*(users|clients|customers|people|team|members|projects|applications|servers|services|endpoints|requests|transactions)/i;\n const allHighlights: string[] = [];\n\n for (const w of resume.work || []) {\n allHighlights.push(...(w.highlights || []));\n }\n for (const p of resume.projects || []) {\n allHighlights.push(...(p.highlights || []));\n }\n\n if (allHighlights.length === 0) {\n return {\n id: 'quantified-impact',\n category: 'content',\n weight: 'medium',\n passed: false,\n score: 0,\n message: 'No highlights found to check for quantified impact.',\n suggestion: 'Add measurable results to your highlights (e.g., \"Reduced load time by 40%\", \"Managed team of 8\").',\n };\n }\n\n const quantified = allHighlights.filter((h) => quantPattern.test(h));\n const ratio = quantified.length / allHighlights.length;\n // At least 50% of highlights should have numbers\n const passed = ratio >= 0.5;\n const score = Math.min(100, Math.round(ratio * 200)); // 50% = 100 score\n\n return {\n id: 'quantified-impact',\n category: 'content',\n weight: 'medium',\n passed,\n score,\n message: passed\n ? `${quantified.length} of ${allHighlights.length} highlights include quantified results.`\n : `Only ${quantified.length} of ${allHighlights.length} highlights include numbers or metrics.`,\n suggestion: passed\n ? undefined\n : 'Add specific numbers, percentages, or metrics to your highlights (e.g., \"Improved performance by 30%\", \"Managed $2M budget\").',\n };\n};\n\nconst dateConsistency: CheckFn = (resume) => {\n const work = resume.work || [];\n if (work.length < 2) {\n return {\n id: 'date-consistency',\n category: 'structure',\n weight: 'medium',\n passed: true,\n score: 100,\n message: 'Date consistency check passed (fewer than 2 work entries).',\n };\n }\n\n const issues: string[] = [];\n\n // Check that each entry has a startDate\n for (const w of work) {\n if (!w.startDate) {\n issues.push(`\"${w.position || 'Unknown'} at ${w.name || 'Unknown'}\" is missing a start date.`);\n }\n }\n\n // Check for gaps > 6 months between consecutive jobs\n const sorted = [...work]\n .filter((w): w is typeof w & { startDate: string } => Boolean(w.startDate))\n .sort((a, b) => (a.startDate > b.startDate ? 1 : -1));\n\n for (let i = 0; i < sorted.length - 1; i++) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const current = sorted[i]!;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const next = sorted[i + 1]!;\n const endDate = current.endDate ?? current.startDate;\n const gapMs = new Date(next.startDate).getTime() - new Date(endDate).getTime();\n const gapMonths = gapMs / (1000 * 60 * 60 * 24 * 30);\n\n if (gapMonths > 6) {\n issues.push(\n `Gap of ~${Math.round(gapMonths)} months between \"${current.name ?? 'Unknown'}\" (ended ${endDate}) and \"${next.name ?? 'Unknown'}\" (started ${next.startDate}).`\n );\n }\n }\n\n const passed = issues.length === 0;\n return {\n id: 'date-consistency',\n category: 'structure',\n weight: 'medium',\n passed,\n score: passed ? 100 : Math.max(0, 100 - issues.length * 25),\n message: passed\n ? 'Work experience dates are consistent with no major gaps.'\n : `Date issues found: ${issues.join(' ')}`,\n suggestion: passed\n ? undefined\n : 'Ensure all work entries have start dates. If there are employment gaps, consider adding freelance, volunteer, or education entries to fill them.',\n };\n};\n\nconst skillsPopulated: CheckFn = (resume) => {\n const skills = resume.skills || [];\n const minCategories = 3;\n const categoriesWithKeywords = skills.filter((s) => s.keywords && s.keywords.length > 0);\n const passed = categoriesWithKeywords.length >= minCategories;\n const score = Math.min(100, Math.round((categoriesWithKeywords.length / minCategories) * 100));\n\n return {\n id: 'skills-populated',\n category: 'structure',\n weight: 'medium',\n passed,\n score,\n message: passed\n ? `${categoriesWithKeywords.length} skill categories with keywords found.`\n : `Only ${categoriesWithKeywords.length} skill categories with keywords found (need at least ${minCategories}).`,\n suggestion: passed\n ? undefined\n : `Add at least ${minCategories} skill categories with specific keywords (e.g., \"Languages: TypeScript, Python\", \"Frameworks: React, Node.js\").`,\n };\n};\n\nconst educationComplete: CheckFn = (resume) => {\n const education = resume.education || [];\n if (education.length === 0) {\n return {\n id: 'education-complete',\n category: 'structure',\n weight: 'low',\n passed: false,\n score: 0,\n message: 'No education entries found.',\n suggestion: 'Add at least one education entry with institution, area, and studyType.',\n };\n }\n\n const complete = education.filter((e) => e.institution && e.area && e.studyType);\n const passed = complete.length === education.length;\n const score = Math.round((complete.length / education.length) * 100);\n const incomplete = education\n .filter((e) => !e.institution || !e.area || !e.studyType)\n .map((e) => {\n const missing: string[] = [];\n if (!e.institution) missing.push('institution');\n if (!e.area) missing.push('area');\n if (!e.studyType) missing.push('studyType');\n return `\"${e.institution || 'Unknown'}\" missing: ${missing.join(', ')}`;\n });\n\n return {\n id: 'education-complete',\n category: 'structure',\n weight: 'low',\n passed,\n score,\n message: passed\n ? 'All education entries are complete.'\n : `Incomplete education entries: ${incomplete.join('; ')}.`,\n suggestion: passed\n ? undefined\n : 'Ensure each education entry has institution, area (field of study), and studyType (degree type).',\n };\n};\n\nconst noPronouns: CheckFn = (resume, language) => {\n const langData = getLanguageData(language);\n const pronounSet = new Set(langData.pronouns);\n\n const textBlocks: { text: string; source: string }[] = [];\n\n if (resume.basics?.summary) {\n textBlocks.push({ text: resume.basics.summary, source: 'summary' });\n }\n for (const w of resume.work || []) {\n if (w.summary) textBlocks.push({ text: w.summary, source: `work summary (${w.name || 'Unknown'})` });\n for (const h of w.highlights || []) {\n textBlocks.push({ text: h, source: `work highlight (${w.name || 'Unknown'})` });\n }\n }\n for (const p of resume.projects || []) {\n if (p.description) textBlocks.push({ text: p.description, source: `project (${p.name || 'Unknown'})` });\n for (const h of p.highlights || []) {\n textBlocks.push({ text: h, source: `project highlight (${p.name || 'Unknown'})` });\n }\n }\n\n const found: { pronoun: string; source: string }[] = [];\n for (const block of textBlocks) {\n const words = block.text.toLowerCase().split(/\\s+/);\n for (const word of words) {\n const clean = word.replace(/[^a-zA-ZäöüßÄÖÜ]/g, '');\n if (pronounSet.has(clean)) {\n found.push({ pronoun: clean, source: block.source });\n }\n }\n }\n\n const passed = found.length === 0;\n const uniquePronouns = [...new Set(found.map((f) => f.pronoun))];\n const examples = found.slice(0, 3).map((f) => `\"${f.pronoun}\" in ${f.source}`);\n\n return {\n id: 'no-pronouns',\n category: 'content',\n weight: 'medium',\n passed,\n score: passed ? 100 : Math.max(0, 100 - found.length * 15),\n message: passed\n ? 'No first-person pronouns found in resume content.'\n : `Found ${found.length} first-person pronoun(s): ${uniquePronouns.join(', ')}.`,\n suggestion: passed\n ? undefined\n : `Remove first-person pronouns from your resume. Instead of \"I managed a team\", write \"Managed a team\". Found: ${examples.join('; ')}.`,\n };\n};\n\nconst sectionCompleteness: CheckFn = (resume) => {\n const required = ['basics', 'work', 'education', 'skills'] as const;\n const present = required.filter((section) => {\n const value = resume[section];\n if (Array.isArray(value)) return value.length > 0;\n return value !== undefined;\n });\n const missing = required.filter((s) => !present.includes(s));\n const passed = missing.length === 0;\n\n return {\n id: 'section-completeness',\n category: 'structure',\n weight: 'low',\n passed,\n score: Math.round((present.length / required.length) * 100),\n message: passed\n ? 'All essential resume sections are present.'\n : `Missing essential sections: ${missing.join(', ')}.`,\n suggestion: passed ? undefined : `Add the following sections to your resume: ${missing.join(', ')}.`,\n };\n};\n\nexport const allChecks: CheckFn[] = [\n contactComplete,\n hasSummary,\n hasLinkedin,\n workHighlights,\n actionVerbs,\n quantifiedImpact,\n dateConsistency,\n skillsPopulated,\n educationComplete,\n noPronouns,\n sectionCompleteness,\n];\n\nexport function runGenericChecks(resume: ResumeSchema, language: string): AtsCheck[] {\n return allChecks.map((check) => check(resume, language));\n}\n","import type { ResumeSchema } from '../types/resume';\nimport type { AtsKeywordMatch } from './types';\nimport { getLanguageData } from './i18n/index';\n\n/**\n * Tokenize text into normalized words, removing stop words and short tokens.\n */\nfunction tokenize(text: string, stopWords: Set<string>): string[] {\n return text\n .toLowerCase()\n .replace(/[^a-zA-Z0-9äöüßÄÖÜàáâãéèêëíìîïóòôõúùûüñç\\s-]/g, ' ')\n .split(/\\s+/)\n .filter((word) => word.length > 2 && !stopWords.has(word));\n}\n\n/**\n * Simple stemmer: strips common suffixes for rough normalization.\n * This avoids the heavy `natural` dependency while still providing useful matching.\n */\nfunction simpleStem(word: string, language: string): string {\n if (language === 'de') {\n return word\n .replace(/(ung|heit|keit|schaft|lich|isch|iert|ieren|tion|ment)$/, '')\n .replace(/(en|er|es|em|te|st)$/, '');\n }\n // English\n return word\n .replace(/(ment|ness|tion|sion|ance|ence|ity|ing|ous|ive|able|ible|ful|less)$/, '')\n .replace(/(ies)$/, 'y')\n .replace(/(es|ed|s)$/, '');\n}\n\n/**\n * Extract all text content from a resume.\n */\nfunction extractResumeText(resume: ResumeSchema): string {\n const parts: string[] = [];\n\n if (resume.basics?.summary) parts.push(resume.basics.summary);\n if (resume.basics?.label) parts.push(resume.basics.label);\n\n for (const w of resume.work || []) {\n if (w.position) parts.push(w.position);\n if (w.summary) parts.push(w.summary);\n parts.push(...(w.highlights || []));\n }\n for (const s of resume.skills || []) {\n if (s.name) parts.push(s.name);\n parts.push(...(s.keywords || []));\n }\n for (const p of resume.projects || []) {\n if (p.name) parts.push(p.name);\n if (p.description) parts.push(p.description);\n parts.push(...(p.highlights || []));\n }\n for (const e of resume.education || []) {\n if (e.area) parts.push(e.area);\n if (e.studyType) parts.push(e.studyType);\n parts.push(...(e.courses || []));\n }\n for (const c of resume.certificates || []) {\n if (c.name) parts.push(c.name);\n }\n\n return parts.join(' ');\n}\n\n/**\n * Build a TF (term frequency) map from tokenized text.\n */\nfunction buildTfMap(tokens: string[]): Map<string, number> {\n const tf = new Map<string, number>();\n for (const token of tokens) {\n tf.set(token, (tf.get(token) || 0) + 1);\n }\n return tf;\n}\n\n/**\n * Extract the most important keywords from a job description using TF-based ranking.\n * Words that appear more frequently (and aren't stop words) are considered more important.\n */\nfunction extractKeywords(text: string, language: string, maxKeywords: number = 30): string[] {\n const langData = getLanguageData(language);\n const stopWords = new Set(langData.stopWords);\n const tokens = tokenize(text, stopWords);\n const stemmed = tokens.map((t) => simpleStem(t, language));\n const tf = buildTfMap(stemmed);\n\n // Keep a mapping from stem → original token (first occurrence)\n const stemToOriginal = new Map<string, string>();\n for (let i = 0; i < tokens.length; i++) {\n const stem = stemmed[i] ?? '';\n if (!stemToOriginal.has(stem)) {\n stemToOriginal.set(stem, tokens[i] ?? '');\n }\n }\n\n // Sort by frequency, take top N\n return [...tf.entries()]\n .filter(([stem]) => stem.length > 2)\n .sort((a, b) => b[1] - a[1])\n .slice(0, maxKeywords)\n .map(([stem]) => stemToOriginal.get(stem) || stem);\n}\n\n/**\n * Match job description keywords against resume content.\n * Uses stemmed matching for fuzzy equivalence.\n */\nexport function matchJobDescription(\n resume: ResumeSchema,\n jobDescription: string,\n language: string = 'en'\n): AtsKeywordMatch {\n const langData = getLanguageData(language);\n const stopWords = new Set(langData.stopWords);\n\n // Extract keywords from JD\n const jdKeywords = extractKeywords(jobDescription, language);\n\n // Build stemmed set from resume content\n const resumeText = extractResumeText(resume);\n const resumeTokens = tokenize(resumeText, stopWords);\n const resumeStems = new Set(resumeTokens.map((t) => simpleStem(t, language)));\n\n // Also include raw tokens for exact matching (handles acronyms, tool names)\n const resumeTokenSet = new Set(resumeTokens);\n\n // Match\n const matched: string[] = [];\n const missing: string[] = [];\n\n for (const keyword of jdKeywords) {\n const stem = simpleStem(keyword, language);\n if (resumeStems.has(stem) || resumeTokenSet.has(keyword.toLowerCase())) {\n matched.push(keyword);\n } else {\n missing.push(keyword);\n }\n }\n\n const matchPercentage = jdKeywords.length > 0\n ? Math.round((matched.length / jdKeywords.length) * 100)\n : 0;\n\n return { matched, missing, matchPercentage };\n}\n","import type { AtsCheck, AtsRating } from './types';\n\nconst weightMultiplier: Record<string, number> = {\n high: 3,\n medium: 2,\n low: 1,\n};\n\n/**\n * Calculate a weighted ATS score from a set of checks.\n */\nexport function calculateScore(checks: AtsCheck[]): number {\n if (checks.length === 0) return 0;\n\n let weightedSum = 0;\n let totalWeight = 0;\n\n for (const check of checks) {\n const mult = weightMultiplier[check.weight] || 1;\n weightedSum += check.score * mult;\n totalWeight += 100 * mult;\n }\n\n return totalWeight > 0 ? Math.round((weightedSum / totalWeight) * 100) : 0;\n}\n\n/**\n * Calculate a combined score from generic checks and optional JD matching.\n */\nexport function calculateCombinedScore(genericScore: number, jdMatchPercentage?: number): number {\n if (jdMatchPercentage === undefined) return genericScore;\n return Math.round(genericScore * 0.6 + jdMatchPercentage * 0.4);\n}\n\n/**\n * Map a numeric score to a human-readable rating.\n */\nexport function scoreToRating(score: number): AtsRating {\n if (score >= 90) return 'excellent';\n if (score >= 75) return 'good';\n if (score >= 60) return 'needs-work';\n return 'poor';\n}\n\n/**\n * Generate a summary string for a given score and rating.\n */\nexport function generateSummary(score: number, rating: AtsRating, hasJd: boolean): string {\n const ratingLabel = {\n excellent: 'Excellent',\n good: 'Good',\n 'needs-work': 'Needs Work',\n poor: 'Poor',\n }[rating];\n\n const base = `ATS Score: ${score}/100 (${ratingLabel})`;\n if (hasJd) {\n return `${base} — includes job description keyword matching.`;\n }\n return `${base} — based on resume structure and content best practices.`;\n}\n","import type { ResumeSchema } from '../types/resume';\nimport type { AtsResult, AtsOptions } from './types';\nimport { runGenericChecks } from './genericChecks';\nimport { matchJobDescription } from './jdMatcher';\nimport { calculateScore, calculateCombinedScore, scoreToRating, generateSummary } from './scoring';\n\n/**\n * Run ATS analysis on a resume.\n *\n * Performs deterministic, offline checks:\n * 1. Generic best-practice checks (contact, content, structure)\n * 2. Optional job-description keyword matching\n *\n * @param resume - Validated resume data\n * @param options - ATS analysis options\n * @returns Full ATS analysis result with score, checks, and suggestions\n */\nexport function analyzeAts(resume: ResumeSchema, options: AtsOptions = {}): AtsResult {\n const language = options.language || 'en';\n\n // Run generic checks\n const checks = runGenericChecks(resume, language);\n const genericScore = calculateScore(checks);\n\n // Run JD matching if provided\n let keywords;\n if (options.jobDescription) {\n keywords = matchJobDescription(resume, options.jobDescription, language);\n }\n\n // Calculate combined score\n const finalScore = calculateCombinedScore(genericScore, keywords?.matchPercentage);\n const rating = scoreToRating(finalScore);\n const summary = generateSummary(finalScore, rating, !!keywords);\n\n return {\n score: finalScore,\n rating,\n checks,\n keywords,\n summary,\n };\n}\n\nexport type { AtsResult, AtsOptions, AtsCheck, AtsKeywordMatch } from './types';\n","import { execFileSync } from 'child_process';\nimport { createRequire } from 'module';\n\nconst require = createRequire(import.meta.url);\n\nexport interface ThemeModule {\n render: (resume: Record<string, unknown>, options?: Record<string, unknown>) => string | Promise<string>;\n}\n\n/**\n * Install a theme package using npm\n * @param packageName The npm package name to install\n */\nfunction installTheme(packageName: string): void {\n try {\n execFileSync('npm', ['install', packageName], {\n stdio: ['inherit', 'pipe', 'pipe'],\n encoding: 'utf8',\n });\n } catch (error) {\n throw new Error(`Failed to install ${packageName}: ${(error as Error).message}`);\n }\n}\n\n/**\n * Load a theme module by name\n * @param themeName The name of the theme to load\n * @param options Optional settings (autoInstall: boolean)\n * @returns The loaded theme module\n */\nexport function loadTheme(themeName: string, options?: { autoInstall?: boolean }): ThemeModule {\n let jsonResumeThemeName: string;\n let nativeThemeName: string;\n const autoInstall = options?.autoInstall !== false;\n\n try {\n // Try loading as a JSON Resume theme\n jsonResumeThemeName = themeName.startsWith('jsonresume-theme-')\n ? themeName\n : `jsonresume-theme-${themeName}`;\n\n try {\n // Use require for CommonJS modules\n return require(jsonResumeThemeName) as ThemeModule;\n } catch (_jsonResumeError) {\n // If not found as JSON Resume theme, try as native theme\n nativeThemeName = `@resuml/theme-${themeName}`;\n try {\n return require(nativeThemeName) as ThemeModule;\n } catch (_nativeError) {\n if (!autoInstall) {\n throw new Error(\n `Theme package ${jsonResumeThemeName} or ${nativeThemeName} not found in node_modules.\\n` +\n `Please install the theme package manually.`\n );\n }\n // Both attempts failed - auto-install the theme\n console.log(`📦 Theme ${jsonResumeThemeName} not found. Installing...`);\n try {\n installTheme(jsonResumeThemeName);\n console.log(`✅ Successfully installed ${jsonResumeThemeName}`);\n // Try requiring again after installation\n return require(jsonResumeThemeName) as ThemeModule;\n } catch (installError) {\n throw new Error(\n `Failed to auto-install theme ${jsonResumeThemeName}: ${\n (installError as Error).message\n }`\n );\n }\n }\n }\n } catch (error) {\n // Re-throw if it's already our custom error\n if (error instanceof Error && error.message.includes('Failed to auto-install')) {\n throw error;\n }\n throw new Error(`Theme package ${themeName} not found`);\n }\n}\n","export function generateResumeYaml(name: string, email: string, label: string): string {\n return `# =============================================================================\n# Resume - Generated by resuml\n# Documentation: https://github.com/phoinixi/resuml\n# Schema: https://jsonresume.org/schema/\n# =============================================================================\n\n# --- Basic Information ---\nbasics:\n name: '${name}'\n label: '${label}'\n # image: 'https://example.com/photo.jpg'\n email: '${email}'\n # phone: '+1-555-123-4567'\n # url: 'https://yourwebsite.com'\n summary: >-\n Write a short professional summary here.\n This supports multi-line strings in YAML.\n location:\n # address: '123 Main Street'\n # postalCode: '12345'\n city: 'Your City'\n countryCode: 'US'\n # region: 'Your State'\n profiles:\n - network: 'LinkedIn'\n username: 'your-username'\n url: 'https://linkedin.com/in/your-username'\n - network: 'GitHub'\n username: 'your-username'\n url: 'https://github.com/your-username'\n\n# --- Work Experience ---\nwork:\n - name: 'Company Name'\n position: 'Job Title'\n url: 'https://company.com'\n startDate: '2020-01-01'\n # endDate: '2023-12-31' # Omit for current position\n summary: 'Brief description of your role and responsibilities.'\n highlights:\n - 'Key achievement or responsibility'\n - 'Another notable accomplishment'\n\n# --- Education ---\neducation:\n - institution: 'University Name'\n url: 'https://university.edu'\n area: 'Field of Study'\n studyType: 'Bachelor of Science'\n startDate: '2014-09-01'\n endDate: '2018-06-01'\n # score: '3.8'\n courses:\n - 'Relevant Course 1'\n - 'Relevant Course 2'\n\n# --- Skills ---\nskills:\n - name: 'Programming Languages'\n level: 'Expert'\n keywords:\n - 'JavaScript'\n - 'TypeScript'\n - 'Python'\n - name: 'Frameworks'\n level: 'Advanced'\n keywords:\n - 'React'\n - 'Node.js'\n\n# --- Projects ---\n# projects:\n# - name: 'Project Name'\n# description: 'Brief project description'\n# highlights:\n# - 'Key feature or result'\n# keywords:\n# - 'Technology Used'\n# startDate: '2023-01-01'\n# endDate: '2023-06-30'\n# url: 'https://github.com/you/project'\n# roles:\n# - 'Developer'\n# type: 'application'\n\n# --- Languages ---\n# languages:\n# - language: 'English'\n# fluency: 'Native speaker'\n# - language: 'Spanish'\n# fluency: 'Professional working proficiency'\n\n# --- Interests ---\n# interests:\n# - name: 'Open Source'\n# keywords:\n# - 'Contributing'\n# - 'Community'\n\n# --- References ---\n# references:\n# - name: 'Jane Smith'\n# reference: 'It was a pleasure working with...'\n\n# --- Awards ---\n# awards:\n# - title: 'Award Name'\n# date: '2023-01-01'\n# awarder: 'Organization'\n# summary: 'Description of the award'\n\n# --- Certificates ---\n# certificates:\n# - name: 'Certificate Name'\n# date: '2023-01-01'\n# issuer: 'Issuing Organization'\n# url: 'https://example.com/cert'\n\n# --- Publications ---\n# publications:\n# - name: 'Publication Title'\n# publisher: 'Publisher'\n# releaseDate: '2023-01-01'\n# url: 'https://example.com/publication'\n# summary: 'Brief description'\n\n# --- Volunteer ---\n# volunteers:\n# - organization: 'Organization Name'\n# position: 'Volunteer Role'\n# url: 'https://organization.com'\n# startDate: '2022-01-01'\n# summary: 'Description of volunteer work'\n# highlights:\n# - 'Notable contribution'\n`;\n}\n","import { createRequire } from 'module';\n\nexport interface ThemeInfo {\n name: string;\n pkg: string;\n description: string;\n}\n\nexport const KNOWN_THEMES: ThemeInfo[] = [\n { name: 'stackoverflow', pkg: 'jsonresume-theme-stackoverflow', description: 'Stack Overflow inspired theme' },\n { name: 'elegant', pkg: 'jsonresume-theme-elegant', description: 'Elegant and professional' },\n { name: 'react', pkg: 'jsonresume-theme-react', description: 'Built with React components' },\n { name: 'even', pkg: 'jsonresume-theme-even', description: 'Clean and minimal' },\n { name: 'kendall', pkg: 'jsonresume-theme-kendall', description: 'Simple and clean layout' },\n { name: 'macchiato', pkg: 'jsonresume-theme-macchiato', description: 'Beautiful and modern' },\n { name: 'flat', pkg: 'jsonresume-theme-flat', description: 'Flat design theme' },\n { name: 'class', pkg: 'jsonresume-theme-class', description: 'Classic professional look' },\n { name: 'short', pkg: 'jsonresume-theme-short', description: 'Compact single-page resume' },\n { name: 'spartan', pkg: 'jsonresume-theme-spartan', description: 'Minimalist Spartan design' },\n { name: 'paper', pkg: 'jsonresume-theme-paper', description: 'Paper-like clean design' },\n { name: 'onepage', pkg: 'jsonresume-theme-onepage', description: 'One page resume layout' },\n];\n\nexport function isThemeInstalled(pkg: string): boolean {\n try {\n const req = createRequire(process.cwd() + '/');\n req.resolve(pkg);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getInstalledVersion(pkg: string): string | null {\n try {\n const req = createRequire(process.cwd() + '/');\n const pkgJson = req(`${pkg}/package.json`) as { version?: string };\n return pkgJson.version ?? null;\n } catch {\n return null;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKA,IAAM,mBAAmB,MACvB,OAAO,aAAa,cAChB,IAAI,IAAI,QAAQ,UAAU,EAAE,EAAE,OAC7B,SAAS,iBAAiB,SAAS,cAAc,OAClD,IAAI,IAAI,WAAW,SAAS,OAAO,EAAE;AAEpC,IAAM,gBAAgC,iCAAiB;;;ADX9D,iBAA0B;AAC1B,mBAAqC;AACrC,iBAAkB;;;AEAlB,kBAAsB;AACtB,oBAAkB;AAClB,oBAAyB;AAWzB,eAAsB,kBAAkB,cAAyC;AAC/E,MAAI,aAAa,WAAW,GAAG;AAC7B,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AAGA,QAAM,cAAc,aACjB,IAAI,CAAC,YAAY;AAChB,QAAI;AACF,iBAAO,mBAAM,OAAO;AAAA,IACtB,SAAS,OAAO;AACd,cAAQ,KAAK,iCAAiC,KAAK;AACnD,aAAO;AAAA,IACT;AAAA,EACF,CAAC,EACA,OAAO,CAAC,SAAkC,OAAO,SAAS,YAAY,SAAS,IAAI;AAEtF,MAAI,YAAY,WAAW,GAAG;AAC5B,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAGA,QAAM,aAAa,CAAC,UAAmB,aAAsB;AAC3D,QAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,aAAQ,SAAuB,OAAO,QAAqB;AAAA,IAC7D;AACA,WAAO;AAAA,EACT;AAGA,QAAM,aAAa,YAAY,OAAO,CAAC,KAAK,aAAS,cAAAA,SAAM,KAAK,MAAM,UAAU,GAAG,CAAC,CAAC;AAGrF,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,gCAAS,YAAY,CAAC,QAAQ,YAAY;AACxC,UAAI,CAAC,SAAS;AACZ;AAAA,UACE,IAAI,MAAM,yCAAyC,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC,EAAE;AAAA,QACtF;AAAA,MACF,OAAO;AACL,gBAAQ,UAAU;AAAA,MACpB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;;;ACrDA,IAAM,KAAmB;AAAA,EACvB,aAAa;AAAA;AAAA,IAEX;AAAA,IAAY;AAAA,IAAgB;AAAA,IAAY;AAAA,IAAa;AAAA,IAAY;AAAA,IACjE;AAAA,IAAc;AAAA,IAAW;AAAA,IAAgB;AAAA,IAAe;AAAA,IAAa;AAAA,IACrE;AAAA,IAAe;AAAA,IAAY;AAAA,IAAU;AAAA,IAAS;AAAA,IAAU;AAAA,IAAO;AAAA,IAC/D;AAAA,IAAY;AAAA,IAAa;AAAA,IAAgB;AAAA,IAAa;AAAA,IAAW;AAAA,IACjE;AAAA,IAAY;AAAA,IAAe;AAAA,IAAY;AAAA,IAAa;AAAA,IAAe;AAAA;AAAA,IAEnE;AAAA,IAAe;AAAA,IAAa;AAAA,IAAS;AAAA,IAAS;AAAA,IAAc;AAAA,IAC5D;AAAA,IAAY;AAAA,IAAY;AAAA,IAAa;AAAA,IAAW;AAAA,IAAc;AAAA,IAC9D;AAAA,IAAa;AAAA,IAAc;AAAA,IAAY;AAAA,IAAc;AAAA,IAAY;AAAA,IACjE;AAAA,IAAa;AAAA,IAAc;AAAA,IAAc;AAAA,IAAc;AAAA,IACvD;AAAA,IAAgB;AAAA,IAAY;AAAA,IAAgB;AAAA,IAAY;AAAA,IACxD;AAAA,IAAgB;AAAA,IAAe;AAAA,IAAU;AAAA,IAAe;AAAA;AAAA,IAExD;AAAA,IAAe;AAAA,IAAgB;AAAA,IAAW;AAAA,IAAa;AAAA,IACvD;AAAA,IAAa;AAAA,IAAa;AAAA,IAAa;AAAA,IAAW;AAAA,IAAU;AAAA,IAC5D;AAAA,IAAY;AAAA,IAAY;AAAA,IAAa;AAAA,IAAa;AAAA,IAAQ;AAAA,IAC1D;AAAA,IAAa;AAAA,IAAa;AAAA,IAAa;AAAA,IAAgB;AAAA,IACvD;AAAA,IAAa;AAAA,IAAW;AAAA,IAAS;AAAA,IAAc;AAAA,IAAU;AAAA,IACzD;AAAA,IAAe;AAAA;AAAA,IAEf;AAAA,IAAW;AAAA,IAAa;AAAA,IAAW;AAAA,IAAgB;AAAA,IACnD;AAAA,IAAa;AAAA,IAAa;AAAA,IAAa;AAAA,IAAW;AAAA,IAClD;AAAA,IAAc;AAAA,IAAY;AAAA,IAAe;AAAA,IAAU;AAAA,IACnD;AAAA,IAAY;AAAA,IAAc;AAAA,IAAW;AAAA,IAAc;AAAA,IACnD;AAAA,IAAa;AAAA,IAAa;AAAA,IAAY;AAAA,IAAY;AAAA,IAClD;AAAA,IAAe;AAAA,IAAe;AAAA;AAAA,IAE9B;AAAA,IAAY;AAAA,IAAY;AAAA,IAAW;AAAA,IAAe;AAAA,IAClD;AAAA,IAAY;AAAA,IAAY;AAAA,IAAa;AAAA,IAAc;AAAA,IACnD;AAAA,IAAY;AAAA,IAAY;AAAA,IAAc;AAAA,IAAc;AAAA,IACpD;AAAA,IAAe;AAAA,IAAgB;AAAA,IAAU;AAAA,IAAY;AAAA,IACrD;AAAA,IAAa;AAAA,IAAc;AAAA,IAAc;AAAA,IAAY;AAAA,IACrD;AAAA,IAAe;AAAA,IAAW;AAAA,IAAa;AAAA;AAAA,IAEvC;AAAA,IAAkB;AAAA,IAAW;AAAA,IAAW;AAAA,IAAc;AAAA,IACtD;AAAA,IAAW;AAAA,IAAa;AAAA,IAAa;AAAA,IAAc;AAAA,IACnD;AAAA,IAAc;AAAA,EAChB;AAAA,EACA,UAAU,CAAC,KAAK,MAAM,MAAM,QAAQ,UAAU,MAAM,OAAO,MAAM;AAAA,EACjE,WAAW;AAAA,IACT;AAAA,IAAK;AAAA,IAAM;AAAA,IAAO;AAAA,IAAO;AAAA,IAAM;AAAA,IAAO;AAAA,IAAM;AAAA,IAAM;AAAA,IAAM;AAAA,IAAM;AAAA,IAC9D;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAM;AAAA,IAAO;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAM;AAAA,IAC9D;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAO;AAAA,IAAO;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAO;AAAA,IAAQ;AAAA,IAC5D;AAAA,IAAS;AAAA,IAAU;AAAA,IAAO;AAAA,IAAS;AAAA,IAAS;AAAA,IAAO;AAAA,IAAQ;AAAA,IAC3D;AAAA,IAAS;AAAA,IAAS;AAAA,IAAM;AAAA,IAAO;AAAA,IAAM;AAAA,IAAM;AAAA,IAAO;AAAA,IAAM;AAAA,IAAM;AAAA,IAC9D;AAAA,IAAO;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAU;AAAA,IAAW;AAAA,IAC9D;AAAA,IAAS;AAAA,IAAS;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAO;AAAA,IACzD;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAO;AAAA,EAClD;AACF;AAEA,IAAO,aAAQ;;;AC1Df,IAAM,KAAmB;AAAA,EACvB,aAAa;AAAA;AAAA,IAEX;AAAA,IAAY;AAAA,IAAW;AAAA,IAAe;AAAA,IAAe;AAAA,IACrD;AAAA,IAAa;AAAA,IAAiB;AAAA,IAAW;AAAA,IAAe;AAAA,IACxD;AAAA,IAAgB;AAAA,IAAa;AAAA,IAAa;AAAA,IAAe;AAAA;AAAA,IAEzD;AAAA,IAAc;AAAA,IAAiB;AAAA,IAAgB;AAAA,IAAgB;AAAA,IAC/D;AAAA,IAAW;AAAA,IAAU;AAAA,IAAa;AAAA,IAAc;AAAA,IAAY;AAAA,IAC5D;AAAA,IAAa;AAAA,IAAgB;AAAA,IAAY;AAAA,IAAkB;AAAA,IAC3D;AAAA,IAAa;AAAA,IAAc;AAAA,IAAkB;AAAA;AAAA,IAE7C;AAAA,IAAc;AAAA,IAAc;AAAA,IAAa;AAAA,IAAgB;AAAA,IACzD;AAAA,IAAe;AAAA,IAAa;AAAA,IAAe;AAAA,IAAU;AAAA,IACrD;AAAA,IAAU;AAAA,IAAc;AAAA,IAAgB;AAAA,IAAa;AAAA,IACrD;AAAA,IAAa;AAAA,IAAa;AAAA,IAAc;AAAA,IAAa;AAAA;AAAA,IAErD;AAAA,IAAW;AAAA,IAAe;AAAA,IAAgB;AAAA,IAAY;AAAA,IACtD;AAAA,IAAc;AAAA,IAAgB;AAAA,IAAc;AAAA,IAC5C;AAAA,IAAe;AAAA,IAAa;AAAA,IAAa;AAAA,IAAe;AAAA;AAAA,IAExD;AAAA,IAAc;AAAA,IAAY;AAAA,IAAa;AAAA,IAAc;AAAA,IACrD;AAAA,IAAiB;AAAA,IAAY;AAAA,IAAa;AAAA,IAAa;AAAA,IACvD;AAAA,IAAW;AAAA,IAAc;AAAA,IAAgB;AAAA;AAAA,IAEzC;AAAA,IAAc;AAAA,IAAY;AAAA,IAAa;AAAA,IAAa;AAAA,IACpD;AAAA,IAAc;AAAA,IAAa;AAAA,EAC7B;AAAA,EACA,UAAU,CAAC,OAAO,QAAQ,OAAO,QAAQ,SAAS,UAAU,UAAU,UAAU,OAAO,SAAS,QAAQ;AAAA,EACxG,WAAW;AAAA,IACT;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAS;AAAA,IAAS;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAC/D;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAM;AAAA,IAAM;AAAA,IAAO;AAAA,IAAM;AAAA,IAC9D;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAS;AAAA,IAC3D;AAAA,IAAS;AAAA,IAAU;AAAA,IAAO;AAAA,IAAS;AAAA,IAAS;AAAA,IAAU;AAAA,IAAQ;AAAA,IAC9D;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAQ;AAAA,IACtD;AAAA,IAAU;AAAA,IAAU;AAAA,IAAU;AAAA,IAAU;AAAA,IAAO;AAAA,IAAQ;AAAA,IACvD;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAQ;AAAA,IACxD;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAY;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAM;AAAA,IACpD;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAQ;AAAA,EACpD;AACF;AAEA,IAAO,aAAQ;;;ACtCf,IAAM,YAA0C,EAAE,gBAAI,eAAG;AAElD,SAAS,gBAAgB,UAAgC;AAC9D,SAAO,UAAU,QAAQ,KAAK,UAAU,IAAI,KAAK;AACnD;;;ACJA,SAAS,UAAU,MAAsB;AACvC,SAAO,KAAK,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO,EAAE;AAClD;AAEA,SAAS,aAAa,MAAsB;AAC1C,SAAO,KAAK,KAAK,EAAE,MAAM,KAAK,EAAE,CAAC,GAAG,YAAY,EAAE,QAAQ,2CAA2C,EAAE,KAAK;AAC9G;AAEA,IAAM,kBAA2B,CAAC,WAAW;AAC3C,QAAM,IAAI,OAAO;AACjB,QAAM,UAAU,CAAC,CAAC,GAAG;AACrB,QAAM,WAAW,CAAC,CAAC,GAAG;AACtB,QAAM,WAAW,CAAC,CAAC,GAAG;AACtB,QAAM,UAAU,CAAC,CAAC,GAAG,UAAU;AAC/B,QAAM,SAAS,CAAC,SAAS,UAAU,UAAU,OAAO;AACpD,QAAM,eAAe,OAAO,OAAO,OAAO,EAAE;AAC5C,QAAM,SAAS,iBAAiB,OAAO;AACvC,QAAM,UAAoB,CAAC;AAC3B,MAAI,CAAC,QAAS,SAAQ,KAAK,MAAM;AACjC,MAAI,CAAC,SAAU,SAAQ,KAAK,OAAO;AACnC,MAAI,CAAC,SAAU,SAAQ,KAAK,OAAO;AACnC,MAAI,CAAC,QAAS,SAAQ,KAAK,eAAe;AAE1C,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,KAAK,MAAO,eAAe,OAAO,SAAU,GAAG;AAAA,IACtD,SAAS,SACL,qCACA,2BAA2B,QAAQ,KAAK,IAAI,CAAC;AAAA,IACjD,YAAY,SAAS,SAAY,6CAA6C,QAAQ,KAAK,IAAI,CAAC;AAAA,EAClG;AACF;AAEA,IAAM,aAAsB,CAAC,WAAW;AACtC,QAAM,UAAU,OAAO,QAAQ,SAAS,KAAK;AAC7C,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AACA,QAAM,QAAQ,UAAU,OAAO;AAC/B,QAAM,WAAW,QAAQ;AACzB,QAAM,UAAU,QAAQ;AACxB,QAAM,SAAS,CAAC,YAAY,CAAC;AAC7B,MAAI,QAAQ;AACZ,MAAI,SAAU,SAAQ,KAAK,MAAO,QAAQ,KAAM,EAAE;AAClD,MAAI,QAAS,SAAQ,KAAK,IAAI,IAAI,OAAO,QAAQ,IAAI;AAErD,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS,WACL,yBAAyB,KAAK,mCAC9B,UACE,wBAAwB,KAAK,mCAC7B,2BAA2B,KAAK;AAAA,IACtC,YAAY,WACR,kGACA,UACE,sGACA;AAAA,EACR;AACF;AAEA,IAAM,cAAuB,CAAC,WAAW;AACvC,QAAM,WAAW,OAAO,QAAQ,YAAY,CAAC;AAC7C,QAAM,WAAW,SAAS;AAAA,IACxB,CAAC,MAAM,EAAE,SAAS,YAAY,MAAM,cAAc,EAAE,KAAK,YAAY,EAAE,SAAS,cAAc;AAAA,EAChG;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ,CAAC,CAAC;AAAA,IACV,OAAO,WAAW,MAAM;AAAA,IACxB,SAAS,WAAW,4BAA4B;AAAA,IAChD,YAAY,WAAW,SAAY;AAAA,EACrC;AACF;AAEA,IAAM,iBAA0B,CAAC,WAAW;AAC1C,QAAM,OAAO,OAAO,QAAQ,CAAC;AAC7B,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AACA,QAAM,gBAAgB;AACtB,QAAM,oBAAoB,KAAK,OAAO,CAAC,OAAO,EAAE,YAAY,UAAU,MAAM,aAAa;AACzF,QAAM,SAAS,kBAAkB,WAAW,KAAK;AACjD,QAAM,QAAQ,KAAK,MAAO,kBAAkB,SAAS,KAAK,SAAU,GAAG;AACvE,QAAM,UAAU,KACb,OAAO,CAAC,OAAO,EAAE,YAAY,UAAU,KAAK,aAAa,EACzD,IAAI,CAAC,MAAM,IAAI,EAAE,YAAY,SAAS,OAAO,EAAE,QAAQ,SAAS,MAAM,EAAE,YAAY,UAAU,CAAC,cAAc;AAEhH,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS,SACL,iDACA,2CAA2C,QAAQ,KAAK,IAAI,CAAC;AAAA,IACjE,YAAY,SACR,SACA,gBAAgB,aAAa;AAAA,EACnC;AACF;AAEA,IAAM,cAAuB,CAAC,QAAQ,aAAa;AACjD,QAAM,WAAW,gBAAgB,QAAQ;AACzC,QAAM,QAAQ,IAAI,IAAI,SAAS,WAAW;AAC1C,QAAM,gBAAoD,CAAC;AAE3D,aAAW,KAAK,OAAO,QAAQ,CAAC,GAAG;AACjC,eAAW,KAAK,EAAE,cAAc,CAAC,GAAG;AAClC,oBAAc,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC;AAAA,IAClF;AAAA,EACF;AACA,aAAW,KAAK,OAAO,YAAY,CAAC,GAAG;AACrC,eAAW,KAAK,EAAE,cAAc,CAAC,GAAG;AAClC,oBAAc,KAAK,EAAE,MAAM,GAAG,QAAQ,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC;AAAA,IACrE;AAAA,EACF;AACA,aAAW,KAAK,OAAO,aAAa,CAAC,GAAG;AACtC,eAAW,KAAK,EAAE,cAAc,CAAC,GAAG;AAClC,oBAAc,KAAK,EAAE,MAAM,GAAG,QAAQ,gBAAgB,EAAE,gBAAgB,EAAE,GAAG,CAAC;AAAA,IAChF;AAAA,EACF;AAEA,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,iBAAiB,cAAc,OAAO,CAAC,MAAM,MAAM,IAAI,aAAa,EAAE,IAAI,CAAC,CAAC;AAClF,QAAM,oBAAoB,cAAc,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,aAAa,EAAE,IAAI,CAAC,CAAC;AACtF,QAAM,SAAS,kBAAkB,WAAW;AAC5C,QAAM,QAAQ,KAAK,MAAO,eAAe,SAAS,cAAc,SAAU,GAAG;AAE7E,QAAM,WAAW,kBAAkB,MAAM,GAAG,CAAC,EAAE;AAAA,IAC7C,CAAC,MAAM,IAAI,EAAE,KAAK,UAAU,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,SAAS,KAAK,QAAQ,EAAE,MAAM,EAAE,MAAM;AAAA,EACpF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS,SACL,4CACA,GAAG,kBAAkB,MAAM,OAAO,cAAc,MAAM;AAAA,IAC1D,YAAY,SACR,SACA,kGAAkG,SAAS,KAAK,IAAI,CAAC;AAAA,EAC3H;AACF;AAEA,IAAM,mBAA4B,CAAC,WAAW;AAC5C,QAAM,eAAe;AACrB,QAAM,gBAA0B,CAAC;AAEjC,aAAW,KAAK,OAAO,QAAQ,CAAC,GAAG;AACjC,kBAAc,KAAK,GAAI,EAAE,cAAc,CAAC,CAAE;AAAA,EAC5C;AACA,aAAW,KAAK,OAAO,YAAY,CAAC,GAAG;AACrC,kBAAc,KAAK,GAAI,EAAE,cAAc,CAAC,CAAE;AAAA,EAC5C;AAEA,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,aAAa,cAAc,OAAO,CAAC,MAAM,aAAa,KAAK,CAAC,CAAC;AACnE,QAAM,QAAQ,WAAW,SAAS,cAAc;AAEhD,QAAM,SAAS,SAAS;AACxB,QAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,MAAM,QAAQ,GAAG,CAAC;AAEnD,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS,SACL,GAAG,WAAW,MAAM,OAAO,cAAc,MAAM,4CAC/C,QAAQ,WAAW,MAAM,OAAO,cAAc,MAAM;AAAA,IACxD,YAAY,SACR,SACA;AAAA,EACN;AACF;AAEA,IAAM,kBAA2B,CAAC,WAAW;AAC3C,QAAM,OAAO,OAAO,QAAQ,CAAC;AAC7B,MAAI,KAAK,SAAS,GAAG;AACnB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,SAAmB,CAAC;AAG1B,aAAW,KAAK,MAAM;AACpB,QAAI,CAAC,EAAE,WAAW;AAChB,aAAO,KAAK,IAAI,EAAE,YAAY,SAAS,OAAO,EAAE,QAAQ,SAAS,4BAA4B;AAAA,IAC/F;AAAA,EACF;AAGA,QAAM,SAAS,CAAC,GAAG,IAAI,EACpB,OAAO,CAAC,MAA6C,QAAQ,EAAE,SAAS,CAAC,EACzE,KAAK,CAAC,GAAG,MAAO,EAAE,YAAY,EAAE,YAAY,IAAI,EAAG;AAEtD,WAAS,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK;AAE1C,UAAM,UAAU,OAAO,CAAC;AAExB,UAAM,OAAO,OAAO,IAAI,CAAC;AACzB,UAAM,UAAU,QAAQ,WAAW,QAAQ;AAC3C,UAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,OAAO,EAAE,QAAQ;AAC7E,UAAM,YAAY,SAAS,MAAO,KAAK,KAAK,KAAK;AAEjD,QAAI,YAAY,GAAG;AACjB,aAAO;AAAA,QACL,WAAW,KAAK,MAAM,SAAS,CAAC,oBAAoB,QAAQ,QAAQ,SAAS,YAAY,OAAO,UAAU,KAAK,QAAQ,SAAS,cAAc,KAAK,SAAS;AAAA,MAC9J;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,OAAO,WAAW;AACjC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,SAAS,MAAM,KAAK,IAAI,GAAG,MAAM,OAAO,SAAS,EAAE;AAAA,IAC1D,SAAS,SACL,6DACA,sBAAsB,OAAO,KAAK,GAAG,CAAC;AAAA,IAC1C,YAAY,SACR,SACA;AAAA,EACN;AACF;AAEA,IAAM,kBAA2B,CAAC,WAAW;AAC3C,QAAM,SAAS,OAAO,UAAU,CAAC;AACjC,QAAM,gBAAgB;AACtB,QAAM,yBAAyB,OAAO,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,SAAS,CAAC;AACvF,QAAM,SAAS,uBAAuB,UAAU;AAChD,QAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,MAAO,uBAAuB,SAAS,gBAAiB,GAAG,CAAC;AAE7F,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS,SACL,GAAG,uBAAuB,MAAM,2CAChC,QAAQ,uBAAuB,MAAM,wDAAwD,aAAa;AAAA,IAC9G,YAAY,SACR,SACA,gBAAgB,aAAa;AAAA,EACnC;AACF;AAEA,IAAM,oBAA6B,CAAC,WAAW;AAC7C,QAAM,YAAY,OAAO,aAAa,CAAC;AACvC,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,WAAW,UAAU,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS;AAC/E,QAAM,SAAS,SAAS,WAAW,UAAU;AAC7C,QAAM,QAAQ,KAAK,MAAO,SAAS,SAAS,UAAU,SAAU,GAAG;AACnE,QAAM,aAAa,UAChB,OAAO,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,EAAE,QAAQ,CAAC,EAAE,SAAS,EACvD,IAAI,CAAC,MAAM;AACV,UAAM,UAAoB,CAAC;AAC3B,QAAI,CAAC,EAAE,YAAa,SAAQ,KAAK,aAAa;AAC9C,QAAI,CAAC,EAAE,KAAM,SAAQ,KAAK,MAAM;AAChC,QAAI,CAAC,EAAE,UAAW,SAAQ,KAAK,WAAW;AAC1C,WAAO,IAAI,EAAE,eAAe,SAAS,cAAc,QAAQ,KAAK,IAAI,CAAC;AAAA,EACvE,CAAC;AAEH,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS,SACL,wCACA,iCAAiC,WAAW,KAAK,IAAI,CAAC;AAAA,IAC1D,YAAY,SACR,SACA;AAAA,EACN;AACF;AAEA,IAAM,aAAsB,CAAC,QAAQ,aAAa;AAChD,QAAM,WAAW,gBAAgB,QAAQ;AACzC,QAAM,aAAa,IAAI,IAAI,SAAS,QAAQ;AAE5C,QAAM,aAAiD,CAAC;AAExD,MAAI,OAAO,QAAQ,SAAS;AAC1B,eAAW,KAAK,EAAE,MAAM,OAAO,OAAO,SAAS,QAAQ,UAAU,CAAC;AAAA,EACpE;AACA,aAAW,KAAK,OAAO,QAAQ,CAAC,GAAG;AACjC,QAAI,EAAE,QAAS,YAAW,KAAK,EAAE,MAAM,EAAE,SAAS,QAAQ,iBAAiB,EAAE,QAAQ,SAAS,IAAI,CAAC;AACnG,eAAW,KAAK,EAAE,cAAc,CAAC,GAAG;AAClC,iBAAW,KAAK,EAAE,MAAM,GAAG,QAAQ,mBAAmB,EAAE,QAAQ,SAAS,IAAI,CAAC;AAAA,IAChF;AAAA,EACF;AACA,aAAW,KAAK,OAAO,YAAY,CAAC,GAAG;AACrC,QAAI,EAAE,YAAa,YAAW,KAAK,EAAE,MAAM,EAAE,aAAa,QAAQ,YAAY,EAAE,QAAQ,SAAS,IAAI,CAAC;AACtG,eAAW,KAAK,EAAE,cAAc,CAAC,GAAG;AAClC,iBAAW,KAAK,EAAE,MAAM,GAAG,QAAQ,sBAAsB,EAAE,QAAQ,SAAS,IAAI,CAAC;AAAA,IACnF;AAAA,EACF;AAEA,QAAM,QAA+C,CAAC;AACtD,aAAW,SAAS,YAAY;AAC9B,UAAM,QAAQ,MAAM,KAAK,YAAY,EAAE,MAAM,KAAK;AAClD,eAAW,QAAQ,OAAO;AACxB,YAAM,QAAQ,KAAK,QAAQ,qBAAqB,EAAE;AAClD,UAAI,WAAW,IAAI,KAAK,GAAG;AACzB,cAAM,KAAK,EAAE,SAAS,OAAO,QAAQ,MAAM,OAAO,CAAC;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,iBAAiB,CAAC,GAAG,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC/D,QAAM,WAAW,MAAM,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,OAAO,QAAQ,EAAE,MAAM,EAAE;AAE7E,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,SAAS,MAAM,KAAK,IAAI,GAAG,MAAM,MAAM,SAAS,EAAE;AAAA,IACzD,SAAS,SACL,sDACA,SAAS,MAAM,MAAM,6BAA6B,eAAe,KAAK,IAAI,CAAC;AAAA,IAC/E,YAAY,SACR,SACA,gHAAgH,SAAS,KAAK,IAAI,CAAC;AAAA,EACzI;AACF;AAEA,IAAM,sBAA+B,CAAC,WAAW;AAC/C,QAAM,WAAW,CAAC,UAAU,QAAQ,aAAa,QAAQ;AACzD,QAAM,UAAU,SAAS,OAAO,CAAC,YAAY;AAC3C,UAAM,QAAQ,OAAO,OAAO;AAC5B,QAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,SAAS;AAChD,WAAO,UAAU;AAAA,EACnB,CAAC;AACD,QAAM,UAAU,SAAS,OAAO,CAAC,MAAM,CAAC,QAAQ,SAAS,CAAC,CAAC;AAC3D,QAAM,SAAS,QAAQ,WAAW;AAElC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,KAAK,MAAO,QAAQ,SAAS,SAAS,SAAU,GAAG;AAAA,IAC1D,SAAS,SACL,+CACA,+BAA+B,QAAQ,KAAK,IAAI,CAAC;AAAA,IACrD,YAAY,SAAS,SAAY,8CAA8C,QAAQ,KAAK,IAAI,CAAC;AAAA,EACnG;AACF;AAEO,IAAM,YAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,iBAAiB,QAAsB,UAA8B;AACnF,SAAO,UAAU,IAAI,CAAC,UAAU,MAAM,QAAQ,QAAQ,CAAC;AACzD;;;AC1bA,SAAS,SAAS,MAAc,WAAkC;AAChE,SAAO,KACJ,YAAY,EACZ,QAAQ,iDAAiD,GAAG,EAC5D,MAAM,KAAK,EACX,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC;AAC7D;AAMA,SAAS,WAAW,MAAc,UAA0B;AAC1D,MAAI,aAAa,MAAM;AACrB,WAAO,KACJ,QAAQ,0DAA0D,EAAE,EACpE,QAAQ,wBAAwB,EAAE;AAAA,EACvC;AAEA,SAAO,KACJ,QAAQ,uEAAuE,EAAE,EACjF,QAAQ,UAAU,GAAG,EACrB,QAAQ,cAAc,EAAE;AAC7B;AAKA,SAAS,kBAAkB,QAA8B;AACvD,QAAM,QAAkB,CAAC;AAEzB,MAAI,OAAO,QAAQ,QAAS,OAAM,KAAK,OAAO,OAAO,OAAO;AAC5D,MAAI,OAAO,QAAQ,MAAO,OAAM,KAAK,OAAO,OAAO,KAAK;AAExD,aAAW,KAAK,OAAO,QAAQ,CAAC,GAAG;AACjC,QAAI,EAAE,SAAU,OAAM,KAAK,EAAE,QAAQ;AACrC,QAAI,EAAE,QAAS,OAAM,KAAK,EAAE,OAAO;AACnC,UAAM,KAAK,GAAI,EAAE,cAAc,CAAC,CAAE;AAAA,EACpC;AACA,aAAW,KAAK,OAAO,UAAU,CAAC,GAAG;AACnC,QAAI,EAAE,KAAM,OAAM,KAAK,EAAE,IAAI;AAC7B,UAAM,KAAK,GAAI,EAAE,YAAY,CAAC,CAAE;AAAA,EAClC;AACA,aAAW,KAAK,OAAO,YAAY,CAAC,GAAG;AACrC,QAAI,EAAE,KAAM,OAAM,KAAK,EAAE,IAAI;AAC7B,QAAI,EAAE,YAAa,OAAM,KAAK,EAAE,WAAW;AAC3C,UAAM,KAAK,GAAI,EAAE,cAAc,CAAC,CAAE;AAAA,EACpC;AACA,aAAW,KAAK,OAAO,aAAa,CAAC,GAAG;AACtC,QAAI,EAAE,KAAM,OAAM,KAAK,EAAE,IAAI;AAC7B,QAAI,EAAE,UAAW,OAAM,KAAK,EAAE,SAAS;AACvC,UAAM,KAAK,GAAI,EAAE,WAAW,CAAC,CAAE;AAAA,EACjC;AACA,aAAW,KAAK,OAAO,gBAAgB,CAAC,GAAG;AACzC,QAAI,EAAE,KAAM,OAAM,KAAK,EAAE,IAAI;AAAA,EAC/B;AAEA,SAAO,MAAM,KAAK,GAAG;AACvB;AAKA,SAAS,WAAW,QAAuC;AACzD,QAAM,KAAK,oBAAI,IAAoB;AACnC,aAAW,SAAS,QAAQ;AAC1B,OAAG,IAAI,QAAQ,GAAG,IAAI,KAAK,KAAK,KAAK,CAAC;AAAA,EACxC;AACA,SAAO;AACT;AAMA,SAAS,gBAAgB,MAAc,UAAkB,cAAsB,IAAc;AAC3F,QAAM,WAAW,gBAAgB,QAAQ;AACzC,QAAM,YAAY,IAAI,IAAI,SAAS,SAAS;AAC5C,QAAM,SAAS,SAAS,MAAM,SAAS;AACvC,QAAM,UAAU,OAAO,IAAI,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC;AACzD,QAAM,KAAK,WAAW,OAAO;AAG7B,QAAM,iBAAiB,oBAAI,IAAoB;AAC/C,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,OAAO,QAAQ,CAAC,KAAK;AAC3B,QAAI,CAAC,eAAe,IAAI,IAAI,GAAG;AAC7B,qBAAe,IAAI,MAAM,OAAO,CAAC,KAAK,EAAE;AAAA,IAC1C;AAAA,EACF;AAGA,SAAO,CAAC,GAAG,GAAG,QAAQ,CAAC,EACpB,OAAO,CAAC,CAAC,IAAI,MAAM,KAAK,SAAS,CAAC,EAClC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,WAAW,EACpB,IAAI,CAAC,CAAC,IAAI,MAAM,eAAe,IAAI,IAAI,KAAK,IAAI;AACrD;AAMO,SAAS,oBACd,QACA,gBACA,WAAmB,MACF;AACjB,QAAM,WAAW,gBAAgB,QAAQ;AACzC,QAAM,YAAY,IAAI,IAAI,SAAS,SAAS;AAG5C,QAAM,aAAa,gBAAgB,gBAAgB,QAAQ;AAG3D,QAAM,aAAa,kBAAkB,MAAM;AAC3C,QAAM,eAAe,SAAS,YAAY,SAAS;AACnD,QAAM,cAAc,IAAI,IAAI,aAAa,IAAI,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC;AAG5E,QAAM,iBAAiB,IAAI,IAAI,YAAY;AAG3C,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAoB,CAAC;AAE3B,aAAW,WAAW,YAAY;AAChC,UAAM,OAAO,WAAW,SAAS,QAAQ;AACzC,QAAI,YAAY,IAAI,IAAI,KAAK,eAAe,IAAI,QAAQ,YAAY,CAAC,GAAG;AACtE,cAAQ,KAAK,OAAO;AAAA,IACtB,OAAO;AACL,cAAQ,KAAK,OAAO;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,kBAAkB,WAAW,SAAS,IACxC,KAAK,MAAO,QAAQ,SAAS,WAAW,SAAU,GAAG,IACrD;AAEJ,SAAO,EAAE,SAAS,SAAS,gBAAgB;AAC7C;;;ACjJA,IAAM,mBAA2C;AAAA,EAC/C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AACP;AAKO,SAAS,eAAe,QAA4B;AACzD,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,MAAI,cAAc;AAClB,MAAI,cAAc;AAElB,aAAW,SAAS,QAAQ;AAC1B,UAAM,OAAO,iBAAiB,MAAM,MAAM,KAAK;AAC/C,mBAAe,MAAM,QAAQ;AAC7B,mBAAe,MAAM;AAAA,EACvB;AAEA,SAAO,cAAc,IAAI,KAAK,MAAO,cAAc,cAAe,GAAG,IAAI;AAC3E;AAKO,SAAS,uBAAuB,cAAsB,mBAAoC;AAC/F,MAAI,sBAAsB,OAAW,QAAO;AAC5C,SAAO,KAAK,MAAM,eAAe,MAAM,oBAAoB,GAAG;AAChE;AAKO,SAAS,cAAc,OAA0B;AACtD,MAAI,SAAS,GAAI,QAAO;AACxB,MAAI,SAAS,GAAI,QAAO;AACxB,MAAI,SAAS,GAAI,QAAO;AACxB,SAAO;AACT;AAKO,SAAS,gBAAgB,OAAe,QAAmB,OAAwB;AACxF,QAAM,cAAc;AAAA,IAClB,WAAW;AAAA,IACX,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM;AAAA,EACR,EAAE,MAAM;AAER,QAAM,OAAO,cAAc,KAAK,SAAS,WAAW;AACpD,MAAI,OAAO;AACT,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO,GAAG,IAAI;AAChB;;;AC3CO,SAAS,WAAW,QAAsB,UAAsB,CAAC,GAAc;AACpF,QAAM,WAAW,QAAQ,YAAY;AAGrC,QAAM,SAAS,iBAAiB,QAAQ,QAAQ;AAChD,QAAM,eAAe,eAAe,MAAM;AAG1C,MAAI;AACJ,MAAI,QAAQ,gBAAgB;AAC1B,eAAW,oBAAoB,QAAQ,QAAQ,gBAAgB,QAAQ;AAAA,EACzE;AAGA,QAAM,aAAa,uBAAuB,cAAc,UAAU,eAAe;AACjF,QAAM,SAAS,cAAc,UAAU;AACvC,QAAM,UAAU,gBAAgB,YAAY,QAAQ,CAAC,CAAC,QAAQ;AAE9D,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC1CA,2BAA6B;AAC7B,oBAA8B;AAE9B,IAAMC,eAAU,6BAAc,aAAe;AAU7C,SAAS,aAAa,aAA2B;AAC/C,MAAI;AACF,2CAAa,OAAO,CAAC,WAAW,WAAW,GAAG;AAAA,MAC5C,OAAO,CAAC,WAAW,QAAQ,MAAM;AAAA,MACjC,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,qBAAqB,WAAW,KAAM,MAAgB,OAAO,EAAE;AAAA,EACjF;AACF;AAQO,SAAS,UAAU,WAAmB,SAAkD;AAC7F,MAAI;AACJ,MAAI;AACJ,QAAM,cAAc,SAAS,gBAAgB;AAE7C,MAAI;AAEF,0BAAsB,UAAU,WAAW,mBAAmB,IAC1D,YACA,oBAAoB,SAAS;AAEjC,QAAI;AAEF,aAAOA,SAAQ,mBAAmB;AAAA,IACpC,SAAS,kBAAkB;AAEzB,wBAAkB,iBAAiB,SAAS;AAC5C,UAAI;AACF,eAAOA,SAAQ,eAAe;AAAA,MAChC,SAAS,cAAc;AACrB,YAAI,CAAC,aAAa;AAChB,gBAAM,IAAI;AAAA,YACR,iBAAiB,mBAAmB,OAAO,eAAe;AAAA;AAAA,UAE5D;AAAA,QACF;AAEA,gBAAQ,IAAI,mBAAY,mBAAmB,2BAA2B;AACtE,YAAI;AACF,uBAAa,mBAAmB;AAChC,kBAAQ,IAAI,iCAA4B,mBAAmB,EAAE;AAE7D,iBAAOA,SAAQ,mBAAmB;AAAA,QACpC,SAAS,cAAc;AACrB,gBAAM,IAAI;AAAA,YACR,gCAAgC,mBAAmB,KAChD,aAAuB,OAC1B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AAEd,QAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,wBAAwB,GAAG;AAC9E,YAAM;AAAA,IACR;AACA,UAAM,IAAI,MAAM,iBAAiB,SAAS,YAAY;AAAA,EACxD;AACF;;;AC/EO,SAAS,mBAAmB,MAAc,OAAe,OAAuB;AACrF,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAQE,IAAI;AAAA,YACH,KAAK;AAAA;AAAA,YAEL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6HjB;;;ACzIA,IAAAC,iBAA8B;AAQvB,IAAM,eAA4B;AAAA,EACvC,EAAE,MAAM,iBAAiB,KAAK,kCAAkC,aAAa,gCAAgC;AAAA,EAC7G,EAAE,MAAM,WAAW,KAAK,4BAA4B,aAAa,2BAA2B;AAAA,EAC5F,EAAE,MAAM,SAAS,KAAK,0BAA0B,aAAa,8BAA8B;AAAA,EAC3F,EAAE,MAAM,QAAQ,KAAK,yBAAyB,aAAa,oBAAoB;AAAA,EAC/E,EAAE,MAAM,WAAW,KAAK,4BAA4B,aAAa,0BAA0B;AAAA,EAC3F,EAAE,MAAM,aAAa,KAAK,8BAA8B,aAAa,uBAAuB;AAAA,EAC5F,EAAE,MAAM,QAAQ,KAAK,yBAAyB,aAAa,oBAAoB;AAAA,EAC/E,EAAE,MAAM,SAAS,KAAK,0BAA0B,aAAa,4BAA4B;AAAA,EACzF,EAAE,MAAM,SAAS,KAAK,0BAA0B,aAAa,6BAA6B;AAAA,EAC1F,EAAE,MAAM,WAAW,KAAK,4BAA4B,aAAa,4BAA4B;AAAA,EAC7F,EAAE,MAAM,SAAS,KAAK,0BAA0B,aAAa,0BAA0B;AAAA,EACvF,EAAE,MAAM,WAAW,KAAK,4BAA4B,aAAa,yBAAyB;AAC5F;AAEO,SAAS,iBAAiB,KAAsB;AACrD,MAAI;AACF,UAAM,UAAM,8BAAc,QAAQ,IAAI,IAAI,GAAG;AAC7C,QAAI,QAAQ,GAAG;AACf,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,KAA4B;AAC9D,MAAI;AACF,UAAM,UAAM,8BAAc,QAAQ,IAAI,IAAI,GAAG;AAC7C,UAAM,UAAU,IAAI,GAAG,GAAG,eAAe;AACzC,WAAO,QAAQ,WAAW;AAAA,EAC5B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AZ/BA,IAAM,cAAc,QAAQ;AAC5B,IAAM,eAAe,QAAQ;AAE7B,SAAS,iBAAiB;AACxB,UAAQ,MAAM,IAAI,SAAoB;AAAE,YAAQ,MAAM,YAAY,GAAG,IAAI;AAAA,EAAG;AAC5E,UAAQ,OAAO,IAAI,SAAoB;AAAE,YAAQ,MAAM,YAAY,GAAG,IAAI;AAAA,EAAG;AAC/E;AAEA,SAAS,gBAAgB;AACvB,UAAQ,MAAM;AACd,UAAQ,OAAO;AACjB;AAEA,SAAS,eAA0B;AACjC,QAAM,SAAS,IAAI,qBAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AAID,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,QAC/D,OAAO,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,QAChE,OAAO,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,eAAe;AAAA,MACvD;AAAA,IACF;AAAA,IACA,CAAC,EAAE,MAAM,OAAO,MAAM,MAAM;AAC1B,YAAM,OAAO;AAAA,QACX,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AACA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,CAAC,EAAE;AAAA,IAC5D;AAAA,EACF;AAIA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM,aAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,MAC3D;AAAA,IACF;AAAA,IACA,OAAO,EAAE,KAAK,MAAM;AAClB,qBAAe;AACf,UAAI;AACF,cAAM,kBAAkB,CAAC,IAAI,CAAC;AAC9B,sBAAc;AACd,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,EAAE,OAAO,MAAM,QAAQ,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,QACjG;AAAA,MACF,SAAS,GAAY;AACnB,sBAAc;AACd,cAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACzD,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,EAAE,OAAO,OAAO,QAAQ,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,QACzG;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM,aAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,QACzD,gBAAgB,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gDAAgD;AAAA,QAC/F,UAAU,aAAE,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,MAC1F;AAAA,IACF;AAAA,IACA,OAAO,EAAE,MAAM,gBAAgB,SAAS,MAAM;AAC5C,qBAAe;AACf,UAAI;AACF,cAAM,SAAS,MAAM,kBAAkB,CAAC,IAAI,CAAC;AAC7C,cAAM,SAAS,WAAW,QAAQ;AAAA,UAChC,UAAU,YAAY;AAAA,UACtB;AAAA,QACF,CAAC;AACD,sBAAc;AACd,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC;AAAA,QAC5E;AAAA,MACF,SAAS,GAAY;AACnB,sBAAc;AACd,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,EAAE,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;AAAA,UAChH,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM,aAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,QACzD,OAAO,aAAE,OAAO,EAAE,QAAQ,MAAM,EAAE,SAAS,gEAAgE;AAAA,MAC7G;AAAA,IACF;AAAA,IACA,OAAO,EAAE,MAAM,MAAM,MAAM;AACzB,qBAAe;AACf,UAAI;AACF,cAAM,SAAS,MAAM,kBAAkB,CAAC,IAAI,CAAC;AAC7C,cAAM,cAAc,UAAU,OAAO,EAAE,aAAa,MAAM,CAAC;AAC3D,cAAM,OAAO,MAAM,YAAY,OAAO,MAA4C;AAClF,sBAAc;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,CAAC,EAAE;AAAA,MAC5D,SAAS,GAAY;AACnB,sBAAc;AACd,cAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACzD,cAAM,OAAO,QAAQ,SAAS,oBAAoB,IAC9C,2CAA2C,KAAK,KAChD;AACJ,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,EAAE,OAAO,UAAU,KAAK,CAAC,EAAE,CAAC;AAAA,UACpF,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA,MAAM;AACJ,YAAM,SAAS,aAAa,IAAI,CAAC,OAAO;AAAA,QACtC,MAAM,EAAE;AAAA,QACR,SAAS,EAAE;AAAA,QACX,aAAa,EAAE;AAAA,QACf,WAAW,iBAAiB,EAAE,GAAG;AAAA,QACjC,SAAS,oBAAoB,EAAE,GAAG;AAAA,MACpC,EAAE;AACF,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,EAAE,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,MAChF;AAAA,IACF;AAAA,EACF;AAIA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM,aAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,QACzD,OAAO,aAAE,OAAO,EAAE,QAAQ,MAAM,EAAE,SAAS,YAAY;AAAA,QACvD,QAAQ,aAAE,KAAK,CAAC,MAAM,QAAQ,CAAC,EAAE,QAAQ,IAAI,EAAE,SAAS,cAAc;AAAA,MACxE;AAAA,IACF;AAAA,IACA,OAAO,EAAE,MAAM,OAAO,OAAO,MAAM;AACjC,qBAAe;AACf,UAAI;AACF,cAAM,SAAS,MAAM,kBAAkB,CAAC,IAAI,CAAC;AAC7C,cAAM,cAAc,UAAU,OAAO,EAAE,aAAa,MAAM,CAAC;AAC3D,cAAM,OAAO,MAAM,YAAY,OAAO,MAA4C;AAElF,YAAI;AACJ,YAAI;AACF,gBAAM,KAAK,MAAM,OAAO,YAAY;AACpC,qBAAW,GAAG;AAAA,QAChB,QAAQ;AACN,wBAAc;AACd,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,EAAE,OAAO,2DAA2D,CAAC,EAAE,CAAC;AAAA,YAChI,SAAS;AAAA,UACX;AAAA,QACF;AAEA,cAAM,UAAU,MAAM,SAAS,OAAO,EAAE,UAAU,KAAK,CAAC;AACxD,cAAM,OAAO,MAAM,QAAQ,QAAQ;AACnC,cAAM,KAAK,WAAW,MAAM,EAAE,WAAW,cAAc,CAAC;AACxD,cAAM,SAAS;AACf,cAAM,YAAY,MAAM,KAAK,IAAI;AAAA,UAC/B;AAAA,UACA,iBAAiB;AAAA,UACjB,QAAQ,EAAE,KAAK,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,OAAO,OAAO;AAAA,QACrE,CAAC;AACD,cAAM,QAAQ,MAAM;AACpB,sBAAc;AAEd,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM,KAAK,UAAU;AAAA,cACnB,KAAK,OAAO,KAAK,SAAS,EAAE,SAAS,QAAQ;AAAA,cAC7C,UAAU;AAAA,cACV;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AAAA,MACF,SAAS,GAAY;AACnB,sBAAc;AACd,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,EAAE,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;AAAA,UAChH,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,iBAAgC;AACpD,QAAM,SAAS,aAAa;AAC5B,QAAM,YAAY,IAAI,kCAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAChC;","names":["merge","require","import_module"]}
1
+ {"version":3,"sources":["../../src/mcp/server.ts","../../node_modules/tsup/assets/cjs_shims.js","../../src/core.ts","../../src/ats/i18n/en.ts","../../src/ats/i18n/de.ts","../../src/ats/i18n/index.ts","../../src/ats/genericChecks.ts","../../src/ats/jdMatcher.ts","../../src/ats/scoring.ts","../../src/ats/index.ts","../../src/utils/themeLoader.ts","../../src/utils/resumeTemplate.ts","../../src/utils/themeInfo.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { processResumeData } from '../core';\nimport { analyzeAts } from '../ats/index';\nimport { loadTheme } from '../utils/themeLoader';\nimport { generateResumeYaml } from '../utils/resumeTemplate';\nimport { KNOWN_THEMES, isThemeInstalled, getInstalledVersion } from '../utils/themeInfo';\n\n// Redirect console.log to stderr so it doesn't corrupt the MCP stdio channel\nconst originalLog = console.log;\nconst originalWarn = console.warn;\n\nfunction suppressStdout() {\n console.log = (...args: unknown[]) => { console.error('[resuml]', ...args); };\n console.warn = (...args: unknown[]) => { console.error('[resuml]', ...args); };\n}\n\nfunction restoreStdout() {\n console.log = originalLog;\n console.warn = originalWarn;\n}\n\n// ── Shared data ─────────────────────────────────────────────────────\n\nconst JSON_RESUME_SCHEMA_REFERENCE = `# JSON Resume Schema Reference\n\nThe JSON Resume schema defines the structure for resume data. resuml uses YAML as the input format.\n\n## Top-level sections\n\n| Section | Required | Description |\n|---------|----------|-------------|\n| basics | Yes | Name, label, email, phone, url, summary, location, profiles |\n| work | Recommended | Work experience entries |\n| education | Recommended | Education entries |\n| skills | Recommended | Skill categories with keywords |\n| projects | Optional | Project entries |\n| volunteer | Optional | Volunteer experience |\n| awards | Optional | Awards and honors |\n| certificates | Optional | Professional certifications |\n| publications | Optional | Published works |\n| languages | Optional | Language proficiencies |\n| interests | Optional | Personal interests |\n| references | Optional | Professional references |\n\n## Section schemas\n\n### basics\n\\`\\`\\`yaml\nbasics:\n name: \"Full Name\" # required\n label: \"Professional Title\"\n email: \"email@example.com\"\n phone: \"+1-555-123-4567\"\n url: \"https://website.com\"\n summary: \"2-4 sentence professional summary\"\n location:\n city: \"City\"\n countryCode: \"US\"\n region: \"State\"\n profiles:\n - network: \"LinkedIn\"\n username: \"username\"\n url: \"https://linkedin.com/in/username\"\n\\`\\`\\`\n\n### work\n\\`\\`\\`yaml\nwork:\n - name: \"Company Name\"\n position: \"Job Title\"\n url: \"https://company.com\"\n startDate: \"2020-01-01\" # ISO 8601\n endDate: \"2023-12-31\" # omit for current position\n summary: \"Role description\"\n highlights:\n - \"Achievement with measurable result\"\n\\`\\`\\`\n\n### education\n\\`\\`\\`yaml\neducation:\n - institution: \"University\"\n area: \"Field of Study\"\n studyType: \"Degree Type\" # e.g. Bachelor, Master, PhD\n startDate: \"2014-09-01\"\n endDate: \"2018-06-01\"\n\\`\\`\\`\n\n### skills\n\\`\\`\\`yaml\nskills:\n - name: \"Category\"\n level: \"Expert\" # Master, Expert, Advanced, Intermediate, Beginner\n keywords: [\"Skill1\", \"Skill2\"]\n\\`\\`\\`\n\n### projects\n\\`\\`\\`yaml\nprojects:\n - name: \"Project Name\"\n description: \"What it does\"\n highlights: [\"Key achievement\"]\n keywords: [\"Tech1\", \"Tech2\"]\n startDate: \"2023-01-01\"\n url: \"https://github.com/...\"\n\\`\\`\\`\n\n### certificates\n\\`\\`\\`yaml\ncertificates:\n - name: \"Certificate Name\"\n date: \"2023-01-01\"\n issuer: \"Issuing Organization\"\n url: \"https://credential-url.com\"\n\\`\\`\\`\n\n### languages\n\\`\\`\\`yaml\nlanguages:\n - language: \"English\"\n fluency: \"Native speaker\" # Native speaker, Fluent, Advanced, Intermediate, Elementary\n\\`\\`\\`\n\n## Formatting rules\n- Dates: ISO 8601 format (YYYY-MM-DD or YYYY-MM)\n- Start highlights with action verbs: Developed, Implemented, Led, Optimized, Reduced, Built, Designed\n- Include numbers in 50%+ of highlights (e.g., \"Reduced latency by 40%\")\n- Never use first person (I, my, me, we)\n- Summary: 2-4 sentences positioning the candidate for the specific role\n`;\n\nconst ATS_SCORING_RUBRIC = `# ATS Scoring Rubric\n\nresuml performs deterministic, offline ATS (Applicant Tracking System) analysis.\n\n## Scoring system\n\n### Rating scale\n| Score | Rating | Description |\n|-------|--------|-------------|\n| 90-100 | Excellent | Resume is well-optimized for ATS |\n| 75-89 | Good | Resume passes most ATS checks |\n| 60-74 | Needs Work | Several improvements recommended |\n| 0-59 | Poor | Significant issues found |\n\n### Weight system\nEach check has a weight that affects the final score:\n- **High weight (3x)**: Critical checks that significantly impact ATS parsing\n- **Medium weight (2x)**: Important but not critical checks\n- **Low weight (1x)**: Nice-to-have improvements\n\n### Combined scoring (with job description)\nWhen a job description is provided:\n- Generic checks: 60% of final score\n- Keyword match: 40% of final score\n\n## Checks performed\n\n### Contact Information (category: contact)\n| Check | Weight | What it verifies |\n|-------|--------|-----------------|\n| contact-complete | High | Name, email, phone, and city are all present |\n| has-linkedin | Medium | LinkedIn profile exists in profiles section |\n\n### Content Quality (category: content)\n| Check | Weight | What it verifies |\n|-------|--------|-----------------|\n| has-summary | High | Professional summary exists (15-100 words) |\n| work-highlights | High | Each work entry has at least 2 highlights |\n| action-verbs | Medium | Highlights start with action verbs |\n| quantified-impact | Medium | 50%+ of highlights include numbers/metrics |\n| no-first-person | Low | No first-person pronouns (I, my, me, we) |\n\n### Resume Structure (category: structure)\n| Check | Weight | What it verifies |\n|-------|--------|-----------------|\n| date-consistency | Medium | All dates are valid ISO 8601 format |\n| skills-populated | Medium | At least 3 skill categories defined |\n| education-complete | Medium | Education section has institution and area |\n| essential-sections | High | Work, education, and skills sections present |\n\n## Job description matching\nWhen a job description is provided, resuml extracts keywords using TF-based extraction\nand matches them against the resume using stem matching. Results include:\n- **matched**: Keywords found in the resume\n- **missing**: Keywords not found (add these to improve score)\n- **matchPercentage**: Percentage of JD keywords found in resume\n\n## Tips for improving ATS score\n1. Include all contact information (name, email, phone, city)\n2. Add a LinkedIn profile URL\n3. Write a 2-4 sentence professional summary\n4. Use action verbs to start each highlight\n5. Quantify achievements with numbers (%, $, time saved, team size)\n6. Include at least 3 skill categories with relevant keywords\n7. When targeting a job, mirror exact terminology from the job description\n`;\n\nfunction createServer(): McpServer {\n const server = new McpServer({\n name: 'resuml',\n version: '1.0.0',\n });\n\n // ═══════════════════════════════════════════════════════════════════\n // RESOURCES\n // ═══════════════════════════════════════════════════════════════════\n\n // ── JSON Resume Schema Reference ──────────────────────────────────\n\n server.registerResource(\n 'json-resume-schema',\n 'resuml://schema/json-resume',\n {\n description: 'JSON Resume schema reference with all sections, field types, and formatting rules',\n mimeType: 'text/markdown',\n },\n () => ({\n contents: [{\n uri: 'resuml://schema/json-resume',\n mimeType: 'text/markdown',\n text: JSON_RESUME_SCHEMA_REFERENCE,\n }],\n }),\n );\n\n // ── ATS Scoring Rubric ────────────────────────────────────────────\n\n server.registerResource(\n 'ats-scoring-rubric',\n 'resuml://docs/ats-scoring',\n {\n description: 'ATS scoring rubric: checks performed, weight system, rating scale, and tips for improving score',\n mimeType: 'text/markdown',\n },\n () => ({\n contents: [{\n uri: 'resuml://docs/ats-scoring',\n mimeType: 'text/markdown',\n text: ATS_SCORING_RUBRIC,\n }],\n }),\n );\n\n // ── Theme Catalog ─────────────────────────────────────────────────\n\n server.registerResource(\n 'theme-catalog',\n 'resuml://themes/catalog',\n {\n description: 'Available resume themes with descriptions and installation status',\n mimeType: 'application/json',\n },\n () => {\n const themes = KNOWN_THEMES.map((t) => ({\n name: t.name,\n package: t.pkg,\n description: t.description,\n installed: isThemeInstalled(t.pkg),\n version: getInstalledVersion(t.pkg),\n }));\n return {\n contents: [{\n uri: 'resuml://themes/catalog',\n mimeType: 'application/json',\n text: JSON.stringify({ themes, totalCount: themes.length }, null, 2),\n }],\n };\n },\n );\n\n // ═══════════════════════════════════════════════════════════════════\n // PROMPTS\n // ═══════════════════════════════════════════════════════════════════\n\n // ── Tailor Resume to Job Description ──────────────────────────────\n\n server.registerPrompt(\n 'tailor-resume-to-jd',\n {\n title: 'Tailor Resume to Job Description',\n description: 'Generate a tailored resume YAML optimized for a specific job description',\n argsSchema: {\n jobDescription: z.string().describe('The full job description text'),\n candidateName: z.string().optional().describe('Candidate full name'),\n candidateEmail: z.string().optional().describe('Candidate email address'),\n candidateBackground: z.string().optional().describe('Brief summary of the candidate background, skills, and experience to incorporate'),\n },\n },\n ({ jobDescription, candidateName, candidateEmail, candidateBackground }) => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: `Create a tailored resume in YAML format optimized for the following job description.\n\n## Job Description\n${jobDescription}\n\n${candidateBackground ? `## Candidate Background\\n${candidateBackground}\\n` : ''}\n## Instructions\n\n1. Analyze the job description to identify required skills, technologies, experience level, and industry terms\n2. Generate a complete resume YAML following the JSON Resume schema (read the resuml://schema/json-resume resource for the full schema)\n3. Mirror exact terminology from the job description in skills and highlights\n4. Start every highlight with an action verb (Developed, Implemented, Led, Optimized, Reduced, Built, Designed)\n5. Include numbers in 50%+ of highlights (e.g., \"Reduced latency by 40%\", \"Managed team of 8\")\n6. Never use \"I\", \"my\", \"me\", \"we\"\n7. Write a 2-4 sentence summary positioning the candidate for this specific role\n8. Use ISO 8601 dates (YYYY-MM-DD or YYYY-MM)\n${candidateName ? `9. Use candidate name: ${candidateName}` : ''}\n${candidateEmail ? `10. Use candidate email: ${candidateEmail}` : ''}\n\n## Workflow\nAfter generating the YAML:\n1. Use \\`resuml_validate\\` to check schema compliance\n2. Use \\`resuml_ats_check\\` with the job description text. Target: score >= 75, keyword match >= 70%\n3. If ATS score is low, revise the YAML and re-check\n4. Use \\`resuml_render\\` with theme \"even\" for the final output\n\nOutput the resume YAML first, then run the validation and ATS check tools.`,\n },\n }],\n }),\n );\n\n // ── Optimize ATS Score ────────────────────────────────────────────\n\n server.registerPrompt(\n 'optimize-ats-score',\n {\n title: 'Optimize ATS Score',\n description: 'Analyze and improve an existing resume YAML to maximize its ATS score',\n argsSchema: {\n resumeYaml: z.string().describe('The current resume YAML content'),\n jobDescription: z.string().optional().describe('Optional job description to optimize against'),\n targetScore: z.string().optional().describe('Target ATS score (default: 85)'),\n },\n },\n ({ resumeYaml, jobDescription, targetScore }) => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: `Optimize this resume YAML to maximize its ATS score${targetScore ? ` (target: ${targetScore})` : ' (target: 85+)'}.\n\n## Current Resume YAML\n\\`\\`\\`yaml\n${resumeYaml}\n\\`\\`\\`\n\n${jobDescription ? `## Job Description\\n${jobDescription}\\n` : ''}\n## Instructions\n\n1. First, run \\`resuml_ats_check\\` on the current YAML${jobDescription ? ' with the job description' : ''} to get the baseline score\n2. Read the ATS scoring rubric (resuml://docs/ats-scoring) to understand what checks are performed\n3. Review each failed or low-scoring check and fix the issues:\n - Missing contact info → add it\n - No summary → write a 2-4 sentence professional summary\n - Weak highlights → rewrite with action verbs and quantified metrics\n - Missing keywords → incorporate them naturally into skills and highlights\n - Structural issues → ensure all essential sections are present\n4. Run \\`resuml_ats_check\\` again to verify improvement\n5. Repeat until the target score is reached\n\nOutput the improved YAML with a summary of changes made.`,\n },\n }],\n }),\n );\n\n // ── Review Resume ─────────────────────────────────────────────────\n\n server.registerPrompt(\n 'review-resume',\n {\n title: 'Review Resume',\n description: 'Comprehensive review of a resume YAML with ATS analysis and improvement suggestions',\n argsSchema: {\n resumeYaml: z.string().describe('The resume YAML content to review'),\n },\n },\n ({ resumeYaml }) => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: `Perform a comprehensive review of this resume.\n\n## Resume YAML\n\\`\\`\\`yaml\n${resumeYaml}\n\\`\\`\\`\n\n## Review steps\n\n1. Run \\`resuml_validate\\` to check schema compliance\n2. Run \\`resuml_ats_check\\` for ATS analysis\n3. Review content quality:\n - Is the summary compelling and role-specific?\n - Do highlights use strong action verbs?\n - Are achievements quantified with metrics?\n - Are skills well-organized and comprehensive?\n - Is the work history clear and impactful?\n4. Provide a structured review with:\n - **ATS Score**: Current score and rating\n - **Schema Issues**: Any validation errors\n - **Strengths**: What the resume does well\n - **Improvements**: Specific, actionable suggestions\n - **Revised YAML**: An improved version if significant changes are recommended`,\n },\n }],\n }),\n );\n\n // ═══════════════════════════════════════════════════════════════════\n // TOOLS\n // ═══════════════════════════════════════════════════════════════════\n\n // ── resuml_init_resume ──────────────────────────────────────────────\n\n server.registerTool(\n 'resuml_init_resume',\n {\n title: 'Init Resume',\n description: 'Generate a starter resume YAML template following the JSON Resume schema',\n inputSchema: {\n name: z.string().optional().describe('Full name for the resume'),\n title: z.string().optional().describe('Professional title/label'),\n email: z.string().optional().describe('Email address'),\n },\n },\n ({ name, title, email }) => {\n const yaml = generateResumeYaml(\n name ?? 'Your Name',\n email ?? 'email@example.com',\n title ?? 'Professional Title',\n );\n return { content: [{ type: 'text' as const, text: yaml }] };\n },\n );\n\n // ── resuml_validate ─────────────────────────────────────────────────\n\n server.registerTool(\n 'resuml_validate',\n {\n title: 'Validate Resume',\n description: 'Validate resume YAML against the JSON Resume schema',\n inputSchema: {\n yaml: z.string().describe('Resume content in YAML format'),\n },\n },\n async ({ yaml }) => {\n suppressStdout();\n try {\n await processResumeData([yaml]);\n restoreStdout();\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ valid: true, errors: [] }, null, 2) }],\n };\n } catch (e: unknown) {\n restoreStdout();\n const message = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ valid: false, errors: [message] }, null, 2) }],\n };\n }\n },\n );\n\n // ── resuml_ats_check ────────────────────────────────────────────────\n\n server.registerTool(\n 'resuml_ats_check',\n {\n title: 'ATS Check',\n description: 'Run ATS (Applicant Tracking System) analysis on a resume, optionally matching against a job description',\n inputSchema: {\n yaml: z.string().describe('Resume content in YAML format'),\n jobDescription: z.string().optional().describe('Job description text to match keywords against'),\n language: z.enum(['en', 'de']).optional().describe('Language for analysis (default: en)'),\n },\n },\n async ({ yaml, jobDescription, language }) => {\n suppressStdout();\n try {\n const resume = await processResumeData([yaml]);\n const result = analyzeAts(resume, {\n language: language ?? 'en',\n jobDescription,\n });\n restoreStdout();\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n } catch (e: unknown) {\n restoreStdout();\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ error: e instanceof Error ? e.message : String(e) }) }],\n isError: true,\n };\n }\n },\n );\n\n // ── resuml_render ───────────────────────────────────────────────────\n\n server.registerTool(\n 'resuml_render',\n {\n title: 'Render Resume',\n description: 'Render a resume to HTML using a specified theme',\n inputSchema: {\n yaml: z.string().describe('Resume content in YAML format'),\n theme: z.string().default('even').describe('Theme name (e.g. even, stackoverflow, elegant, paper, kendall)'),\n locale: z.string().optional().describe('Locale for theme rendering (e.g. en, de)'),\n },\n },\n async (args) => {\n const { yaml, theme } = args;\n const locale = args['locale'];\n suppressStdout();\n try {\n const resume = await processResumeData([yaml]);\n const themeModule = loadTheme(theme, { autoInstall: false });\n const renderOptions: Record<string, unknown> = {};\n if (locale) renderOptions['locale'] = locale;\n const html = await themeModule.render(resume as unknown as Record<string, unknown>, renderOptions);\n restoreStdout();\n return { content: [{ type: 'text' as const, text: html }] };\n } catch (e: unknown) {\n restoreStdout();\n const message = e instanceof Error ? e.message : String(e);\n const hint = message.includes('Cannot find module')\n ? `. Install with: resuml themes --install ${theme}`\n : '';\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ error: message + hint }) }],\n isError: true,\n };\n }\n },\n );\n\n // ── resuml_list_themes ──────────────────────────────────────────────\n\n server.registerTool(\n 'resuml_list_themes',\n {\n title: 'List Themes',\n description: 'List available resume themes with their installation status',\n },\n () => {\n const themes = KNOWN_THEMES.map((t) => ({\n name: t.name,\n package: t.pkg,\n description: t.description,\n installed: isThemeInstalled(t.pkg),\n version: getInstalledVersion(t.pkg),\n }));\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ themes }, null, 2) }],\n };\n },\n );\n\n // ── resuml_export_pdf ───────────────────────────────────────────────\n\n server.registerTool(\n 'resuml_export_pdf',\n {\n title: 'Export PDF',\n description: 'Export a resume as PDF (requires Playwright to be installed)',\n inputSchema: {\n yaml: z.string().describe('Resume content in YAML format'),\n theme: z.string().default('even').describe('Theme name'),\n format: z.enum(['A4', 'Letter']).default('A4').describe('Paper format'),\n locale: z.string().optional().describe('Locale for theme rendering (e.g. en, de)'),\n margin: z.string().optional().describe('Page margins. Single value (e.g. \"10mm\") for all sides, two values (e.g. \"10mm,15mm\") for vertical/horizontal, or four values (e.g. \"10mm,15mm,10mm,15mm\") for top/right/bottom/left'),\n },\n },\n async (args) => {\n const { yaml, theme, format } = args;\n const locale = args['locale'];\n const margin = args['margin'];\n suppressStdout();\n try {\n const resume = await processResumeData([yaml]);\n const themeModule = loadTheme(theme, { autoInstall: false });\n const renderOptions: Record<string, unknown> = {};\n if (locale) renderOptions['locale'] = locale;\n const html = await themeModule.render(resume as unknown as Record<string, unknown>, renderOptions);\n\n let chromium;\n try {\n const pw = await import('playwright');\n chromium = pw.chromium;\n } catch {\n restoreStdout();\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ error: 'Playwright is not installed. Run: npm install playwright' }) }],\n isError: true,\n };\n }\n\n const parsedMargin = parseMargin(margin);\n const browser = await chromium.launch({ headless: true });\n const page = await browser.newPage();\n await page.setContent(html, { waitUntil: 'networkidle' });\n const pdfBuffer = await page.pdf({\n format,\n printBackground: true,\n margin: parsedMargin,\n });\n await browser.close();\n restoreStdout();\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n pdf: Buffer.from(pdfBuffer).toString('base64'),\n encoding: 'base64',\n format,\n }),\n }],\n };\n } catch (e: unknown) {\n restoreStdout();\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ error: e instanceof Error ? e.message : String(e) }) }],\n isError: true,\n };\n }\n },\n );\n\n return server;\n}\n\nfunction parseMargin(margin?: string): Record<string, string> {\n const defaultMargin = { top: '10mm', right: '10mm', bottom: '10mm', left: '10mm' };\n if (!margin) return defaultMargin;\n\n const parts = margin.split(',').map((s) => s.trim());\n if (parts.length === 1 && parts[0]) {\n return { top: parts[0], right: parts[0], bottom: parts[0], left: parts[0] };\n }\n if (parts.length === 2 && parts[0] && parts[1]) {\n return { top: parts[0], right: parts[1], bottom: parts[0], left: parts[1] };\n }\n if (parts.length === 4 && parts[0] && parts[1] && parts[2] && parts[3]) {\n return { top: parts[0], right: parts[1], bottom: parts[2], left: parts[3] };\n }\n return defaultMargin;\n}\n\nexport async function startMcpServer(): Promise<void> {\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n typeof document === 'undefined'\n ? new URL(`file:${__filename}`).href\n : (document.currentScript && document.currentScript.src) ||\n new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","// Placeholder for core logic\n\nimport { parse } from 'yaml';\nimport merge from 'lodash.merge';\nimport { validate } from '@jsonresume/schema';\nimport type { ResumeSchema as Resume } from './types/resume';\n\nexport type { Resume };\n\n/**\n * Merges and validates resume data objects against the JSON Resume schema.\n * @param yamlContents - An array of YAML strings containing resume data.\n * @returns The merged and validated resume data.\n * @throws Error if validation fails.\n */\nexport async function processResumeData(yamlContents: string[]): Promise<Resume> {\n if (yamlContents.length === 0) {\n throw new Error('No YAML content provided for processing.');\n }\n\n // Parse YAML content and filter out invalid objects\n const dataObjects = yamlContents\n .map((content) => {\n try {\n return parse(content) as Partial<Resume>;\n } catch (error) {\n console.warn('Failed to parse YAML content:', error);\n return null;\n }\n })\n .filter((data): data is Partial<Resume> => typeof data === 'object' && data !== null);\n\n if (dataObjects.length === 0) {\n throw new Error('No valid YAML content found after parsing.');\n }\n\n // Custom array merge to ensure arrays are concatenated\n const customizer = (objValue: unknown, srcValue: unknown) => {\n if (Array.isArray(objValue)) {\n return (objValue as unknown[]).concat(srcValue as unknown[]);\n }\n return undefined; // Let lodash handle it\n };\n\n // Merge data: Concatenate arrays, deep merge objects\n const mergedData = dataObjects.reduce((acc, data) => merge(acc, data, customizer), {}) as Resume;\n\n // Validate using the official JSON Resume validator\n return new Promise((resolve, reject) => {\n validate(mergedData, (errors, isValid) => {\n if (!isValid) {\n reject(\n new Error(`Resume data failed schema validation: ${JSON.stringify(errors, null, 2)}`)\n );\n } else {\n resolve(mergedData);\n }\n });\n });\n}\n","export interface LanguageData {\n actionVerbs: string[];\n pronouns: string[];\n stopWords: string[];\n}\n\nconst en: LanguageData = {\n actionVerbs: [\n // Leadership & Management\n 'achieved', 'administered', 'advanced', 'allocated', 'approved', 'assigned',\n 'authorized', 'chaired', 'consolidated', 'coordinated', 'delegated', 'directed',\n 'established', 'executed', 'headed', 'hired', 'hosted', 'led', 'managed',\n 'mentored', 'motivated', 'orchestrated', 'organized', 'oversaw', 'planned',\n 'presided', 'prioritized', 'produced', 'recruited', 'spearheaded', 'supervised',\n // Technical & Engineering\n 'architected', 'automated', 'built', 'coded', 'configured', 'debugged',\n 'deployed', 'designed', 'developed', 'devised', 'engineered', 'implemented',\n 'installed', 'integrated', 'launched', 'maintained', 'migrated', 'modernized',\n 'optimized', 'overhauled', 'programmed', 'prototyped', 'refactored',\n 'reengineered', 'resolved', 'restructured', 'revamped', 'scaled',\n 'standardized', 'streamlined', 'tested', 'troubleshot', 'upgraded',\n // Achievement & Impact\n 'accelerated', 'accomplished', 'boosted', 'completed', 'contributed',\n 'converted', 'decreased', 'delivered', 'doubled', 'earned', 'eliminated',\n 'exceeded', 'expanded', 'expedited', 'generated', 'grew', 'improved',\n 'increased', 'maximized', 'minimized', 'outperformed', 'pioneered',\n 'recovered', 'reduced', 'saved', 'simplified', 'solved', 'surpassed',\n 'transformed', 'tripled',\n // Communication & Collaboration\n 'advised', 'advocated', 'briefed', 'collaborated', 'communicated',\n 'consulted', 'convinced', 'counseled', 'defined', 'demonstrated',\n 'documented', 'educated', 'facilitated', 'guided', 'influenced',\n 'informed', 'instructed', 'liaised', 'negotiated', 'partnered',\n 'persuaded', 'presented', 'promoted', 'proposed', 'published',\n 'recommended', 'represented', 'trained',\n // Analysis & Research\n 'analyzed', 'assessed', 'audited', 'benchmarked', 'calculated',\n 'compared', 'compiled', 'conducted', 'discovered', 'evaluated',\n 'examined', 'explored', 'forecasted', 'identified', 'inspected',\n 'interpreted', 'investigated', 'mapped', 'measured', 'modeled',\n 'monitored', 'quantified', 'researched', 'reviewed', 'surveyed',\n 'synthesized', 'tracked', 'validated', 'verified',\n // Creation & Innovation\n 'conceptualized', 'crafted', 'created', 'customized', 'formulated',\n 'founded', 'initiated', 'innovated', 'introduced', 'invented',\n 'originated', 'shaped',\n ],\n pronouns: ['i', 'me', 'my', 'mine', 'myself', 'we', 'our', 'ours'],\n stopWords: [\n 'a', 'an', 'the', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for',\n 'of', 'with', 'by', 'from', 'is', 'was', 'are', 'were', 'be', 'been',\n 'being', 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would',\n 'could', 'should', 'may', 'might', 'shall', 'can', 'this', 'that',\n 'these', 'those', 'it', 'its', 'as', 'if', 'not', 'no', 'so', 'up',\n 'out', 'about', 'into', 'over', 'after', 'before', 'between', 'under',\n 'above', 'below', 'all', 'each', 'every', 'both', 'few', 'more',\n 'most', 'other', 'some', 'such', 'than', 'too', 'very',\n ],\n};\n\nexport default en;\n","import type { LanguageData } from './en';\n\nconst de: LanguageData = {\n actionVerbs: [\n // Führung & Management\n 'geleitet', 'geführt', 'koordiniert', 'organisiert', 'verwaltet',\n 'delegiert', 'beaufsichtigt', 'betreut', 'eingestellt', 'motiviert',\n 'verantwortet', 'gesteuert', 'überwacht', 'priorisiert', 'geplant',\n // Technik & Entwicklung\n 'entwickelt', 'implementiert', 'programmiert', 'konfiguriert', 'automatisiert',\n 'deployt', 'gebaut', 'entworfen', 'integriert', 'migriert', 'modernisiert',\n 'optimiert', 'refaktoriert', 'skaliert', 'standardisiert', 'getestet',\n 'aufgebaut', 'eingeführt', 'bereitgestellt', 'umgesetzt',\n // Leistung & Ergebnisse\n 'verbessert', 'gesteigert', 'reduziert', 'beschleunigt', 'erreicht',\n 'übertroffen', 'erweitert', 'vereinfacht', 'gelöst', 'transformiert',\n 'erhöht', 'verdoppelt', 'verdreifacht', 'generiert', 'gespart',\n 'maximiert', 'minimiert', 'eliminiert', 'geliefert', 'abgeschlossen',\n // Kommunikation & Zusammenarbeit\n 'beraten', 'präsentiert', 'dokumentiert', 'geschult', 'trainiert',\n 'vermittelt', 'kommuniziert', 'verhandelt', 'zusammengearbeitet',\n 'unterstützt', 'gefördert', 'empfohlen', 'vorgestellt', 'publiziert',\n // Analyse & Forschung\n 'analysiert', 'bewertet', 'evaluiert', 'untersucht', 'erforscht',\n 'identifiziert', 'gemessen', 'überwacht', 'validiert', 'verifiziert',\n 'geprüft', 'verglichen', 'recherchiert', 'quantifiziert',\n // Kreation & Innovation\n 'konzipiert', 'erstellt', 'gestaltet', 'initiiert', 'innoviert',\n 'eingeführt', 'gegründet', 'formuliert',\n ],\n pronouns: ['ich', 'mich', 'mir', 'mein', 'meine', 'meinem', 'meiner', 'meines', 'wir', 'unser', 'unsere'],\n stopWords: [\n 'ein', 'eine', 'einer', 'eines', 'einem', 'der', 'die', 'das', 'den',\n 'dem', 'des', 'und', 'oder', 'aber', 'in', 'an', 'auf', 'zu', 'für',\n 'von', 'mit', 'bei', 'aus', 'ist', 'war', 'sind', 'waren', 'wird',\n 'wurde', 'werden', 'hat', 'hatte', 'haben', 'hatten', 'sein', 'kann',\n 'könnte', 'soll', 'sollte', 'muss', 'musste', 'darf', 'diese',\n 'dieser', 'dieses', 'diesem', 'diesen', 'als', 'wenn', 'nicht',\n 'kein', 'keine', 'so', 'auch', 'noch', 'schon', 'nach', 'vor',\n 'über', 'unter', 'zwischen', 'durch', 'ohne', 'um', 'bis',\n 'alle', 'jede', 'jeder', 'jedes', 'mehr', 'viel', 'sehr',\n ],\n};\n\nexport default de;\n","import en from './en';\nimport de from './de';\nimport type { LanguageData } from './en';\n\nexport type { LanguageData };\n\nconst languages: Record<string, LanguageData> = { en, de };\n\nexport function getLanguageData(language: string): LanguageData {\n return languages[language] ?? languages['en'] ?? en;\n}\n","import type { ResumeSchema } from '../types/resume';\nimport type { AtsCheck } from './types';\nimport { getLanguageData } from './i18n/index';\n\ntype CheckFn = (resume: ResumeSchema, language: string) => AtsCheck;\n\nfunction wordCount(text: string): number {\n return text.trim().split(/\\s+/).filter(Boolean).length;\n}\n\nfunction getFirstWord(text: string): string {\n return text.trim().split(/\\s+/)[0]?.toLowerCase().replace(/[^a-zA-ZäöüßÄÖÜàáâãéèêëíìîïóòôõúùûüñç]/g, '') || '';\n}\n\nconst contactComplete: CheckFn = (resume) => {\n const b = resume.basics;\n const hasName = !!b?.name;\n const hasEmail = !!b?.email;\n const hasPhone = !!b?.phone;\n const hasCity = !!b?.location?.city;\n const fields = [hasName, hasEmail, hasPhone, hasCity];\n const presentCount = fields.filter(Boolean).length;\n const passed = presentCount === fields.length;\n const missing: string[] = [];\n if (!hasName) missing.push('name');\n if (!hasEmail) missing.push('email');\n if (!hasPhone) missing.push('phone');\n if (!hasCity) missing.push('location.city');\n\n return {\n id: 'contact-complete',\n category: 'contact',\n weight: 'high',\n passed,\n score: Math.round((presentCount / fields.length) * 100),\n message: passed\n ? 'Contact information is complete.'\n : `Missing contact fields: ${missing.join(', ')}.`,\n suggestion: passed ? undefined : `Add the following to your basics section: ${missing.join(', ')}.`,\n };\n};\n\nconst hasSummary: CheckFn = (resume) => {\n const summary = resume.basics?.summary?.trim();\n if (!summary) {\n return {\n id: 'has-summary',\n category: 'content',\n weight: 'high',\n passed: false,\n score: 0,\n message: 'No professional summary found.',\n suggestion: 'Add a 2-4 sentence professional summary to your basics section highlighting your experience and key skills.',\n };\n }\n const words = wordCount(summary);\n const tooShort = words < 15;\n const tooLong = words > 100;\n const passed = !tooShort && !tooLong;\n let score = 100;\n if (tooShort) score = Math.round((words / 15) * 60);\n if (tooLong) score = Math.max(60, 100 - (words - 100));\n\n return {\n id: 'has-summary',\n category: 'content',\n weight: 'high',\n passed,\n score,\n message: tooShort\n ? `Summary is too short (${words} words). Aim for 15-100 words.`\n : tooLong\n ? `Summary is too long (${words} words). Aim for 15-100 words.`\n : `Summary length is good (${words} words).`,\n suggestion: tooShort\n ? 'Expand your summary to describe your experience, expertise, and career goals in 15-100 words.'\n : tooLong\n ? 'Shorten your summary to the most impactful 15-100 words. Focus on key achievements and expertise.'\n : undefined,\n };\n};\n\nconst hasLinkedin: CheckFn = (resume) => {\n const profiles = resume.basics?.profiles || [];\n const linkedin = profiles.find(\n (p) => p.network?.toLowerCase() === 'linkedin' || p.url?.toLowerCase().includes('linkedin.com')\n );\n return {\n id: 'has-linkedin',\n category: 'contact',\n weight: 'medium',\n passed: !!linkedin,\n score: linkedin ? 100 : 0,\n message: linkedin ? 'LinkedIn profile found.' : 'No LinkedIn profile found.',\n suggestion: linkedin ? undefined : 'Add a LinkedIn profile to your basics.profiles section.',\n };\n};\n\nconst workHighlights: CheckFn = (resume) => {\n const work = resume.work || [];\n if (work.length === 0) {\n return {\n id: 'work-highlights',\n category: 'content',\n weight: 'high',\n passed: false,\n score: 0,\n message: 'No work experience entries found.',\n suggestion: 'Add work experience entries with highlights describing your accomplishments.',\n };\n }\n const minHighlights = 2;\n const entriesWithEnough = work.filter((w) => (w.highlights?.length || 0) >= minHighlights);\n const passed = entriesWithEnough.length === work.length;\n const score = Math.round((entriesWithEnough.length / work.length) * 100);\n const lacking = work\n .filter((w) => (w.highlights?.length || 0) < minHighlights)\n .map((w) => `\"${w.position || 'Unknown'} at ${w.name || 'Unknown'}\" (${w.highlights?.length || 0} highlights)`);\n\n return {\n id: 'work-highlights',\n category: 'content',\n weight: 'high',\n passed,\n score,\n message: passed\n ? 'All work entries have sufficient highlights.'\n : `Some work entries need more highlights: ${lacking.join('; ')}.`,\n suggestion: passed\n ? undefined\n : `Add at least ${minHighlights} bullet-point highlights to each work entry describing specific accomplishments.`,\n };\n};\n\nconst actionVerbs: CheckFn = (resume, language) => {\n const langData = getLanguageData(language);\n const verbs = new Set(langData.actionVerbs);\n const allHighlights: { text: string; source: string }[] = [];\n\n for (const w of resume.work || []) {\n for (const h of w.highlights || []) {\n allHighlights.push({ text: h, source: `${w.position || ''} at ${w.name || ''}` });\n }\n }\n for (const p of resume.projects || []) {\n for (const h of p.highlights || []) {\n allHighlights.push({ text: h, source: `project \"${p.name || ''}\"` });\n }\n }\n for (const v of resume.volunteer || []) {\n for (const h of v.highlights || []) {\n allHighlights.push({ text: h, source: `volunteer at ${v.organization || ''}` });\n }\n }\n\n if (allHighlights.length === 0) {\n return {\n id: 'action-verbs',\n category: 'content',\n weight: 'high',\n passed: false,\n score: 0,\n message: 'No highlights found to check for action verbs.',\n suggestion: 'Add highlights to your work, project, or volunteer entries starting with strong action verbs.',\n };\n }\n\n const withActionVerb = allHighlights.filter((h) => verbs.has(getFirstWord(h.text)));\n const withoutActionVerb = allHighlights.filter((h) => !verbs.has(getFirstWord(h.text)));\n const passed = withoutActionVerb.length === 0;\n const score = Math.round((withActionVerb.length / allHighlights.length) * 100);\n\n const examples = withoutActionVerb.slice(0, 3).map(\n (h) => `\"${h.text.substring(0, 60)}${h.text.length > 60 ? '...' : ''}\" (${h.source})`\n );\n\n return {\n id: 'action-verbs',\n category: 'content',\n weight: 'high',\n passed,\n score,\n message: passed\n ? 'All highlights start with action verbs.'\n : `${withoutActionVerb.length} of ${allHighlights.length} highlights don't start with an action verb.`,\n suggestion: passed\n ? undefined\n : `Start each highlight with a strong action verb (e.g., \"Developed\", \"Implemented\", \"Led\"). Fix: ${examples.join('; ')}.`,\n };\n};\n\nconst quantifiedImpact: CheckFn = (resume) => {\n const quantPattern = /\\d+%?|\\$[\\d,]+|[\\d,]+\\+?\\s*(users|clients|customers|people|team|members|projects|applications|servers|services|endpoints|requests|transactions)/i;\n const allHighlights: string[] = [];\n\n for (const w of resume.work || []) {\n allHighlights.push(...(w.highlights || []));\n }\n for (const p of resume.projects || []) {\n allHighlights.push(...(p.highlights || []));\n }\n\n if (allHighlights.length === 0) {\n return {\n id: 'quantified-impact',\n category: 'content',\n weight: 'medium',\n passed: false,\n score: 0,\n message: 'No highlights found to check for quantified impact.',\n suggestion: 'Add measurable results to your highlights (e.g., \"Reduced load time by 40%\", \"Managed team of 8\").',\n };\n }\n\n const quantified = allHighlights.filter((h) => quantPattern.test(h));\n const ratio = quantified.length / allHighlights.length;\n // At least 50% of highlights should have numbers\n const passed = ratio >= 0.5;\n const score = Math.min(100, Math.round(ratio * 200)); // 50% = 100 score\n\n return {\n id: 'quantified-impact',\n category: 'content',\n weight: 'medium',\n passed,\n score,\n message: passed\n ? `${quantified.length} of ${allHighlights.length} highlights include quantified results.`\n : `Only ${quantified.length} of ${allHighlights.length} highlights include numbers or metrics.`,\n suggestion: passed\n ? undefined\n : 'Add specific numbers, percentages, or metrics to your highlights (e.g., \"Improved performance by 30%\", \"Managed $2M budget\").',\n };\n};\n\nconst dateConsistency: CheckFn = (resume) => {\n const work = resume.work || [];\n if (work.length < 2) {\n return {\n id: 'date-consistency',\n category: 'structure',\n weight: 'medium',\n passed: true,\n score: 100,\n message: 'Date consistency check passed (fewer than 2 work entries).',\n };\n }\n\n const issues: string[] = [];\n\n // Check that each entry has a startDate\n for (const w of work) {\n if (!w.startDate) {\n issues.push(`\"${w.position || 'Unknown'} at ${w.name || 'Unknown'}\" is missing a start date.`);\n }\n }\n\n // Check for gaps > 6 months between consecutive jobs\n const sorted = [...work]\n .filter((w): w is typeof w & { startDate: string } => Boolean(w.startDate))\n .sort((a, b) => (a.startDate > b.startDate ? 1 : -1));\n\n for (let i = 0; i < sorted.length - 1; i++) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const current = sorted[i]!;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const next = sorted[i + 1]!;\n const endDate = current.endDate ?? current.startDate;\n const gapMs = new Date(next.startDate).getTime() - new Date(endDate).getTime();\n const gapMonths = gapMs / (1000 * 60 * 60 * 24 * 30);\n\n if (gapMonths > 6) {\n issues.push(\n `Gap of ~${Math.round(gapMonths)} months between \"${current.name ?? 'Unknown'}\" (ended ${endDate}) and \"${next.name ?? 'Unknown'}\" (started ${next.startDate}).`\n );\n }\n }\n\n const passed = issues.length === 0;\n return {\n id: 'date-consistency',\n category: 'structure',\n weight: 'medium',\n passed,\n score: passed ? 100 : Math.max(0, 100 - issues.length * 25),\n message: passed\n ? 'Work experience dates are consistent with no major gaps.'\n : `Date issues found: ${issues.join(' ')}`,\n suggestion: passed\n ? undefined\n : 'Ensure all work entries have start dates. If there are employment gaps, consider adding freelance, volunteer, or education entries to fill them.',\n };\n};\n\nconst skillsPopulated: CheckFn = (resume) => {\n const skills = resume.skills || [];\n const minCategories = 3;\n const categoriesWithKeywords = skills.filter((s) => s.keywords && s.keywords.length > 0);\n const passed = categoriesWithKeywords.length >= minCategories;\n const score = Math.min(100, Math.round((categoriesWithKeywords.length / minCategories) * 100));\n\n return {\n id: 'skills-populated',\n category: 'structure',\n weight: 'medium',\n passed,\n score,\n message: passed\n ? `${categoriesWithKeywords.length} skill categories with keywords found.`\n : `Only ${categoriesWithKeywords.length} skill categories with keywords found (need at least ${minCategories}).`,\n suggestion: passed\n ? undefined\n : `Add at least ${minCategories} skill categories with specific keywords (e.g., \"Languages: TypeScript, Python\", \"Frameworks: React, Node.js\").`,\n };\n};\n\nconst educationComplete: CheckFn = (resume) => {\n const education = resume.education || [];\n if (education.length === 0) {\n return {\n id: 'education-complete',\n category: 'structure',\n weight: 'low',\n passed: false,\n score: 0,\n message: 'No education entries found.',\n suggestion: 'Add at least one education entry with institution, area, and studyType.',\n };\n }\n\n const complete = education.filter((e) => e.institution && e.area && e.studyType);\n const passed = complete.length === education.length;\n const score = Math.round((complete.length / education.length) * 100);\n const incomplete = education\n .filter((e) => !e.institution || !e.area || !e.studyType)\n .map((e) => {\n const missing: string[] = [];\n if (!e.institution) missing.push('institution');\n if (!e.area) missing.push('area');\n if (!e.studyType) missing.push('studyType');\n return `\"${e.institution || 'Unknown'}\" missing: ${missing.join(', ')}`;\n });\n\n return {\n id: 'education-complete',\n category: 'structure',\n weight: 'low',\n passed,\n score,\n message: passed\n ? 'All education entries are complete.'\n : `Incomplete education entries: ${incomplete.join('; ')}.`,\n suggestion: passed\n ? undefined\n : 'Ensure each education entry has institution, area (field of study), and studyType (degree type).',\n };\n};\n\nconst noPronouns: CheckFn = (resume, language) => {\n const langData = getLanguageData(language);\n const pronounSet = new Set(langData.pronouns);\n\n const textBlocks: { text: string; source: string }[] = [];\n\n if (resume.basics?.summary) {\n textBlocks.push({ text: resume.basics.summary, source: 'summary' });\n }\n for (const w of resume.work || []) {\n if (w.summary) textBlocks.push({ text: w.summary, source: `work summary (${w.name || 'Unknown'})` });\n for (const h of w.highlights || []) {\n textBlocks.push({ text: h, source: `work highlight (${w.name || 'Unknown'})` });\n }\n }\n for (const p of resume.projects || []) {\n if (p.description) textBlocks.push({ text: p.description, source: `project (${p.name || 'Unknown'})` });\n for (const h of p.highlights || []) {\n textBlocks.push({ text: h, source: `project highlight (${p.name || 'Unknown'})` });\n }\n }\n\n const found: { pronoun: string; source: string }[] = [];\n for (const block of textBlocks) {\n const words = block.text.toLowerCase().split(/\\s+/);\n for (const word of words) {\n const clean = word.replace(/[^a-zA-ZäöüßÄÖÜ]/g, '');\n if (pronounSet.has(clean)) {\n found.push({ pronoun: clean, source: block.source });\n }\n }\n }\n\n const passed = found.length === 0;\n const uniquePronouns = [...new Set(found.map((f) => f.pronoun))];\n const examples = found.slice(0, 3).map((f) => `\"${f.pronoun}\" in ${f.source}`);\n\n return {\n id: 'no-pronouns',\n category: 'content',\n weight: 'medium',\n passed,\n score: passed ? 100 : Math.max(0, 100 - found.length * 15),\n message: passed\n ? 'No first-person pronouns found in resume content.'\n : `Found ${found.length} first-person pronoun(s): ${uniquePronouns.join(', ')}.`,\n suggestion: passed\n ? undefined\n : `Remove first-person pronouns from your resume. Instead of \"I managed a team\", write \"Managed a team\". Found: ${examples.join('; ')}.`,\n };\n};\n\nconst sectionCompleteness: CheckFn = (resume) => {\n const required = ['basics', 'work', 'education', 'skills'] as const;\n const present = required.filter((section) => {\n const value = resume[section];\n if (Array.isArray(value)) return value.length > 0;\n return value !== undefined;\n });\n const missing = required.filter((s) => !present.includes(s));\n const passed = missing.length === 0;\n\n return {\n id: 'section-completeness',\n category: 'structure',\n weight: 'low',\n passed,\n score: Math.round((present.length / required.length) * 100),\n message: passed\n ? 'All essential resume sections are present.'\n : `Missing essential sections: ${missing.join(', ')}.`,\n suggestion: passed ? undefined : `Add the following sections to your resume: ${missing.join(', ')}.`,\n };\n};\n\nexport const allChecks: CheckFn[] = [\n contactComplete,\n hasSummary,\n hasLinkedin,\n workHighlights,\n actionVerbs,\n quantifiedImpact,\n dateConsistency,\n skillsPopulated,\n educationComplete,\n noPronouns,\n sectionCompleteness,\n];\n\nexport function runGenericChecks(resume: ResumeSchema, language: string): AtsCheck[] {\n return allChecks.map((check) => check(resume, language));\n}\n","import type { ResumeSchema } from '../types/resume';\nimport type { AtsKeywordMatch } from './types';\nimport { getLanguageData } from './i18n/index';\n\n/**\n * Tokenize text into normalized words, removing stop words and short tokens.\n */\nfunction tokenize(text: string, stopWords: Set<string>): string[] {\n return text\n .toLowerCase()\n .replace(/[^a-zA-Z0-9äöüßÄÖÜàáâãéèêëíìîïóòôõúùûüñç\\s-]/g, ' ')\n .split(/\\s+/)\n .filter((word) => word.length > 2 && !stopWords.has(word));\n}\n\n/**\n * Simple stemmer: strips common suffixes for rough normalization.\n * This avoids the heavy `natural` dependency while still providing useful matching.\n */\nfunction simpleStem(word: string, language: string): string {\n if (language === 'de') {\n return word\n .replace(/(ung|heit|keit|schaft|lich|isch|iert|ieren|tion|ment)$/, '')\n .replace(/(en|er|es|em|te|st)$/, '');\n }\n // English\n return word\n .replace(/(ment|ness|tion|sion|ance|ence|ity|ing|ous|ive|able|ible|ful|less)$/, '')\n .replace(/(ies)$/, 'y')\n .replace(/(es|ed|s)$/, '');\n}\n\n/**\n * Extract all text content from a resume.\n */\nfunction extractResumeText(resume: ResumeSchema): string {\n const parts: string[] = [];\n\n if (resume.basics?.summary) parts.push(resume.basics.summary);\n if (resume.basics?.label) parts.push(resume.basics.label);\n\n for (const w of resume.work || []) {\n if (w.position) parts.push(w.position);\n if (w.summary) parts.push(w.summary);\n parts.push(...(w.highlights || []));\n }\n for (const s of resume.skills || []) {\n if (s.name) parts.push(s.name);\n parts.push(...(s.keywords || []));\n }\n for (const p of resume.projects || []) {\n if (p.name) parts.push(p.name);\n if (p.description) parts.push(p.description);\n parts.push(...(p.highlights || []));\n }\n for (const e of resume.education || []) {\n if (e.area) parts.push(e.area);\n if (e.studyType) parts.push(e.studyType);\n parts.push(...(e.courses || []));\n }\n for (const c of resume.certificates || []) {\n if (c.name) parts.push(c.name);\n }\n\n return parts.join(' ');\n}\n\n/**\n * Build a TF (term frequency) map from tokenized text.\n */\nfunction buildTfMap(tokens: string[]): Map<string, number> {\n const tf = new Map<string, number>();\n for (const token of tokens) {\n tf.set(token, (tf.get(token) || 0) + 1);\n }\n return tf;\n}\n\n/**\n * Extract the most important keywords from a job description using TF-based ranking.\n * Words that appear more frequently (and aren't stop words) are considered more important.\n */\nfunction extractKeywords(text: string, language: string, maxKeywords: number = 30): string[] {\n const langData = getLanguageData(language);\n const stopWords = new Set(langData.stopWords);\n const tokens = tokenize(text, stopWords);\n const stemmed = tokens.map((t) => simpleStem(t, language));\n const tf = buildTfMap(stemmed);\n\n // Keep a mapping from stem → original token (first occurrence)\n const stemToOriginal = new Map<string, string>();\n for (let i = 0; i < tokens.length; i++) {\n const stem = stemmed[i] ?? '';\n if (!stemToOriginal.has(stem)) {\n stemToOriginal.set(stem, tokens[i] ?? '');\n }\n }\n\n // Sort by frequency, take top N\n return [...tf.entries()]\n .filter(([stem]) => stem.length > 2)\n .sort((a, b) => b[1] - a[1])\n .slice(0, maxKeywords)\n .map(([stem]) => stemToOriginal.get(stem) || stem);\n}\n\n/**\n * Match job description keywords against resume content.\n * Uses stemmed matching for fuzzy equivalence.\n */\nexport function matchJobDescription(\n resume: ResumeSchema,\n jobDescription: string,\n language: string = 'en'\n): AtsKeywordMatch {\n const langData = getLanguageData(language);\n const stopWords = new Set(langData.stopWords);\n\n // Extract keywords from JD\n const jdKeywords = extractKeywords(jobDescription, language);\n\n // Build stemmed set from resume content\n const resumeText = extractResumeText(resume);\n const resumeTokens = tokenize(resumeText, stopWords);\n const resumeStems = new Set(resumeTokens.map((t) => simpleStem(t, language)));\n\n // Also include raw tokens for exact matching (handles acronyms, tool names)\n const resumeTokenSet = new Set(resumeTokens);\n\n // Match\n const matched: string[] = [];\n const missing: string[] = [];\n\n for (const keyword of jdKeywords) {\n const stem = simpleStem(keyword, language);\n if (resumeStems.has(stem) || resumeTokenSet.has(keyword.toLowerCase())) {\n matched.push(keyword);\n } else {\n missing.push(keyword);\n }\n }\n\n const matchPercentage = jdKeywords.length > 0\n ? Math.round((matched.length / jdKeywords.length) * 100)\n : 0;\n\n return { matched, missing, matchPercentage };\n}\n","import type { AtsCheck, AtsRating } from './types';\n\nconst weightMultiplier: Record<string, number> = {\n high: 3,\n medium: 2,\n low: 1,\n};\n\n/**\n * Calculate a weighted ATS score from a set of checks.\n */\nexport function calculateScore(checks: AtsCheck[]): number {\n if (checks.length === 0) return 0;\n\n let weightedSum = 0;\n let totalWeight = 0;\n\n for (const check of checks) {\n const mult = weightMultiplier[check.weight] || 1;\n weightedSum += check.score * mult;\n totalWeight += 100 * mult;\n }\n\n return totalWeight > 0 ? Math.round((weightedSum / totalWeight) * 100) : 0;\n}\n\n/**\n * Calculate a combined score from generic checks and optional JD matching.\n */\nexport function calculateCombinedScore(genericScore: number, jdMatchPercentage?: number): number {\n if (jdMatchPercentage === undefined) return genericScore;\n return Math.round(genericScore * 0.6 + jdMatchPercentage * 0.4);\n}\n\n/**\n * Map a numeric score to a human-readable rating.\n */\nexport function scoreToRating(score: number): AtsRating {\n if (score >= 90) return 'excellent';\n if (score >= 75) return 'good';\n if (score >= 60) return 'needs-work';\n return 'poor';\n}\n\n/**\n * Generate a summary string for a given score and rating.\n */\nexport function generateSummary(score: number, rating: AtsRating, hasJd: boolean): string {\n const ratingLabel = {\n excellent: 'Excellent',\n good: 'Good',\n 'needs-work': 'Needs Work',\n poor: 'Poor',\n }[rating];\n\n const base = `ATS Score: ${score}/100 (${ratingLabel})`;\n if (hasJd) {\n return `${base} — includes job description keyword matching.`;\n }\n return `${base} — based on resume structure and content best practices.`;\n}\n","import type { ResumeSchema } from '../types/resume';\nimport type { AtsResult, AtsOptions } from './types';\nimport { runGenericChecks } from './genericChecks';\nimport { matchJobDescription } from './jdMatcher';\nimport { calculateScore, calculateCombinedScore, scoreToRating, generateSummary } from './scoring';\n\n/**\n * Run ATS analysis on a resume.\n *\n * Performs deterministic, offline checks:\n * 1. Generic best-practice checks (contact, content, structure)\n * 2. Optional job-description keyword matching\n *\n * @param resume - Validated resume data\n * @param options - ATS analysis options\n * @returns Full ATS analysis result with score, checks, and suggestions\n */\nexport function analyzeAts(resume: ResumeSchema, options: AtsOptions = {}): AtsResult {\n const language = options.language || 'en';\n\n // Run generic checks\n const checks = runGenericChecks(resume, language);\n const genericScore = calculateScore(checks);\n\n // Run JD matching if provided\n let keywords;\n if (options.jobDescription) {\n keywords = matchJobDescription(resume, options.jobDescription, language);\n }\n\n // Calculate combined score\n const finalScore = calculateCombinedScore(genericScore, keywords?.matchPercentage);\n const rating = scoreToRating(finalScore);\n const summary = generateSummary(finalScore, rating, !!keywords);\n\n return {\n score: finalScore,\n rating,\n checks,\n keywords,\n summary,\n };\n}\n\nexport type { AtsResult, AtsOptions, AtsCheck, AtsKeywordMatch } from './types';\n","import { execFileSync } from 'child_process';\nimport { createRequire } from 'module';\n\nconst require = createRequire(import.meta.url);\n\nexport interface ThemeModule {\n render: (resume: Record<string, unknown>, options?: Record<string, unknown>) => string | Promise<string>;\n}\n\n/**\n * Install a theme package using npm\n * @param packageName The npm package name to install\n */\nfunction installTheme(packageName: string): void {\n try {\n execFileSync('npm', ['install', packageName], {\n stdio: ['inherit', 'pipe', 'pipe'],\n encoding: 'utf8',\n });\n } catch (error) {\n throw new Error(`Failed to install ${packageName}: ${(error as Error).message}`);\n }\n}\n\n/**\n * Load a theme module by name\n * @param themeName The name of the theme to load\n * @param options Optional settings (autoInstall: boolean)\n * @returns The loaded theme module\n */\nexport function loadTheme(themeName: string, options?: { autoInstall?: boolean }): ThemeModule {\n let jsonResumeThemeName: string;\n let nativeThemeName: string;\n const autoInstall = options?.autoInstall !== false;\n\n try {\n // Try loading as a JSON Resume theme\n jsonResumeThemeName = themeName.startsWith('jsonresume-theme-')\n ? themeName\n : `jsonresume-theme-${themeName}`;\n\n try {\n // Use require for CommonJS modules\n return require(jsonResumeThemeName) as ThemeModule;\n } catch (_jsonResumeError) {\n // If not found as JSON Resume theme, try as native theme\n nativeThemeName = `@resuml/theme-${themeName}`;\n try {\n return require(nativeThemeName) as ThemeModule;\n } catch (_nativeError) {\n if (!autoInstall) {\n throw new Error(\n `Theme package ${jsonResumeThemeName} or ${nativeThemeName} not found in node_modules.\\n` +\n `Please install the theme package manually.`\n );\n }\n // Both attempts failed - auto-install the theme\n console.log(`📦 Theme ${jsonResumeThemeName} not found. Installing...`);\n try {\n installTheme(jsonResumeThemeName);\n console.log(`✅ Successfully installed ${jsonResumeThemeName}`);\n // Try requiring again after installation\n return require(jsonResumeThemeName) as ThemeModule;\n } catch (installError) {\n throw new Error(\n `Failed to auto-install theme ${jsonResumeThemeName}: ${\n (installError as Error).message\n }`\n );\n }\n }\n }\n } catch (error) {\n // Re-throw if it's already our custom error\n if (error instanceof Error && error.message.includes('Failed to auto-install')) {\n throw error;\n }\n throw new Error(`Theme package ${themeName} not found`);\n }\n}\n","export function generateResumeYaml(name: string, email: string, label: string): string {\n return `# =============================================================================\n# Resume - Generated by resuml\n# Documentation: https://github.com/phoinixi/resuml\n# Schema: https://jsonresume.org/schema/\n# =============================================================================\n\n# --- Basic Information ---\nbasics:\n name: '${name}'\n label: '${label}'\n # image: 'https://example.com/photo.jpg'\n email: '${email}'\n # phone: '+1-555-123-4567'\n # url: 'https://yourwebsite.com'\n summary: >-\n Write a short professional summary here.\n This supports multi-line strings in YAML.\n location:\n # address: '123 Main Street'\n # postalCode: '12345'\n city: 'Your City'\n countryCode: 'US'\n # region: 'Your State'\n profiles:\n - network: 'LinkedIn'\n username: 'your-username'\n url: 'https://linkedin.com/in/your-username'\n - network: 'GitHub'\n username: 'your-username'\n url: 'https://github.com/your-username'\n\n# --- Work Experience ---\nwork:\n - name: 'Company Name'\n position: 'Job Title'\n url: 'https://company.com'\n startDate: '2020-01-01'\n # endDate: '2023-12-31' # Omit for current position\n summary: 'Brief description of your role and responsibilities.'\n highlights:\n - 'Key achievement or responsibility'\n - 'Another notable accomplishment'\n\n# --- Education ---\neducation:\n - institution: 'University Name'\n url: 'https://university.edu'\n area: 'Field of Study'\n studyType: 'Bachelor of Science'\n startDate: '2014-09-01'\n endDate: '2018-06-01'\n # score: '3.8'\n courses:\n - 'Relevant Course 1'\n - 'Relevant Course 2'\n\n# --- Skills ---\nskills:\n - name: 'Programming Languages'\n level: 'Expert'\n keywords:\n - 'JavaScript'\n - 'TypeScript'\n - 'Python'\n - name: 'Frameworks'\n level: 'Advanced'\n keywords:\n - 'React'\n - 'Node.js'\n\n# --- Projects ---\n# projects:\n# - name: 'Project Name'\n# description: 'Brief project description'\n# highlights:\n# - 'Key feature or result'\n# keywords:\n# - 'Technology Used'\n# startDate: '2023-01-01'\n# endDate: '2023-06-30'\n# url: 'https://github.com/you/project'\n# roles:\n# - 'Developer'\n# type: 'application'\n\n# --- Languages ---\n# languages:\n# - language: 'English'\n# fluency: 'Native speaker'\n# - language: 'Spanish'\n# fluency: 'Professional working proficiency'\n\n# --- Interests ---\n# interests:\n# - name: 'Open Source'\n# keywords:\n# - 'Contributing'\n# - 'Community'\n\n# --- References ---\n# references:\n# - name: 'Jane Smith'\n# reference: 'It was a pleasure working with...'\n\n# --- Awards ---\n# awards:\n# - title: 'Award Name'\n# date: '2023-01-01'\n# awarder: 'Organization'\n# summary: 'Description of the award'\n\n# --- Certificates ---\n# certificates:\n# - name: 'Certificate Name'\n# date: '2023-01-01'\n# issuer: 'Issuing Organization'\n# url: 'https://example.com/cert'\n\n# --- Publications ---\n# publications:\n# - name: 'Publication Title'\n# publisher: 'Publisher'\n# releaseDate: '2023-01-01'\n# url: 'https://example.com/publication'\n# summary: 'Brief description'\n\n# --- Volunteer ---\n# volunteers:\n# - organization: 'Organization Name'\n# position: 'Volunteer Role'\n# url: 'https://organization.com'\n# startDate: '2022-01-01'\n# summary: 'Description of volunteer work'\n# highlights:\n# - 'Notable contribution'\n`;\n}\n","import { createRequire } from 'module';\n\nexport interface ThemeInfo {\n name: string;\n pkg: string;\n description: string;\n}\n\nexport const KNOWN_THEMES: ThemeInfo[] = [\n { name: 'stackoverflow', pkg: 'jsonresume-theme-stackoverflow', description: 'Stack Overflow inspired theme' },\n { name: 'elegant', pkg: 'jsonresume-theme-elegant', description: 'Elegant and professional' },\n { name: 'react', pkg: 'jsonresume-theme-react', description: 'Built with React components' },\n { name: 'even', pkg: 'jsonresume-theme-even', description: 'Clean and minimal' },\n { name: 'kendall', pkg: 'jsonresume-theme-kendall', description: 'Simple and clean layout' },\n { name: 'macchiato', pkg: 'jsonresume-theme-macchiato', description: 'Beautiful and modern' },\n { name: 'flat', pkg: 'jsonresume-theme-flat', description: 'Flat design theme' },\n { name: 'class', pkg: 'jsonresume-theme-class', description: 'Classic professional look' },\n { name: 'short', pkg: 'jsonresume-theme-short', description: 'Compact single-page resume' },\n { name: 'spartan', pkg: 'jsonresume-theme-spartan', description: 'Minimalist Spartan design' },\n { name: 'paper', pkg: 'jsonresume-theme-paper', description: 'Paper-like clean design' },\n { name: 'onepage', pkg: 'jsonresume-theme-onepage', description: 'One page resume layout' },\n];\n\nexport function isThemeInstalled(pkg: string): boolean {\n try {\n const req = createRequire(process.cwd() + '/');\n req.resolve(pkg);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getInstalledVersion(pkg: string): string | null {\n try {\n const req = createRequire(process.cwd() + '/');\n const pkgJson = req(`${pkg}/package.json`) as { version?: string };\n return pkgJson.version ?? null;\n } catch {\n return null;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKA,IAAM,mBAAmB,MACvB,OAAO,aAAa,cAChB,IAAI,IAAI,QAAQ,UAAU,EAAE,EAAE,OAC7B,SAAS,iBAAiB,SAAS,cAAc,OAClD,IAAI,IAAI,WAAW,SAAS,OAAO,EAAE;AAEpC,IAAM,gBAAgC,iCAAiB;;;ADX9D,iBAA0B;AAC1B,mBAAqC;AACrC,iBAAkB;;;AEAlB,kBAAsB;AACtB,oBAAkB;AAClB,oBAAyB;AAWzB,eAAsB,kBAAkB,cAAyC;AAC/E,MAAI,aAAa,WAAW,GAAG;AAC7B,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AAGA,QAAM,cAAc,aACjB,IAAI,CAAC,YAAY;AAChB,QAAI;AACF,iBAAO,mBAAM,OAAO;AAAA,IACtB,SAAS,OAAO;AACd,cAAQ,KAAK,iCAAiC,KAAK;AACnD,aAAO;AAAA,IACT;AAAA,EACF,CAAC,EACA,OAAO,CAAC,SAAkC,OAAO,SAAS,YAAY,SAAS,IAAI;AAEtF,MAAI,YAAY,WAAW,GAAG;AAC5B,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAGA,QAAM,aAAa,CAAC,UAAmB,aAAsB;AAC3D,QAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,aAAQ,SAAuB,OAAO,QAAqB;AAAA,IAC7D;AACA,WAAO;AAAA,EACT;AAGA,QAAM,aAAa,YAAY,OAAO,CAAC,KAAK,aAAS,cAAAA,SAAM,KAAK,MAAM,UAAU,GAAG,CAAC,CAAC;AAGrF,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,gCAAS,YAAY,CAAC,QAAQ,YAAY;AACxC,UAAI,CAAC,SAAS;AACZ;AAAA,UACE,IAAI,MAAM,yCAAyC,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC,EAAE;AAAA,QACtF;AAAA,MACF,OAAO;AACL,gBAAQ,UAAU;AAAA,MACpB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;;;ACrDA,IAAM,KAAmB;AAAA,EACvB,aAAa;AAAA;AAAA,IAEX;AAAA,IAAY;AAAA,IAAgB;AAAA,IAAY;AAAA,IAAa;AAAA,IAAY;AAAA,IACjE;AAAA,IAAc;AAAA,IAAW;AAAA,IAAgB;AAAA,IAAe;AAAA,IAAa;AAAA,IACrE;AAAA,IAAe;AAAA,IAAY;AAAA,IAAU;AAAA,IAAS;AAAA,IAAU;AAAA,IAAO;AAAA,IAC/D;AAAA,IAAY;AAAA,IAAa;AAAA,IAAgB;AAAA,IAAa;AAAA,IAAW;AAAA,IACjE;AAAA,IAAY;AAAA,IAAe;AAAA,IAAY;AAAA,IAAa;AAAA,IAAe;AAAA;AAAA,IAEnE;AAAA,IAAe;AAAA,IAAa;AAAA,IAAS;AAAA,IAAS;AAAA,IAAc;AAAA,IAC5D;AAAA,IAAY;AAAA,IAAY;AAAA,IAAa;AAAA,IAAW;AAAA,IAAc;AAAA,IAC9D;AAAA,IAAa;AAAA,IAAc;AAAA,IAAY;AAAA,IAAc;AAAA,IAAY;AAAA,IACjE;AAAA,IAAa;AAAA,IAAc;AAAA,IAAc;AAAA,IAAc;AAAA,IACvD;AAAA,IAAgB;AAAA,IAAY;AAAA,IAAgB;AAAA,IAAY;AAAA,IACxD;AAAA,IAAgB;AAAA,IAAe;AAAA,IAAU;AAAA,IAAe;AAAA;AAAA,IAExD;AAAA,IAAe;AAAA,IAAgB;AAAA,IAAW;AAAA,IAAa;AAAA,IACvD;AAAA,IAAa;AAAA,IAAa;AAAA,IAAa;AAAA,IAAW;AAAA,IAAU;AAAA,IAC5D;AAAA,IAAY;AAAA,IAAY;AAAA,IAAa;AAAA,IAAa;AAAA,IAAQ;AAAA,IAC1D;AAAA,IAAa;AAAA,IAAa;AAAA,IAAa;AAAA,IAAgB;AAAA,IACvD;AAAA,IAAa;AAAA,IAAW;AAAA,IAAS;AAAA,IAAc;AAAA,IAAU;AAAA,IACzD;AAAA,IAAe;AAAA;AAAA,IAEf;AAAA,IAAW;AAAA,IAAa;AAAA,IAAW;AAAA,IAAgB;AAAA,IACnD;AAAA,IAAa;AAAA,IAAa;AAAA,IAAa;AAAA,IAAW;AAAA,IAClD;AAAA,IAAc;AAAA,IAAY;AAAA,IAAe;AAAA,IAAU;AAAA,IACnD;AAAA,IAAY;AAAA,IAAc;AAAA,IAAW;AAAA,IAAc;AAAA,IACnD;AAAA,IAAa;AAAA,IAAa;AAAA,IAAY;AAAA,IAAY;AAAA,IAClD;AAAA,IAAe;AAAA,IAAe;AAAA;AAAA,IAE9B;AAAA,IAAY;AAAA,IAAY;AAAA,IAAW;AAAA,IAAe;AAAA,IAClD;AAAA,IAAY;AAAA,IAAY;AAAA,IAAa;AAAA,IAAc;AAAA,IACnD;AAAA,IAAY;AAAA,IAAY;AAAA,IAAc;AAAA,IAAc;AAAA,IACpD;AAAA,IAAe;AAAA,IAAgB;AAAA,IAAU;AAAA,IAAY;AAAA,IACrD;AAAA,IAAa;AAAA,IAAc;AAAA,IAAc;AAAA,IAAY;AAAA,IACrD;AAAA,IAAe;AAAA,IAAW;AAAA,IAAa;AAAA;AAAA,IAEvC;AAAA,IAAkB;AAAA,IAAW;AAAA,IAAW;AAAA,IAAc;AAAA,IACtD;AAAA,IAAW;AAAA,IAAa;AAAA,IAAa;AAAA,IAAc;AAAA,IACnD;AAAA,IAAc;AAAA,EAChB;AAAA,EACA,UAAU,CAAC,KAAK,MAAM,MAAM,QAAQ,UAAU,MAAM,OAAO,MAAM;AAAA,EACjE,WAAW;AAAA,IACT;AAAA,IAAK;AAAA,IAAM;AAAA,IAAO;AAAA,IAAO;AAAA,IAAM;AAAA,IAAO;AAAA,IAAM;AAAA,IAAM;AAAA,IAAM;AAAA,IAAM;AAAA,IAC9D;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAM;AAAA,IAAO;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAM;AAAA,IAC9D;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAO;AAAA,IAAO;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAO;AAAA,IAAQ;AAAA,IAC5D;AAAA,IAAS;AAAA,IAAU;AAAA,IAAO;AAAA,IAAS;AAAA,IAAS;AAAA,IAAO;AAAA,IAAQ;AAAA,IAC3D;AAAA,IAAS;AAAA,IAAS;AAAA,IAAM;AAAA,IAAO;AAAA,IAAM;AAAA,IAAM;AAAA,IAAO;AAAA,IAAM;AAAA,IAAM;AAAA,IAC9D;AAAA,IAAO;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAU;AAAA,IAAW;AAAA,IAC9D;AAAA,IAAS;AAAA,IAAS;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAO;AAAA,IACzD;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAO;AAAA,EAClD;AACF;AAEA,IAAO,aAAQ;;;AC1Df,IAAM,KAAmB;AAAA,EACvB,aAAa;AAAA;AAAA,IAEX;AAAA,IAAY;AAAA,IAAW;AAAA,IAAe;AAAA,IAAe;AAAA,IACrD;AAAA,IAAa;AAAA,IAAiB;AAAA,IAAW;AAAA,IAAe;AAAA,IACxD;AAAA,IAAgB;AAAA,IAAa;AAAA,IAAa;AAAA,IAAe;AAAA;AAAA,IAEzD;AAAA,IAAc;AAAA,IAAiB;AAAA,IAAgB;AAAA,IAAgB;AAAA,IAC/D;AAAA,IAAW;AAAA,IAAU;AAAA,IAAa;AAAA,IAAc;AAAA,IAAY;AAAA,IAC5D;AAAA,IAAa;AAAA,IAAgB;AAAA,IAAY;AAAA,IAAkB;AAAA,IAC3D;AAAA,IAAa;AAAA,IAAc;AAAA,IAAkB;AAAA;AAAA,IAE7C;AAAA,IAAc;AAAA,IAAc;AAAA,IAAa;AAAA,IAAgB;AAAA,IACzD;AAAA,IAAe;AAAA,IAAa;AAAA,IAAe;AAAA,IAAU;AAAA,IACrD;AAAA,IAAU;AAAA,IAAc;AAAA,IAAgB;AAAA,IAAa;AAAA,IACrD;AAAA,IAAa;AAAA,IAAa;AAAA,IAAc;AAAA,IAAa;AAAA;AAAA,IAErD;AAAA,IAAW;AAAA,IAAe;AAAA,IAAgB;AAAA,IAAY;AAAA,IACtD;AAAA,IAAc;AAAA,IAAgB;AAAA,IAAc;AAAA,IAC5C;AAAA,IAAe;AAAA,IAAa;AAAA,IAAa;AAAA,IAAe;AAAA;AAAA,IAExD;AAAA,IAAc;AAAA,IAAY;AAAA,IAAa;AAAA,IAAc;AAAA,IACrD;AAAA,IAAiB;AAAA,IAAY;AAAA,IAAa;AAAA,IAAa;AAAA,IACvD;AAAA,IAAW;AAAA,IAAc;AAAA,IAAgB;AAAA;AAAA,IAEzC;AAAA,IAAc;AAAA,IAAY;AAAA,IAAa;AAAA,IAAa;AAAA,IACpD;AAAA,IAAc;AAAA,IAAa;AAAA,EAC7B;AAAA,EACA,UAAU,CAAC,OAAO,QAAQ,OAAO,QAAQ,SAAS,UAAU,UAAU,UAAU,OAAO,SAAS,QAAQ;AAAA,EACxG,WAAW;AAAA,IACT;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAS;AAAA,IAAS;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAC/D;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAM;AAAA,IAAM;AAAA,IAAO;AAAA,IAAM;AAAA,IAC9D;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAS;AAAA,IAC3D;AAAA,IAAS;AAAA,IAAU;AAAA,IAAO;AAAA,IAAS;AAAA,IAAS;AAAA,IAAU;AAAA,IAAQ;AAAA,IAC9D;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAQ;AAAA,IACtD;AAAA,IAAU;AAAA,IAAU;AAAA,IAAU;AAAA,IAAU;AAAA,IAAO;AAAA,IAAQ;AAAA,IACvD;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAQ;AAAA,IACxD;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAY;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAM;AAAA,IACpD;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAQ;AAAA,EACpD;AACF;AAEA,IAAO,aAAQ;;;ACtCf,IAAM,YAA0C,EAAE,gBAAI,eAAG;AAElD,SAAS,gBAAgB,UAAgC;AAC9D,SAAO,UAAU,QAAQ,KAAK,UAAU,IAAI,KAAK;AACnD;;;ACJA,SAAS,UAAU,MAAsB;AACvC,SAAO,KAAK,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO,EAAE;AAClD;AAEA,SAAS,aAAa,MAAsB;AAC1C,SAAO,KAAK,KAAK,EAAE,MAAM,KAAK,EAAE,CAAC,GAAG,YAAY,EAAE,QAAQ,2CAA2C,EAAE,KAAK;AAC9G;AAEA,IAAM,kBAA2B,CAAC,WAAW;AAC3C,QAAM,IAAI,OAAO;AACjB,QAAM,UAAU,CAAC,CAAC,GAAG;AACrB,QAAM,WAAW,CAAC,CAAC,GAAG;AACtB,QAAM,WAAW,CAAC,CAAC,GAAG;AACtB,QAAM,UAAU,CAAC,CAAC,GAAG,UAAU;AAC/B,QAAM,SAAS,CAAC,SAAS,UAAU,UAAU,OAAO;AACpD,QAAM,eAAe,OAAO,OAAO,OAAO,EAAE;AAC5C,QAAM,SAAS,iBAAiB,OAAO;AACvC,QAAM,UAAoB,CAAC;AAC3B,MAAI,CAAC,QAAS,SAAQ,KAAK,MAAM;AACjC,MAAI,CAAC,SAAU,SAAQ,KAAK,OAAO;AACnC,MAAI,CAAC,SAAU,SAAQ,KAAK,OAAO;AACnC,MAAI,CAAC,QAAS,SAAQ,KAAK,eAAe;AAE1C,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,KAAK,MAAO,eAAe,OAAO,SAAU,GAAG;AAAA,IACtD,SAAS,SACL,qCACA,2BAA2B,QAAQ,KAAK,IAAI,CAAC;AAAA,IACjD,YAAY,SAAS,SAAY,6CAA6C,QAAQ,KAAK,IAAI,CAAC;AAAA,EAClG;AACF;AAEA,IAAM,aAAsB,CAAC,WAAW;AACtC,QAAM,UAAU,OAAO,QAAQ,SAAS,KAAK;AAC7C,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AACA,QAAM,QAAQ,UAAU,OAAO;AAC/B,QAAM,WAAW,QAAQ;AACzB,QAAM,UAAU,QAAQ;AACxB,QAAM,SAAS,CAAC,YAAY,CAAC;AAC7B,MAAI,QAAQ;AACZ,MAAI,SAAU,SAAQ,KAAK,MAAO,QAAQ,KAAM,EAAE;AAClD,MAAI,QAAS,SAAQ,KAAK,IAAI,IAAI,OAAO,QAAQ,IAAI;AAErD,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS,WACL,yBAAyB,KAAK,mCAC9B,UACE,wBAAwB,KAAK,mCAC7B,2BAA2B,KAAK;AAAA,IACtC,YAAY,WACR,kGACA,UACE,sGACA;AAAA,EACR;AACF;AAEA,IAAM,cAAuB,CAAC,WAAW;AACvC,QAAM,WAAW,OAAO,QAAQ,YAAY,CAAC;AAC7C,QAAM,WAAW,SAAS;AAAA,IACxB,CAAC,MAAM,EAAE,SAAS,YAAY,MAAM,cAAc,EAAE,KAAK,YAAY,EAAE,SAAS,cAAc;AAAA,EAChG;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ,CAAC,CAAC;AAAA,IACV,OAAO,WAAW,MAAM;AAAA,IACxB,SAAS,WAAW,4BAA4B;AAAA,IAChD,YAAY,WAAW,SAAY;AAAA,EACrC;AACF;AAEA,IAAM,iBAA0B,CAAC,WAAW;AAC1C,QAAM,OAAO,OAAO,QAAQ,CAAC;AAC7B,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AACA,QAAM,gBAAgB;AACtB,QAAM,oBAAoB,KAAK,OAAO,CAAC,OAAO,EAAE,YAAY,UAAU,MAAM,aAAa;AACzF,QAAM,SAAS,kBAAkB,WAAW,KAAK;AACjD,QAAM,QAAQ,KAAK,MAAO,kBAAkB,SAAS,KAAK,SAAU,GAAG;AACvE,QAAM,UAAU,KACb,OAAO,CAAC,OAAO,EAAE,YAAY,UAAU,KAAK,aAAa,EACzD,IAAI,CAAC,MAAM,IAAI,EAAE,YAAY,SAAS,OAAO,EAAE,QAAQ,SAAS,MAAM,EAAE,YAAY,UAAU,CAAC,cAAc;AAEhH,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS,SACL,iDACA,2CAA2C,QAAQ,KAAK,IAAI,CAAC;AAAA,IACjE,YAAY,SACR,SACA,gBAAgB,aAAa;AAAA,EACnC;AACF;AAEA,IAAM,cAAuB,CAAC,QAAQ,aAAa;AACjD,QAAM,WAAW,gBAAgB,QAAQ;AACzC,QAAM,QAAQ,IAAI,IAAI,SAAS,WAAW;AAC1C,QAAM,gBAAoD,CAAC;AAE3D,aAAW,KAAK,OAAO,QAAQ,CAAC,GAAG;AACjC,eAAW,KAAK,EAAE,cAAc,CAAC,GAAG;AAClC,oBAAc,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC;AAAA,IAClF;AAAA,EACF;AACA,aAAW,KAAK,OAAO,YAAY,CAAC,GAAG;AACrC,eAAW,KAAK,EAAE,cAAc,CAAC,GAAG;AAClC,oBAAc,KAAK,EAAE,MAAM,GAAG,QAAQ,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC;AAAA,IACrE;AAAA,EACF;AACA,aAAW,KAAK,OAAO,aAAa,CAAC,GAAG;AACtC,eAAW,KAAK,EAAE,cAAc,CAAC,GAAG;AAClC,oBAAc,KAAK,EAAE,MAAM,GAAG,QAAQ,gBAAgB,EAAE,gBAAgB,EAAE,GAAG,CAAC;AAAA,IAChF;AAAA,EACF;AAEA,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,iBAAiB,cAAc,OAAO,CAAC,MAAM,MAAM,IAAI,aAAa,EAAE,IAAI,CAAC,CAAC;AAClF,QAAM,oBAAoB,cAAc,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,aAAa,EAAE,IAAI,CAAC,CAAC;AACtF,QAAM,SAAS,kBAAkB,WAAW;AAC5C,QAAM,QAAQ,KAAK,MAAO,eAAe,SAAS,cAAc,SAAU,GAAG;AAE7E,QAAM,WAAW,kBAAkB,MAAM,GAAG,CAAC,EAAE;AAAA,IAC7C,CAAC,MAAM,IAAI,EAAE,KAAK,UAAU,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,SAAS,KAAK,QAAQ,EAAE,MAAM,EAAE,MAAM;AAAA,EACpF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS,SACL,4CACA,GAAG,kBAAkB,MAAM,OAAO,cAAc,MAAM;AAAA,IAC1D,YAAY,SACR,SACA,kGAAkG,SAAS,KAAK,IAAI,CAAC;AAAA,EAC3H;AACF;AAEA,IAAM,mBAA4B,CAAC,WAAW;AAC5C,QAAM,eAAe;AACrB,QAAM,gBAA0B,CAAC;AAEjC,aAAW,KAAK,OAAO,QAAQ,CAAC,GAAG;AACjC,kBAAc,KAAK,GAAI,EAAE,cAAc,CAAC,CAAE;AAAA,EAC5C;AACA,aAAW,KAAK,OAAO,YAAY,CAAC,GAAG;AACrC,kBAAc,KAAK,GAAI,EAAE,cAAc,CAAC,CAAE;AAAA,EAC5C;AAEA,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,aAAa,cAAc,OAAO,CAAC,MAAM,aAAa,KAAK,CAAC,CAAC;AACnE,QAAM,QAAQ,WAAW,SAAS,cAAc;AAEhD,QAAM,SAAS,SAAS;AACxB,QAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,MAAM,QAAQ,GAAG,CAAC;AAEnD,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS,SACL,GAAG,WAAW,MAAM,OAAO,cAAc,MAAM,4CAC/C,QAAQ,WAAW,MAAM,OAAO,cAAc,MAAM;AAAA,IACxD,YAAY,SACR,SACA;AAAA,EACN;AACF;AAEA,IAAM,kBAA2B,CAAC,WAAW;AAC3C,QAAM,OAAO,OAAO,QAAQ,CAAC;AAC7B,MAAI,KAAK,SAAS,GAAG;AACnB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,SAAmB,CAAC;AAG1B,aAAW,KAAK,MAAM;AACpB,QAAI,CAAC,EAAE,WAAW;AAChB,aAAO,KAAK,IAAI,EAAE,YAAY,SAAS,OAAO,EAAE,QAAQ,SAAS,4BAA4B;AAAA,IAC/F;AAAA,EACF;AAGA,QAAM,SAAS,CAAC,GAAG,IAAI,EACpB,OAAO,CAAC,MAA6C,QAAQ,EAAE,SAAS,CAAC,EACzE,KAAK,CAAC,GAAG,MAAO,EAAE,YAAY,EAAE,YAAY,IAAI,EAAG;AAEtD,WAAS,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK;AAE1C,UAAM,UAAU,OAAO,CAAC;AAExB,UAAM,OAAO,OAAO,IAAI,CAAC;AACzB,UAAM,UAAU,QAAQ,WAAW,QAAQ;AAC3C,UAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,OAAO,EAAE,QAAQ;AAC7E,UAAM,YAAY,SAAS,MAAO,KAAK,KAAK,KAAK;AAEjD,QAAI,YAAY,GAAG;AACjB,aAAO;AAAA,QACL,WAAW,KAAK,MAAM,SAAS,CAAC,oBAAoB,QAAQ,QAAQ,SAAS,YAAY,OAAO,UAAU,KAAK,QAAQ,SAAS,cAAc,KAAK,SAAS;AAAA,MAC9J;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,OAAO,WAAW;AACjC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,SAAS,MAAM,KAAK,IAAI,GAAG,MAAM,OAAO,SAAS,EAAE;AAAA,IAC1D,SAAS,SACL,6DACA,sBAAsB,OAAO,KAAK,GAAG,CAAC;AAAA,IAC1C,YAAY,SACR,SACA;AAAA,EACN;AACF;AAEA,IAAM,kBAA2B,CAAC,WAAW;AAC3C,QAAM,SAAS,OAAO,UAAU,CAAC;AACjC,QAAM,gBAAgB;AACtB,QAAM,yBAAyB,OAAO,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,SAAS,CAAC;AACvF,QAAM,SAAS,uBAAuB,UAAU;AAChD,QAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,MAAO,uBAAuB,SAAS,gBAAiB,GAAG,CAAC;AAE7F,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS,SACL,GAAG,uBAAuB,MAAM,2CAChC,QAAQ,uBAAuB,MAAM,wDAAwD,aAAa;AAAA,IAC9G,YAAY,SACR,SACA,gBAAgB,aAAa;AAAA,EACnC;AACF;AAEA,IAAM,oBAA6B,CAAC,WAAW;AAC7C,QAAM,YAAY,OAAO,aAAa,CAAC;AACvC,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,WAAW,UAAU,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS;AAC/E,QAAM,SAAS,SAAS,WAAW,UAAU;AAC7C,QAAM,QAAQ,KAAK,MAAO,SAAS,SAAS,UAAU,SAAU,GAAG;AACnE,QAAM,aAAa,UAChB,OAAO,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,EAAE,QAAQ,CAAC,EAAE,SAAS,EACvD,IAAI,CAAC,MAAM;AACV,UAAM,UAAoB,CAAC;AAC3B,QAAI,CAAC,EAAE,YAAa,SAAQ,KAAK,aAAa;AAC9C,QAAI,CAAC,EAAE,KAAM,SAAQ,KAAK,MAAM;AAChC,QAAI,CAAC,EAAE,UAAW,SAAQ,KAAK,WAAW;AAC1C,WAAO,IAAI,EAAE,eAAe,SAAS,cAAc,QAAQ,KAAK,IAAI,CAAC;AAAA,EACvE,CAAC;AAEH,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,SAAS,SACL,wCACA,iCAAiC,WAAW,KAAK,IAAI,CAAC;AAAA,IAC1D,YAAY,SACR,SACA;AAAA,EACN;AACF;AAEA,IAAM,aAAsB,CAAC,QAAQ,aAAa;AAChD,QAAM,WAAW,gBAAgB,QAAQ;AACzC,QAAM,aAAa,IAAI,IAAI,SAAS,QAAQ;AAE5C,QAAM,aAAiD,CAAC;AAExD,MAAI,OAAO,QAAQ,SAAS;AAC1B,eAAW,KAAK,EAAE,MAAM,OAAO,OAAO,SAAS,QAAQ,UAAU,CAAC;AAAA,EACpE;AACA,aAAW,KAAK,OAAO,QAAQ,CAAC,GAAG;AACjC,QAAI,EAAE,QAAS,YAAW,KAAK,EAAE,MAAM,EAAE,SAAS,QAAQ,iBAAiB,EAAE,QAAQ,SAAS,IAAI,CAAC;AACnG,eAAW,KAAK,EAAE,cAAc,CAAC,GAAG;AAClC,iBAAW,KAAK,EAAE,MAAM,GAAG,QAAQ,mBAAmB,EAAE,QAAQ,SAAS,IAAI,CAAC;AAAA,IAChF;AAAA,EACF;AACA,aAAW,KAAK,OAAO,YAAY,CAAC,GAAG;AACrC,QAAI,EAAE,YAAa,YAAW,KAAK,EAAE,MAAM,EAAE,aAAa,QAAQ,YAAY,EAAE,QAAQ,SAAS,IAAI,CAAC;AACtG,eAAW,KAAK,EAAE,cAAc,CAAC,GAAG;AAClC,iBAAW,KAAK,EAAE,MAAM,GAAG,QAAQ,sBAAsB,EAAE,QAAQ,SAAS,IAAI,CAAC;AAAA,IACnF;AAAA,EACF;AAEA,QAAM,QAA+C,CAAC;AACtD,aAAW,SAAS,YAAY;AAC9B,UAAM,QAAQ,MAAM,KAAK,YAAY,EAAE,MAAM,KAAK;AAClD,eAAW,QAAQ,OAAO;AACxB,YAAM,QAAQ,KAAK,QAAQ,qBAAqB,EAAE;AAClD,UAAI,WAAW,IAAI,KAAK,GAAG;AACzB,cAAM,KAAK,EAAE,SAAS,OAAO,QAAQ,MAAM,OAAO,CAAC;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,iBAAiB,CAAC,GAAG,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC/D,QAAM,WAAW,MAAM,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,OAAO,QAAQ,EAAE,MAAM,EAAE;AAE7E,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,SAAS,MAAM,KAAK,IAAI,GAAG,MAAM,MAAM,SAAS,EAAE;AAAA,IACzD,SAAS,SACL,sDACA,SAAS,MAAM,MAAM,6BAA6B,eAAe,KAAK,IAAI,CAAC;AAAA,IAC/E,YAAY,SACR,SACA,gHAAgH,SAAS,KAAK,IAAI,CAAC;AAAA,EACzI;AACF;AAEA,IAAM,sBAA+B,CAAC,WAAW;AAC/C,QAAM,WAAW,CAAC,UAAU,QAAQ,aAAa,QAAQ;AACzD,QAAM,UAAU,SAAS,OAAO,CAAC,YAAY;AAC3C,UAAM,QAAQ,OAAO,OAAO;AAC5B,QAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,SAAS;AAChD,WAAO,UAAU;AAAA,EACnB,CAAC;AACD,QAAM,UAAU,SAAS,OAAO,CAAC,MAAM,CAAC,QAAQ,SAAS,CAAC,CAAC;AAC3D,QAAM,SAAS,QAAQ,WAAW;AAElC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,KAAK,MAAO,QAAQ,SAAS,SAAS,SAAU,GAAG;AAAA,IAC1D,SAAS,SACL,+CACA,+BAA+B,QAAQ,KAAK,IAAI,CAAC;AAAA,IACrD,YAAY,SAAS,SAAY,8CAA8C,QAAQ,KAAK,IAAI,CAAC;AAAA,EACnG;AACF;AAEO,IAAM,YAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,iBAAiB,QAAsB,UAA8B;AACnF,SAAO,UAAU,IAAI,CAAC,UAAU,MAAM,QAAQ,QAAQ,CAAC;AACzD;;;AC1bA,SAAS,SAAS,MAAc,WAAkC;AAChE,SAAO,KACJ,YAAY,EACZ,QAAQ,iDAAiD,GAAG,EAC5D,MAAM,KAAK,EACX,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC;AAC7D;AAMA,SAAS,WAAW,MAAc,UAA0B;AAC1D,MAAI,aAAa,MAAM;AACrB,WAAO,KACJ,QAAQ,0DAA0D,EAAE,EACpE,QAAQ,wBAAwB,EAAE;AAAA,EACvC;AAEA,SAAO,KACJ,QAAQ,uEAAuE,EAAE,EACjF,QAAQ,UAAU,GAAG,EACrB,QAAQ,cAAc,EAAE;AAC7B;AAKA,SAAS,kBAAkB,QAA8B;AACvD,QAAM,QAAkB,CAAC;AAEzB,MAAI,OAAO,QAAQ,QAAS,OAAM,KAAK,OAAO,OAAO,OAAO;AAC5D,MAAI,OAAO,QAAQ,MAAO,OAAM,KAAK,OAAO,OAAO,KAAK;AAExD,aAAW,KAAK,OAAO,QAAQ,CAAC,GAAG;AACjC,QAAI,EAAE,SAAU,OAAM,KAAK,EAAE,QAAQ;AACrC,QAAI,EAAE,QAAS,OAAM,KAAK,EAAE,OAAO;AACnC,UAAM,KAAK,GAAI,EAAE,cAAc,CAAC,CAAE;AAAA,EACpC;AACA,aAAW,KAAK,OAAO,UAAU,CAAC,GAAG;AACnC,QAAI,EAAE,KAAM,OAAM,KAAK,EAAE,IAAI;AAC7B,UAAM,KAAK,GAAI,EAAE,YAAY,CAAC,CAAE;AAAA,EAClC;AACA,aAAW,KAAK,OAAO,YAAY,CAAC,GAAG;AACrC,QAAI,EAAE,KAAM,OAAM,KAAK,EAAE,IAAI;AAC7B,QAAI,EAAE,YAAa,OAAM,KAAK,EAAE,WAAW;AAC3C,UAAM,KAAK,GAAI,EAAE,cAAc,CAAC,CAAE;AAAA,EACpC;AACA,aAAW,KAAK,OAAO,aAAa,CAAC,GAAG;AACtC,QAAI,EAAE,KAAM,OAAM,KAAK,EAAE,IAAI;AAC7B,QAAI,EAAE,UAAW,OAAM,KAAK,EAAE,SAAS;AACvC,UAAM,KAAK,GAAI,EAAE,WAAW,CAAC,CAAE;AAAA,EACjC;AACA,aAAW,KAAK,OAAO,gBAAgB,CAAC,GAAG;AACzC,QAAI,EAAE,KAAM,OAAM,KAAK,EAAE,IAAI;AAAA,EAC/B;AAEA,SAAO,MAAM,KAAK,GAAG;AACvB;AAKA,SAAS,WAAW,QAAuC;AACzD,QAAM,KAAK,oBAAI,IAAoB;AACnC,aAAW,SAAS,QAAQ;AAC1B,OAAG,IAAI,QAAQ,GAAG,IAAI,KAAK,KAAK,KAAK,CAAC;AAAA,EACxC;AACA,SAAO;AACT;AAMA,SAAS,gBAAgB,MAAc,UAAkB,cAAsB,IAAc;AAC3F,QAAM,WAAW,gBAAgB,QAAQ;AACzC,QAAM,YAAY,IAAI,IAAI,SAAS,SAAS;AAC5C,QAAM,SAAS,SAAS,MAAM,SAAS;AACvC,QAAM,UAAU,OAAO,IAAI,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC;AACzD,QAAM,KAAK,WAAW,OAAO;AAG7B,QAAM,iBAAiB,oBAAI,IAAoB;AAC/C,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,OAAO,QAAQ,CAAC,KAAK;AAC3B,QAAI,CAAC,eAAe,IAAI,IAAI,GAAG;AAC7B,qBAAe,IAAI,MAAM,OAAO,CAAC,KAAK,EAAE;AAAA,IAC1C;AAAA,EACF;AAGA,SAAO,CAAC,GAAG,GAAG,QAAQ,CAAC,EACpB,OAAO,CAAC,CAAC,IAAI,MAAM,KAAK,SAAS,CAAC,EAClC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,WAAW,EACpB,IAAI,CAAC,CAAC,IAAI,MAAM,eAAe,IAAI,IAAI,KAAK,IAAI;AACrD;AAMO,SAAS,oBACd,QACA,gBACA,WAAmB,MACF;AACjB,QAAM,WAAW,gBAAgB,QAAQ;AACzC,QAAM,YAAY,IAAI,IAAI,SAAS,SAAS;AAG5C,QAAM,aAAa,gBAAgB,gBAAgB,QAAQ;AAG3D,QAAM,aAAa,kBAAkB,MAAM;AAC3C,QAAM,eAAe,SAAS,YAAY,SAAS;AACnD,QAAM,cAAc,IAAI,IAAI,aAAa,IAAI,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC;AAG5E,QAAM,iBAAiB,IAAI,IAAI,YAAY;AAG3C,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAoB,CAAC;AAE3B,aAAW,WAAW,YAAY;AAChC,UAAM,OAAO,WAAW,SAAS,QAAQ;AACzC,QAAI,YAAY,IAAI,IAAI,KAAK,eAAe,IAAI,QAAQ,YAAY,CAAC,GAAG;AACtE,cAAQ,KAAK,OAAO;AAAA,IACtB,OAAO;AACL,cAAQ,KAAK,OAAO;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,kBAAkB,WAAW,SAAS,IACxC,KAAK,MAAO,QAAQ,SAAS,WAAW,SAAU,GAAG,IACrD;AAEJ,SAAO,EAAE,SAAS,SAAS,gBAAgB;AAC7C;;;ACjJA,IAAM,mBAA2C;AAAA,EAC/C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AACP;AAKO,SAAS,eAAe,QAA4B;AACzD,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,MAAI,cAAc;AAClB,MAAI,cAAc;AAElB,aAAW,SAAS,QAAQ;AAC1B,UAAM,OAAO,iBAAiB,MAAM,MAAM,KAAK;AAC/C,mBAAe,MAAM,QAAQ;AAC7B,mBAAe,MAAM;AAAA,EACvB;AAEA,SAAO,cAAc,IAAI,KAAK,MAAO,cAAc,cAAe,GAAG,IAAI;AAC3E;AAKO,SAAS,uBAAuB,cAAsB,mBAAoC;AAC/F,MAAI,sBAAsB,OAAW,QAAO;AAC5C,SAAO,KAAK,MAAM,eAAe,MAAM,oBAAoB,GAAG;AAChE;AAKO,SAAS,cAAc,OAA0B;AACtD,MAAI,SAAS,GAAI,QAAO;AACxB,MAAI,SAAS,GAAI,QAAO;AACxB,MAAI,SAAS,GAAI,QAAO;AACxB,SAAO;AACT;AAKO,SAAS,gBAAgB,OAAe,QAAmB,OAAwB;AACxF,QAAM,cAAc;AAAA,IAClB,WAAW;AAAA,IACX,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM;AAAA,EACR,EAAE,MAAM;AAER,QAAM,OAAO,cAAc,KAAK,SAAS,WAAW;AACpD,MAAI,OAAO;AACT,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO,GAAG,IAAI;AAChB;;;AC3CO,SAAS,WAAW,QAAsB,UAAsB,CAAC,GAAc;AACpF,QAAM,WAAW,QAAQ,YAAY;AAGrC,QAAM,SAAS,iBAAiB,QAAQ,QAAQ;AAChD,QAAM,eAAe,eAAe,MAAM;AAG1C,MAAI;AACJ,MAAI,QAAQ,gBAAgB;AAC1B,eAAW,oBAAoB,QAAQ,QAAQ,gBAAgB,QAAQ;AAAA,EACzE;AAGA,QAAM,aAAa,uBAAuB,cAAc,UAAU,eAAe;AACjF,QAAM,SAAS,cAAc,UAAU;AACvC,QAAM,UAAU,gBAAgB,YAAY,QAAQ,CAAC,CAAC,QAAQ;AAE9D,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC1CA,2BAA6B;AAC7B,oBAA8B;AAE9B,IAAMC,eAAU,6BAAc,aAAe;AAU7C,SAAS,aAAa,aAA2B;AAC/C,MAAI;AACF,2CAAa,OAAO,CAAC,WAAW,WAAW,GAAG;AAAA,MAC5C,OAAO,CAAC,WAAW,QAAQ,MAAM;AAAA,MACjC,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,qBAAqB,WAAW,KAAM,MAAgB,OAAO,EAAE;AAAA,EACjF;AACF;AAQO,SAAS,UAAU,WAAmB,SAAkD;AAC7F,MAAI;AACJ,MAAI;AACJ,QAAM,cAAc,SAAS,gBAAgB;AAE7C,MAAI;AAEF,0BAAsB,UAAU,WAAW,mBAAmB,IAC1D,YACA,oBAAoB,SAAS;AAEjC,QAAI;AAEF,aAAOA,SAAQ,mBAAmB;AAAA,IACpC,SAAS,kBAAkB;AAEzB,wBAAkB,iBAAiB,SAAS;AAC5C,UAAI;AACF,eAAOA,SAAQ,eAAe;AAAA,MAChC,SAAS,cAAc;AACrB,YAAI,CAAC,aAAa;AAChB,gBAAM,IAAI;AAAA,YACR,iBAAiB,mBAAmB,OAAO,eAAe;AAAA;AAAA,UAE5D;AAAA,QACF;AAEA,gBAAQ,IAAI,mBAAY,mBAAmB,2BAA2B;AACtE,YAAI;AACF,uBAAa,mBAAmB;AAChC,kBAAQ,IAAI,iCAA4B,mBAAmB,EAAE;AAE7D,iBAAOA,SAAQ,mBAAmB;AAAA,QACpC,SAAS,cAAc;AACrB,gBAAM,IAAI;AAAA,YACR,gCAAgC,mBAAmB,KAChD,aAAuB,OAC1B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AAEd,QAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,wBAAwB,GAAG;AAC9E,YAAM;AAAA,IACR;AACA,UAAM,IAAI,MAAM,iBAAiB,SAAS,YAAY;AAAA,EACxD;AACF;;;AC/EO,SAAS,mBAAmB,MAAc,OAAe,OAAuB;AACrF,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAQE,IAAI;AAAA,YACH,KAAK;AAAA;AAAA,YAEL,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6HjB;;;ACzIA,IAAAC,iBAA8B;AAQvB,IAAM,eAA4B;AAAA,EACvC,EAAE,MAAM,iBAAiB,KAAK,kCAAkC,aAAa,gCAAgC;AAAA,EAC7G,EAAE,MAAM,WAAW,KAAK,4BAA4B,aAAa,2BAA2B;AAAA,EAC5F,EAAE,MAAM,SAAS,KAAK,0BAA0B,aAAa,8BAA8B;AAAA,EAC3F,EAAE,MAAM,QAAQ,KAAK,yBAAyB,aAAa,oBAAoB;AAAA,EAC/E,EAAE,MAAM,WAAW,KAAK,4BAA4B,aAAa,0BAA0B;AAAA,EAC3F,EAAE,MAAM,aAAa,KAAK,8BAA8B,aAAa,uBAAuB;AAAA,EAC5F,EAAE,MAAM,QAAQ,KAAK,yBAAyB,aAAa,oBAAoB;AAAA,EAC/E,EAAE,MAAM,SAAS,KAAK,0BAA0B,aAAa,4BAA4B;AAAA,EACzF,EAAE,MAAM,SAAS,KAAK,0BAA0B,aAAa,6BAA6B;AAAA,EAC1F,EAAE,MAAM,WAAW,KAAK,4BAA4B,aAAa,4BAA4B;AAAA,EAC7F,EAAE,MAAM,SAAS,KAAK,0BAA0B,aAAa,0BAA0B;AAAA,EACvF,EAAE,MAAM,WAAW,KAAK,4BAA4B,aAAa,yBAAyB;AAC5F;AAEO,SAAS,iBAAiB,KAAsB;AACrD,MAAI;AACF,UAAM,UAAM,8BAAc,QAAQ,IAAI,IAAI,GAAG;AAC7C,QAAI,QAAQ,GAAG;AACf,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,KAA4B;AAC9D,MAAI;AACF,UAAM,UAAM,8BAAc,QAAQ,IAAI,IAAI,GAAG;AAC7C,UAAM,UAAU,IAAI,GAAG,GAAG,eAAe;AACzC,WAAO,QAAQ,WAAW;AAAA,EAC5B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AZ/BA,IAAM,cAAc,QAAQ;AAC5B,IAAM,eAAe,QAAQ;AAE7B,SAAS,iBAAiB;AACxB,UAAQ,MAAM,IAAI,SAAoB;AAAE,YAAQ,MAAM,YAAY,GAAG,IAAI;AAAA,EAAG;AAC5E,UAAQ,OAAO,IAAI,SAAoB;AAAE,YAAQ,MAAM,YAAY,GAAG,IAAI;AAAA,EAAG;AAC/E;AAEA,SAAS,gBAAgB;AACvB,UAAQ,MAAM;AACd,UAAQ,OAAO;AACjB;AAIA,IAAM,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4GrC,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmE3B,SAAS,eAA0B;AACjC,QAAM,SAAS,IAAI,qBAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AAQD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,OAAO;AAAA,MACL,UAAU,CAAC;AAAA,QACT,KAAK;AAAA,QACL,UAAU;AAAA,QACV,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAIA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,OAAO;AAAA,MACL,UAAU,CAAC;AAAA,QACT,KAAK;AAAA,QACL,UAAU;AAAA,QACV,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAIA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,MAAM;AACJ,YAAM,SAAS,aAAa,IAAI,CAAC,OAAO;AAAA,QACtC,MAAM,EAAE;AAAA,QACR,SAAS,EAAE;AAAA,QACX,aAAa,EAAE;AAAA,QACf,WAAW,iBAAiB,EAAE,GAAG;AAAA,QACjC,SAAS,oBAAoB,EAAE,GAAG;AAAA,MACpC,EAAE;AACF,aAAO;AAAA,QACL,UAAU,CAAC;AAAA,UACT,KAAK;AAAA,UACL,UAAU;AAAA,UACV,MAAM,KAAK,UAAU,EAAE,QAAQ,YAAY,OAAO,OAAO,GAAG,MAAM,CAAC;AAAA,QACrE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAQA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,YAAY;AAAA,QACV,gBAAgB,aAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,QACnE,eAAe,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qBAAqB;AAAA,QACnE,gBAAgB,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,yBAAyB;AAAA,QACxE,qBAAqB,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kFAAkF;AAAA,MACxI;AAAA,IACF;AAAA,IACA,CAAC,EAAE,gBAAgB,eAAe,gBAAgB,oBAAoB,OAAO;AAAA,MAC3E,UAAU,CAAC;AAAA,QACT,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,MAAM;AAAA;AAAA;AAAA,EAGd,cAAc;AAAA;AAAA,EAEd,sBAAsB;AAAA,EAA4B,mBAAmB;AAAA,IAAO,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAW9E,gBAAgB,0BAA0B,aAAa,KAAK,EAAE;AAAA,EAC9D,iBAAiB,4BAA4B,cAAc,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAU5D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAIA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,YAAY;AAAA,QACV,YAAY,aAAE,OAAO,EAAE,SAAS,iCAAiC;AAAA,QACjE,gBAAgB,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,8CAA8C;AAAA,QAC7F,aAAa,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gCAAgC;AAAA,MAC9E;AAAA,IACF;AAAA,IACA,CAAC,EAAE,YAAY,gBAAgB,YAAY,OAAO;AAAA,MAChD,UAAU,CAAC;AAAA,QACT,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,MAAM,sDAAsD,cAAc,aAAa,WAAW,MAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAIhI,UAAU;AAAA;AAAA;AAAA,EAGV,iBAAiB;AAAA,EAAuB,cAAc;AAAA,IAAO,EAAE;AAAA;AAAA;AAAA,wDAGT,iBAAiB,8BAA8B,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAYjG;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAIA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,YAAY;AAAA,QACV,YAAY,aAAE,OAAO,EAAE,SAAS,mCAAmC;AAAA,MACrE;AAAA,IACF;AAAA,IACA,CAAC,EAAE,WAAW,OAAO;AAAA,MACnB,UAAU,CAAC;AAAA,QACT,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,MAAM;AAAA;AAAA;AAAA;AAAA,EAId,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAmBJ;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAQA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,QAC/D,OAAO,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,QAChE,OAAO,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,eAAe;AAAA,MACvD;AAAA,IACF;AAAA,IACA,CAAC,EAAE,MAAM,OAAO,MAAM,MAAM;AAC1B,YAAM,OAAO;AAAA,QACX,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AACA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,CAAC,EAAE;AAAA,IAC5D;AAAA,EACF;AAIA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM,aAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,MAC3D;AAAA,IACF;AAAA,IACA,OAAO,EAAE,KAAK,MAAM;AAClB,qBAAe;AACf,UAAI;AACF,cAAM,kBAAkB,CAAC,IAAI,CAAC;AAC9B,sBAAc;AACd,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,EAAE,OAAO,MAAM,QAAQ,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,QACjG;AAAA,MACF,SAAS,GAAY;AACnB,sBAAc;AACd,cAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACzD,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,EAAE,OAAO,OAAO,QAAQ,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,QACzG;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM,aAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,QACzD,gBAAgB,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gDAAgD;AAAA,QAC/F,UAAU,aAAE,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,MAC1F;AAAA,IACF;AAAA,IACA,OAAO,EAAE,MAAM,gBAAgB,SAAS,MAAM;AAC5C,qBAAe;AACf,UAAI;AACF,cAAM,SAAS,MAAM,kBAAkB,CAAC,IAAI,CAAC;AAC7C,cAAM,SAAS,WAAW,QAAQ;AAAA,UAChC,UAAU,YAAY;AAAA,UACtB;AAAA,QACF,CAAC;AACD,sBAAc;AACd,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC;AAAA,QAC5E;AAAA,MACF,SAAS,GAAY;AACnB,sBAAc;AACd,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,EAAE,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;AAAA,UAChH,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM,aAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,QACzD,OAAO,aAAE,OAAO,EAAE,QAAQ,MAAM,EAAE,SAAS,gEAAgE;AAAA,QAC3G,QAAQ,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0CAA0C;AAAA,MACnF;AAAA,IACF;AAAA,IACA,OAAO,SAAS;AACd,YAAM,EAAE,MAAM,MAAM,IAAI;AACxB,YAAM,SAAS,KAAK,QAAQ;AAC5B,qBAAe;AACf,UAAI;AACF,cAAM,SAAS,MAAM,kBAAkB,CAAC,IAAI,CAAC;AAC7C,cAAM,cAAc,UAAU,OAAO,EAAE,aAAa,MAAM,CAAC;AAC3D,cAAM,gBAAyC,CAAC;AAChD,YAAI,OAAQ,eAAc,QAAQ,IAAI;AACtC,cAAM,OAAO,MAAM,YAAY,OAAO,QAA8C,aAAa;AACjG,sBAAc;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,CAAC,EAAE;AAAA,MAC5D,SAAS,GAAY;AACnB,sBAAc;AACd,cAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACzD,cAAM,OAAO,QAAQ,SAAS,oBAAoB,IAC9C,2CAA2C,KAAK,KAChD;AACJ,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,EAAE,OAAO,UAAU,KAAK,CAAC,EAAE,CAAC;AAAA,UACpF,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA,MAAM;AACJ,YAAM,SAAS,aAAa,IAAI,CAAC,OAAO;AAAA,QACtC,MAAM,EAAE;AAAA,QACR,SAAS,EAAE;AAAA,QACX,aAAa,EAAE;AAAA,QACf,WAAW,iBAAiB,EAAE,GAAG;AAAA,QACjC,SAAS,oBAAoB,EAAE,GAAG;AAAA,MACpC,EAAE;AACF,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,EAAE,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,MAChF;AAAA,IACF;AAAA,EACF;AAIA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM,aAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,QACzD,OAAO,aAAE,OAAO,EAAE,QAAQ,MAAM,EAAE,SAAS,YAAY;AAAA,QACvD,QAAQ,aAAE,KAAK,CAAC,MAAM,QAAQ,CAAC,EAAE,QAAQ,IAAI,EAAE,SAAS,cAAc;AAAA,QACtE,QAAQ,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0CAA0C;AAAA,QACjF,QAAQ,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sLAAsL;AAAA,MAC/N;AAAA,IACF;AAAA,IACA,OAAO,SAAS;AACd,YAAM,EAAE,MAAM,OAAO,OAAO,IAAI;AAChC,YAAM,SAAS,KAAK,QAAQ;AAC5B,YAAM,SAAS,KAAK,QAAQ;AAC5B,qBAAe;AACf,UAAI;AACF,cAAM,SAAS,MAAM,kBAAkB,CAAC,IAAI,CAAC;AAC7C,cAAM,cAAc,UAAU,OAAO,EAAE,aAAa,MAAM,CAAC;AAC3D,cAAM,gBAAyC,CAAC;AAChD,YAAI,OAAQ,eAAc,QAAQ,IAAI;AACtC,cAAM,OAAO,MAAM,YAAY,OAAO,QAA8C,aAAa;AAEjG,YAAI;AACJ,YAAI;AACF,gBAAM,KAAK,MAAM,OAAO,YAAY;AACpC,qBAAW,GAAG;AAAA,QAChB,QAAQ;AACN,wBAAc;AACd,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,EAAE,OAAO,2DAA2D,CAAC,EAAE,CAAC;AAAA,YAChI,SAAS;AAAA,UACX;AAAA,QACF;AAEA,cAAM,eAAe,YAAY,MAAM;AACvC,cAAM,UAAU,MAAM,SAAS,OAAO,EAAE,UAAU,KAAK,CAAC;AACxD,cAAM,OAAO,MAAM,QAAQ,QAAQ;AACnC,cAAM,KAAK,WAAW,MAAM,EAAE,WAAW,cAAc,CAAC;AACxD,cAAM,YAAY,MAAM,KAAK,IAAI;AAAA,UAC/B;AAAA,UACA,iBAAiB;AAAA,UACjB,QAAQ;AAAA,QACV,CAAC;AACD,cAAM,QAAQ,MAAM;AACpB,sBAAc;AAEd,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM,KAAK,UAAU;AAAA,cACnB,KAAK,OAAO,KAAK,SAAS,EAAE,SAAS,QAAQ;AAAA,cAC7C,UAAU;AAAA,cACV;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AAAA,MACF,SAAS,GAAY;AACnB,sBAAc;AACd,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,EAAE,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;AAAA,UAChH,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,QAAyC;AAC5D,QAAM,gBAAgB,EAAE,KAAK,QAAQ,OAAO,QAAQ,QAAQ,QAAQ,MAAM,OAAO;AACjF,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,QAAQ,OAAO,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACnD,MAAI,MAAM,WAAW,KAAK,MAAM,CAAC,GAAG;AAClC,WAAO,EAAE,KAAK,MAAM,CAAC,GAAG,OAAO,MAAM,CAAC,GAAG,QAAQ,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,EAAE;AAAA,EAC5E;AACA,MAAI,MAAM,WAAW,KAAK,MAAM,CAAC,KAAK,MAAM,CAAC,GAAG;AAC9C,WAAO,EAAE,KAAK,MAAM,CAAC,GAAG,OAAO,MAAM,CAAC,GAAG,QAAQ,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,EAAE;AAAA,EAC5E;AACA,MAAI,MAAM,WAAW,KAAK,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,CAAC,GAAG;AACtE,WAAO,EAAE,KAAK,MAAM,CAAC,GAAG,OAAO,MAAM,CAAC,GAAG,QAAQ,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,EAAE;AAAA,EAC5E;AACA,SAAO;AACT;AAEA,eAAsB,iBAAgC;AACpD,QAAM,SAAS,aAAa;AAC5B,QAAM,YAAY,IAAI,kCAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAChC;","names":["merge","require","import_module"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "resuml",
3
- "version": "1.8.2",
3
+ "version": "1.9.0",
4
4
  "description": "Generate JSON resumes from YAML with theme support",
5
5
  "type": "module",
6
6
  "main": "./dist/api.js",