featuredrop 2.7.2 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -1
- package/dist/astro.cjs +333 -0
- package/dist/astro.cjs.map +1 -0
- package/dist/astro.d.cts +242 -0
- package/dist/astro.d.ts +242 -0
- package/dist/astro.js +329 -0
- package/dist/astro.js.map +1 -0
- package/dist/engine.cjs +552 -0
- package/dist/engine.cjs.map +1 -0
- package/dist/engine.d.cts +422 -0
- package/dist/engine.d.ts +422 -0
- package/dist/engine.js +545 -0
- package/dist/engine.js.map +1 -0
- package/dist/featuredrop.cjs +208 -1
- package/dist/featuredrop.cjs.map +1 -1
- package/dist/next.cjs +336 -0
- package/dist/next.cjs.map +1 -0
- package/dist/next.d.cts +243 -0
- package/dist/next.d.ts +243 -0
- package/dist/next.js +332 -0
- package/dist/next.js.map +1 -0
- package/dist/nuxt.cjs +352 -0
- package/dist/nuxt.cjs.map +1 -0
- package/dist/nuxt.d.cts +282 -0
- package/dist/nuxt.d.ts +282 -0
- package/dist/nuxt.js +347 -0
- package/dist/nuxt.js.map +1 -0
- package/dist/preact.cjs +354 -0
- package/dist/preact.cjs.map +1 -1
- package/dist/preact.d.cts +170 -1
- package/dist/preact.d.ts +170 -1
- package/dist/preact.js +350 -1
- package/dist/preact.js.map +1 -1
- package/dist/react-hooks.cjs +82 -0
- package/dist/react-hooks.cjs.map +1 -1
- package/dist/react-hooks.d.cts +117 -1
- package/dist/react-hooks.d.ts +117 -1
- package/dist/react-hooks.js +80 -1
- package/dist/react-hooks.js.map +1 -1
- package/dist/react.cjs +354 -0
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +170 -1
- package/dist/react.d.ts +170 -1
- package/dist/react.js +350 -1
- package/dist/react.js.map +1 -1
- package/dist/remix.cjs +331 -0
- package/dist/remix.cjs.map +1 -0
- package/dist/remix.d.cts +305 -0
- package/dist/remix.d.ts +305 -0
- package/dist/remix.js +327 -0
- package/dist/remix.js.map +1 -0
- package/package.json +70 -2
package/dist/featuredrop.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dependencies.ts","../src/schema.ts","../src/changelog-as-code.ts","../src/posthog-client.ts","../src/cli-utils.ts","../src/cli-scaffold.ts","../src/markdown.ts","../src/rss.ts","../src/cli.ts"],"names":["z","readdir","join","stat","readFile","relative","sep","writeFile","PostHog","isRecord","mkdir","sample","basename","moduleApi","sanitized","decoded","createInterface","hostname","entries"],"mappings":"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","file":"featuredrop.cjs","sourcesContent":["import type { FeatureEntry, FeatureManifest } from \"./types\";\n\nfunction getDirectDependencies(feature: FeatureEntry): string[] {\n const dependsOn = feature.dependsOn;\n if (!dependsOn) return [];\n const seen = dependsOn.seen ?? [];\n const clicked = dependsOn.clicked ?? [];\n const dismissed = dependsOn.dismissed ?? [];\n const unique = new Set<string>();\n for (const id of [...seen, ...clicked, ...dismissed]) {\n if (id) unique.add(id);\n }\n return Array.from(unique);\n}\n\nexport function resolveDependencyOrder(manifest: FeatureManifest): string[] {\n const ids = new Set(manifest.map((feature) => feature.id));\n const outgoing = new Map<string, Set<string>>();\n const indegree = new Map<string, number>();\n\n for (const feature of manifest) {\n outgoing.set(feature.id, new Set());\n indegree.set(feature.id, 0);\n }\n\n for (const feature of manifest) {\n for (const dependencyId of getDirectDependencies(feature)) {\n if (!ids.has(dependencyId)) continue;\n const edges = outgoing.get(dependencyId);\n if (!edges || edges.has(feature.id)) continue;\n edges.add(feature.id);\n indegree.set(feature.id, (indegree.get(feature.id) ?? 0) + 1);\n }\n }\n\n const queue: string[] = [];\n for (const feature of manifest) {\n if ((indegree.get(feature.id) ?? 0) === 0) queue.push(feature.id);\n }\n\n const ordered: string[] = [];\n while (queue.length > 0) {\n const id = queue.shift();\n if (!id) continue;\n ordered.push(id);\n const edges = outgoing.get(id);\n if (!edges) continue;\n for (const nextId of edges) {\n const nextDegree = (indegree.get(nextId) ?? 0) - 1;\n indegree.set(nextId, nextDegree);\n if (nextDegree === 0) queue.push(nextId);\n }\n }\n\n // On cycles, append remaining IDs in original order to keep behavior stable.\n if (ordered.length < manifest.length) {\n const included = new Set(ordered);\n for (const feature of manifest) {\n if (included.has(feature.id)) continue;\n ordered.push(feature.id);\n }\n }\n\n return ordered;\n}\n\nexport function hasDependencyCycle(manifest: FeatureManifest): boolean {\n const ids = new Set(manifest.map((feature) => feature.id));\n const outgoing = new Map<string, Set<string>>();\n const indegree = new Map<string, number>();\n\n for (const feature of manifest) {\n outgoing.set(feature.id, new Set());\n indegree.set(feature.id, 0);\n }\n\n for (const feature of manifest) {\n for (const dependencyId of getDirectDependencies(feature)) {\n if (!ids.has(dependencyId)) continue;\n const edges = outgoing.get(dependencyId);\n if (!edges || edges.has(feature.id)) continue;\n edges.add(feature.id);\n indegree.set(feature.id, (indegree.get(feature.id) ?? 0) + 1);\n }\n }\n\n const queue: string[] = [];\n for (const feature of manifest) {\n if ((indegree.get(feature.id) ?? 0) === 0) queue.push(feature.id);\n }\n\n let visited = 0;\n while (queue.length > 0) {\n const id = queue.shift();\n if (!id) continue;\n visited += 1;\n const edges = outgoing.get(id);\n if (!edges) continue;\n for (const nextId of edges) {\n const nextDegree = (indegree.get(nextId) ?? 0) - 1;\n indegree.set(nextId, nextDegree);\n if (nextDegree === 0) queue.push(nextId);\n }\n }\n\n return visited !== manifest.length;\n}\n\nexport function sortFeaturesByDependencies(features: FeatureEntry[]): FeatureEntry[] {\n if (features.length <= 1) return [...features];\n const order = resolveDependencyOrder(features);\n const rank = new Map(order.map((id, index) => [id, index]));\n return [...features].sort((a, b) => {\n const ra = rank.get(a.id);\n const rb = rank.get(b.id);\n if (ra === undefined || rb === undefined) return 0;\n return ra - rb;\n });\n}\n","import { hasDependencyCycle } from \"./dependencies\";\nimport type { FeatureEntry, FeatureManifest } from \"./types\";\nimport { z } from \"zod\";\n\nexport interface ValidationIssue {\n path: string;\n message: string;\n code:\n | \"invalid_type\"\n | \"missing_required\"\n | \"invalid_value\"\n | \"invalid_date\"\n | \"duplicate_id\"\n | \"circular_dependency\";\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationIssue[];\n}\n\nexport const featureEntryJsonSchema = {\n type: \"object\",\n required: [\"id\", \"label\", \"releasedAt\", \"showNewUntil\"],\n properties: {\n id: { type: \"string\" },\n label: { type: \"string\" },\n description: { type: \"string\" },\n releasedAt: { type: \"string\", format: \"date-time\" },\n showNewUntil: { type: \"string\", format: \"date-time\" },\n flagKey: { type: \"string\" },\n product: { type: \"string\" },\n url: { type: \"string\" },\n image: { type: \"string\" },\n type: { enum: [\"feature\", \"improvement\", \"fix\", \"breaking\"] },\n priority: { enum: [\"critical\", \"normal\", \"low\"] },\n cta: {\n type: \"object\",\n properties: {\n label: { type: \"string\" },\n url: { type: \"string\" },\n },\n },\n meta: { type: \"object\" },\n },\n} as const;\n\nexport const featureManifestJsonSchema = {\n type: \"array\",\n items: featureEntryJsonSchema,\n} as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isValidDate(value: string): boolean {\n return Number.isFinite(new Date(value).getTime());\n}\n\nconst nonEmptyString = z.string().trim().min(1, \"must be a non-empty string\");\n\nconst isoDateString = nonEmptyString.refine(isValidDate, {\n message: \"must be a valid date\",\n params: { featuredropCode: \"invalid_date\" },\n});\n\nconst dependsOnSchema = z\n .object({\n seen: z.array(z.string()).optional(),\n clicked: z.array(z.string()).optional(),\n dismissed: z.array(z.string()).optional(),\n })\n .optional();\n\nconst ctaSchema = z\n .object({\n label: nonEmptyString,\n url: nonEmptyString,\n })\n .optional();\n\nexport const featureEntrySchema = z\n .object({\n id: nonEmptyString,\n label: nonEmptyString,\n releasedAt: isoDateString,\n showNewUntil: isoDateString,\n description: z.string().optional(),\n flagKey: z.string().optional(),\n product: z.string().optional(),\n url: z.string().optional(),\n image: z.string().optional(),\n type: z.enum([\"feature\", \"improvement\", \"fix\", \"breaking\"]).optional(),\n priority: z.enum([\"critical\", \"normal\", \"low\"]).optional(),\n cta: ctaSchema,\n meta: z.record(z.unknown()).optional(),\n dependsOn: dependsOnSchema,\n })\n .passthrough();\n\nexport const featureManifestSchema = z.array(featureEntrySchema);\n\nfunction toIssuePath(path: Array<string | number>): string {\n if (path.length === 0) return \"$\";\n let output = \"\";\n for (const part of path) {\n if (typeof part === \"number\") output += `[${part}]`;\n else output += output ? `.${part}` : part;\n }\n return output;\n}\n\nfunction mapZodIssue(issue: z.ZodIssue): ValidationIssue {\n const codeParam = (issue as { params?: Record<string, unknown> }).params?.featuredropCode;\n if (codeParam === \"invalid_date\") {\n return {\n path: toIssuePath(issue.path),\n message: issue.message,\n code: \"invalid_date\",\n };\n }\n if (issue.code === \"invalid_type\") {\n return {\n path: toIssuePath(issue.path),\n message: issue.message,\n code: issue.received === \"undefined\" ? \"missing_required\" : \"invalid_type\",\n };\n }\n return {\n path: toIssuePath(issue.path),\n message: issue.message,\n code: \"invalid_value\",\n };\n}\n\nconst UNSAFE_META_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nfunction isSafeUrl(value: string): boolean {\n const normalized = value.trim();\n if (!normalized) return false;\n if (/^(\\/|\\.\\/|\\.\\.\\/|\\?|#)/.test(normalized)) return true;\n if (/^https?:\\/\\//i.test(normalized)) return true;\n return false;\n}\n\nfunction findUnsafeMetaPath(value: unknown, path = \"meta\"): string | null {\n if (Array.isArray(value)) {\n for (let index = 0; index < value.length; index++) {\n const nested = findUnsafeMetaPath(value[index], `${path}[${index}]`);\n if (nested) return nested;\n }\n return null;\n }\n\n if (!isRecord(value)) return null;\n for (const [key, nestedValue] of Object.entries(value)) {\n if (UNSAFE_META_KEYS.has(key)) {\n return `${path}.${key}`;\n }\n const nested = findUnsafeMetaPath(nestedValue, `${path}.${key}`);\n if (nested) return nested;\n }\n return null;\n}\n\nfunction validateFeatureEntry(raw: unknown, index: number): { entry?: FeatureEntry; issues: ValidationIssue[] } {\n if (!isRecord(raw)) {\n return {\n issues: [\n {\n path: `[${index}]`,\n message: \"Feature entry must be an object\",\n code: \"invalid_type\",\n },\n ],\n };\n }\n\n const parsed = featureEntrySchema.safeParse(raw);\n if (!parsed.success) {\n return {\n issues: parsed.error.issues.map((issue) => ({\n ...mapZodIssue(issue),\n path: `[${index}]${issue.path.length > 0 ? `.${toIssuePath(issue.path)}` : \"\"}`,\n })),\n };\n }\n\n return {\n issues: [],\n entry: parsed.data as FeatureEntry,\n };\n}\n\nexport function validateManifest(data: unknown): ValidationResult {\n const errors: ValidationIssue[] = [];\n if (!Array.isArray(data)) {\n return {\n valid: false,\n errors: [\n {\n path: \"$\",\n message: \"Manifest must be an array\",\n code: \"invalid_type\",\n },\n ],\n };\n }\n\n const entries: FeatureEntry[] = [];\n const seenIds = new Set<string>();\n data.forEach((item, index) => {\n const result = validateFeatureEntry(item, index);\n errors.push(...result.issues);\n if (!result.entry) return;\n if (seenIds.has(result.entry.id)) {\n errors.push({\n path: `[${index}].id`,\n message: `Duplicate feature id \"${result.entry.id}\"`,\n code: \"duplicate_id\",\n });\n return;\n }\n seenIds.add(result.entry.id);\n entries.push(result.entry);\n });\n\n if (entries.length > 0 && hasDependencyCycle(entries as FeatureManifest)) {\n errors.push({\n path: \"$\",\n message: \"Circular dependsOn relationship detected\",\n code: \"circular_dependency\",\n });\n }\n\n for (let index = 0; index < entries.length; index++) {\n const entry = entries[index];\n if (new Date(entry.showNewUntil).getTime() <= new Date(entry.releasedAt).getTime()) {\n errors.push({\n path: `[${index}].showNewUntil`,\n message: \"showNewUntil must be after releasedAt\",\n code: \"invalid_value\",\n });\n }\n\n if (entry.url && !isSafeUrl(entry.url)) {\n errors.push({\n path: `[${index}].url`,\n message: \"url must be http, https, or relative\",\n code: \"invalid_value\",\n });\n }\n\n if (entry.image && !isSafeUrl(entry.image)) {\n errors.push({\n path: `[${index}].image`,\n message: \"image must be http, https, or relative\",\n code: \"invalid_value\",\n });\n }\n\n if (entry.cta?.url && !isSafeUrl(entry.cta.url)) {\n errors.push({\n path: `[${index}].cta.url`,\n message: \"cta.url must be http, https, or relative\",\n code: \"invalid_value\",\n });\n }\n\n const unsafeMetaPath = findUnsafeMetaPath(entry.meta);\n if (unsafeMetaPath) {\n errors.push({\n path: `[${index}].${unsafeMetaPath}`,\n message: `meta contains unsafe key \"${unsafeMetaPath.split(\".\").pop()}\"`,\n code: \"invalid_value\",\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","import { readdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { join, relative, sep } from \"node:path\";\nimport type { FeatureEntry } from \"./types\";\nimport { validateManifest } from \"./schema\";\n\ninterface ParseResult {\n frontmatter: Record<string, unknown>;\n body: string;\n}\n\nexport interface BuildManifestOptions {\n cwd?: string;\n pattern?: string;\n outFile?: string;\n}\n\nfunction parseScalar(raw: string): unknown {\n const value = raw.trim();\n if (!value) return \"\";\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n if (value === \"null\") return null;\n if (/^-?\\d+(\\.\\d+)?$/.test(value)) return Number(value);\n if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n const inner = value.slice(1, -1).trim();\n if (!inner) return [];\n return inner.split(\",\").map((part) => String(parseScalar(part.trim())));\n }\n return value;\n}\n\nfunction parseFrontmatter(raw: string): Record<string, unknown> {\n const lines = raw.split(/\\r?\\n/);\n const root: Record<string, unknown> = {};\n const stack: Array<{ indent: number; value: Record<string, unknown> | unknown[] }> = [\n { indent: -1, value: root },\n ];\n\n const isArrayContext = (idx: number): boolean => {\n for (let i = idx + 1; i < lines.length; i++) {\n const line = lines[i];\n if (!line.trim()) continue;\n const indent = line.length - line.trimStart().length;\n if (indent <= (lines[idx].length - lines[idx].trimStart().length)) return false;\n return line.trimStart().startsWith(\"- \");\n }\n return false;\n };\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line.trim() || line.trimStart().startsWith(\"#\")) continue;\n\n const indent = line.length - line.trimStart().length;\n const trimmed = line.trim();\n\n while (stack.length > 1 && indent <= stack[stack.length - 1].indent) {\n stack.pop();\n }\n\n const current = stack[stack.length - 1].value;\n\n if (trimmed.startsWith(\"- \")) {\n if (!Array.isArray(current)) {\n throw new Error(`Invalid frontmatter list at line ${i + 1}`);\n }\n const item = trimmed.slice(2).trim();\n current.push(parseScalar(item));\n continue;\n }\n\n const colon = trimmed.indexOf(\":\");\n if (colon === -1) {\n throw new Error(`Invalid frontmatter line ${i + 1}: ${trimmed}`);\n }\n\n const key = trimmed.slice(0, colon).trim();\n const rest = trimmed.slice(colon + 1).trim();\n\n if (Array.isArray(current)) {\n throw new Error(`Unexpected key in list at line ${i + 1}`);\n }\n\n if (!rest) {\n const container: Record<string, unknown> | unknown[] = isArrayContext(i) ? [] : {};\n current[key] = container;\n stack.push({ indent, value: container });\n continue;\n }\n\n current[key] = parseScalar(rest);\n }\n\n return root;\n}\n\nfunction splitFrontmatter(markdown: string): ParseResult {\n const normalized = markdown.replace(/\\r\\n/g, \"\\n\");\n if (!normalized.startsWith(\"---\\n\")) {\n return { frontmatter: {}, body: normalized.trim() };\n }\n\n const end = normalized.indexOf(\"\\n---\\n\", 4);\n if (end === -1) {\n throw new Error(\"Frontmatter block is not closed with ---\");\n }\n\n const fmRaw = normalized.slice(4, end);\n const body = normalized.slice(end + 5).trim();\n return {\n frontmatter: parseFrontmatter(fmRaw),\n body,\n };\n}\n\nfunction asString(value: unknown, field: string, source: string): string {\n if (typeof value !== \"string\" || !value.trim()) {\n throw new Error(`${source}: \"${field}\" must be a non-empty string`);\n }\n return value;\n}\n\nfunction asOptionalObject(value: unknown, field: string, source: string): Record<string, unknown> | undefined {\n if (value === undefined) return undefined;\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(`${source}: \"${field}\" must be an object`);\n }\n return value as Record<string, unknown>;\n}\n\nexport function parseFeatureFile(markdown: string, source = \"feature.md\"): FeatureEntry {\n const { frontmatter, body } = splitFrontmatter(markdown);\n\n const entry: FeatureEntry = {\n id: asString(frontmatter.id, \"id\", source),\n label: asString(frontmatter.label, \"label\", source),\n releasedAt: asString(frontmatter.releasedAt, \"releasedAt\", source),\n showNewUntil: asString(frontmatter.showNewUntil, \"showNewUntil\", source),\n description: body || undefined,\n };\n\n if (frontmatter.sidebarKey !== undefined) entry.sidebarKey = asString(frontmatter.sidebarKey, \"sidebarKey\", source);\n if (frontmatter.category !== undefined) entry.category = asString(frontmatter.category, \"category\", source);\n if (frontmatter.product !== undefined) entry.product = asString(frontmatter.product, \"product\", source);\n if (frontmatter.url !== undefined) entry.url = asString(frontmatter.url, \"url\", source);\n if (frontmatter.flagKey !== undefined) entry.flagKey = asString(frontmatter.flagKey, \"flagKey\", source);\n if (frontmatter.image !== undefined) entry.image = asString(frontmatter.image, \"image\", source);\n if (frontmatter.publishAt !== undefined) entry.publishAt = asString(frontmatter.publishAt, \"publishAt\", source);\n if (frontmatter.version !== undefined) {\n if (typeof frontmatter.version === \"string\" || typeof frontmatter.version === \"object\") {\n entry.version = frontmatter.version as FeatureEntry[\"version\"];\n } else {\n throw new Error(`${source}: \"version\" must be a string or object`);\n }\n }\n if (frontmatter.type !== undefined) {\n const type = asString(frontmatter.type, \"type\", source);\n if (![\"feature\", \"improvement\", \"fix\", \"breaking\"].includes(type)) {\n throw new Error(`${source}: invalid \"type\" value \"${type}\"`);\n }\n entry.type = type as FeatureEntry[\"type\"];\n }\n if (frontmatter.priority !== undefined) {\n const priority = asString(frontmatter.priority, \"priority\", source);\n if (![\"critical\", \"normal\", \"low\"].includes(priority)) {\n throw new Error(`${source}: invalid \"priority\" value \"${priority}\"`);\n }\n entry.priority = priority as FeatureEntry[\"priority\"];\n }\n\n const cta = asOptionalObject(frontmatter.cta, \"cta\", source);\n if (cta) {\n entry.cta = {\n label: asString(cta.label, \"cta.label\", source),\n url: asString(cta.url, \"cta.url\", source),\n };\n }\n\n const audience = asOptionalObject(frontmatter.audience, \"audience\", source);\n if (audience) {\n const parsedAudience: FeatureEntry[\"audience\"] = {};\n for (const field of [\"plan\", \"role\", \"region\"] as const) {\n const value = audience[field];\n if (value !== undefined) {\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new Error(`${source}: \"audience.${field}\" must be string[]`);\n }\n parsedAudience[field] = value;\n }\n }\n if (audience.custom !== undefined) {\n if (!audience.custom || typeof audience.custom !== \"object\" || Array.isArray(audience.custom)) {\n throw new Error(`${source}: \"audience.custom\" must be an object`);\n }\n parsedAudience.custom = audience.custom as Record<string, unknown>;\n }\n entry.audience = parsedAudience;\n }\n\n return entry;\n}\n\nfunction normalizePattern(pattern: string): { baseDir: string; ext: string } {\n const normalized = pattern.replaceAll(\"\\\\\", \"/\");\n if (normalized.endsWith(\"/**/*.md\")) {\n return {\n baseDir: normalized.slice(0, -\"/**/*.md\".length),\n ext: \".md\",\n };\n }\n throw new Error(`Unsupported pattern \"${pattern}\". Use \"features/**/*.md\" style patterns.`);\n}\n\nasync function collectFiles(dir: string, ext: string): Promise<string[]> {\n const out: string[] = [];\n async function walk(current: string): Promise<void> {\n let entries;\n try {\n entries = await readdir(current, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const fullPath = join(current, entry.name);\n if (entry.isDirectory()) {\n await walk(fullPath);\n continue;\n }\n if (entry.isFile() && entry.name.endsWith(ext)) {\n out.push(fullPath);\n }\n }\n }\n await walk(dir);\n return out.sort();\n}\n\nexport async function buildManifestFromPattern(options: BuildManifestOptions = {}): Promise<FeatureEntry[]> {\n const cwd = options.cwd ?? process.cwd();\n const pattern = options.pattern ?? \"features/**/*.md\";\n const { baseDir, ext } = normalizePattern(pattern);\n const baseAbs = join(cwd, baseDir);\n\n const stats = await stat(baseAbs).catch(() => null);\n if (!stats || !stats.isDirectory()) {\n throw new Error(`Pattern base directory does not exist: ${baseDir}`);\n }\n\n const files = await collectFiles(baseAbs, ext);\n const entries: FeatureEntry[] = [];\n const seenIds = new Set<string>();\n\n for (const file of files) {\n const content = await readFile(file, \"utf8\");\n const source = relative(cwd, file).split(sep).join(\"/\");\n const entry = parseFeatureFile(content, source);\n if (seenIds.has(entry.id)) {\n throw new Error(`Duplicate feature id \"${entry.id}\" found at ${source}`);\n }\n seenIds.add(entry.id);\n entries.push(entry);\n }\n\n if (options.outFile) {\n const outPath = join(cwd, options.outFile);\n await writeFile(outPath, `${JSON.stringify(entries, null, 2)}\\n`, \"utf8\");\n }\n\n return entries;\n}\n\nexport async function validateFeatureFiles(options: BuildManifestOptions = {}): Promise<void> {\n const entries = await buildManifestFromPattern(options);\n const result = validateManifest(entries);\n if (!result.valid) {\n const message = result.errors\n .map((issue) => `${issue.path}: ${issue.message}`)\n .join(\"; \");\n throw new Error(`Manifest validation failed: ${message}`);\n }\n}\n","import { PostHog } from \"posthog-node\";\n\nlet _client: PostHog | null = null;\n\n/**\n * Returns true when analytics should be suppressed:\n * - POSTHOG_OPT_OUT env var is set (any truthy value)\n * - NODE_ENV is 'development' or 'test'\n * - CI environment detected\n */\nfunction isOptedOut(): boolean {\n const optOut = process.env.POSTHOG_OPT_OUT;\n if (optOut && optOut !== \"0\" && optOut !== \"false\") return true;\n\n const env = process.env.NODE_ENV;\n if (env === \"development\" || env === \"test\") return true;\n\n if (process.env.CI) return true;\n\n return false;\n}\n\n/**\n * Returns a shared PostHog client configured for CLI (short-lived process) use.\n * Events are flushed immediately (flushAt=1, flushInterval=0).\n *\n * Returns null (safely skips analytics) when:\n * - POSTHOG_API_KEY is not set\n * - POSTHOG_OPT_OUT is set to a truthy value\n * - NODE_ENV is 'development' or 'test'\n * - Running in CI\n */\nexport function getPostHogClient(): PostHog | null {\n if (isOptedOut()) return null;\n\n const apiKey = process.env.POSTHOG_API_KEY;\n if (!apiKey) return null;\n\n if (!_client) {\n _client = new PostHog(apiKey, {\n host: process.env.POSTHOG_HOST ?? \"https://us.i.posthog.com\",\n flushAt: 1,\n flushInterval: 0,\n enableExceptionAutocapture: true,\n });\n }\n return _client;\n}\n\n/**\n * Shuts down the PostHog client and flushes any pending events.\n * Call before process exit in CLI contexts.\n */\nexport async function shutdownPostHog(): Promise<void> {\n if (_client) {\n await _client.shutdown();\n _client = null;\n }\n}\n","import { hasDependencyCycle } from \"./dependencies\";\nimport type { FeatureEntry } from \"./types\";\n\nexport interface ManifestStats {\n total: number;\n byType: Record<string, number>;\n byCategory: Record<string, number>;\n newestRelease: string | null;\n oldestRelease: string | null;\n}\n\nexport function computeManifestStats(entries: FeatureEntry[]): ManifestStats {\n const byType: Record<string, number> = {};\n const byCategory: Record<string, number> = {};\n\n for (const entry of entries) {\n const type = entry.type ?? \"feature\";\n byType[type] = (byType[type] ?? 0) + 1;\n if (entry.category) {\n byCategory[entry.category] = (byCategory[entry.category] ?? 0) + 1;\n }\n }\n\n const sortedByDate = [...entries].sort(\n (a, b) => new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime(),\n );\n\n return {\n total: entries.length,\n byType,\n byCategory,\n newestRelease: sortedByDate[0]?.releasedAt ?? null,\n oldestRelease: sortedByDate[sortedByDate.length - 1]?.releasedAt ?? null,\n };\n}\n\nexport function generateMarkdownChangelog(entries: FeatureEntry[]): string {\n const sorted = [...entries].sort(\n (a, b) => new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime(),\n );\n const sections = sorted.map((entry) => {\n const lines = [\n `## ${entry.label}`,\n \"\",\n `- **ID**: \\`${entry.id}\\``,\n `- **Released**: ${entry.releasedAt}`,\n ];\n if (entry.type) lines.push(`- **Type**: ${entry.type}`);\n if (entry.category) lines.push(`- **Category**: ${entry.category}`);\n if (entry.showNewUntil) lines.push(`- **Show new until**: ${entry.showNewUntil}`);\n if (entry.cta) lines.push(`- **CTA**: [${entry.cta.label}](${entry.cta.url})`);\n if (entry.description) {\n lines.push(\"\", entry.description.trim());\n }\n return lines.join(\"\\n\");\n });\n\n return `# Generated Changelog\\n\\n${sections.join(\"\\n\\n---\\n\\n\")}\\n`;\n}\n\nfunction isIsoWithTimezone(value: string): boolean {\n if (!value.includes(\"T\")) return false;\n if (!(value.endsWith(\"Z\") || /[+-]\\d{2}:\\d{2}$/.test(value))) return false;\n return Number.isFinite(new Date(value).getTime());\n}\n\nexport interface DoctorReport {\n checks: string[];\n warnings: string[];\n errors: string[];\n}\n\nexport function runDoctor(entries: FeatureEntry[], now: Date = new Date()): DoctorReport {\n const checks: string[] = [];\n const warnings: string[] = [];\n const errors: string[] = [];\n\n checks.push(`Manifest entries loaded: ${entries.length}`);\n\n const ids = new Set<string>();\n let duplicateCount = 0;\n for (const entry of entries) {\n if (ids.has(entry.id)) duplicateCount += 1;\n ids.add(entry.id);\n }\n if (duplicateCount > 0) {\n errors.push(`${duplicateCount} duplicate feature id(s) found`);\n } else {\n checks.push(\"No duplicate IDs\");\n }\n\n let invalidDateCount = 0;\n let reversedDateCount = 0;\n let expiredCount = 0;\n let scheduledCount = 0;\n let missingDescriptionCount = 0;\n\n for (const entry of entries) {\n if (!entry.description?.trim()) missingDescriptionCount += 1;\n if (!isIsoWithTimezone(entry.releasedAt) || !isIsoWithTimezone(entry.showNewUntil)) {\n invalidDateCount += 1;\n continue;\n }\n const released = new Date(entry.releasedAt).getTime();\n const showUntil = new Date(entry.showNewUntil).getTime();\n if (showUntil <= released) reversedDateCount += 1;\n if (showUntil < now.getTime()) expiredCount += 1;\n if (entry.publishAt) {\n const publishMs = new Date(entry.publishAt).getTime();\n if (Number.isFinite(publishMs) && publishMs > now.getTime()) scheduledCount += 1;\n }\n }\n\n if (invalidDateCount > 0) {\n errors.push(`${invalidDateCount} entries have invalid ISO 8601 dates with timezone`);\n } else {\n checks.push(\"All dates are valid ISO 8601 with timezone\");\n }\n\n if (reversedDateCount > 0) {\n errors.push(`${reversedDateCount} entries have showNewUntil before/at releasedAt`);\n }\n\n if (expiredCount > 0) warnings.push(`${expiredCount} entries have showNewUntil in the past`);\n if (scheduledCount > 0) warnings.push(`${scheduledCount} entries have publishAt in the future`);\n\n if (missingDescriptionCount > 0) {\n errors.push(`${missingDescriptionCount} entries have no description`);\n } else {\n checks.push(\"All entries have descriptions\");\n }\n\n if (hasDependencyCycle(entries)) {\n errors.push(\"Circular dependsOn relationship detected\");\n } else {\n checks.push(\"No circular dependencies in dependsOn chains\");\n }\n\n return { checks, warnings, errors };\n}\n","import { mkdir, readFile, readdir, stat, writeFile } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport { buildManifestFromPattern } from \"./changelog-as-code\";\nimport { validateManifest } from \"./schema\";\nimport type { FeatureEntry, FeatureType } from \"./types\";\n\nexport type InitFormat = \"markdown\" | \"json\";\n\nexport interface InitProjectOptions {\n cwd?: string;\n format?: InitFormat;\n force?: boolean;\n now?: Date;\n}\n\nexport interface InitProjectResult {\n format: InitFormat;\n created: string[];\n}\n\nexport interface AddFeatureOptions {\n cwd?: string;\n format?: InitFormat;\n id?: string;\n label: string;\n description?: string;\n type?: FeatureType;\n category?: string;\n url?: string;\n releasedAt?: string;\n showNewUntil?: string;\n showDays?: number;\n}\n\nexport interface AddFeatureResult {\n format: InitFormat;\n path: string;\n entry: FeatureEntry;\n}\n\nexport interface MigrateOptions {\n cwd?: string;\n from: MigrationSource;\n inputFile: string;\n outFile?: string;\n now?: Date;\n}\n\nexport type MigrationSource =\n | \"beamer\"\n | \"headway\"\n | \"announcekit\"\n | \"canny\"\n | \"launchnotes\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n const result = await stat(path).catch(() => null);\n return !!result;\n}\n\nfunction ensureIsoDate(value: string, field: string): string {\n const parsed = new Date(value).getTime();\n if (!Number.isFinite(parsed)) {\n throw new Error(`\"${field}\" must be a valid ISO date string`);\n }\n return new Date(parsed).toISOString();\n}\n\nfunction withDays(date: Date, days: number): string {\n return new Date(date.getTime() + days * 24 * 60 * 60 * 1000).toISOString();\n}\n\nfunction toSlug(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/-{2,}/g, \"-\");\n}\n\nfunction getPathDate(dateIso: string): string {\n return dateIso.slice(0, 10);\n}\n\nfunction getFrontmatterValue(value: string): string {\n return value.replace(/\\n/g, \" \").trim();\n}\n\nexport function slugifyFeatureId(label: string): string {\n const slug = toSlug(label);\n return slug || \"feature\";\n}\n\nexport function createFeatureEntry(options: AddFeatureOptions, now: Date = new Date()): FeatureEntry {\n const releasedAt = options.releasedAt\n ? ensureIsoDate(options.releasedAt, \"releasedAt\")\n : now.toISOString();\n const showNewUntil = options.showNewUntil\n ? ensureIsoDate(options.showNewUntil, \"showNewUntil\")\n : withDays(new Date(releasedAt), options.showDays ?? 14);\n const id = options.id ? slugifyFeatureId(options.id) : slugifyFeatureId(options.label);\n\n const entry: FeatureEntry = {\n id,\n label: options.label.trim(),\n releasedAt,\n showNewUntil,\n type: options.type ?? \"feature\",\n };\n\n if (options.description?.trim()) entry.description = options.description.trim();\n if (options.category?.trim()) entry.category = options.category.trim();\n if (options.url?.trim()) entry.url = options.url.trim();\n\n return entry;\n}\n\nexport function renderFeatureMarkdown(entry: FeatureEntry): string {\n const lines = [\n \"---\",\n `id: ${getFrontmatterValue(entry.id)}`,\n `label: ${getFrontmatterValue(entry.label)}`,\n `releasedAt: ${entry.releasedAt}`,\n `showNewUntil: ${entry.showNewUntil}`,\n ];\n if (entry.type) lines.push(`type: ${entry.type}`);\n if (entry.category) lines.push(`category: ${getFrontmatterValue(entry.category)}`);\n if (entry.url) lines.push(`url: ${getFrontmatterValue(entry.url)}`);\n lines.push(\"---\", \"\");\n if (entry.description) {\n lines.push(entry.description.trim(), \"\");\n } else {\n lines.push(\"Describe the feature here.\", \"\");\n }\n return `${lines.join(\"\\n\")}`;\n}\n\nfunction getNextAvailablePath(existingNames: ReadonlySet<string>, baseName: string): string {\n if (!existingNames.has(baseName)) return baseName;\n const ext = baseName.endsWith(\".md\") ? \".md\" : \"\";\n const withoutExt = ext ? baseName.slice(0, -ext.length) : baseName;\n let index = 2;\n while (existingNames.has(`${withoutExt}-${index}${ext}`)) {\n index += 1;\n }\n return `${withoutExt}-${index}${ext}`;\n}\n\nasync function detectProjectFormat(cwd: string, explicit?: InitFormat): Promise<InitFormat> {\n if (explicit) return explicit;\n if (await pathExists(join(cwd, \"features\"))) return \"markdown\";\n if (await pathExists(join(cwd, \"features.json\"))) return \"json\";\n return \"markdown\";\n}\n\nexport async function initFeaturedropProject(options: InitProjectOptions = {}): Promise<InitProjectResult> {\n const cwd = options.cwd ?? process.cwd();\n const format = options.format ?? \"markdown\";\n const now = options.now ?? new Date();\n const force = options.force ?? false;\n const created: string[] = [];\n\n if (format === \"markdown\") {\n const featuresDir = join(cwd, \"features\");\n if (await pathExists(featuresDir)) {\n const existing = await readdir(featuresDir).catch(() => []);\n if (existing.length > 0 && !force) {\n throw new Error(\"features/ already exists and is not empty (use --force to overwrite sample files)\");\n }\n }\n await mkdir(featuresDir, { recursive: true });\n const sample = createFeatureEntry(\n {\n id: \"welcome-featuredrop\",\n label: \"Welcome to featuredrop\",\n description: \"Update this file with your first product announcement.\",\n category: \"onboarding\",\n type: \"feature\",\n releasedAt: now.toISOString(),\n showDays: 30,\n },\n now,\n );\n const sampleName = `${getPathDate(sample.releasedAt)}-${sample.id}.md`;\n const samplePath = join(featuresDir, sampleName);\n await writeFile(samplePath, renderFeatureMarkdown(sample), \"utf8\");\n created.push(\"features/\");\n created.push(`features/${sampleName}`);\n return { format, created };\n }\n\n const manifestPath = join(cwd, \"features.json\");\n if (await pathExists(manifestPath)) {\n if (!force) {\n throw new Error(\"features.json already exists (use --force to overwrite)\");\n }\n }\n const sample = createFeatureEntry(\n {\n id: \"welcome-featuredrop\",\n label: \"Welcome to featuredrop\",\n description: \"Replace this sample entry with your own release notes.\",\n category: \"onboarding\",\n type: \"feature\",\n releasedAt: now.toISOString(),\n showDays: 30,\n },\n now,\n );\n await writeFile(manifestPath, `${JSON.stringify([sample], null, 2)}\\n`, \"utf8\");\n created.push(\"features.json\");\n return { format, created };\n}\n\nasync function ensureUniqueIdForMarkdown(cwd: string, id: string): Promise<void> {\n const featuresDir = join(cwd, \"features\");\n if (!(await pathExists(featuresDir))) return;\n const entries = await buildManifestFromPattern({ cwd, pattern: \"features/**/*.md\" }).catch(() => []);\n if (entries.some((entry) => entry.id === id)) {\n throw new Error(`Feature id \"${id}\" already exists`);\n }\n}\n\nasync function addFeatureToMarkdown(cwd: string, entry: FeatureEntry): Promise<string> {\n await mkdir(join(cwd, \"features\"), { recursive: true });\n await ensureUniqueIdForMarkdown(cwd, entry.id);\n const existingFiles = new Set(\n (await readdir(join(cwd, \"features\")).catch(() => []))\n .filter((name) => name.endsWith(\".md\")),\n );\n const baseName = `${getPathDate(entry.releasedAt)}-${entry.id}.md`;\n const fileName = getNextAvailablePath(existingFiles, baseName);\n const relPath = `features/${fileName}`;\n await writeFile(join(cwd, relPath), renderFeatureMarkdown(entry), \"utf8\");\n return relPath;\n}\n\nasync function addFeatureToJson(cwd: string, entry: FeatureEntry): Promise<string> {\n const manifestPath = join(cwd, \"features.json\");\n const raw = await readFile(manifestPath, \"utf8\").catch(() => \"[]\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(\"features.json is not valid JSON\");\n }\n if (!Array.isArray(parsed)) {\n throw new Error(\"features.json must contain an array of feature entries\");\n }\n const existing = parsed as FeatureEntry[];\n if (existing.some((item) => item.id === entry.id)) {\n throw new Error(`Feature id \"${entry.id}\" already exists`);\n }\n const next = [...existing, entry];\n const validation = validateManifest(next);\n if (!validation.valid) {\n throw new Error(`features.json validation failed: ${validation.errors[0]?.message ?? \"unknown error\"}`);\n }\n await writeFile(manifestPath, `${JSON.stringify(next, null, 2)}\\n`, \"utf8\");\n return \"features.json\";\n}\n\nexport async function addFeatureEntry(options: AddFeatureOptions): Promise<AddFeatureResult> {\n const cwd = options.cwd ?? process.cwd();\n const format = await detectProjectFormat(cwd, options.format);\n const entry = createFeatureEntry(options);\n const path = format === \"markdown\"\n ? await addFeatureToMarkdown(cwd, entry)\n : await addFeatureToJson(cwd, entry);\n return { format, path, entry };\n}\n\nfunction pickString(obj: Record<string, unknown>, keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const value = obj[key];\n if (typeof value === \"string\" && value.trim()) return value.trim();\n }\n return undefined;\n}\n\nfunction getMigrationItems(payload: unknown): unknown[] {\n if (Array.isArray(payload)) return payload;\n if (!isRecord(payload)) throw new Error(\"Migration payload must be an array or object\");\n for (const key of [\"posts\", \"items\", \"announcements\", \"entries\"] as const) {\n const value = payload[key];\n if (Array.isArray(value)) return value;\n }\n throw new Error(\"Could not find entries array in migration payload\");\n}\n\nfunction normalizeDate(raw: string | undefined, fallback: Date): string {\n if (!raw) return fallback.toISOString();\n const parsed = new Date(raw).getTime();\n if (!Number.isFinite(parsed)) return fallback.toISOString();\n return new Date(parsed).toISOString();\n}\n\nfunction buildFallbackId(prefix: string, index: number): string {\n return `${prefix}-entry-${index + 1}`;\n}\n\ninterface MigrationProfile {\n fallbackPrefix: string;\n labelKeys: readonly string[];\n idKeys: readonly string[];\n dateKeys: readonly string[];\n categoryKeys: readonly string[];\n urlKeys: readonly string[];\n descriptionKeys: readonly string[];\n showUntilKeys: readonly string[];\n}\n\nconst MIGRATION_PROFILES: Record<MigrationSource, MigrationProfile> = {\n beamer: {\n fallbackPrefix: \"beamer\",\n labelKeys: [\"title\", \"name\", \"headline\"],\n idKeys: [\"id\", \"uid\", \"slug\", \"postId\", \"post_id\"],\n dateKeys: [\"publishedAt\", \"published_at\", \"published\", \"createdAt\", \"created_at\", \"date\"],\n categoryKeys: [\"category\", \"type\", \"segment\"],\n urlKeys: [\"url\", \"link\", \"permalink\"],\n descriptionKeys: [\"description\", \"content\", \"body\", \"html\"],\n showUntilKeys: [\"showNewUntil\", \"show_new_until\", \"newUntil\", \"new_until\"],\n },\n headway: {\n fallbackPrefix: \"headway\",\n labelKeys: [\"title\", \"name\", \"headline\"],\n idKeys: [\"id\", \"slug\", \"entryId\", \"entry_id\"],\n dateKeys: [\"publishedAt\", \"published_at\", \"createdAt\", \"created_at\", \"date\"],\n categoryKeys: [\"category\", \"tag\", \"tags\"],\n urlKeys: [\"url\", \"link\", \"permalink\"],\n descriptionKeys: [\"description\", \"summary\", \"content\", \"body\"],\n showUntilKeys: [\"showNewUntil\", \"new_until\"],\n },\n announcekit: {\n fallbackPrefix: \"announcekit\",\n labelKeys: [\"title\", \"subject\", \"name\"],\n idKeys: [\"id\", \"post_id\", \"postId\", \"slug\"],\n dateKeys: [\"published_at\", \"publishedAt\", \"created_at\", \"createdAt\", \"date\"],\n categoryKeys: [\"category\", \"segment\", \"tab\", \"label\"],\n urlKeys: [\"url\", \"link\", \"permalink\"],\n descriptionKeys: [\"description\", \"content\", \"html\", \"body\"],\n showUntilKeys: [\"show_new_until\", \"showNewUntil\", \"new_until\"],\n },\n canny: {\n fallbackPrefix: \"canny\",\n labelKeys: [\"title\", \"name\"],\n idKeys: [\"id\", \"postId\", \"post_id\", \"slug\"],\n dateKeys: [\"createdAt\", \"created_at\", \"publishedAt\", \"published_at\", \"date\"],\n categoryKeys: [\"category\", \"type\", \"boardName\"],\n urlKeys: [\"url\", \"link\", \"permalink\"],\n descriptionKeys: [\"details\", \"description\", \"content\", \"body\"],\n showUntilKeys: [\"showNewUntil\", \"new_until\"],\n },\n launchnotes: {\n fallbackPrefix: \"launchnotes\",\n labelKeys: [\"title\", \"headline\", \"name\"],\n idKeys: [\"id\", \"slug\", \"noteId\", \"note_id\"],\n dateKeys: [\"publishedAt\", \"published_at\", \"createdAt\", \"created_at\", \"date\"],\n categoryKeys: [\"category\", \"segment\", \"channel\"],\n urlKeys: [\"url\", \"link\", \"permalink\"],\n descriptionKeys: [\"description\", \"body\", \"content\", \"summary\"],\n showUntilKeys: [\"showNewUntil\", \"new_until\"],\n },\n};\n\nexport function migrateFromSourcePayload(\n source: MigrationSource,\n payload: unknown,\n now: Date = new Date(),\n): FeatureEntry[] {\n const profile = MIGRATION_PROFILES[source];\n const items = getMigrationItems(payload);\n const usedIds = new Set<string>();\n\n return items\n .map((raw, index) => {\n if (!isRecord(raw)) return null;\n const release = normalizeDate(\n pickString(raw, profile.dateKeys),\n now,\n );\n const label = pickString(raw, profile.labelKeys) ?? `Update ${index + 1}`;\n const idSeed = pickString(raw, profile.idKeys) ?? label;\n let id = slugifyFeatureId(idSeed);\n if (!id) id = buildFallbackId(profile.fallbackPrefix, index);\n while (usedIds.has(id)) {\n id = `${id}-${index + 1}`;\n }\n usedIds.add(id);\n\n const category = pickString(raw, profile.categoryKeys);\n const url = pickString(raw, profile.urlKeys);\n const description = pickString(raw, profile.descriptionKeys);\n const explicitShowUntil = normalizeDate(\n pickString(raw, profile.showUntilKeys),\n new Date(withDays(new Date(release), 30)),\n );\n\n const entry: FeatureEntry = {\n id,\n label,\n releasedAt: release,\n showNewUntil: explicitShowUntil,\n type: \"feature\",\n };\n if (description) entry.description = description;\n if (category) entry.category = category;\n if (url) entry.url = url;\n return entry;\n })\n .filter((value): value is FeatureEntry => !!value);\n}\n\nexport function migrateFromBeamerPayload(payload: unknown, now: Date = new Date()): FeatureEntry[] {\n return migrateFromSourcePayload(\"beamer\", payload, now);\n}\n\nexport function migrateFromHeadwayPayload(payload: unknown, now: Date = new Date()): FeatureEntry[] {\n return migrateFromSourcePayload(\"headway\", payload, now);\n}\n\nexport function migrateFromAnnounceKitPayload(payload: unknown, now: Date = new Date()): FeatureEntry[] {\n return migrateFromSourcePayload(\"announcekit\", payload, now);\n}\n\nexport function migrateFromCannyPayload(payload: unknown, now: Date = new Date()): FeatureEntry[] {\n return migrateFromSourcePayload(\"canny\", payload, now);\n}\n\nexport function migrateFromLaunchNotesPayload(payload: unknown, now: Date = new Date()): FeatureEntry[] {\n return migrateFromSourcePayload(\"launchnotes\", payload, now);\n}\n\nexport async function migrateManifest(options: MigrateOptions): Promise<{ outFile: string; entries: FeatureEntry[] }> {\n const cwd = options.cwd ?? process.cwd();\n const outFile = options.outFile ?? \"featuredrop.manifest.json\";\n const inputPath = join(cwd, options.inputFile);\n const raw = await readFile(inputPath, \"utf8\");\n const payload = JSON.parse(raw) as unknown;\n\n const entries = migrateFromSourcePayload(options.from, payload, options.now ?? new Date());\n await writeFile(join(cwd, outFile), `${JSON.stringify(entries, null, 2)}\\n`, \"utf8\");\n return { outFile: basename(outFile), entries };\n}\n","import * as moduleApi from \"module\";\n\n// Lightweight markdown parser with optional `marked` + `shiki` support.\n// The function is synchronous and always returns sanitized HTML.\n\ntype MarkedRenderer = {\n link?: (href: string | null, title: string | null, text: string) => string;\n image?: (href: string | null, title: string | null, text: string) => string;\n paragraph?: (text: string) => string;\n heading?: (text: string, level: number) => string;\n};\n\ntype MarkedModule = {\n Renderer?: new () => MarkedRenderer;\n parse?: (markdown: string, options?: { renderer?: MarkedRenderer }) => string | Promise<string>;\n};\n\ntype ShikiLike = {\n codeToHtml?: (code: string, options?: { lang?: string; theme?: string }) => string | Promise<string>;\n};\n\nconst dynamicRequire =\n typeof moduleApi.createRequire === \"function\" ? moduleApi.createRequire(import.meta.url) : null;\n\nlet cachedMarked: MarkedModule | null | false = null;\nlet cachedShiki: ShikiLike | null | false = null;\n\nfunction optionalRequire<T>(name: string): T | null {\n if (!dynamicRequire) return null;\n try {\n // Using dynamic require so missing optional peers don't break bundling/runtime.\n return dynamicRequire(name) as T;\n } catch (error: unknown) {\n if (error && typeof error === \"object\" && \"code\" in error && (error as { code?: string }).code === \"MODULE_NOT_FOUND\") {\n return null;\n }\n // Any other error should still be treated as a failure to keep parsing resilient.\n return null;\n }\n}\n\nfunction getMarked(): MarkedModule | null {\n if (cachedMarked !== null) return cachedMarked || null;\n cachedMarked = optionalRequire<MarkedModule>(\"marked\") ?? false;\n return cachedMarked || null;\n}\n\nfunction getShiki(): ShikiLike | null {\n if (cachedShiki !== null) return cachedShiki || null;\n cachedShiki = optionalRequire<ShikiLike>(\"shiki\") ?? false;\n return cachedShiki || null;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction sanitizeUrl(url: string | null | undefined): string | null {\n if (!url) return null;\n const trimmed = url.trim();\n if (!trimmed) return null;\n\n const lower = trimmed.toLowerCase();\n if (lower.startsWith(\"javascript:\")) return null;\n if (lower.startsWith(\"data:\")) return null;\n if (lower.startsWith(\"vbscript:\")) return null;\n\n // Disallow characters that can break attribute context\n if (/['\"<>\\s]/.test(trimmed)) return null;\n\n return trimmed;\n}\n\nfunction sanitizeHtml(html: string): string {\n return html\n // Remove script/style tags entirely\n .replace(/<script[\\s\\S]*?>[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/<style[\\s\\S]*?>[\\s\\S]*?<\\/style>/gi, \"\")\n // Remove inline event handlers (on*)\n .replace(/\\s+on[a-z]+\\s*=\\s*(\"[^\"]*\"|'[^']*'|[^\\s>]+)/gi, \"\")\n // Remove javascript: or data: URLs in href/src/xlink:href\n .replace(/\\s+(?:href|src|xlink:href)\\s*=\\s*(\"|')(?:javascript:|data:)[^\"']*\\1/gi, \"\");\n}\n\nfunction decodeAllowedEntities(html: string): string {\n const allowTags = [\n \"p\",\n \"strong\",\n \"em\",\n \"a\",\n \"code\",\n \"pre\",\n \"img\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"br\",\n ];\n\n // Decode common entities inside allowed tags only\n return html.replace(/<(\\/?)([a-z0-9]+)([^>]*)>/gi, (match, slash, tag, rest) => {\n if (!allowTags.includes(tag.toLowerCase())) return match;\n const decodedRest = rest\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n return `<${slash}${tag}${decodedRest}>`;\n });\n}\n\nfunction renderCodeBlock(code: string, language: string | undefined): string {\n const shiki = getShiki();\n if (shiki?.codeToHtml) {\n try {\n const rendered = shiki.codeToHtml(code, { lang: language || \"text\", theme: \"github-dark\" });\n if (typeof rendered === \"string\") return rendered;\n } catch {\n // Fall through to non-highlighted rendering\n }\n }\n\n const langAttr = language ? ` class=\"language-${escapeHtml(language)}\"` : \"\";\n return `<pre><code${langAttr}>${escapeHtml(code)}</code></pre>`;\n}\n\nfunction inlineMarkdown(text: string): string {\n // Escape user-provided HTML before applying markdown conversions.\n let result = escapeHtml(text);\n\n // Protect inline code spans so subsequent replacements don't mangle them.\n const codeSpans: string[] = [];\n result = result.replace(/`([^`]+)`/g, (_match, code) => {\n const idx = codeSpans.length;\n codeSpans.push(`<code>${escapeHtml(code)}</code>`);\n return `§§CODE${idx}§§`;\n });\n\n // Images: \n result = result.replace(/!\\[([^\\]]*)\\]\\(([^)]+)\\)/g, (_match, alt, url) => {\n const safeUrl = sanitizeUrl(url);\n const safeAlt = escapeHtml(alt ?? \"\");\n if (!safeUrl) return safeAlt;\n return `<img src=\"${escapeHtml(safeUrl)}\" alt=\"${safeAlt}\" />`;\n });\n\n // Links: [text](url)\n result = result.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (_match, label, url) => {\n const safeUrl = sanitizeUrl(url);\n const safeLabel = escapeHtml(label ?? \"\");\n if (!safeUrl) return safeLabel;\n return `<a href=\"${escapeHtml(safeUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">${safeLabel}</a>`;\n });\n\n // Bold and italic (basic)\n result = result.replace(/\\*\\*([^*]+)\\*\\*/g, \"<strong>$1</strong>\");\n result = result.replace(/\\*([^*]+)\\*/g, \"<em>$1</em>\");\n\n // Restore code spans\n result = result.replace(/§§CODE(\\d+)§§/g, (_m, idx) => codeSpans[Number(idx)] ?? \"\");\n\n return result;\n}\n\nfunction fallbackParse(markdown: string): string {\n const lines = markdown.split(/\\r?\\n/);\n const blocks: string[] = [];\n let listBuffer: string[] | null = null;\n let quoteBuffer: string[] | null = null;\n let inCodeBlock = false;\n let codeLang: string | undefined;\n let codeLines: string[] = [];\n\n const flushList = () => {\n if (!listBuffer) return;\n blocks.push(`<ul>${listBuffer.map((item) => `<li>${item}</li>`).join(\"\")}</ul>`);\n listBuffer = null;\n };\n\n const flushQuote = () => {\n if (!quoteBuffer) return;\n const content = quoteBuffer.map((line) => inlineMarkdown(line.trim())).join(\"<br>\");\n blocks.push(`<blockquote>${content}</blockquote>`);\n quoteBuffer = null;\n };\n\n const flushCode = () => {\n if (!inCodeBlock) return;\n blocks.push(renderCodeBlock(codeLines.join(\"\\n\"), codeLang));\n codeLines = [];\n codeLang = undefined;\n inCodeBlock = false;\n };\n\n for (const rawLine of lines) {\n const line = rawLine.replace(/\\s+$/, \"\");\n\n const codeFence = line.match(/^```(.*)$/);\n if (codeFence) {\n if (inCodeBlock) {\n flushCode();\n } else {\n flushList();\n flushQuote();\n inCodeBlock = true;\n codeLang = codeFence[1]?.trim() || undefined;\n codeLines = [];\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeLines.push(rawLine);\n continue;\n }\n\n const listMatch = line.match(/^\\s*[-*+]\\s+(.*)$/);\n if (listMatch) {\n flushQuote();\n listBuffer = listBuffer ?? [];\n listBuffer.push(inlineMarkdown(listMatch[1].trim()));\n continue;\n }\n\n if (listBuffer) flushList();\n\n const headingMatch = line.match(/^(#{1,6})\\s+(.*)$/);\n if (headingMatch) {\n flushQuote();\n const level = headingMatch[1].length;\n const content = inlineMarkdown(headingMatch[2].trim());\n blocks.push(`<h${level}>${content}</h${level}>`);\n continue;\n }\n\n const quoteMatch = line.match(/^>\\s?(.*)$/);\n if (quoteMatch) {\n quoteBuffer = quoteBuffer ?? [];\n quoteBuffer.push(quoteMatch[1]);\n continue;\n }\n\n if (quoteBuffer) flushQuote();\n\n if (!line.trim()) {\n continue;\n }\n\n blocks.push(`<p>${inlineMarkdown(line.trim())}</p>`);\n }\n\n flushList();\n flushQuote();\n flushCode();\n\n return blocks.join(\"\\n\");\n}\n\nfunction renderWithMarked(markdown: string, marked: MarkedModule): string | null {\n if (!marked.parse) return null;\n\n const renderer = marked.Renderer ? new marked.Renderer() : undefined;\n\n if (renderer) {\n renderer.link = (href, _title, text) => {\n const safeUrl = sanitizeUrl(href);\n if (!safeUrl) return escapeHtml(text);\n return `<a href=\"${escapeHtml(safeUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">${text}</a>`;\n };\n renderer.image = (href, _title, text) => {\n const safeUrl = sanitizeUrl(href);\n const safeAlt = escapeHtml(text ?? \"\");\n if (!safeUrl) return safeAlt;\n return `<img src=\"${escapeHtml(safeUrl)}\" alt=\"${safeAlt}\" />`;\n };\n }\n\n const output = marked.parse(markdown, renderer ? { renderer } : undefined);\n if (typeof output === \"string\") return output;\n return output ? String(output) : null;\n}\n\n/**\n * Parse a feature description from markdown into sanitized HTML.\n * - Uses `marked` when installed (optional peer dep)\n * - Falls back to a tiny built-in parser when `marked` is absent\n * - Strips script tags, event handlers, and javascript:/data: URLs\n */\nexport function parseDescription(markdown: string): string {\n if (!markdown) return \"\";\n\n const marked = getMarked();\n if (marked) {\n try {\n const rendered = renderWithMarked(markdown, marked);\n if (rendered) {\n const sanitized = sanitizeHtml(rendered);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n }\n } catch {\n // If marked fails for any reason, fall back to the tiny parser.\n }\n }\n\n // Fast path: raw HTML provided without `marked` installed\n if (/<[^>]+>/.test(markdown)) {\n const sanitized = sanitizeHtml(markdown);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n }\n\n const fallback = fallbackParse(markdown);\n const sanitized = sanitizeHtml(fallback);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n}\n","import type { FeatureManifest } from \"./types\";\nimport { parseDescription } from \"./markdown\";\n\nfunction escape(str: string): string {\n return str\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n\n/**\n * Generate a simple RSS 2.0 feed from a feature manifest.\n * Titles and descriptions are sanitized via `parseDescription`.\n */\nexport function generateRSS(manifest: FeatureManifest, options?: { title?: string; link?: string; description?: string }): string {\n const title = escape(options?.title ?? \"Featuredrop Changelog\");\n const link = escape(options?.link ?? \"\");\n const desc = escape(options?.description ?? \"Product updates\");\n\n const items = manifest\n .slice()\n .sort((a, b) => new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime())\n .map((item) => {\n const descriptionHtml = item.description ? parseDescription(item.description) : \"\";\n const itemLink = item.url ? escape(item.url) : \"\";\n return [\n \"<item>\",\n `<title>${escape(item.label)}</title>`,\n itemLink ? `<link>${itemLink}</link>` : \"\",\n `<guid isPermaLink=\\\"false\\\">${escape(item.id)}</guid>`,\n `<pubDate>${new Date(item.releasedAt).toUTCString()}</pubDate>`,\n `<description><![CDATA[${descriptionHtml}]]></description>`,\n \"</item>\",\n ].join(\"\");\n })\n .join(\"\");\n\n return [\n \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\",\n \"<rss version=\\\"2.0\\\">\",\n \"<channel>\",\n `<title>${title}</title>`,\n link ? `<link>${link}</link>` : \"\",\n `<description>${desc}</description>`,\n items,\n \"</channel>\",\n \"</rss>\",\n ].join(\"\");\n}\n","import { createInterface } from \"node:readline/promises\";\nimport { writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { hostname } from \"node:os\";\nimport { buildManifestFromPattern, validateFeatureFiles } from \"./changelog-as-code\";\nimport { getPostHogClient, shutdownPostHog } from \"./posthog-client\";\nimport {\n computeManifestStats,\n generateMarkdownChangelog,\n runDoctor,\n} from \"./cli-utils\";\nimport {\n addFeatureEntry,\n initFeaturedropProject,\n migrateManifest,\n type InitFormat,\n type MigrationSource,\n} from \"./cli-scaffold\";\nimport { generateRSS } from \"./rss\";\nimport type { FeatureType } from \"./types\";\n\ninterface ParsedArgs {\n command:\n | \"init\"\n | \"add\"\n | \"migrate\"\n | \"build\"\n | \"validate\"\n | \"stats\"\n | \"doctor\"\n | \"generate-rss\"\n | \"generate-changelog\"\n | \"help\";\n pattern?: string;\n outFile?: string;\n inputFile?: string;\n cwd?: string;\n title?: string;\n link?: string;\n description?: string;\n from?: MigrationSource;\n format?: InitFormat;\n force?: boolean;\n id?: string;\n label?: string;\n type?: FeatureType;\n category?: string;\n url?: string;\n releasedAt?: string;\n showNewUntil?: string;\n showDays?: number;\n}\n\nfunction parseArgs(argv: string[]): ParsedArgs {\n const [commandRaw, ...rest] = argv;\n const allowed = new Set([\n \"init\",\n \"add\",\n \"migrate\",\n \"build\",\n \"validate\",\n \"stats\",\n \"doctor\",\n \"generate-rss\",\n \"generate-changelog\",\n ]);\n const command = allowed.has(commandRaw) ? (commandRaw as ParsedArgs[\"command\"]) : \"help\";\n const parsed: ParsedArgs = { command };\n\n for (let i = 0; i < rest.length; i++) {\n const arg = rest[i];\n if (arg === \"--pattern\") parsed.pattern = rest[++i];\n else if (arg === \"--out\") parsed.outFile = rest[++i];\n else if (arg === \"--cwd\") parsed.cwd = rest[++i];\n else if (arg === \"--title\") parsed.title = rest[++i];\n else if (arg === \"--link\") parsed.link = rest[++i];\n else if (arg === \"--description\") parsed.description = rest[++i];\n else if (arg === \"--input\") parsed.inputFile = rest[++i];\n else if (arg === \"--from\") parsed.from = rest[++i] as MigrationSource;\n else if (arg === \"--format\") parsed.format = rest[++i] as InitFormat;\n else if (arg === \"--force\") parsed.force = true;\n else if (arg === \"--id\") parsed.id = rest[++i];\n else if (arg === \"--label\") parsed.label = rest[++i];\n else if (arg === \"--type\") parsed.type = rest[++i] as FeatureType;\n else if (arg === \"--category\") parsed.category = rest[++i];\n else if (arg === \"--url\") parsed.url = rest[++i];\n else if (arg === \"--releasedAt\") parsed.releasedAt = rest[++i];\n else if (arg === \"--showNewUntil\") parsed.showNewUntil = rest[++i];\n else if (arg === \"--show-days\") parsed.showDays = Number(rest[++i]);\n }\n return parsed;\n}\n\nfunction printHelp(): void {\n console.log(\"featuredrop CLI\");\n console.log(\"\");\n console.log(\"Usage:\");\n console.log(\" featuredrop init [--format markdown|json] [--force] [--cwd .]\");\n console.log(\" featuredrop add [--label ...] [--id ...] [--description ...] [--type feature|improvement|fix|breaking] [--category ...] [--url ...] [--releasedAt ...] [--showNewUntil ...] [--show-days 14] [--format markdown|json] [--cwd .]\");\n console.log(\" featuredrop migrate --from beamer|headway|announcekit|canny|launchnotes [--input export.json] [--out featuredrop.manifest.json] [--cwd .]\");\n console.log(\" featuredrop build [--pattern features/**/*.md] [--out featuredrop.manifest.json] [--cwd .]\");\n console.log(\" featuredrop validate [--pattern features/**/*.md] [--cwd .]\");\n console.log(\" featuredrop stats [--pattern features/**/*.md] [--cwd .]\");\n console.log(\" featuredrop doctor [--pattern features/**/*.md] [--cwd .]\");\n console.log(\" featuredrop generate-rss [--pattern features/**/*.md] [--out featuredrop.rss.xml] [--title ...] [--link ...] [--description ...] [--cwd .]\");\n console.log(\" featuredrop generate-changelog [--pattern features/**/*.md] [--out CHANGELOG.generated.md] [--cwd .]\");\n}\n\nasync function promptForLabelIfNeeded(label?: string): Promise<string> {\n if (label?.trim()) return label.trim();\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n throw new Error(\"Missing --label. Provide --label in non-interactive mode.\");\n }\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n try {\n const value = (await rl.question(\"Feature label: \")).trim();\n if (!value) throw new Error(\"Feature label is required\");\n return value;\n } finally {\n rl.close();\n }\n}\n\nasync function run(): Promise<void> {\n const args = parseArgs(process.argv.slice(2));\n if (args.command === \"help\") {\n printHelp();\n process.exitCode = 1;\n return;\n }\n\n // Use hostname-based distinct ID for anonymous CLI telemetry\n const distinctId = `cli:${hostname()}`;\n const posthog = getPostHogClient();\n\n try {\n if (args.command === \"init\") {\n const result = await initFeaturedropProject({\n cwd: args.cwd,\n format: args.format,\n force: args.force,\n });\n console.log(`Initialized featuredrop project (${result.format})`);\n for (const path of result.created) {\n console.log(`- ${path}`);\n }\n posthog?.capture({\n distinctId,\n event: \"cli_init\",\n properties: { format: result.format, files_created: result.created.length },\n });\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"add\") {\n const label = await promptForLabelIfNeeded(args.label);\n const result = await addFeatureEntry({\n cwd: args.cwd,\n format: args.format,\n id: args.id,\n label,\n description: args.description,\n type: args.type,\n category: args.category,\n url: args.url,\n releasedAt: args.releasedAt,\n showNewUntil: args.showNewUntil,\n showDays: args.showDays,\n });\n console.log(`Added feature \"${result.entry.id}\" -> ${result.path}`);\n posthog?.capture({\n distinctId,\n event: \"cli_add_feature\",\n properties: {\n feature_id: result.entry.id,\n feature_type: result.entry.type,\n format: args.format,\n has_description: Boolean(args.description),\n has_url: Boolean(args.url),\n },\n });\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"migrate\") {\n const from = args.from;\n if (!from) {\n throw new Error('Missing required \"--from\" (beamer|headway|announcekit|canny|launchnotes)');\n }\n const inputFile = args.inputFile ?? `${from}-export.json`;\n const result = await migrateManifest({\n cwd: args.cwd,\n from,\n inputFile,\n outFile: args.outFile,\n });\n console.log(`Migrated ${result.entries.length} entries from ${from} -> ${result.outFile}`);\n posthog?.capture({\n distinctId,\n event: \"cli_migrate\",\n properties: { source: from, entries_migrated: result.entries.length, out_file: result.outFile },\n });\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"build\") {\n const out = args.outFile ?? \"featuredrop.manifest.json\";\n const entries = await buildManifestFromPattern({\n pattern: args.pattern,\n outFile: out,\n cwd: args.cwd,\n });\n console.log(`Built ${entries.length} feature entries -> ${out}`);\n posthog?.capture({\n distinctId,\n event: \"cli_build\",\n properties: { entries_built: entries.length, out_file: out, has_pattern: Boolean(args.pattern) },\n });\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"validate\") {\n await validateFeatureFiles({\n pattern: args.pattern,\n cwd: args.cwd,\n });\n console.log(\"Feature files valid\");\n await shutdownPostHog();\n return;\n }\n\n const entries = await buildManifestFromPattern({\n pattern: args.pattern,\n cwd: args.cwd,\n });\n\n if (args.command === \"stats\") {\n const stats = computeManifestStats(entries);\n console.log(`Total entries: ${stats.total}`);\n console.log(`By type: ${Object.entries(stats.byType).map(([k, v]) => `${k}=${v}`).join(\", \") || \"none\"}`);\n console.log(`By category: ${Object.entries(stats.byCategory).map(([k, v]) => `${k}=${v}`).join(\", \") || \"none\"}`);\n if (stats.newestRelease) console.log(`Newest release: ${stats.newestRelease}`);\n if (stats.oldestRelease) console.log(`Oldest release: ${stats.oldestRelease}`);\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"doctor\") {\n const report = runDoctor(entries);\n for (const check of report.checks) console.log(`✓ ${check}`);\n for (const warning of report.warnings) console.log(`⚠ ${warning}`);\n for (const error of report.errors) console.log(`✗ ${error}`);\n console.log(\"\");\n console.log(`${report.warnings.length} warning(s), ${report.errors.length} error(s).`);\n if (report.errors.length > 0) process.exitCode = 1;\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"generate-rss\") {\n const out = args.outFile ?? \"featuredrop.rss.xml\";\n const xml = generateRSS(entries, {\n title: args.title,\n link: args.link,\n description: args.description,\n });\n await writeFile(join(args.cwd ?? process.cwd(), out), `${xml}\\n`, \"utf8\");\n console.log(`Generated RSS feed -> ${out}`);\n posthog?.capture({\n distinctId,\n event: \"cli_generate_rss\",\n properties: { entries_count: entries.length, out_file: out },\n });\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"generate-changelog\") {\n const out = args.outFile ?? \"CHANGELOG.generated.md\";\n const markdown = generateMarkdownChangelog(entries);\n await writeFile(join(args.cwd ?? process.cwd(), out), markdown, \"utf8\");\n console.log(`Generated markdown changelog -> ${out}`);\n posthog?.capture({\n distinctId,\n event: \"cli_generate_changelog\",\n properties: { entries_count: entries.length, out_file: out },\n });\n await shutdownPostHog();\n return;\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`featuredrop: ${message}`);\n posthog?.captureException(error, distinctId, { command: args.command });\n posthog?.capture({\n distinctId,\n event: \"cli_error\",\n properties: { command: args.command, error_message: message },\n });\n await shutdownPostHog();\n process.exitCode = 1;\n }\n}\n\nvoid run();\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/dependencies.ts","../src/schema.ts","../src/changelog-as-code.ts","../src/posthog-client.ts","../src/cli-utils.ts","../src/cli-scaffold.ts","../src/markdown.ts","../src/rss.ts","../src/cli-ai-setup.ts","../src/cli.ts"],"names":["z","readdir","join","stat","readFile","relative","sep","writeFile","PostHog","isRecord","mkdir","sample","basename","moduleApi","sanitized","decoded","existsSync","createInterface","hostname","entries"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,SAAS,sBAAsB,OAAA,EAAiC;AAC9D,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAC1B,EAAA,IAAI,CAAC,SAAA,EAAW,OAAO,EAAC;AACxB,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,IAAQ,EAAC;AAChC,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,OAAA,IAAW,EAAC;AACtC,EAAA,MAAM,SAAA,GAAY,SAAA,CAAU,SAAA,IAAa,EAAC;AAC1C,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,EAAA,KAAA,MAAW,EAAA,IAAM,CAAC,GAAG,IAAA,EAAM,GAAG,OAAA,EAAS,GAAG,SAAS,CAAA,EAAG;AACpD,IAAA,IAAI,EAAA,EAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,EACvB;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,MAAM,CAAA;AAC1B;AAqDO,SAAS,mBAAmB,QAAA,EAAoC;AACrE,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,EAAE,CAAC,CAAA;AACzD,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAyB;AAC9C,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AAEzC,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,EAAA,kBAAI,IAAI,KAAK,CAAA;AAClC,IAAA,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI,CAAC,CAAA;AAAA,EAC5B;AAEA,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,KAAA,MAAW,YAAA,IAAgB,qBAAA,CAAsB,OAAO,CAAA,EAAG;AACzD,MAAA,IAAI,CAAC,GAAA,CAAI,GAAA,CAAI,YAAY,CAAA,EAAG;AAC5B,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,YAAY,CAAA;AACvC,MAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA,EAAG;AACrC,MAAA,KAAA,CAAM,GAAA,CAAI,QAAQ,EAAE,CAAA;AACpB,MAAA,QAAA,CAAS,GAAA,CAAI,QAAQ,EAAA,EAAA,CAAK,QAAA,CAAS,IAAI,OAAA,CAAQ,EAAE,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AAAA,IAC9D;AAAA,EACF;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA,IAAK,OAAO,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAA;AAAA,EAClE;AAEA,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AACvB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,OAAA,IAAW,CAAA;AACX,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC7B,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,KAAA,MAAW,UAAU,KAAA,EAAO;AAC1B,MAAA,MAAM,UAAA,GAAA,CAAc,QAAA,CAAS,GAAA,CAAI,MAAM,KAAK,CAAA,IAAK,CAAA;AACjD,MAAA,QAAA,CAAS,GAAA,CAAI,QAAQ,UAAU,CAAA;AAC/B,MAAA,IAAI,UAAA,KAAe,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,OAAO,YAAY,QAAA,CAAS,MAAA;AAC9B;ACtDA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,CAAC,CAAC,KAAA,IAAS,OAAO,UAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AACrE;AAEA,SAAS,YAAY,KAAA,EAAwB;AAC3C,EAAA,OAAO,OAAO,QAAA,CAAS,IAAI,KAAK,KAAK,CAAA,CAAE,SAAS,CAAA;AAClD;AAEA,IAAM,cAAA,GAAiBA,MAAE,MAAA,EAAO,CAAE,MAAK,CAAE,GAAA,CAAI,GAAG,4BAA4B,CAAA;AAE5E,IAAM,aAAA,GAAgB,cAAA,CAAe,MAAA,CAAO,WAAA,EAAa;AAAA,EACvD,OAAA,EAAS,sBAAA;AAAA,EACT,MAAA,EAAQ,EAAE,eAAA,EAAiB,cAAA;AAC7B,CAAC,CAAA;AAED,IAAM,eAAA,GAAkBA,MACrB,MAAA,CAAO;AAAA,EACN,MAAMA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACnC,SAASA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACtC,WAAWA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA;AACjC,CAAC,EACA,QAAA,EAAS;AAEZ,IAAM,SAAA,GAAYA,MACf,MAAA,CAAO;AAAA,EACN,KAAA,EAAO,cAAA;AAAA,EACP,GAAA,EAAK;AACP,CAAC,EACA,QAAA,EAAS;AAEL,IAAM,kBAAA,GAAqBA,MAC/B,MAAA,CAAO;AAAA,EACN,EAAA,EAAI,cAAA;AAAA,EACJ,KAAA,EAAO,cAAA;AAAA,EACP,UAAA,EAAY,aAAA;AAAA,EACZ,YAAA,EAAc,aAAA;AAAA,EACd,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,GAAA,EAAKA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACzB,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3B,IAAA,EAAMA,KAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,eAAe,KAAA,EAAO,UAAU,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACrE,QAAA,EAAUA,MAAE,IAAA,CAAK,CAAC,YAAY,QAAA,EAAU,KAAK,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACzD,GAAA,EAAK,SAAA;AAAA,EACL,MAAMA,KAAA,CAAE,MAAA,CAAOA,MAAE,OAAA,EAAS,EAAE,QAAA,EAAS;AAAA,EACrC,SAAA,EAAW;AACb,CAAC,EACA,WAAA,EAAY;AAEsBA,KAAA,CAAE,KAAA,CAAM,kBAAkB;AAE/D,SAAS,YAAY,IAAA,EAAsC;AACzD,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,GAAA;AAC9B,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,MAAA,IAAU,IAAI,IAAI,CAAA,CAAA,CAAA;AAAA,SAC3C,MAAA,IAAU,MAAA,GAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,IAAA;AAAA,EACvC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAY,KAAA,EAAoC;AACvD,EAAA,MAAM,SAAA,GAAa,MAA+C,MAAA,EAAQ,eAAA;AAC1E,EAAA,IAAI,cAAc,cAAA,EAAgB;AAChC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA;AAAA,MAC5B,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,cAAA,EAAgB;AACjC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA;AAAA,MAC5B,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,IAAA,EAAM,KAAA,CAAM,QAAA,KAAa,WAAA,GAAc,kBAAA,GAAqB;AAAA,KAC9D;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA;AAAA,IAC5B,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,IAAA,EAAM;AAAA,GACR;AACF;AAEA,IAAM,mCAAmB,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,aAAA,EAAe,WAAW,CAAC,CAAA;AAE1E,SAAS,UAAU,KAAA,EAAwB;AACzC,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAC9B,EAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AACxB,EAAA,IAAI,wBAAA,CAAyB,IAAA,CAAK,UAAU,CAAA,EAAG,OAAO,IAAA;AACtD,EAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,UAAU,CAAA,EAAG,OAAO,IAAA;AAC7C,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,kBAAA,CAAmB,KAAA,EAAgB,IAAA,GAAO,MAAA,EAAuB;AACxE,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,KAAA,CAAM,QAAQ,KAAA,EAAA,EAAS;AACjD,MAAA,MAAM,MAAA,GAAS,mBAAmB,KAAA,CAAM,KAAK,GAAG,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAA;AACnE,MAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,IACrB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,IAAA;AAC7B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,WAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtD,IAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC7B,MAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,IACvB;AACA,IAAA,MAAM,SAAS,kBAAA,CAAmB,WAAA,EAAa,GAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AAC/D,IAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,EACrB;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,oBAAA,CAAqB,KAAc,KAAA,EAAoE;AAC9G,EAAA,IAAI,CAAC,QAAA,CAAS,GAAG,CAAA,EAAG;AAClB,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAA,EAAM,IAAI,KAAK,CAAA,CAAA,CAAA;AAAA,UACf,OAAA,EAAS,iCAAA;AAAA,UACT,IAAA,EAAM;AAAA;AACR;AACF,KACF;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,SAAA,CAAU,GAAG,CAAA;AAC/C,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO;AAAA,MACL,QAAQ,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QAC1C,GAAG,YAAY,KAAK,CAAA;AAAA,QACpB,IAAA,EAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,MAAM,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,CAAA,CAAA,EAAI,WAAA,CAAY,KAAA,CAAM,IAAI,CAAC,KAAK,EAAE,CAAA;AAAA,OAC/E,CAAE;AAAA,KACJ;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,QAAQ,EAAC;AAAA,IACT,OAAO,MAAA,CAAO;AAAA,GAChB;AACF;AAEO,SAAS,iBAAiB,IAAA,EAAiC;AAChE,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACxB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAA,EAAM,GAAA;AAAA,UACN,OAAA,EAAS,2BAAA;AAAA,UACT,IAAA,EAAM;AAAA;AACR;AACF,KACF;AAAA,EACF;AAEA,EAAA,MAAM,UAA0B,EAAC;AACjC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC5B,IAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,IAAA,EAAM,KAAK,CAAA;AAC/C,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAA,CAAO,MAAM,CAAA;AAC5B,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACnB,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,EAAG;AAChC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,IAAI,KAAK,CAAA,IAAA,CAAA;AAAA,QACf,OAAA,EAAS,CAAA,sBAAA,EAAyB,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,CAAA,CAAA;AAAA,QACjD,IAAA,EAAM;AAAA,OACP,CAAA;AACD,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA;AAC3B,IAAA,OAAA,CAAQ,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EAC3B,CAAC,CAAA;AAED,EAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,kBAAA,CAAmB,OAA0B,CAAA,EAAG;AACxE,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,GAAA;AAAA,MACN,OAAA,EAAS,0CAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAEA,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,OAAA,CAAQ,QAAQ,KAAA,EAAA,EAAS;AACnD,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAC3B,IAAA,IAAI,IAAI,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA,CAAE,OAAA,EAAQ,IAAK,IAAI,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAE,SAAQ,EAAG;AAClF,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,IAAI,KAAK,CAAA,cAAA,CAAA;AAAA,QACf,OAAA,EAAS,uCAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,MAAM,GAAA,IAAO,CAAC,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,EAAG;AACtC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,IAAI,KAAK,CAAA,KAAA,CAAA;AAAA,QACf,OAAA,EAAS,sCAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,MAAM,KAAA,IAAS,CAAC,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA,EAAG;AAC1C,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,IAAI,KAAK,CAAA,OAAA,CAAA;AAAA,QACf,OAAA,EAAS,wCAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAA,CAAM,KAAK,GAAA,IAAO,CAAC,UAAU,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,EAAG;AAC/C,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,IAAI,KAAK,CAAA,SAAA,CAAA;AAAA,QACf,OAAA,EAAS,0CAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,cAAA,GAAiB,kBAAA,CAAmB,KAAA,CAAM,IAAI,CAAA;AACpD,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,CAAA,CAAA,EAAI,KAAK,CAAA,EAAA,EAAK,cAAc,CAAA,CAAA;AAAA,QAClC,SAAS,CAAA,0BAAA,EAA6B,cAAA,CAAe,MAAM,GAAG,CAAA,CAAE,KAAK,CAAA,CAAA,CAAA;AAAA,QACrE,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB;AAAA,GACF;AACF;;;AC5QA,SAAS,YAAY,GAAA,EAAsB;AACzC,EAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,EAAK;AACvB,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,EAAA,IACG,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,IAAK,MAAM,QAAA,CAAS,GAAG,CAAA,IAC3C,KAAA,CAAM,WAAW,GAAG,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAC5C;AACA,IAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EAC1B;AACA,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,IAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,SAAS,OAAO,KAAA;AAC9B,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,IAAA;AAC7B,EAAA,IAAI,kBAAkB,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,OAAO,KAAK,CAAA;AACtD,EAAA,IAAI,MAAM,UAAA,CAAW,GAAG,KAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAChD,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AACtC,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,IAAA,OAAO,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EACxE;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,iBAAiB,GAAA,EAAsC;AAC9D,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AAC/B,EAAA,MAAM,OAAgC,EAAC;AACvC,EAAA,MAAM,KAAA,GAA+E;AAAA,IACnF,EAAE,MAAA,EAAQ,EAAA,EAAI,KAAA,EAAO,IAAA;AAAK,GAC5B;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,GAAA,KAAyB;AAC/C,IAAA,KAAA,IAAS,IAAI,GAAA,GAAM,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AAC3C,MAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,MAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAClB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,WAAU,CAAE,MAAA;AAC9C,MAAA,IAAI,MAAA,IAAW,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,GAAS,KAAA,CAAM,GAAG,CAAA,CAAE,SAAA,EAAU,CAAE,MAAA,EAAS,OAAO,KAAA;AAC1E,MAAA,OAAO,IAAA,CAAK,SAAA,EAAU,CAAE,UAAA,CAAW,IAAI,CAAA;AAAA,IACzC;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAI,CAAC,KAAK,IAAA,EAAK,IAAK,KAAK,SAAA,EAAU,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AAEtD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,WAAU,CAAE,MAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAE1B,IAAA,OAAO,KAAA,CAAM,SAAS,CAAA,IAAK,MAAA,IAAU,MAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,MAAA,EAAQ;AACnE,MAAA,KAAA,CAAM,GAAA,EAAI;AAAA,IACZ;AAEA,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,KAAA;AAExC,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AAC5B,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC3B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MAC7D;AACA,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AACnC,MAAA,OAAA,CAAQ,IAAA,CAAK,WAAA,CAAY,IAAI,CAAC,CAAA;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACjC,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,IAAI,CAAC,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAAA,IACjE;AAEA,IAAA,MAAM,MAAM,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,EAAE,IAAA,EAAK;AACzC,IAAA,MAAM,OAAO,OAAA,CAAQ,KAAA,CAAM,KAAA,GAAQ,CAAC,EAAE,IAAA,EAAK;AAE3C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,YAAiD,cAAA,CAAe,CAAC,CAAA,GAAI,KAAK,EAAC;AACjF,MAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,SAAA;AACf,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,EAAO,WAAW,CAAA;AACvC,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,WAAA,CAAY,IAAI,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,iBAAiB,QAAA,EAA+B;AACvD,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AACjD,EAAA,IAAI,CAAC,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA,EAAG;AACnC,IAAA,OAAO,EAAE,WAAA,EAAa,IAAI,IAAA,EAAM,UAAA,CAAW,MAAK,EAAE;AAAA,EACpD;AAEA,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,OAAA,CAAQ,SAAA,EAAW,CAAC,CAAA;AAC3C,EAAA,IAAI,QAAQ,EAAA,EAAI;AACd,IAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,EAC5D;AAEA,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AACrC,EAAA,MAAM,OAAO,UAAA,CAAW,KAAA,CAAM,GAAA,GAAM,CAAC,EAAE,IAAA,EAAK;AAC5C,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,iBAAiB,KAAK,CAAA;AAAA,IACnC;AAAA,GACF;AACF;AAEA,SAAS,QAAA,CAAS,KAAA,EAAgB,KAAA,EAAe,MAAA,EAAwB;AACvE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,MAAK,EAAG;AAC9C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,GAAA,EAAM,KAAK,CAAA,4BAAA,CAA8B,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,gBAAA,CAAiB,KAAA,EAAgB,KAAA,EAAe,MAAA,EAAqD;AAC5G,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,MAAA;AAChC,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/D,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,GAAA,EAAM,KAAK,CAAA,mBAAA,CAAqB,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,gBAAA,CAAiB,QAAA,EAAkB,MAAA,GAAS,YAAA,EAA4B;AACtF,EAAA,MAAM,EAAE,WAAA,EAAa,IAAA,EAAK,GAAI,iBAAiB,QAAQ,CAAA;AAEvD,EAAA,MAAM,KAAA,GAAsB;AAAA,IAC1B,EAAA,EAAI,QAAA,CAAS,WAAA,CAAY,EAAA,EAAI,MAAM,MAAM,CAAA;AAAA,IACzC,KAAA,EAAO,QAAA,CAAS,WAAA,CAAY,KAAA,EAAO,SAAS,MAAM,CAAA;AAAA,IAClD,UAAA,EAAY,QAAA,CAAS,WAAA,CAAY,UAAA,EAAY,cAAc,MAAM,CAAA;AAAA,IACjE,YAAA,EAAc,QAAA,CAAS,WAAA,CAAY,YAAA,EAAc,gBAAgB,MAAM,CAAA;AAAA,IACvE,aAAa,IAAA,IAAQ;AAAA,GACvB;AAEA,EAAA,IAAI,WAAA,CAAY,eAAe,MAAA,EAAW,KAAA,CAAM,aAAa,QAAA,CAAS,WAAA,CAAY,UAAA,EAAY,YAAA,EAAc,MAAM,CAAA;AAClH,EAAA,IAAI,WAAA,CAAY,aAAa,MAAA,EAAW,KAAA,CAAM,WAAW,QAAA,CAAS,WAAA,CAAY,QAAA,EAAU,UAAA,EAAY,MAAM,CAAA;AAC1G,EAAA,IAAI,WAAA,CAAY,YAAY,MAAA,EAAW,KAAA,CAAM,UAAU,QAAA,CAAS,WAAA,CAAY,OAAA,EAAS,SAAA,EAAW,MAAM,CAAA;AACtG,EAAA,IAAI,WAAA,CAAY,QAAQ,MAAA,EAAW,KAAA,CAAM,MAAM,QAAA,CAAS,WAAA,CAAY,GAAA,EAAK,KAAA,EAAO,MAAM,CAAA;AACtF,EAAA,IAAI,WAAA,CAAY,YAAY,MAAA,EAAW,KAAA,CAAM,UAAU,QAAA,CAAS,WAAA,CAAY,OAAA,EAAS,SAAA,EAAW,MAAM,CAAA;AACtG,EAAA,IAAI,WAAA,CAAY,UAAU,MAAA,EAAW,KAAA,CAAM,QAAQ,QAAA,CAAS,WAAA,CAAY,KAAA,EAAO,OAAA,EAAS,MAAM,CAAA;AAC9F,EAAA,IAAI,WAAA,CAAY,cAAc,MAAA,EAAW,KAAA,CAAM,YAAY,QAAA,CAAS,WAAA,CAAY,SAAA,EAAW,WAAA,EAAa,MAAM,CAAA;AAC9G,EAAA,IAAI,WAAA,CAAY,YAAY,MAAA,EAAW;AACrC,IAAA,IAAI,OAAO,WAAA,CAAY,OAAA,KAAY,YAAY,OAAO,WAAA,CAAY,YAAY,QAAA,EAAU;AACtF,MAAA,KAAA,CAAM,UAAU,WAAA,CAAY,OAAA;AAAA,IAC9B,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,sCAAA,CAAwC,CAAA;AAAA,IACnE;AAAA,EACF;AACA,EAAA,IAAI,WAAA,CAAY,SAAS,MAAA,EAAW;AAClC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,WAAA,CAAY,IAAA,EAAM,QAAQ,MAAM,CAAA;AACtD,IAAA,IAAI,CAAC,CAAC,SAAA,EAAW,aAAA,EAAe,OAAO,UAAU,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG;AACjE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,wBAAA,EAA2B,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IAC7D;AACA,IAAA,KAAA,CAAM,IAAA,GAAO,IAAA;AAAA,EACf;AACA,EAAA,IAAI,WAAA,CAAY,aAAa,MAAA,EAAW;AACtC,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,WAAA,CAAY,QAAA,EAAU,YAAY,MAAM,CAAA;AAClE,IAAA,IAAI,CAAC,CAAC,UAAA,EAAY,QAAA,EAAU,KAAK,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA,EAAG;AACrD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,4BAAA,EAA+B,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,IACrE;AACA,IAAA,KAAA,CAAM,QAAA,GAAW,QAAA;AAAA,EACnB;AAEA,EAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,WAAA,CAAY,GAAA,EAAK,OAAO,MAAM,CAAA;AAC3D,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,KAAA,CAAM,GAAA,GAAM;AAAA,MACV,KAAA,EAAO,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,aAAa,MAAM,CAAA;AAAA,MAC9C,GAAA,EAAK,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,WAAW,MAAM;AAAA,KAC1C;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,WAAA,CAAY,QAAA,EAAU,YAAY,MAAM,CAAA;AAC1E,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,iBAA2C,EAAC;AAClD,IAAA,KAAA,MAAW,KAAA,IAAS,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ,CAAA,EAAY;AACvD,MAAA,MAAM,KAAA,GAAQ,SAAS,KAAK,CAAA;AAC5B,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,OAAO,IAAA,KAAS,QAAQ,CAAA,EAAG;AAC3E,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,YAAA,EAAe,KAAK,CAAA,kBAAA,CAAoB,CAAA;AAAA,QACnE;AACA,QAAA,cAAA,CAAe,KAAK,CAAA,GAAI,KAAA;AAAA,MAC1B;AAAA,IACF;AACA,IAAA,IAAI,QAAA,CAAS,WAAW,MAAA,EAAW;AACjC,MAAA,IAAI,CAAC,QAAA,CAAS,MAAA,IAAU,OAAO,QAAA,CAAS,MAAA,KAAW,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC7F,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,qCAAA,CAAuC,CAAA;AAAA,MAClE;AACA,MAAA,cAAA,CAAe,SAAS,QAAA,CAAS,MAAA;AAAA,IACnC;AACA,IAAA,KAAA,CAAM,QAAA,GAAW,cAAA;AAAA,EACnB;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,iBAAiB,OAAA,EAAmD;AAC3E,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,CAAW,IAAA,EAAM,GAAG,CAAA;AAC/C,EAAA,IAAI,UAAA,CAAW,QAAA,CAAS,UAAU,CAAA,EAAG;AACnC,IAAA,OAAO;AAAA,MACL,SAAS,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,CAAC,WAAW,MAAM,CAAA;AAAA,MAC/C,GAAA,EAAK;AAAA,KACP;AAAA,EACF;AACA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,OAAO,CAAA,yCAAA,CAA2C,CAAA;AAC5F;AAEA,eAAe,YAAA,CAAa,KAAa,GAAA,EAAgC;AACvE,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,eAAe,KAAK,OAAA,EAAgC;AAClD,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,MAAMC,gBAAA,CAAQ,OAAA,EAAS,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,IAC1D,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,QAAA,GAAWC,SAAA,CAAK,OAAA,EAAS,KAAA,CAAM,IAAI,CAAA;AACzC,MAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,QAAA,MAAM,KAAK,QAAQ,CAAA;AACnB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,MAAM,MAAA,EAAO,IAAK,MAAM,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9C,QAAA,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,KAAK,GAAG,CAAA;AACd,EAAA,OAAO,IAAI,IAAA,EAAK;AAClB;AAEA,eAAsB,wBAAA,CAAyB,OAAA,GAAgC,EAAC,EAA4B;AAC1G,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACvC,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,kBAAA;AACnC,EAAA,MAAM,EAAE,OAAA,EAAS,GAAA,EAAI,GAAI,iBAAiB,OAAO,CAAA;AACjD,EAAA,MAAM,OAAA,GAAUA,SAAA,CAAK,GAAA,EAAK,OAAO,CAAA;AAEjC,EAAA,MAAM,QAAQ,MAAMC,aAAA,CAAK,OAAO,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAClD,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,aAAY,EAAG;AAClC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,OAAO,CAAA,CAAE,CAAA;AAAA,EACrE;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,OAAA,EAAS,GAAG,CAAA;AAC7C,EAAA,MAAM,UAA0B,EAAC;AACjC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GAAU,MAAMC,iBAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAC3C,IAAA,MAAM,MAAA,GAASC,cAAS,GAAA,EAAK,IAAI,EAAE,KAAA,CAAMC,QAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACtD,IAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,OAAA,EAAS,MAAM,CAAA;AAC9C,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,MAAM,EAAE,CAAA,WAAA,EAAc,MAAM,CAAA,CAAE,CAAA;AAAA,IACzE;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,EAAE,CAAA;AACpB,IAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,EACpB;AAEA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,MAAM,OAAA,GAAUJ,SAAA,CAAK,GAAA,EAAK,OAAA,CAAQ,OAAO,CAAA;AACzC,IAAA,MAAMK,kBAAA,CAAU,SAAS,CAAA,EAAG,IAAA,CAAK,UAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA,EAAM,MAAM,CAAA;AAAA,EAC1E;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,eAAsB,oBAAA,CAAqB,OAAA,GAAgC,EAAC,EAAkB;AAC5F,EAAA,MAAM,OAAA,GAAU,MAAM,wBAAA,CAAyB,OAAO,CAAA;AACtD,EAAA,MAAM,MAAA,GAAS,iBAAiB,OAAO,CAAA;AACvC,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CACpB,GAAA,CAAI,CAAC,KAAA,KAAU,CAAA,EAAG,KAAA,CAAM,IAAI,KAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA,CAChD,KAAK,IAAI,CAAA;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,OAAO,CAAA,CAAE,CAAA;AAAA,EAC1D;AACF;AC5RA,IAAI,OAAA,GAA0B,IAAA;AAQ9B,SAAS,UAAA,GAAsB;AAC7B,EAAA,MAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,eAAA;AAC3B,EAAA,IAAI,MAAA,IAAU,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,SAAS,OAAO,IAAA;AAE3D,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,CAAI,QAAA;AACxB,EAAA,IAAI,GAAA,KAAQ,aAAA,IAAiB,GAAA,KAAQ,MAAA,EAAQ,OAAO,IAAA;AAEpD,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,OAAO,IAAA;AAE3B,EAAA,OAAO,KAAA;AACT;AAYO,SAAS,gBAAA,GAAmC;AACjD,EAAA,IAAI,UAAA,IAAc,OAAO,IAAA;AAEzB,EAAA,MAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,eAAA;AAC3B,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,GAAU,IAAIC,oBAAQ,MAAA,EAAQ;AAAA,MAC5B,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,YAAA,IAAgB,0BAAA;AAAA,MAClC,OAAA,EAAS,CAAA;AAAA,MACT,aAAA,EAAe,CAAA;AAAA,MACf,0BAAA,EAA4B;AAAA,KAC7B,CAAA;AAAA,EACH;AACA,EAAA,OAAO,OAAA;AACT;AAMA,eAAsB,eAAA,GAAiC;AACrD,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ;AACF;;;AC/CO,SAAS,qBAAqB,OAAA,EAAwC;AAC3E,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,MAAM,aAAqC,EAAC;AAE5C,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,SAAA;AAC3B,IAAA,MAAA,CAAO,IAAI,CAAA,GAAA,CAAK,MAAA,CAAO,IAAI,KAAK,CAAA,IAAK,CAAA;AACrC,IAAA,IAAI,MAAM,QAAA,EAAU;AAClB,MAAA,UAAA,CAAW,MAAM,QAAQ,CAAA,GAAA,CAAK,WAAW,KAAA,CAAM,QAAQ,KAAK,CAAA,IAAK,CAAA;AAAA,IACnE;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,GAAG,OAAO,CAAA,CAAE,IAAA;AAAA,IAChC,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,KAAK,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA,KAAY,IAAI,IAAA,CAAK,CAAA,CAAE,UAAU,EAAE,OAAA;AAAQ,GAC9E;AAEA,EAAA,OAAO;AAAA,IACL,OAAO,OAAA,CAAQ,MAAA;AAAA,IACf,MAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA,EAAe,YAAA,CAAa,CAAC,CAAA,EAAG,UAAA,IAAc,IAAA;AAAA,IAC9C,eAAe,YAAA,CAAa,YAAA,CAAa,MAAA,GAAS,CAAC,GAAG,UAAA,IAAc;AAAA,GACtE;AACF;AAEO,SAAS,0BAA0B,OAAA,EAAiC;AACzE,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,OAAO,CAAA,CAAE,IAAA;AAAA,IAC1B,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,KAAK,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA,KAAY,IAAI,IAAA,CAAK,CAAA,CAAE,UAAU,EAAE,OAAA;AAAQ,GAC9E;AACA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AACrC,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,CAAA,GAAA,EAAM,MAAM,KAAK,CAAA,CAAA;AAAA,MACjB,EAAA;AAAA,MACA,CAAA,YAAA,EAAe,MAAM,EAAE,CAAA,EAAA,CAAA;AAAA,MACvB,CAAA,gBAAA,EAAmB,MAAM,UAAU,CAAA;AAAA,KACrC;AACA,IAAA,IAAI,MAAM,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA,YAAA,EAAe,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AACtD,IAAA,IAAI,MAAM,QAAA,EAAU,KAAA,CAAM,KAAK,CAAA,gBAAA,EAAmB,KAAA,CAAM,QAAQ,CAAA,CAAE,CAAA;AAClE,IAAA,IAAI,MAAM,YAAA,EAAc,KAAA,CAAM,KAAK,CAAA,sBAAA,EAAyB,KAAA,CAAM,YAAY,CAAA,CAAE,CAAA;AAChF,IAAA,IAAI,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA,EAAA,EAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,CAAA,CAAG,CAAA;AAC7E,IAAA,IAAI,MAAM,WAAA,EAAa;AACrB,MAAA,KAAA,CAAM,IAAA,CAAK,EAAA,EAAI,KAAA,CAAM,WAAA,CAAY,MAAM,CAAA;AAAA,IACzC;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB,CAAC,CAAA;AAED,EAAA,OAAO,CAAA;;AAAA,EAA4B,QAAA,CAAS,IAAA,CAAK,aAAa,CAAC;AAAA,CAAA;AACjE;AAEA,SAAS,kBAAkB,KAAA,EAAwB;AACjD,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,GAAG,GAAG,OAAO,KAAA;AACjC,EAAA,IAAI,EAAE,MAAM,QAAA,CAAS,GAAG,KAAK,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,OAAO,KAAA;AACrE,EAAA,OAAO,OAAO,QAAA,CAAS,IAAI,KAAK,KAAK,CAAA,CAAE,SAAS,CAAA;AAClD;AAQO,SAAS,SAAA,CAAU,OAAA,EAAyB,GAAA,mBAAY,IAAI,MAAK,EAAiB;AACvF,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,MAAA,CAAO,IAAA,CAAK,CAAA,yBAAA,EAA4B,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAExD,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,EAAE,GAAG,cAAA,IAAkB,CAAA;AACzC,IAAA,GAAA,CAAI,GAAA,CAAI,MAAM,EAAE,CAAA;AAAA,EAClB;AACA,EAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,cAAc,CAAA,8BAAA,CAAgC,CAAA;AAAA,EAC/D,CAAA,MAAO;AACL,IAAA,MAAA,CAAO,KAAK,kBAAkB,CAAA;AAAA,EAChC;AAEA,EAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,EAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,IAAI,uBAAA,GAA0B,CAAA;AAE9B,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,CAAC,KAAA,CAAM,WAAA,EAAa,IAAA,IAAQ,uBAAA,IAA2B,CAAA;AAC3D,IAAA,IAAI,CAAC,kBAAkB,KAAA,CAAM,UAAU,KAAK,CAAC,iBAAA,CAAkB,KAAA,CAAM,YAAY,CAAA,EAAG;AAClF,MAAA,gBAAA,IAAoB,CAAA;AACpB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,WAAW,IAAI,IAAA,CAAK,KAAA,CAAM,UAAU,EAAE,OAAA,EAAQ;AACpD,IAAA,MAAM,YAAY,IAAI,IAAA,CAAK,KAAA,CAAM,YAAY,EAAE,OAAA,EAAQ;AACvD,IAAA,IAAI,SAAA,IAAa,UAAU,iBAAA,IAAqB,CAAA;AAChD,IAAA,IAAI,SAAA,GAAY,GAAA,CAAI,OAAA,EAAQ,EAAG,YAAA,IAAgB,CAAA;AAC/C,IAAA,IAAI,MAAM,SAAA,EAAW;AACnB,MAAA,MAAM,YAAY,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,EAAE,OAAA,EAAQ;AACpD,MAAA,IAAI,MAAA,CAAO,SAAS,SAAS,CAAA,IAAK,YAAY,GAAA,CAAI,OAAA,IAAW,cAAA,IAAkB,CAAA;AAAA,IACjF;AAAA,EACF;AAEA,EAAA,IAAI,mBAAmB,CAAA,EAAG;AACxB,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,gBAAgB,CAAA,kDAAA,CAAoD,CAAA;AAAA,EACrF,CAAA,MAAO;AACL,IAAA,MAAA,CAAO,KAAK,4CAA4C,CAAA;AAAA,EAC1D;AAEA,EAAA,IAAI,oBAAoB,CAAA,EAAG;AACzB,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,iBAAiB,CAAA,+CAAA,CAAiD,CAAA;AAAA,EACnF;AAEA,EAAA,IAAI,eAAe,CAAA,EAAG,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,YAAY,CAAA,sCAAA,CAAwC,CAAA;AAC3F,EAAA,IAAI,iBAAiB,CAAA,EAAG,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,cAAc,CAAA,qCAAA,CAAuC,CAAA;AAE9F,EAAA,IAAI,0BAA0B,CAAA,EAAG;AAC/B,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,uBAAuB,CAAA,4BAAA,CAA8B,CAAA;AAAA,EACtE,CAAA,MAAO;AACL,IAAA,MAAA,CAAO,KAAK,+BAA+B,CAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAC/B,IAAA,MAAA,CAAO,KAAK,0CAA0C,CAAA;AAAA,EACxD,CAAA,MAAO;AACL,IAAA,MAAA,CAAO,KAAK,8CAA8C,CAAA;AAAA,EAC5D;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAO;AACpC;ACpFA,SAASC,UAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,CAAC,CAAC,KAAA,IAAS,OAAO,UAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AACrE;AAEA,eAAe,WAAW,IAAA,EAAgC;AACxD,EAAA,MAAM,SAAS,MAAMN,aAAAA,CAAK,IAAI,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAChD,EAAA,OAAO,CAAC,CAAC,MAAA;AACX;AAEA,SAAS,aAAA,CAAc,OAAe,KAAA,EAAuB;AAC3D,EAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,KAAK,EAAE,OAAA,EAAQ;AACvC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,CAAA,EAAI,KAAK,CAAA,iCAAA,CAAmC,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,IAAI,IAAA,CAAK,MAAM,CAAA,CAAE,WAAA,EAAY;AACtC;AAEA,SAAS,QAAA,CAAS,MAAY,IAAA,EAAsB;AAClD,EAAA,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,OAAA,EAAQ,GAAI,IAAA,GAAO,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA,CAAE,WAAA,EAAY;AAC3E;AAEA,SAAS,OAAO,KAAA,EAAuB;AACrC,EAAA,OAAO,KAAA,CACJ,WAAA,EAAY,CACZ,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,CACtB,OAAA,CAAQ,UAAU,GAAG,CAAA;AAC1B;AAEA,SAAS,YAAY,OAAA,EAAyB;AAC5C,EAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC5B;AAEA,SAAS,oBAAoB,KAAA,EAAuB;AAClD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,GAAG,EAAE,IAAA,EAAK;AACxC;AAEO,SAAS,iBAAiB,KAAA,EAAuB;AACtD,EAAA,MAAM,IAAA,GAAO,OAAO,KAAK,CAAA;AACzB,EAAA,OAAO,IAAA,IAAQ,SAAA;AACjB;AAEO,SAAS,kBAAA,CAAmB,OAAA,EAA4B,GAAA,mBAAY,IAAI,MAAK,EAAiB;AACnG,EAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,GACvB,aAAA,CAAc,QAAQ,UAAA,EAAY,YAAY,CAAA,GAC9C,GAAA,CAAI,WAAA,EAAY;AACpB,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,YAAA,GACzB,aAAA,CAAc,QAAQ,YAAA,EAAc,cAAc,CAAA,GAClD,QAAA,CAAS,IAAI,IAAA,CAAK,UAAU,CAAA,EAAG,OAAA,CAAQ,YAAY,EAAE,CAAA;AACzD,EAAA,MAAM,EAAA,GAAK,QAAQ,EAAA,GAAK,gBAAA,CAAiB,QAAQ,EAAE,CAAA,GAAI,gBAAA,CAAiB,OAAA,CAAQ,KAAK,CAAA;AAErF,EAAA,MAAM,KAAA,GAAsB;AAAA,IAC1B,EAAA;AAAA,IACA,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,IAAA,EAAK;AAAA,IAC1B,UAAA;AAAA,IACA,YAAA;AAAA,IACA,IAAA,EAAM,QAAQ,IAAA,IAAQ;AAAA,GACxB;AAEA,EAAA,IAAI,OAAA,CAAQ,aAAa,IAAA,EAAK,QAAS,WAAA,GAAc,OAAA,CAAQ,YAAY,IAAA,EAAK;AAC9E,EAAA,IAAI,OAAA,CAAQ,UAAU,IAAA,EAAK,QAAS,QAAA,GAAW,OAAA,CAAQ,SAAS,IAAA,EAAK;AACrE,EAAA,IAAI,OAAA,CAAQ,KAAK,IAAA,EAAK,QAAS,GAAA,GAAM,OAAA,CAAQ,IAAI,IAAA,EAAK;AAEtD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,sBAAsB,KAAA,EAA6B;AACjE,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,KAAA;AAAA,IACA,CAAA,IAAA,EAAO,mBAAA,CAAoB,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA;AAAA,IACpC,CAAA,OAAA,EAAU,mBAAA,CAAoB,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA;AAAA,IAC1C,CAAA,YAAA,EAAe,MAAM,UAAU,CAAA,CAAA;AAAA,IAC/B,CAAA,cAAA,EAAiB,MAAM,YAAY,CAAA;AAAA,GACrC;AACA,EAAA,IAAI,MAAM,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA,MAAA,EAAS,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAChD,EAAA,IAAI,KAAA,CAAM,UAAU,KAAA,CAAM,IAAA,CAAK,aAAa,mBAAA,CAAoB,KAAA,CAAM,QAAQ,CAAC,CAAA,CAAE,CAAA;AACjF,EAAA,IAAI,KAAA,CAAM,KAAK,KAAA,CAAM,IAAA,CAAK,QAAQ,mBAAA,CAAoB,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,CAAA;AAClE,EAAA,KAAA,CAAM,IAAA,CAAK,OAAO,EAAE,CAAA;AACpB,EAAA,IAAI,MAAM,WAAA,EAAa;AACrB,IAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,IAAA,IAAQ,EAAE,CAAA;AAAA,EACzC,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA,CAAK,8BAA8B,EAAE,CAAA;AAAA,EAC7C;AACA,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAC5B;AAEA,SAAS,oBAAA,CAAqB,eAAoC,QAAA,EAA0B;AAC1F,EAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,QAAQ,GAAG,OAAO,QAAA;AACzC,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,CAAS,KAAK,IAAI,KAAA,GAAQ,EAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,KAAA,CAAM,GAAG,CAAC,GAAA,CAAI,MAAM,CAAA,GAAI,QAAA;AAC1D,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,OAAO,aAAA,CAAc,IAAI,CAAA,EAAG,UAAU,IAAI,KAAK,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAG;AACxD,IAAA,KAAA,IAAS,CAAA;AAAA,EACX;AACA,EAAA,OAAO,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,KAAK,GAAG,GAAG,CAAA,CAAA;AACrC;AAEA,eAAe,mBAAA,CAAoB,KAAa,QAAA,EAA4C;AAC1F,EAAA,IAAI,UAAU,OAAO,QAAA;AACrB,EAAA,IAAI,MAAM,UAAA,CAAWD,SAAAA,CAAK,KAAK,UAAU,CAAC,GAAG,OAAO,UAAA;AACpD,EAAA,IAAI,MAAM,UAAA,CAAWA,SAAAA,CAAK,KAAK,eAAe,CAAC,GAAG,OAAO,MAAA;AACzD,EAAA,OAAO,UAAA;AACT;AAEA,eAAsB,sBAAA,CAAuB,OAAA,GAA8B,EAAC,EAA+B;AACzG,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACvC,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,UAAA;AACjC,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,oBAAO,IAAI,IAAA,EAAK;AACpC,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,KAAA;AAC/B,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,MAAM,WAAA,GAAcA,SAAAA,CAAK,GAAA,EAAK,UAAU,CAAA;AACxC,IAAA,IAAI,MAAM,UAAA,CAAW,WAAW,CAAA,EAAG;AACjC,MAAA,MAAM,QAAA,GAAW,MAAMD,gBAAAA,CAAQ,WAAW,EAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC1D,MAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,CAAC,KAAA,EAAO;AACjC,QAAA,MAAM,IAAI,MAAM,mFAAmF,CAAA;AAAA,MACrG;AAAA,IACF;AACA,IAAA,MAAMS,cAAA,CAAM,WAAA,EAAa,EAAE,SAAA,EAAW,MAAM,CAAA;AAC5C,IAAA,MAAMC,OAAAA,GAAS,kBAAA;AAAA,MACb;AAAA,QACE,EAAA,EAAI,qBAAA;AAAA,QACJ,KAAA,EAAO,wBAAA;AAAA,QACP,WAAA,EAAa,wDAAA;AAAA,QACb,QAAA,EAAU,YAAA;AAAA,QACV,IAAA,EAAM,SAAA;AAAA,QACN,UAAA,EAAY,IAAI,WAAA,EAAY;AAAA,QAC5B,QAAA,EAAU;AAAA,OACZ;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,UAAA,GAAa,GAAG,WAAA,CAAYA,OAAAA,CAAO,UAAU,CAAC,CAAA,CAAA,EAAIA,QAAO,EAAE,CAAA,GAAA,CAAA;AACjE,IAAA,MAAM,UAAA,GAAaT,SAAAA,CAAK,WAAA,EAAa,UAAU,CAAA;AAC/C,IAAA,MAAMK,kBAAAA,CAAU,UAAA,EAAY,qBAAA,CAAsBI,OAAM,GAAG,MAAM,CAAA;AACjE,IAAA,OAAA,CAAQ,KAAK,WAAW,CAAA;AACxB,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,SAAA,EAAY,UAAU,CAAA,CAAE,CAAA;AACrC,IAAA,OAAO,EAAE,QAAQ,OAAA,EAAQ;AAAA,EAC3B;AAEA,EAAA,MAAM,YAAA,GAAeT,SAAAA,CAAK,GAAA,EAAK,eAAe,CAAA;AAC9C,EAAA,IAAI,MAAM,UAAA,CAAW,YAAY,CAAA,EAAG;AAClC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,IAC3E;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,kBAAA;AAAA,IACb;AAAA,MACE,EAAA,EAAI,qBAAA;AAAA,MACJ,KAAA,EAAO,wBAAA;AAAA,MACP,WAAA,EAAa,wDAAA;AAAA,MACb,QAAA,EAAU,YAAA;AAAA,MACV,IAAA,EAAM,SAAA;AAAA,MACN,UAAA,EAAY,IAAI,WAAA,EAAY;AAAA,MAC5B,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAMK,kBAAAA,CAAU,YAAA,EAAc,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,CAAC,MAAM,CAAA,EAAG,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA,EAAM,MAAM,CAAA;AAC9E,EAAA,OAAA,CAAQ,KAAK,eAAe,CAAA;AAC5B,EAAA,OAAO,EAAE,QAAQ,OAAA,EAAQ;AAC3B;AAEA,eAAe,yBAAA,CAA0B,KAAa,EAAA,EAA2B;AAC/E,EAAA,MAAM,WAAA,GAAcL,SAAAA,CAAK,GAAA,EAAK,UAAU,CAAA;AACxC,EAAA,IAAI,CAAE,MAAM,UAAA,CAAW,WAAW,CAAA,EAAI;AACtC,EAAA,MAAM,OAAA,GAAU,MAAM,wBAAA,CAAyB,EAAE,GAAA,EAAK,OAAA,EAAS,kBAAA,EAAoB,CAAA,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AACnG,EAAA,IAAI,QAAQ,IAAA,CAAK,CAAC,UAAU,KAAA,CAAM,EAAA,KAAO,EAAE,CAAA,EAAG;AAC5C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,EAAE,CAAA,gBAAA,CAAkB,CAAA;AAAA,EACrD;AACF;AAEA,eAAe,oBAAA,CAAqB,KAAa,KAAA,EAAsC;AACrF,EAAA,MAAMQ,cAAA,CAAMR,UAAK,GAAA,EAAK,UAAU,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACtD,EAAA,MAAM,yBAAA,CAA0B,GAAA,EAAK,KAAA,CAAM,EAAE,CAAA;AAC7C,EAAA,MAAM,gBAAgB,IAAI,GAAA;AAAA,IAAA,CACvB,MAAMD,gBAAAA,CAAQC,SAAAA,CAAK,KAAK,UAAU,CAAC,EAAE,KAAA,CAAM,MAAM,EAAE,GACjD,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,QAAA,CAAS,KAAK,CAAC;AAAA,GAC1C;AACA,EAAA,MAAM,QAAA,GAAW,GAAG,WAAA,CAAY,KAAA,CAAM,UAAU,CAAC,CAAA,CAAA,EAAI,MAAM,EAAE,CAAA,GAAA,CAAA;AAC7D,EAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,aAAA,EAAe,QAAQ,CAAA;AAC7D,EAAA,MAAM,OAAA,GAAU,YAAY,QAAQ,CAAA,CAAA;AACpC,EAAA,MAAMK,kBAAAA,CAAUL,UAAK,GAAA,EAAK,OAAO,GAAG,qBAAA,CAAsB,KAAK,GAAG,MAAM,CAAA;AACxE,EAAA,OAAO,OAAA;AACT;AAEA,eAAe,gBAAA,CAAiB,KAAa,KAAA,EAAsC;AACjF,EAAA,MAAM,YAAA,GAAeA,SAAAA,CAAK,GAAA,EAAK,eAAe,CAAA;AAC9C,EAAA,MAAM,GAAA,GAAM,MAAME,iBAAAA,CAAS,YAAA,EAAc,MAAM,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AACjE,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACzB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,EAC1E;AACA,EAAA,MAAM,QAAA,GAAW,MAAA;AACjB,EAAA,IAAI,QAAA,CAAS,KAAK,CAAC,IAAA,KAAS,KAAK,EAAA,KAAO,KAAA,CAAM,EAAE,CAAA,EAAG;AACjD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,KAAA,CAAM,EAAE,CAAA,gBAAA,CAAkB,CAAA;AAAA,EAC3D;AACA,EAAA,MAAM,IAAA,GAAO,CAAC,GAAG,QAAA,EAAU,KAAK,CAAA;AAChC,EAAA,MAAM,UAAA,GAAa,iBAAiB,IAAI,CAAA;AACxC,EAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,IAAA,MAAM,IAAI,MAAM,CAAA,iCAAA,EAAoC,UAAA,CAAW,OAAO,CAAC,CAAA,EAAG,OAAA,IAAW,eAAe,CAAA,CAAE,CAAA;AAAA,EACxG;AACA,EAAA,MAAMG,kBAAAA,CAAU,cAAc,CAAA,EAAG,IAAA,CAAK,UAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA,EAAM,MAAM,CAAA;AAC1E,EAAA,OAAO,eAAA;AACT;AAEA,eAAsB,gBAAgB,OAAA,EAAuD;AAC3F,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACvC,EAAA,MAAM,MAAA,GAAS,MAAM,mBAAA,CAAoB,GAAA,EAAK,QAAQ,MAAM,CAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,mBAAmB,OAAO,CAAA;AACxC,EAAA,MAAM,IAAA,GAAO,MAAA,KAAW,UAAA,GACpB,MAAM,oBAAA,CAAqB,GAAA,EAAK,KAAK,CAAA,GACrC,MAAM,gBAAA,CAAiB,GAAA,EAAK,KAAK,CAAA;AACrC,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAC/B;AAEA,SAAS,UAAA,CAAW,KAA8B,IAAA,EAA6C;AAC7F,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAG,CAAA;AACrB,IAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,MAAK,EAAG,OAAO,MAAM,IAAA,EAAK;AAAA,EACnE;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,kBAAkB,OAAA,EAA6B;AACtD,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG,OAAO,OAAA;AACnC,EAAA,IAAI,CAACE,SAAAA,CAAS,OAAO,GAAG,MAAM,IAAI,MAAM,8CAA8C,CAAA;AACtF,EAAA,KAAA,MAAW,OAAO,CAAC,OAAA,EAAS,OAAA,EAAS,eAAA,EAAiB,SAAS,CAAA,EAAY;AACzE,IAAA,MAAM,KAAA,GAAQ,QAAQ,GAAG,CAAA;AACzB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,KAAA;AAAA,EACnC;AACA,EAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AACrE;AAEA,SAAS,aAAA,CAAc,KAAyB,QAAA,EAAwB;AACtE,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,QAAA,CAAS,WAAA,EAAY;AACtC,EAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,GAAG,EAAE,OAAA,EAAQ;AACrC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,SAAS,WAAA,EAAY;AAC1D,EAAA,OAAO,IAAI,IAAA,CAAK,MAAM,CAAA,CAAE,WAAA,EAAY;AACtC;AAEA,SAAS,eAAA,CAAgB,QAAgB,KAAA,EAAuB;AAC9D,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,OAAA,EAAU,KAAA,GAAQ,CAAC,CAAA,CAAA;AACrC;AAaA,IAAM,kBAAA,GAAgE;AAAA,EACpE,MAAA,EAAQ;AAAA,IACN,cAAA,EAAgB,QAAA;AAAA,IAChB,SAAA,EAAW,CAAC,OAAA,EAAS,MAAA,EAAQ,UAAU,CAAA;AAAA,IACvC,QAAQ,CAAC,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,UAAU,SAAS,CAAA;AAAA,IACjD,UAAU,CAAC,aAAA,EAAe,gBAAgB,WAAA,EAAa,WAAA,EAAa,cAAc,MAAM,CAAA;AAAA,IACxF,YAAA,EAAc,CAAC,UAAA,EAAY,MAAA,EAAQ,SAAS,CAAA;AAAA,IAC5C,OAAA,EAAS,CAAC,KAAA,EAAO,MAAA,EAAQ,WAAW,CAAA;AAAA,IACpC,eAAA,EAAiB,CAAC,aAAA,EAAe,SAAA,EAAW,QAAQ,MAAM,CAAA;AAAA,IAC1D,aAAA,EAAe,CAAC,cAAA,EAAgB,gBAAA,EAAkB,YAAY,WAAW;AAAA,GAC3E;AAAA,EACA,OAAA,EAAS;AAAA,IACP,cAAA,EAAgB,SAAA;AAAA,IAChB,SAAA,EAAW,CAAC,OAAA,EAAS,MAAA,EAAQ,UAAU,CAAA;AAAA,IACvC,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAA,EAAQ,WAAW,UAAU,CAAA;AAAA,IAC5C,UAAU,CAAC,aAAA,EAAe,cAAA,EAAgB,WAAA,EAAa,cAAc,MAAM,CAAA;AAAA,IAC3E,YAAA,EAAc,CAAC,UAAA,EAAY,KAAA,EAAO,MAAM,CAAA;AAAA,IACxC,OAAA,EAAS,CAAC,KAAA,EAAO,MAAA,EAAQ,WAAW,CAAA;AAAA,IACpC,eAAA,EAAiB,CAAC,aAAA,EAAe,SAAA,EAAW,WAAW,MAAM,CAAA;AAAA,IAC7D,aAAA,EAAe,CAAC,cAAA,EAAgB,WAAW;AAAA,GAC7C;AAAA,EACA,WAAA,EAAa;AAAA,IACX,cAAA,EAAgB,aAAA;AAAA,IAChB,SAAA,EAAW,CAAC,OAAA,EAAS,SAAA,EAAW,MAAM,CAAA;AAAA,IACtC,MAAA,EAAQ,CAAC,IAAA,EAAM,SAAA,EAAW,UAAU,MAAM,CAAA;AAAA,IAC1C,UAAU,CAAC,cAAA,EAAgB,aAAA,EAAe,YAAA,EAAc,aAAa,MAAM,CAAA;AAAA,IAC3E,YAAA,EAAc,CAAC,UAAA,EAAY,SAAA,EAAW,OAAO,OAAO,CAAA;AAAA,IACpD,OAAA,EAAS,CAAC,KAAA,EAAO,MAAA,EAAQ,WAAW,CAAA;AAAA,IACpC,eAAA,EAAiB,CAAC,aAAA,EAAe,SAAA,EAAW,QAAQ,MAAM,CAAA;AAAA,IAC1D,aAAA,EAAe,CAAC,gBAAA,EAAkB,cAAA,EAAgB,WAAW;AAAA,GAC/D;AAAA,EACA,KAAA,EAAO;AAAA,IACL,cAAA,EAAgB,OAAA;AAAA,IAChB,SAAA,EAAW,CAAC,OAAA,EAAS,MAAM,CAAA;AAAA,IAC3B,MAAA,EAAQ,CAAC,IAAA,EAAM,QAAA,EAAU,WAAW,MAAM,CAAA;AAAA,IAC1C,UAAU,CAAC,WAAA,EAAa,YAAA,EAAc,aAAA,EAAe,gBAAgB,MAAM,CAAA;AAAA,IAC3E,YAAA,EAAc,CAAC,UAAA,EAAY,MAAA,EAAQ,WAAW,CAAA;AAAA,IAC9C,OAAA,EAAS,CAAC,KAAA,EAAO,MAAA,EAAQ,WAAW,CAAA;AAAA,IACpC,eAAA,EAAiB,CAAC,SAAA,EAAW,aAAA,EAAe,WAAW,MAAM,CAAA;AAAA,IAC7D,aAAA,EAAe,CAAC,cAAA,EAAgB,WAAW;AAAA,GAC7C;AAAA,EACA,WAAA,EAAa;AAAA,IACX,cAAA,EAAgB,aAAA;AAAA,IAChB,SAAA,EAAW,CAAC,OAAA,EAAS,UAAA,EAAY,MAAM,CAAA;AAAA,IACvC,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAA,EAAQ,UAAU,SAAS,CAAA;AAAA,IAC1C,UAAU,CAAC,aAAA,EAAe,cAAA,EAAgB,WAAA,EAAa,cAAc,MAAM,CAAA;AAAA,IAC3E,YAAA,EAAc,CAAC,UAAA,EAAY,SAAA,EAAW,SAAS,CAAA;AAAA,IAC/C,OAAA,EAAS,CAAC,KAAA,EAAO,MAAA,EAAQ,WAAW,CAAA;AAAA,IACpC,eAAA,EAAiB,CAAC,aAAA,EAAe,MAAA,EAAQ,WAAW,SAAS,CAAA;AAAA,IAC7D,aAAA,EAAe,CAAC,cAAA,EAAgB,WAAW;AAAA;AAE/C,CAAA;AAEO,SAAS,yBACd,MAAA,EACA,OAAA,EACA,GAAA,mBAAY,IAAI,MAAK,EACL;AAChB,EAAA,MAAM,OAAA,GAAU,mBAAmB,MAAM,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,kBAAkB,OAAO,CAAA;AACvC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,EAAA,OAAO,KAAA,CACJ,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,KAAU;AACnB,IAAA,IAAI,CAACA,SAAAA,CAAS,GAAG,CAAA,EAAG,OAAO,IAAA;AAC3B,IAAA,MAAM,OAAA,GAAU,aAAA;AAAA,MACd,UAAA,CAAW,GAAA,EAAK,OAAA,CAAQ,QAAQ,CAAA;AAAA,MAChC;AAAA,KACF;AACA,IAAA,MAAM,KAAA,GAAQ,WAAW,GAAA,EAAK,OAAA,CAAQ,SAAS,CAAA,IAAK,CAAA,OAAA,EAAU,QAAQ,CAAC,CAAA,CAAA;AACvE,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,EAAK,OAAA,CAAQ,MAAM,CAAA,IAAK,KAAA;AAClD,IAAA,IAAI,EAAA,GAAK,iBAAiB,MAAM,CAAA;AAChC,IAAA,IAAI,CAAC,EAAA,EAAI,EAAA,GAAK,eAAA,CAAgB,OAAA,CAAQ,gBAAgB,KAAK,CAAA;AAC3D,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG;AACtB,MAAA,EAAA,GAAK,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,KAAA,GAAQ,CAAC,CAAA,CAAA;AAAA,IACzB;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,EAAK,OAAA,CAAQ,YAAY,CAAA;AACrD,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,GAAA,EAAK,OAAA,CAAQ,OAAO,CAAA;AAC3C,IAAA,MAAM,WAAA,GAAc,UAAA,CAAW,GAAA,EAAK,OAAA,CAAQ,eAAe,CAAA;AAC3D,IAAA,MAAM,iBAAA,GAAoB,aAAA;AAAA,MACxB,UAAA,CAAW,GAAA,EAAK,OAAA,CAAQ,aAAa,CAAA;AAAA,MACrC,IAAI,KAAK,QAAA,CAAS,IAAI,KAAK,OAAO,CAAA,EAAG,EAAE,CAAC;AAAA,KAC1C;AAEA,IAAA,MAAM,KAAA,GAAsB;AAAA,MAC1B,EAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAA,EAAY,OAAA;AAAA,MACZ,YAAA,EAAc,iBAAA;AAAA,MACd,IAAA,EAAM;AAAA,KACR;AACA,IAAA,IAAI,WAAA,QAAmB,WAAA,GAAc,WAAA;AACrC,IAAA,IAAI,QAAA,QAAgB,QAAA,GAAW,QAAA;AAC/B,IAAA,IAAI,GAAA,QAAW,GAAA,GAAM,GAAA;AACrB,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,KAAA,KAAiC,CAAC,CAAC,KAAK,CAAA;AACrD;AAsBA,eAAsB,gBAAgB,OAAA,EAAgF;AACpH,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACvC,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,2BAAA;AACnC,EAAA,MAAM,SAAA,GAAYP,SAAAA,CAAK,GAAA,EAAK,OAAA,CAAQ,SAAS,CAAA;AAC7C,EAAA,MAAM,GAAA,GAAM,MAAME,iBAAAA,CAAS,SAAA,EAAW,MAAM,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAE9B,EAAA,MAAM,OAAA,GAAU,yBAAyB,OAAA,CAAQ,IAAA,EAAM,SAAS,OAAA,CAAQ,GAAA,oBAAO,IAAI,IAAA,EAAM,CAAA;AACzF,EAAA,MAAMG,kBAAAA,CAAUL,SAAAA,CAAK,GAAA,EAAK,OAAO,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA,EAAM,MAAM,CAAA;AACnF,EAAA,OAAO,EAAE,OAAA,EAASU,aAAA,CAAS,OAAO,GAAG,OAAA,EAAQ;AAC/C;AC1aA,IAAM,iBACJ,OAAiBC,oBAAA,CAAA,aAAA,KAAkB,aAAuBA,oBAAA,CAAA,aAAA,CAAc,iQAAe,CAAA,GAAI,IAAA;AAE7F,IAAI,YAAA,GAA4C,IAAA;AAChD,IAAI,WAAA,GAAwC,IAAA;AAE5C,SAAS,gBAAmB,IAAA,EAAwB;AAClD,EAAA,IAAI,CAAC,gBAAgB,OAAO,IAAA;AAC5B,EAAA,IAAI;AAEF,IAAA,OAAO,eAAe,IAAI,CAAA;AAAA,EAC5B,SAAS,KAAA,EAAgB;AACvB,IAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,KAAA,IAAU,KAAA,CAA4B,SAAS,kBAAA,EAAoB;AACrH,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,SAAA,GAAiC;AACxC,EAAA,IAAI,YAAA,KAAiB,IAAA,EAAM,OAAO,YAAA,IAAgB,IAAA;AAClD,EAAA,YAAA,GAAe,eAAA,CAA8B,QAAQ,CAAA,IAAK,KAAA;AAC1D,EAAA,OAAO,YAAA,IAAgB,IAAA;AACzB;AAEA,SAAS,QAAA,GAA6B;AACpC,EAAA,IAAI,WAAA,KAAgB,IAAA,EAAM,OAAO,WAAA,IAAe,IAAA;AAChD,EAAA,WAAA,GAAc,eAAA,CAA2B,OAAO,CAAA,IAAK,KAAA;AACrD,EAAA,OAAO,WAAA,IAAe,IAAA;AACxB;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,OAAO,MACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,MAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,EACpB,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA,CACtB,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC1B;AAEA,SAAS,YAAY,GAAA,EAA+C;AAClE,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,MAAM,KAAA,GAAQ,QAAQ,WAAA,EAAY;AAClC,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,aAAa,CAAA,EAAG,OAAO,IAAA;AAC5C,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,IAAA;AACtC,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,WAAW,CAAA,EAAG,OAAO,IAAA;AAG1C,EAAA,IAAI,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,IAAA;AAErC,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,aAAa,IAAA,EAAsB;AAC1C,EAAA,OAAO,IAAA,CAEJ,OAAA,CAAQ,sCAAA,EAAwC,EAAE,EAClD,OAAA,CAAQ,oCAAA,EAAsC,EAAE,CAAA,CAEhD,QAAQ,+CAAA,EAAiD,EAAE,CAAA,CAE3D,OAAA,CAAQ,yEAAyE,EAAE,CAAA;AACxF;AAEA,SAAS,sBAAsB,IAAA,EAAsB;AACnD,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,GAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,GAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,YAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,OAAO,KAAK,OAAA,CAAQ,mCAAA,EAAqC,CAAC,KAAA,EAAO,KAAA,EAAO,KAAK,IAAA,KAAS;AACpF,IAAA,IAAI,CAAC,SAAA,CAAU,QAAA,CAAS,IAAI,WAAA,EAAa,GAAG,OAAO,KAAA;AACnD,IAAA,MAAM,WAAA,GAAc,KACjB,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA,CACtB,OAAA,CAAQ,UAAU,GAAG,CAAA,CACrB,QAAQ,QAAA,EAAU,GAAG,EACrB,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA,CACpB,OAAA,CAAQ,SAAS,GAAG,CAAA;AACvB,IAAA,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,EAAG,GAAG,GAAG,WAAW,CAAA,CAAA,CAAA;AAAA,EACtC,CAAC,CAAA;AACH;AAEA,SAAS,eAAA,CAAgB,MAAc,QAAA,EAAsC;AAC3E,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,IAAI,OAAO,UAAA,EAAY;AACrB,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,UAAA,CAAW,IAAA,EAAM,EAAE,MAAM,QAAA,IAAY,MAAA,EAAQ,KAAA,EAAO,aAAA,EAAe,CAAA;AAC1F,MAAA,IAAI,OAAO,QAAA,KAAa,QAAA,EAAU,OAAO,QAAA;AAAA,IAC3C,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,WAAW,QAAA,GAAW,CAAA,iBAAA,EAAoB,UAAA,CAAW,QAAQ,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AAC1E,EAAA,OAAO,CAAA,UAAA,EAAa,QAAQ,CAAA,CAAA,EAAI,UAAA,CAAW,IAAI,CAAC,CAAA,aAAA,CAAA;AAClD;AAEA,SAAS,eAAe,IAAA,EAAsB;AAE5C,EAAA,IAAI,MAAA,GAAS,WAAW,IAAI,CAAA;AAG5B,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,YAAA,EAAc,CAAC,QAAQ,IAAA,KAAS;AACtD,IAAA,MAAM,MAAM,SAAA,CAAU,MAAA;AACtB,IAAA,SAAA,CAAU,IAAA,CAAK,CAAA,MAAA,EAAS,UAAA,CAAW,IAAI,CAAC,CAAA,OAAA,CAAS,CAAA;AACjD,IAAA,OAAO,eAAS,GAAG,CAAA,QAAA,CAAA;AAAA,EACrB,CAAC,CAAA;AAGD,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,2BAAA,EAA6B,CAAC,MAAA,EAAQ,KAAK,GAAA,KAAQ;AACzE,IAAA,MAAM,OAAA,GAAU,YAAY,GAAG,CAAA;AAC/B,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,GAAA,IAAO,EAAE,CAAA;AACpC,IAAA,IAAI,CAAC,SAAS,OAAO,OAAA;AACrB,IAAA,OAAO,CAAA,UAAA,EAAa,UAAA,CAAW,OAAO,CAAC,UAAU,OAAO,CAAA,IAAA,CAAA;AAAA,EAC1D,CAAC,CAAA;AAGD,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,0BAAA,EAA4B,CAAC,MAAA,EAAQ,OAAO,GAAA,KAAQ;AAC1E,IAAA,MAAM,OAAA,GAAU,YAAY,GAAG,CAAA;AAC/B,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,KAAA,IAAS,EAAE,CAAA;AACxC,IAAA,IAAI,CAAC,SAAS,OAAO,SAAA;AACrB,IAAA,OAAO,CAAA,SAAA,EAAY,UAAA,CAAW,OAAO,CAAC,+CAA+C,SAAS,CAAA,IAAA,CAAA;AAAA,EAChG,CAAC,CAAA;AAGD,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,kBAAA,EAAoB,qBAAqB,CAAA;AACjE,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,cAAA,EAAgB,aAAa,CAAA;AAGrD,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,gBAAA,EAAkB,CAAC,EAAA,EAAI,GAAA,KAAQ,SAAA,CAAU,MAAA,CAAO,GAAG,CAAC,CAAA,IAAK,EAAE,CAAA;AAEnF,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAc,QAAA,EAA0B;AAC/C,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA;AACpC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,UAAA,GAA8B,IAAA;AAClC,EAAA,IAAI,WAAA,GAA+B,IAAA;AACnC,EAAA,IAAI,WAAA,GAAc,KAAA;AAClB,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,YAAsB,EAAC;AAE3B,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,IAAA,EAAO,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,IAAA,EAAO,IAAI,CAAA,KAAA,CAAO,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,KAAA,CAAO,CAAA;AAC/E,IAAA,UAAA,GAAa,IAAA;AAAA,EACf,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,CAAC,IAAA,KAAS,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,CAAC,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AAClF,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,OAAO,CAAA,aAAA,CAAe,CAAA;AACjD,IAAA,WAAA,GAAc,IAAA;AAAA,EAChB,CAAA;AAEA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,MAAA,CAAO,KAAK,eAAA,CAAgB,SAAA,CAAU,KAAK,IAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AAC3D,IAAA,SAAA,GAAY,EAAC;AACb,IAAA,QAAA,GAAW,MAAA;AACX,IAAA,WAAA,GAAc,KAAA;AAAA,EAChB,CAAA;AAEA,EAAA,KAAA,MAAW,WAAW,KAAA,EAAO;AAC3B,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAEvC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AACxC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,SAAA,EAAU;AAAA,MACZ,CAAA,MAAO;AACL,QAAA,SAAA,EAAU;AACV,QAAA,UAAA,EAAW;AACX,QAAA,WAAA,GAAc,IAAA;AACd,QAAA,QAAA,GAAW,SAAA,CAAU,CAAC,CAAA,EAAG,IAAA,EAAK,IAAK,MAAA;AACnC,QAAA,SAAA,GAAY,EAAC;AAAA,MACf;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,SAAA,CAAU,KAAK,OAAO,CAAA;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,mBAAmB,CAAA;AAChD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,UAAA,EAAW;AACX,MAAA,UAAA,GAAa,cAAc,EAAC;AAC5B,MAAA,UAAA,CAAW,KAAK,cAAA,CAAe,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AACnD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,YAAY,SAAA,EAAU;AAE1B,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,mBAAmB,CAAA;AACnD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,UAAA,EAAW;AACX,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,CAAC,CAAA,CAAE,MAAA;AAC9B,MAAA,MAAM,UAAU,cAAA,CAAe,YAAA,CAAa,CAAC,CAAA,CAAE,MAAM,CAAA;AACrD,MAAA,MAAA,CAAO,KAAK,CAAA,EAAA,EAAK,KAAK,IAAI,OAAO,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AAC/C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AAC1C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,WAAA,GAAc,eAAe,EAAC;AAC9B,MAAA,WAAA,CAAY,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAA;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,aAAa,UAAA,EAAW;AAE5B,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,KAAK,CAAA,GAAA,EAAM,cAAA,CAAe,KAAK,IAAA,EAAM,CAAC,CAAA,IAAA,CAAM,CAAA;AAAA,EACrD;AAEA,EAAA,SAAA,EAAU;AACV,EAAA,UAAA,EAAW;AACX,EAAA,SAAA,EAAU;AAEV,EAAA,OAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AACzB;AAEA,SAAS,gBAAA,CAAiB,UAAkB,MAAA,EAAqC;AAC/E,EAAA,IAAI,CAAC,MAAA,CAAO,KAAA,EAAO,OAAO,IAAA;AAE1B,EAAA,MAAM,WAAW,MAAA,CAAO,QAAA,GAAW,IAAI,MAAA,CAAO,UAAS,GAAI,MAAA;AAE3D,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,QAAA,CAAS,IAAA,GAAO,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS;AACtC,MAAA,MAAM,OAAA,GAAU,YAAY,IAAI,CAAA;AAChC,MAAA,IAAI,CAAC,OAAA,EAAS,OAAO,UAAA,CAAW,IAAI,CAAA;AACpC,MAAA,OAAO,CAAA,SAAA,EAAY,UAAA,CAAW,OAAO,CAAC,+CAA+C,IAAI,CAAA,IAAA,CAAA;AAAA,IAC3F,CAAA;AACA,IAAA,QAAA,CAAS,KAAA,GAAQ,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS;AACvC,MAAA,MAAM,OAAA,GAAU,YAAY,IAAI,CAAA;AAChC,MAAA,MAAM,OAAA,GAAU,UAAA,CAAW,IAAA,IAAQ,EAAE,CAAA;AACrC,MAAA,IAAI,CAAC,SAAS,OAAO,OAAA;AACrB,MAAA,OAAO,CAAA,UAAA,EAAa,UAAA,CAAW,OAAO,CAAC,UAAU,OAAO,CAAA,IAAA,CAAA;AAAA,IAC1D,CAAA;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,OAAO,KAAA,CAAM,QAAA,EAAU,WAAW,EAAE,QAAA,KAAa,MAAS,CAAA;AACzE,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,EAAU,OAAO,MAAA;AACvC,EAAA,OAAO,MAAA,GAAS,MAAA,CAAO,MAAM,CAAA,GAAI,IAAA;AACnC;AAQO,SAAS,iBAAiB,QAAA,EAA0B;AACzD,EAAA,IAAI,CAAC,UAAU,OAAO,EAAA;AAEtB,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,QAAA,EAAU,MAAM,CAAA;AAClD,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAMC,UAAAA,GAAY,aAAa,QAAQ,CAAA;AACvC,QAAA,MAAMC,QAAAA,GAAU,sBAAsBD,UAAS,CAAA;AAC/C,QAAA,OAAO,aAAaC,QAAO,CAAA;AAAA,MAC7B;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC5B,IAAA,MAAMD,UAAAA,GAAY,aAAa,QAAQ,CAAA;AACvC,IAAA,MAAMC,QAAAA,GAAU,sBAAsBD,UAAS,CAAA;AAC/C,IAAA,OAAO,aAAaC,QAAO,CAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,QAAA,GAAW,cAAc,QAAQ,CAAA;AACvC,EAAA,MAAM,SAAA,GAAY,aAAa,QAAQ,CAAA;AACvC,EAAA,MAAM,OAAA,GAAU,sBAAsB,SAAS,CAAA;AAC/C,EAAA,OAAO,aAAa,OAAO,CAAA;AAC7B;;;ACtUA,SAAS,OAAO,GAAA,EAAqB;AACnC,EAAA,OAAO,GAAA,CACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,EACrB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,MAAM,QAAQ,CAAA;AAC3B;AAMO,SAAS,WAAA,CAAY,UAA2B,OAAA,EAA2E;AAChI,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,EAAS,KAAA,IAAS,uBAAuB,CAAA;AAC9D,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,EAAS,IAAA,IAAQ,EAAE,CAAA;AACvC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,EAAS,WAAA,IAAe,iBAAiB,CAAA;AAE7D,EAAA,MAAM,KAAA,GAAQ,QAAA,CACX,KAAA,EAAM,CACN,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,IAAA,CAAK,CAAA,CAAE,UAAU,EAAE,OAAA,EAAQ,GAAI,IAAI,IAAA,CAAK,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA,EAAS,CAAA,CAClF,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,IAAA,MAAM,kBAAkB,IAAA,CAAK,WAAA,GAAc,gBAAA,CAAiB,IAAA,CAAK,WAAW,CAAA,GAAI,EAAA;AAChF,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,GAAI,EAAA;AAC/C,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,CAAA,OAAA,EAAU,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA,QAAA,CAAA;AAAA,MAC5B,QAAA,GAAW,CAAA,MAAA,EAAS,QAAQ,CAAA,OAAA,CAAA,GAAY,EAAA;AAAA,MACxC,CAAA,0BAAA,EAA+B,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAA,OAAA,CAAA;AAAA,MAC9C,YAAY,IAAI,IAAA,CAAK,KAAK,UAAU,CAAA,CAAE,aAAa,CAAA,UAAA,CAAA;AAAA,MACnD,yBAAyB,eAAe,CAAA,iBAAA,CAAA;AAAA,MACxC;AAAA,KACF,CAAE,KAAK,EAAE,CAAA;AAAA,EACX,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AAEV,EAAA,OAAO;AAAA,IACL,wCAAA;AAAA,IACA,qBAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAU,KAAK,CAAA,QAAA,CAAA;AAAA,IACf,IAAA,GAAO,CAAA,MAAA,EAAS,IAAI,CAAA,OAAA,CAAA,GAAY,EAAA;AAAA,IAChC,gBAAgB,IAAI,CAAA,cAAA,CAAA;AAAA,IACpB,KAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,EAAE,CAAA;AACX;AC5CA,IAAM,YAAA,GAAe,CAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA0ErB,IAAM,WAAA,GAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAiBpB,IAAM,UAAA,GAAa;AAAA,EACjB,WAAA,EAAa;AAAA,IACX,OAAA,EAAS,KAAA;AAAA,IACT,IAAA,EAAM,CAAC,kBAAkB;AAAA;AAE7B,CAAA;AAQA,eAAsB,WAAW,GAAA,EAAoC;AACnE,EAAA,MAAM,IAAA,GAAO,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAChC,EAAA,MAAM,MAAA,GAAsB,EAAE,QAAA,EAAU,EAAC,EAAG,SAAS,EAAC,EAAG,OAAA,EAAS,EAAC,EAAE;AAGrE,EAAA,MAAM,SAAA,GAAYb,SAAAA,CAAK,IAAA,EAAM,SAAS,CAAA;AACtC,EAAA,MAAM,eAAA,GAAkBA,SAAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AAChD,EAAA,MAAM,eAAA,GAAkBA,SAAAA,CAAK,eAAA,EAAiB,gBAAgB,CAAA;AAE9D,EAAA,IAAIc,aAAA,CAAW,SAAS,CAAA,IAAKA,aAAA,CAAWd,UAAK,IAAA,EAAM,WAAW,CAAC,CAAA,EAAG;AAChE,IAAA,MAAA,CAAO,QAAA,CAAS,KAAK,aAAa,CAAA;AAElC,IAAA,IAAIc,aAAA,CAAW,eAAe,CAAA,EAAG;AAC/B,MAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,eAAe,CAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,MAAMN,cAAAA,CAAM,eAAA,EAAiB,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,MAAA,MAAMH,kBAAAA,CAAU,eAAA,EAAiB,YAAA,EAAc,MAAM,CAAA;AACrD,MAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,eAAe,CAAA;AAAA,IACrC;AAGA,IAAA,MAAM,iBAAA,GAAoB,SAAA;AAC1B,IAAA,MAAM,aAAA,GAAgBL,SAAAA,CAAK,iBAAA,EAAmB,eAAe,CAAA;AAC7D,IAAA,IAAI,CAACc,aAAA,CAAW,aAAa,CAAA,EAAG;AAC9B,MAAA,MAAM,QAAA,GAAW,EAAE,UAAA,EAAY,UAAA,EAAW;AAC1C,MAAA,MAAMT,kBAAAA,CAAU,eAAe,IAAA,CAAK,SAAA,CAAU,UAAU,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA,EAAM,MAAM,CAAA;AAC/E,MAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,aAAa,CAAA;AAAA,IACnC,CAAA,MAAO;AAEL,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,MAAMH,iBAAAA,CAAS,aAAA,EAAe,MAAM,CAAC,CAAA;AACjE,QAAA,MAAM,UAAA,GAAc,QAAA,CAAS,UAAA,IAAc,EAAC;AAC5C,QAAA,IAAI,CAAC,WAAW,WAAA,EAAa;AAC3B,UAAA,UAAA,CAAW,cAAc,UAAA,CAAW,WAAA;AACpC,UAAA,QAAA,CAAS,UAAA,GAAa,UAAA;AACtB,UAAA,MAAMG,kBAAAA,CAAU,eAAe,IAAA,CAAK,SAAA,CAAU,UAAU,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA,EAAM,MAAM,CAAA;AAC/E,UAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,aAAa,CAAA,SAAA,CAAW,CAAA;AAAA,QACjD,CAAA,MAAO;AACL,UAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,aAAa,CAAA;AAAA,QACnC;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,aAAa,CAAA,cAAA,CAAgB,CAAA;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAYL,SAAAA,CAAK,IAAA,EAAM,SAAS,CAAA;AACtC,EAAA,MAAM,eAAA,GAAkBA,SAAAA,CAAK,IAAA,EAAM,cAAc,CAAA;AACjD,EAAA,MAAM,aAAA,GAAgBA,SAAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AAEhD,EAAA,IAAIc,aAAA,CAAW,SAAS,CAAA,IAAKA,aAAA,CAAW,eAAe,CAAA,EAAG;AACxD,IAAA,MAAA,CAAO,QAAA,CAAS,KAAK,QAAQ,CAAA;AAG7B,IAAA,IAAIA,aAAA,CAAW,eAAe,CAAA,EAAG;AAC/B,MAAA,MAAM,OAAA,GAAU,MAAMZ,iBAAAA,CAAS,eAAA,EAAiB,MAAM,CAAA;AACtD,MAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA,EAAG;AACnC,QAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,eAAe,CAAA;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,MAAMG,kBAAAA,CAAU,eAAA,EAAiB,OAAA,GAAU,MAAA,GAAS,aAAa,MAAM,CAAA;AACvE,QAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,eAAe,CAAA,WAAA,CAAa,CAAA;AAAA,MACrD;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAMA,kBAAAA,CAAU,eAAA,EAAiB,WAAA,EAAa,MAAM,CAAA;AACpD,MAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,eAAe,CAAA;AAAA,IACrC;AAGA,IAAA,IAAIS,aAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,IAAI,CAACA,aAAA,CAAW,aAAa,CAAA,EAAG;AAC9B,QAAA,MAAM,MAAA,GAAS,EAAE,OAAA,EAAS,UAAA,EAAW;AACrC,QAAA,MAAMN,cAAAA,CAAM,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAC1C,QAAA,MAAMH,kBAAAA,CAAU,eAAe,IAAA,CAAK,SAAA,CAAU,QAAQ,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA,EAAM,MAAM,CAAA;AAC7E,QAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,aAAa,CAAA;AAAA,MACnC,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,aAAa,CAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAYL,SAAAA,CAAK,IAAA,EAAM,SAAS,CAAA;AACtC,EAAA,MAAM,aAAA,GAAgBA,SAAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AAEhD,EAAA,IAAIc,aAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,MAAA,CAAO,QAAA,CAAS,KAAK,SAAS,CAAA;AAE9B,IAAA,IAAI,CAACA,aAAA,CAAW,aAAa,CAAA,EAAG;AAC9B,MAAA,MAAM,MAAA,GAAS,EAAE,OAAA,EAAS,UAAA,EAAW;AACrC,MAAA,MAAMT,kBAAAA,CAAU,eAAe,IAAA,CAAK,SAAA,CAAU,QAAQ,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA,EAAM,MAAM,CAAA;AAC7E,MAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,aAAa,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,aAAa,CAAA;AAAA,IACnC;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAChC,IAAA,MAAA,CAAO,QAAA,CAAS,KAAK,yDAAoD,CAAA;AACzE,IAAA,MAAMA,kBAAAA,CAAU,eAAA,EAAiB,WAAA,EAAa,MAAM,CAAA;AACpD,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,eAAe,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,MAAA;AACT;;;AC/JA,SAAS,UAAU,IAAA,EAA4B;AAC7C,EAAA,MAAM,CAAC,UAAA,EAAY,GAAG,IAAI,CAAA,GAAI,IAAA;AAC9B,EAAA,MAAM,OAAA,uBAAc,GAAA,CAAI;AAAA,IACtB,MAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,UAAU,IAAK,UAAA,GAAuC,MAAA;AAClF,EAAA,MAAM,MAAA,GAAqB,EAAE,OAAA,EAAQ;AAErC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,QAAQ,WAAA,EAAa,MAAA,CAAO,OAAA,GAAU,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IACzC,QAAQ,OAAA,EAAS,MAAA,CAAO,OAAA,GAAU,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IAC1C,QAAQ,OAAA,EAAS,MAAA,CAAO,GAAA,GAAM,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IACtC,QAAQ,SAAA,EAAW,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IAC1C,QAAQ,QAAA,EAAU,MAAA,CAAO,IAAA,GAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IACxC,QAAQ,eAAA,EAAiB,MAAA,CAAO,WAAA,GAAc,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IACtD,QAAQ,SAAA,EAAW,MAAA,CAAO,SAAA,GAAY,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IAC9C,QAAQ,QAAA,EAAU,MAAA,CAAO,IAAA,GAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IACxC,QAAQ,UAAA,EAAY,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IAC5C,GAAA,KAAQ,SAAA,EAAW,MAAA,CAAO,KAAA,GAAQ,IAAA;AAAA,SAAA,IAClC,QAAQ,MAAA,EAAQ,MAAA,CAAO,EAAA,GAAK,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IACpC,QAAQ,SAAA,EAAW,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IAC1C,QAAQ,QAAA,EAAU,MAAA,CAAO,IAAA,GAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IACxC,QAAQ,YAAA,EAAc,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IAChD,QAAQ,OAAA,EAAS,MAAA,CAAO,GAAA,GAAM,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IACtC,QAAQ,cAAA,EAAgB,MAAA,CAAO,UAAA,GAAa,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IACpD,QAAQ,gBAAA,EAAkB,MAAA,CAAO,YAAA,GAAe,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IACxD,GAAA,KAAQ,eAAe,MAAA,CAAO,QAAA,GAAW,OAAO,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,SAAA,GAAkB;AACzB,EAAA,OAAA,CAAQ,IAAI,iBAAiB,CAAA;AAC7B,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,QAAQ,CAAA;AACpB,EAAA,OAAA,CAAQ,IAAI,iEAAiE,CAAA;AAC7E,EAAA,OAAA,CAAQ,IAAI,mOAAmO,CAAA;AAC/O,EAAA,OAAA,CAAQ,IAAI,6IAA6I,CAAA;AACzJ,EAAA,OAAA,CAAQ,IAAI,8FAA8F,CAAA;AAC1G,EAAA,OAAA,CAAQ,IAAI,+DAA+D,CAAA;AAC3E,EAAA,OAAA,CAAQ,IAAI,4DAA4D,CAAA;AACxE,EAAA,OAAA,CAAQ,IAAI,6DAA6D,CAAA;AACzE,EAAA,OAAA,CAAQ,IAAI,8IAA8I,CAAA;AAC1J,EAAA,OAAA,CAAQ,IAAI,wGAAwG,CAAA;AACpH,EAAA,OAAA,CAAQ,IAAI,oGAAoG,CAAA;AAClH;AAEA,eAAe,uBAAuB,KAAA,EAAiC;AACrE,EAAA,IAAI,KAAA,EAAO,IAAA,EAAK,EAAG,OAAO,MAAM,IAAA,EAAK;AACrC,EAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,CAAM,SAAS,CAAC,OAAA,CAAQ,OAAO,KAAA,EAAO;AACjD,IAAA,MAAM,IAAI,MAAM,2DAA2D,CAAA;AAAA,EAC7E;AACA,EAAA,MAAM,KAAKU,0BAAA,CAAgB;AAAA,IACzB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AACD,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,MAAM,EAAA,CAAG,QAAA,CAAS,iBAAiB,GAAG,IAAA,EAAK;AAC1D,IAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,MAAM,2BAA2B,CAAA;AACvD,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,EAAA,CAAG,KAAA,EAAM;AAAA,EACX;AACF;AAEA,eAAe,GAAA,GAAqB;AAClC,EAAA,MAAM,OAAO,SAAA,CAAU,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAC5C,EAAA,IAAI,IAAA,CAAK,YAAY,MAAA,EAAQ;AAC3B,IAAA,SAAA,EAAU;AACV,IAAA,OAAA,CAAQ,QAAA,GAAW,CAAA;AACnB,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,CAAA,IAAA,EAAOC,WAAA,EAAU,CAAA,CAAA;AACpC,EAAA,MAAM,UAAU,gBAAA,EAAiB;AAEjC,EAAA,IAAI;AACF,IAAA,IAAI,IAAA,CAAK,YAAY,MAAA,EAAQ;AAC3B,MAAA,MAAM,MAAA,GAAS,MAAM,sBAAA,CAAuB;AAAA,QAC1C,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AACD,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,iCAAA,EAAoC,MAAA,CAAO,MAAM,CAAA,CAAA,CAAG,CAAA;AAChE,MAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,OAAA,EAAS;AACjC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,MACzB;AACA,MAAA,OAAA,EAAS,OAAA,CAAQ;AAAA,QACf,UAAA;AAAA,QACA,KAAA,EAAO,UAAA;AAAA,QACP,UAAA,EAAY,EAAE,MAAA,EAAQ,MAAA,CAAO,QAAQ,aAAA,EAAe,MAAA,CAAO,QAAQ,MAAA;AAAO,OAC3E,CAAA;AACD,MAAA,MAAM,eAAA,EAAgB;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,YAAY,UAAA,EAAY;AAC/B,MAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AACxC,MAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC9B,QAAA,OAAA,CAAQ,IAAI,CAAA,UAAA,EAAa,MAAA,CAAO,SAAS,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACvD;AACA,MAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,OAAA,EAAS;AACjC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,WAAA,EAAc,IAAI,CAAA,CAAE,CAAA;AAAA,MAClC;AACA,MAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,OAAA,EAAS;AACjC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,WAAA,EAAc,IAAI,CAAA,iBAAA,CAAmB,CAAA;AAAA,MACnD;AACA,MAAA,IAAI,OAAO,OAAA,CAAQ,MAAA,KAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC5D,QAAA,OAAA,CAAQ,IAAI,0CAA0C,CAAA;AAAA,MACxD;AACA,MAAA,OAAA,EAAS,OAAA,CAAQ;AAAA,QACf,UAAA;AAAA,QACA,KAAA,EAAO,cAAA;AAAA,QACP,UAAA,EAAY;AAAA,UACV,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,aAAA,EAAe,OAAO,OAAA,CAAQ,MAAA;AAAA,UAC9B,aAAA,EAAe,OAAO,OAAA,CAAQ;AAAA;AAChC,OACD,CAAA;AACD,MAAA,MAAM,eAAA,EAAgB;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,YAAY,KAAA,EAAO;AAC1B,MAAA,MAAM,KAAA,GAAQ,MAAM,sBAAA,CAAuB,IAAA,CAAK,KAAK,CAAA;AACrD,MAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB;AAAA,QACnC,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,KAAA;AAAA,QACA,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,cAAc,IAAA,CAAK,YAAA;AAAA,QACnB,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AACD,MAAA,OAAA,CAAQ,GAAA,CAAI,kBAAkB,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,KAAA,EAAQ,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAClE,MAAA,OAAA,EAAS,OAAA,CAAQ;AAAA,QACf,UAAA;AAAA,QACA,KAAA,EAAO,iBAAA;AAAA,QACP,UAAA,EAAY;AAAA,UACV,UAAA,EAAY,OAAO,KAAA,CAAM,EAAA;AAAA,UACzB,YAAA,EAAc,OAAO,KAAA,CAAM,IAAA;AAAA,UAC3B,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,eAAA,EAAiB,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA;AAAA,UACzC,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,GAAG;AAAA;AAC3B,OACD,CAAA;AACD,MAAA,MAAM,eAAA,EAAgB;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,YAAY,SAAA,EAAW;AAC9B,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,MAAM,IAAI,MAAM,0EAA0E,CAAA;AAAA,MAC5F;AACA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,IAAa,CAAA,EAAG,IAAI,CAAA,YAAA,CAAA;AAC3C,MAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB;AAAA,QACnC,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,IAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAS,IAAA,CAAK;AAAA,OACf,CAAA;AACD,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,MAAM,iBAAiB,IAAI,CAAA,IAAA,EAAO,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AACzF,MAAA,OAAA,EAAS,OAAA,CAAQ;AAAA,QACf,UAAA;AAAA,QACA,KAAA,EAAO,aAAA;AAAA,QACP,UAAA,EAAY,EAAE,MAAA,EAAQ,IAAA,EAAM,gBAAA,EAAkB,OAAO,OAAA,CAAQ,MAAA,EAAQ,QAAA,EAAU,MAAA,CAAO,OAAA;AAAQ,OAC/F,CAAA;AACD,MAAA,MAAM,eAAA,EAAgB;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,YAAY,OAAA,EAAS;AAC5B,MAAA,MAAM,GAAA,GAAM,KAAK,OAAA,IAAW,2BAAA;AAC5B,MAAA,MAAMC,QAAAA,GAAU,MAAM,wBAAA,CAAyB;AAAA,QAC7C,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,OAAA,EAAS,GAAA;AAAA,QACT,KAAK,IAAA,CAAK;AAAA,OACX,CAAA;AACD,MAAA,OAAA,CAAQ,IAAI,CAAA,MAAA,EAASA,QAAAA,CAAQ,MAAM,CAAA,oBAAA,EAAuB,GAAG,CAAA,CAAE,CAAA;AAC/D,MAAA,OAAA,EAAS,OAAA,CAAQ;AAAA,QACf,UAAA;AAAA,QACA,KAAA,EAAO,WAAA;AAAA,QACP,UAAA,EAAY,EAAE,aAAA,EAAeA,QAAAA,CAAQ,MAAA,EAAQ,QAAA,EAAU,GAAA,EAAK,WAAA,EAAa,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA;AAAE,OAChG,CAAA;AACD,MAAA,MAAM,eAAA,EAAgB;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,YAAY,UAAA,EAAY;AAC/B,MAAA,MAAM,oBAAA,CAAqB;AAAA,QACzB,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,KAAK,IAAA,CAAK;AAAA,OACX,CAAA;AACD,MAAA,OAAA,CAAQ,IAAI,qBAAqB,CAAA;AACjC,MAAA,MAAM,eAAA,EAAgB;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,wBAAA,CAAyB;AAAA,MAC7C,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,KAAK,IAAA,CAAK;AAAA,KACX,CAAA;AAED,IAAA,IAAI,IAAA,CAAK,YAAY,OAAA,EAAS;AAC5B,MAAA,MAAM,KAAA,GAAQ,qBAAqB,OAAO,CAAA;AAC1C,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,eAAA,EAAkB,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAC3C,MAAA,OAAA,CAAQ,GAAA,CAAI,YAAY,MAAA,CAAO,OAAA,CAAQ,MAAM,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,EAAE,IAAA,CAAK,IAAI,CAAA,IAAK,MAAM,CAAA,CAAE,CAAA;AACxG,MAAA,OAAA,CAAQ,GAAA,CAAI,gBAAgB,MAAA,CAAO,OAAA,CAAQ,MAAM,UAAU,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,EAAE,IAAA,CAAK,IAAI,CAAA,IAAK,MAAM,CAAA,CAAE,CAAA;AAChH,MAAA,IAAI,MAAM,aAAA,EAAe,OAAA,CAAQ,IAAI,CAAA,gBAAA,EAAmB,KAAA,CAAM,aAAa,CAAA,CAAE,CAAA;AAC7E,MAAA,IAAI,MAAM,aAAA,EAAe,OAAA,CAAQ,IAAI,CAAA,gBAAA,EAAmB,KAAA,CAAM,aAAa,CAAA,CAAE,CAAA;AAC7E,MAAA,MAAM,eAAA,EAAgB;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,YAAY,QAAA,EAAU;AAC7B,MAAA,MAAM,MAAA,GAAS,UAAU,OAAO,CAAA;AAChC,MAAA,KAAA,MAAW,SAAS,MAAA,CAAO,MAAA,UAAgB,GAAA,CAAI,CAAA,OAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAC3D,MAAA,KAAA,MAAW,WAAW,MAAA,CAAO,QAAA,UAAkB,GAAA,CAAI,CAAA,OAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AACjE,MAAA,KAAA,MAAW,SAAS,MAAA,CAAO,MAAA,UAAgB,GAAA,CAAI,CAAA,OAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAC3D,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,aAAA,EAAgB,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,UAAA,CAAY,CAAA;AACrF,MAAA,IAAI,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAA,UAAW,QAAA,GAAW,CAAA;AACjD,MAAA,MAAM,eAAA,EAAgB;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,YAAY,cAAA,EAAgB;AACnC,MAAA,MAAM,GAAA,GAAM,KAAK,OAAA,IAAW,qBAAA;AAC5B,MAAA,MAAM,GAAA,GAAM,YAAY,OAAA,EAAS;AAAA,QAC/B,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,aAAa,IAAA,CAAK;AAAA,OACnB,CAAA;AACD,MAAA,MAAMZ,kBAAAA,CAAUL,SAAAA,CAAK,IAAA,CAAK,GAAA,IAAO,OAAA,CAAQ,KAAI,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG;AAAA,CAAA,EAAM,MAAM,CAAA;AACxE,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sBAAA,EAAyB,GAAG,CAAA,CAAE,CAAA;AAC1C,MAAA,OAAA,EAAS,OAAA,CAAQ;AAAA,QACf,UAAA;AAAA,QACA,KAAA,EAAO,kBAAA;AAAA,QACP,YAAY,EAAE,aAAA,EAAe,OAAA,CAAQ,MAAA,EAAQ,UAAU,GAAA;AAAI,OAC5D,CAAA;AACD,MAAA,MAAM,eAAA,EAAgB;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,YAAY,oBAAA,EAAsB;AACzC,MAAA,MAAM,GAAA,GAAM,KAAK,OAAA,IAAW,wBAAA;AAC5B,MAAA,MAAM,QAAA,GAAW,0BAA0B,OAAO,CAAA;AAClD,MAAA,MAAMK,kBAAAA,CAAUL,SAAAA,CAAK,IAAA,CAAK,GAAA,IAAO,OAAA,CAAQ,KAAI,EAAG,GAAG,CAAA,EAAG,QAAA,EAAU,MAAM,CAAA;AACtE,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gCAAA,EAAmC,GAAG,CAAA,CAAE,CAAA;AACpD,MAAA,OAAA,EAAS,OAAA,CAAQ;AAAA,QACf,UAAA;AAAA,QACA,KAAA,EAAO,wBAAA;AAAA,QACP,YAAY,EAAE,aAAA,EAAe,OAAA,CAAQ,MAAA,EAAQ,UAAU,GAAA;AAAI,OAC5D,CAAA;AACD,MAAA,MAAM,eAAA,EAAgB;AACtB,MAAA;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,aAAA,EAAgB,OAAO,CAAA,CAAE,CAAA;AACvC,IAAA,OAAA,EAAS,iBAAiB,KAAA,EAAO,UAAA,EAAY,EAAE,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA;AACtE,IAAA,OAAA,EAAS,OAAA,CAAQ;AAAA,MACf,UAAA;AAAA,MACA,KAAA,EAAO,WAAA;AAAA,MACP,YAAY,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,eAAe,OAAA;AAAQ,KAC7D,CAAA;AACD,IAAA,MAAM,eAAA,EAAgB;AACtB,IAAA,OAAA,CAAQ,QAAA,GAAW,CAAA;AAAA,EACrB;AACF;AAEA,KAAK,GAAA,EAAI","file":"featuredrop.cjs","sourcesContent":["import type { FeatureEntry, FeatureManifest } from \"./types\";\n\nfunction getDirectDependencies(feature: FeatureEntry): string[] {\n const dependsOn = feature.dependsOn;\n if (!dependsOn) return [];\n const seen = dependsOn.seen ?? [];\n const clicked = dependsOn.clicked ?? [];\n const dismissed = dependsOn.dismissed ?? [];\n const unique = new Set<string>();\n for (const id of [...seen, ...clicked, ...dismissed]) {\n if (id) unique.add(id);\n }\n return Array.from(unique);\n}\n\nexport function resolveDependencyOrder(manifest: FeatureManifest): string[] {\n const ids = new Set(manifest.map((feature) => feature.id));\n const outgoing = new Map<string, Set<string>>();\n const indegree = new Map<string, number>();\n\n for (const feature of manifest) {\n outgoing.set(feature.id, new Set());\n indegree.set(feature.id, 0);\n }\n\n for (const feature of manifest) {\n for (const dependencyId of getDirectDependencies(feature)) {\n if (!ids.has(dependencyId)) continue;\n const edges = outgoing.get(dependencyId);\n if (!edges || edges.has(feature.id)) continue;\n edges.add(feature.id);\n indegree.set(feature.id, (indegree.get(feature.id) ?? 0) + 1);\n }\n }\n\n const queue: string[] = [];\n for (const feature of manifest) {\n if ((indegree.get(feature.id) ?? 0) === 0) queue.push(feature.id);\n }\n\n const ordered: string[] = [];\n while (queue.length > 0) {\n const id = queue.shift();\n if (!id) continue;\n ordered.push(id);\n const edges = outgoing.get(id);\n if (!edges) continue;\n for (const nextId of edges) {\n const nextDegree = (indegree.get(nextId) ?? 0) - 1;\n indegree.set(nextId, nextDegree);\n if (nextDegree === 0) queue.push(nextId);\n }\n }\n\n // On cycles, append remaining IDs in original order to keep behavior stable.\n if (ordered.length < manifest.length) {\n const included = new Set(ordered);\n for (const feature of manifest) {\n if (included.has(feature.id)) continue;\n ordered.push(feature.id);\n }\n }\n\n return ordered;\n}\n\nexport function hasDependencyCycle(manifest: FeatureManifest): boolean {\n const ids = new Set(manifest.map((feature) => feature.id));\n const outgoing = new Map<string, Set<string>>();\n const indegree = new Map<string, number>();\n\n for (const feature of manifest) {\n outgoing.set(feature.id, new Set());\n indegree.set(feature.id, 0);\n }\n\n for (const feature of manifest) {\n for (const dependencyId of getDirectDependencies(feature)) {\n if (!ids.has(dependencyId)) continue;\n const edges = outgoing.get(dependencyId);\n if (!edges || edges.has(feature.id)) continue;\n edges.add(feature.id);\n indegree.set(feature.id, (indegree.get(feature.id) ?? 0) + 1);\n }\n }\n\n const queue: string[] = [];\n for (const feature of manifest) {\n if ((indegree.get(feature.id) ?? 0) === 0) queue.push(feature.id);\n }\n\n let visited = 0;\n while (queue.length > 0) {\n const id = queue.shift();\n if (!id) continue;\n visited += 1;\n const edges = outgoing.get(id);\n if (!edges) continue;\n for (const nextId of edges) {\n const nextDegree = (indegree.get(nextId) ?? 0) - 1;\n indegree.set(nextId, nextDegree);\n if (nextDegree === 0) queue.push(nextId);\n }\n }\n\n return visited !== manifest.length;\n}\n\nexport function sortFeaturesByDependencies(features: FeatureEntry[]): FeatureEntry[] {\n if (features.length <= 1) return [...features];\n const order = resolveDependencyOrder(features);\n const rank = new Map(order.map((id, index) => [id, index]));\n return [...features].sort((a, b) => {\n const ra = rank.get(a.id);\n const rb = rank.get(b.id);\n if (ra === undefined || rb === undefined) return 0;\n return ra - rb;\n });\n}\n","import { hasDependencyCycle } from \"./dependencies\";\nimport type { FeatureEntry, FeatureManifest } from \"./types\";\nimport { z } from \"zod\";\n\nexport interface ValidationIssue {\n path: string;\n message: string;\n code:\n | \"invalid_type\"\n | \"missing_required\"\n | \"invalid_value\"\n | \"invalid_date\"\n | \"duplicate_id\"\n | \"circular_dependency\";\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationIssue[];\n}\n\nexport const featureEntryJsonSchema = {\n type: \"object\",\n required: [\"id\", \"label\", \"releasedAt\", \"showNewUntil\"],\n properties: {\n id: { type: \"string\" },\n label: { type: \"string\" },\n description: { type: \"string\" },\n releasedAt: { type: \"string\", format: \"date-time\" },\n showNewUntil: { type: \"string\", format: \"date-time\" },\n flagKey: { type: \"string\" },\n product: { type: \"string\" },\n url: { type: \"string\" },\n image: { type: \"string\" },\n type: { enum: [\"feature\", \"improvement\", \"fix\", \"breaking\"] },\n priority: { enum: [\"critical\", \"normal\", \"low\"] },\n cta: {\n type: \"object\",\n properties: {\n label: { type: \"string\" },\n url: { type: \"string\" },\n },\n },\n meta: { type: \"object\" },\n },\n} as const;\n\nexport const featureManifestJsonSchema = {\n type: \"array\",\n items: featureEntryJsonSchema,\n} as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isValidDate(value: string): boolean {\n return Number.isFinite(new Date(value).getTime());\n}\n\nconst nonEmptyString = z.string().trim().min(1, \"must be a non-empty string\");\n\nconst isoDateString = nonEmptyString.refine(isValidDate, {\n message: \"must be a valid date\",\n params: { featuredropCode: \"invalid_date\" },\n});\n\nconst dependsOnSchema = z\n .object({\n seen: z.array(z.string()).optional(),\n clicked: z.array(z.string()).optional(),\n dismissed: z.array(z.string()).optional(),\n })\n .optional();\n\nconst ctaSchema = z\n .object({\n label: nonEmptyString,\n url: nonEmptyString,\n })\n .optional();\n\nexport const featureEntrySchema = z\n .object({\n id: nonEmptyString,\n label: nonEmptyString,\n releasedAt: isoDateString,\n showNewUntil: isoDateString,\n description: z.string().optional(),\n flagKey: z.string().optional(),\n product: z.string().optional(),\n url: z.string().optional(),\n image: z.string().optional(),\n type: z.enum([\"feature\", \"improvement\", \"fix\", \"breaking\"]).optional(),\n priority: z.enum([\"critical\", \"normal\", \"low\"]).optional(),\n cta: ctaSchema,\n meta: z.record(z.unknown()).optional(),\n dependsOn: dependsOnSchema,\n })\n .passthrough();\n\nexport const featureManifestSchema = z.array(featureEntrySchema);\n\nfunction toIssuePath(path: Array<string | number>): string {\n if (path.length === 0) return \"$\";\n let output = \"\";\n for (const part of path) {\n if (typeof part === \"number\") output += `[${part}]`;\n else output += output ? `.${part}` : part;\n }\n return output;\n}\n\nfunction mapZodIssue(issue: z.ZodIssue): ValidationIssue {\n const codeParam = (issue as { params?: Record<string, unknown> }).params?.featuredropCode;\n if (codeParam === \"invalid_date\") {\n return {\n path: toIssuePath(issue.path),\n message: issue.message,\n code: \"invalid_date\",\n };\n }\n if (issue.code === \"invalid_type\") {\n return {\n path: toIssuePath(issue.path),\n message: issue.message,\n code: issue.received === \"undefined\" ? \"missing_required\" : \"invalid_type\",\n };\n }\n return {\n path: toIssuePath(issue.path),\n message: issue.message,\n code: \"invalid_value\",\n };\n}\n\nconst UNSAFE_META_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nfunction isSafeUrl(value: string): boolean {\n const normalized = value.trim();\n if (!normalized) return false;\n if (/^(\\/|\\.\\/|\\.\\.\\/|\\?|#)/.test(normalized)) return true;\n if (/^https?:\\/\\//i.test(normalized)) return true;\n return false;\n}\n\nfunction findUnsafeMetaPath(value: unknown, path = \"meta\"): string | null {\n if (Array.isArray(value)) {\n for (let index = 0; index < value.length; index++) {\n const nested = findUnsafeMetaPath(value[index], `${path}[${index}]`);\n if (nested) return nested;\n }\n return null;\n }\n\n if (!isRecord(value)) return null;\n for (const [key, nestedValue] of Object.entries(value)) {\n if (UNSAFE_META_KEYS.has(key)) {\n return `${path}.${key}`;\n }\n const nested = findUnsafeMetaPath(nestedValue, `${path}.${key}`);\n if (nested) return nested;\n }\n return null;\n}\n\nfunction validateFeatureEntry(raw: unknown, index: number): { entry?: FeatureEntry; issues: ValidationIssue[] } {\n if (!isRecord(raw)) {\n return {\n issues: [\n {\n path: `[${index}]`,\n message: \"Feature entry must be an object\",\n code: \"invalid_type\",\n },\n ],\n };\n }\n\n const parsed = featureEntrySchema.safeParse(raw);\n if (!parsed.success) {\n return {\n issues: parsed.error.issues.map((issue) => ({\n ...mapZodIssue(issue),\n path: `[${index}]${issue.path.length > 0 ? `.${toIssuePath(issue.path)}` : \"\"}`,\n })),\n };\n }\n\n return {\n issues: [],\n entry: parsed.data as FeatureEntry,\n };\n}\n\nexport function validateManifest(data: unknown): ValidationResult {\n const errors: ValidationIssue[] = [];\n if (!Array.isArray(data)) {\n return {\n valid: false,\n errors: [\n {\n path: \"$\",\n message: \"Manifest must be an array\",\n code: \"invalid_type\",\n },\n ],\n };\n }\n\n const entries: FeatureEntry[] = [];\n const seenIds = new Set<string>();\n data.forEach((item, index) => {\n const result = validateFeatureEntry(item, index);\n errors.push(...result.issues);\n if (!result.entry) return;\n if (seenIds.has(result.entry.id)) {\n errors.push({\n path: `[${index}].id`,\n message: `Duplicate feature id \"${result.entry.id}\"`,\n code: \"duplicate_id\",\n });\n return;\n }\n seenIds.add(result.entry.id);\n entries.push(result.entry);\n });\n\n if (entries.length > 0 && hasDependencyCycle(entries as FeatureManifest)) {\n errors.push({\n path: \"$\",\n message: \"Circular dependsOn relationship detected\",\n code: \"circular_dependency\",\n });\n }\n\n for (let index = 0; index < entries.length; index++) {\n const entry = entries[index];\n if (new Date(entry.showNewUntil).getTime() <= new Date(entry.releasedAt).getTime()) {\n errors.push({\n path: `[${index}].showNewUntil`,\n message: \"showNewUntil must be after releasedAt\",\n code: \"invalid_value\",\n });\n }\n\n if (entry.url && !isSafeUrl(entry.url)) {\n errors.push({\n path: `[${index}].url`,\n message: \"url must be http, https, or relative\",\n code: \"invalid_value\",\n });\n }\n\n if (entry.image && !isSafeUrl(entry.image)) {\n errors.push({\n path: `[${index}].image`,\n message: \"image must be http, https, or relative\",\n code: \"invalid_value\",\n });\n }\n\n if (entry.cta?.url && !isSafeUrl(entry.cta.url)) {\n errors.push({\n path: `[${index}].cta.url`,\n message: \"cta.url must be http, https, or relative\",\n code: \"invalid_value\",\n });\n }\n\n const unsafeMetaPath = findUnsafeMetaPath(entry.meta);\n if (unsafeMetaPath) {\n errors.push({\n path: `[${index}].${unsafeMetaPath}`,\n message: `meta contains unsafe key \"${unsafeMetaPath.split(\".\").pop()}\"`,\n code: \"invalid_value\",\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","import { readdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { join, relative, sep } from \"node:path\";\nimport type { FeatureEntry } from \"./types\";\nimport { validateManifest } from \"./schema\";\n\ninterface ParseResult {\n frontmatter: Record<string, unknown>;\n body: string;\n}\n\nexport interface BuildManifestOptions {\n cwd?: string;\n pattern?: string;\n outFile?: string;\n}\n\nfunction parseScalar(raw: string): unknown {\n const value = raw.trim();\n if (!value) return \"\";\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n if (value === \"null\") return null;\n if (/^-?\\d+(\\.\\d+)?$/.test(value)) return Number(value);\n if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n const inner = value.slice(1, -1).trim();\n if (!inner) return [];\n return inner.split(\",\").map((part) => String(parseScalar(part.trim())));\n }\n return value;\n}\n\nfunction parseFrontmatter(raw: string): Record<string, unknown> {\n const lines = raw.split(/\\r?\\n/);\n const root: Record<string, unknown> = {};\n const stack: Array<{ indent: number; value: Record<string, unknown> | unknown[] }> = [\n { indent: -1, value: root },\n ];\n\n const isArrayContext = (idx: number): boolean => {\n for (let i = idx + 1; i < lines.length; i++) {\n const line = lines[i];\n if (!line.trim()) continue;\n const indent = line.length - line.trimStart().length;\n if (indent <= (lines[idx].length - lines[idx].trimStart().length)) return false;\n return line.trimStart().startsWith(\"- \");\n }\n return false;\n };\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line.trim() || line.trimStart().startsWith(\"#\")) continue;\n\n const indent = line.length - line.trimStart().length;\n const trimmed = line.trim();\n\n while (stack.length > 1 && indent <= stack[stack.length - 1].indent) {\n stack.pop();\n }\n\n const current = stack[stack.length - 1].value;\n\n if (trimmed.startsWith(\"- \")) {\n if (!Array.isArray(current)) {\n throw new Error(`Invalid frontmatter list at line ${i + 1}`);\n }\n const item = trimmed.slice(2).trim();\n current.push(parseScalar(item));\n continue;\n }\n\n const colon = trimmed.indexOf(\":\");\n if (colon === -1) {\n throw new Error(`Invalid frontmatter line ${i + 1}: ${trimmed}`);\n }\n\n const key = trimmed.slice(0, colon).trim();\n const rest = trimmed.slice(colon + 1).trim();\n\n if (Array.isArray(current)) {\n throw new Error(`Unexpected key in list at line ${i + 1}`);\n }\n\n if (!rest) {\n const container: Record<string, unknown> | unknown[] = isArrayContext(i) ? [] : {};\n current[key] = container;\n stack.push({ indent, value: container });\n continue;\n }\n\n current[key] = parseScalar(rest);\n }\n\n return root;\n}\n\nfunction splitFrontmatter(markdown: string): ParseResult {\n const normalized = markdown.replace(/\\r\\n/g, \"\\n\");\n if (!normalized.startsWith(\"---\\n\")) {\n return { frontmatter: {}, body: normalized.trim() };\n }\n\n const end = normalized.indexOf(\"\\n---\\n\", 4);\n if (end === -1) {\n throw new Error(\"Frontmatter block is not closed with ---\");\n }\n\n const fmRaw = normalized.slice(4, end);\n const body = normalized.slice(end + 5).trim();\n return {\n frontmatter: parseFrontmatter(fmRaw),\n body,\n };\n}\n\nfunction asString(value: unknown, field: string, source: string): string {\n if (typeof value !== \"string\" || !value.trim()) {\n throw new Error(`${source}: \"${field}\" must be a non-empty string`);\n }\n return value;\n}\n\nfunction asOptionalObject(value: unknown, field: string, source: string): Record<string, unknown> | undefined {\n if (value === undefined) return undefined;\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(`${source}: \"${field}\" must be an object`);\n }\n return value as Record<string, unknown>;\n}\n\nexport function parseFeatureFile(markdown: string, source = \"feature.md\"): FeatureEntry {\n const { frontmatter, body } = splitFrontmatter(markdown);\n\n const entry: FeatureEntry = {\n id: asString(frontmatter.id, \"id\", source),\n label: asString(frontmatter.label, \"label\", source),\n releasedAt: asString(frontmatter.releasedAt, \"releasedAt\", source),\n showNewUntil: asString(frontmatter.showNewUntil, \"showNewUntil\", source),\n description: body || undefined,\n };\n\n if (frontmatter.sidebarKey !== undefined) entry.sidebarKey = asString(frontmatter.sidebarKey, \"sidebarKey\", source);\n if (frontmatter.category !== undefined) entry.category = asString(frontmatter.category, \"category\", source);\n if (frontmatter.product !== undefined) entry.product = asString(frontmatter.product, \"product\", source);\n if (frontmatter.url !== undefined) entry.url = asString(frontmatter.url, \"url\", source);\n if (frontmatter.flagKey !== undefined) entry.flagKey = asString(frontmatter.flagKey, \"flagKey\", source);\n if (frontmatter.image !== undefined) entry.image = asString(frontmatter.image, \"image\", source);\n if (frontmatter.publishAt !== undefined) entry.publishAt = asString(frontmatter.publishAt, \"publishAt\", source);\n if (frontmatter.version !== undefined) {\n if (typeof frontmatter.version === \"string\" || typeof frontmatter.version === \"object\") {\n entry.version = frontmatter.version as FeatureEntry[\"version\"];\n } else {\n throw new Error(`${source}: \"version\" must be a string or object`);\n }\n }\n if (frontmatter.type !== undefined) {\n const type = asString(frontmatter.type, \"type\", source);\n if (![\"feature\", \"improvement\", \"fix\", \"breaking\"].includes(type)) {\n throw new Error(`${source}: invalid \"type\" value \"${type}\"`);\n }\n entry.type = type as FeatureEntry[\"type\"];\n }\n if (frontmatter.priority !== undefined) {\n const priority = asString(frontmatter.priority, \"priority\", source);\n if (![\"critical\", \"normal\", \"low\"].includes(priority)) {\n throw new Error(`${source}: invalid \"priority\" value \"${priority}\"`);\n }\n entry.priority = priority as FeatureEntry[\"priority\"];\n }\n\n const cta = asOptionalObject(frontmatter.cta, \"cta\", source);\n if (cta) {\n entry.cta = {\n label: asString(cta.label, \"cta.label\", source),\n url: asString(cta.url, \"cta.url\", source),\n };\n }\n\n const audience = asOptionalObject(frontmatter.audience, \"audience\", source);\n if (audience) {\n const parsedAudience: FeatureEntry[\"audience\"] = {};\n for (const field of [\"plan\", \"role\", \"region\"] as const) {\n const value = audience[field];\n if (value !== undefined) {\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new Error(`${source}: \"audience.${field}\" must be string[]`);\n }\n parsedAudience[field] = value;\n }\n }\n if (audience.custom !== undefined) {\n if (!audience.custom || typeof audience.custom !== \"object\" || Array.isArray(audience.custom)) {\n throw new Error(`${source}: \"audience.custom\" must be an object`);\n }\n parsedAudience.custom = audience.custom as Record<string, unknown>;\n }\n entry.audience = parsedAudience;\n }\n\n return entry;\n}\n\nfunction normalizePattern(pattern: string): { baseDir: string; ext: string } {\n const normalized = pattern.replaceAll(\"\\\\\", \"/\");\n if (normalized.endsWith(\"/**/*.md\")) {\n return {\n baseDir: normalized.slice(0, -\"/**/*.md\".length),\n ext: \".md\",\n };\n }\n throw new Error(`Unsupported pattern \"${pattern}\". Use \"features/**/*.md\" style patterns.`);\n}\n\nasync function collectFiles(dir: string, ext: string): Promise<string[]> {\n const out: string[] = [];\n async function walk(current: string): Promise<void> {\n let entries;\n try {\n entries = await readdir(current, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const fullPath = join(current, entry.name);\n if (entry.isDirectory()) {\n await walk(fullPath);\n continue;\n }\n if (entry.isFile() && entry.name.endsWith(ext)) {\n out.push(fullPath);\n }\n }\n }\n await walk(dir);\n return out.sort();\n}\n\nexport async function buildManifestFromPattern(options: BuildManifestOptions = {}): Promise<FeatureEntry[]> {\n const cwd = options.cwd ?? process.cwd();\n const pattern = options.pattern ?? \"features/**/*.md\";\n const { baseDir, ext } = normalizePattern(pattern);\n const baseAbs = join(cwd, baseDir);\n\n const stats = await stat(baseAbs).catch(() => null);\n if (!stats || !stats.isDirectory()) {\n throw new Error(`Pattern base directory does not exist: ${baseDir}`);\n }\n\n const files = await collectFiles(baseAbs, ext);\n const entries: FeatureEntry[] = [];\n const seenIds = new Set<string>();\n\n for (const file of files) {\n const content = await readFile(file, \"utf8\");\n const source = relative(cwd, file).split(sep).join(\"/\");\n const entry = parseFeatureFile(content, source);\n if (seenIds.has(entry.id)) {\n throw new Error(`Duplicate feature id \"${entry.id}\" found at ${source}`);\n }\n seenIds.add(entry.id);\n entries.push(entry);\n }\n\n if (options.outFile) {\n const outPath = join(cwd, options.outFile);\n await writeFile(outPath, `${JSON.stringify(entries, null, 2)}\\n`, \"utf8\");\n }\n\n return entries;\n}\n\nexport async function validateFeatureFiles(options: BuildManifestOptions = {}): Promise<void> {\n const entries = await buildManifestFromPattern(options);\n const result = validateManifest(entries);\n if (!result.valid) {\n const message = result.errors\n .map((issue) => `${issue.path}: ${issue.message}`)\n .join(\"; \");\n throw new Error(`Manifest validation failed: ${message}`);\n }\n}\n","import { PostHog } from \"posthog-node\";\n\nlet _client: PostHog | null = null;\n\n/**\n * Returns true when analytics should be suppressed:\n * - POSTHOG_OPT_OUT env var is set (any truthy value)\n * - NODE_ENV is 'development' or 'test'\n * - CI environment detected\n */\nfunction isOptedOut(): boolean {\n const optOut = process.env.POSTHOG_OPT_OUT;\n if (optOut && optOut !== \"0\" && optOut !== \"false\") return true;\n\n const env = process.env.NODE_ENV;\n if (env === \"development\" || env === \"test\") return true;\n\n if (process.env.CI) return true;\n\n return false;\n}\n\n/**\n * Returns a shared PostHog client configured for CLI (short-lived process) use.\n * Events are flushed immediately (flushAt=1, flushInterval=0).\n *\n * Returns null (safely skips analytics) when:\n * - POSTHOG_API_KEY is not set\n * - POSTHOG_OPT_OUT is set to a truthy value\n * - NODE_ENV is 'development' or 'test'\n * - Running in CI\n */\nexport function getPostHogClient(): PostHog | null {\n if (isOptedOut()) return null;\n\n const apiKey = process.env.POSTHOG_API_KEY;\n if (!apiKey) return null;\n\n if (!_client) {\n _client = new PostHog(apiKey, {\n host: process.env.POSTHOG_HOST ?? \"https://us.i.posthog.com\",\n flushAt: 1,\n flushInterval: 0,\n enableExceptionAutocapture: true,\n });\n }\n return _client;\n}\n\n/**\n * Shuts down the PostHog client and flushes any pending events.\n * Call before process exit in CLI contexts.\n */\nexport async function shutdownPostHog(): Promise<void> {\n if (_client) {\n await _client.shutdown();\n _client = null;\n }\n}\n","import { hasDependencyCycle } from \"./dependencies\";\nimport type { FeatureEntry } from \"./types\";\n\nexport interface ManifestStats {\n total: number;\n byType: Record<string, number>;\n byCategory: Record<string, number>;\n newestRelease: string | null;\n oldestRelease: string | null;\n}\n\nexport function computeManifestStats(entries: FeatureEntry[]): ManifestStats {\n const byType: Record<string, number> = {};\n const byCategory: Record<string, number> = {};\n\n for (const entry of entries) {\n const type = entry.type ?? \"feature\";\n byType[type] = (byType[type] ?? 0) + 1;\n if (entry.category) {\n byCategory[entry.category] = (byCategory[entry.category] ?? 0) + 1;\n }\n }\n\n const sortedByDate = [...entries].sort(\n (a, b) => new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime(),\n );\n\n return {\n total: entries.length,\n byType,\n byCategory,\n newestRelease: sortedByDate[0]?.releasedAt ?? null,\n oldestRelease: sortedByDate[sortedByDate.length - 1]?.releasedAt ?? null,\n };\n}\n\nexport function generateMarkdownChangelog(entries: FeatureEntry[]): string {\n const sorted = [...entries].sort(\n (a, b) => new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime(),\n );\n const sections = sorted.map((entry) => {\n const lines = [\n `## ${entry.label}`,\n \"\",\n `- **ID**: \\`${entry.id}\\``,\n `- **Released**: ${entry.releasedAt}`,\n ];\n if (entry.type) lines.push(`- **Type**: ${entry.type}`);\n if (entry.category) lines.push(`- **Category**: ${entry.category}`);\n if (entry.showNewUntil) lines.push(`- **Show new until**: ${entry.showNewUntil}`);\n if (entry.cta) lines.push(`- **CTA**: [${entry.cta.label}](${entry.cta.url})`);\n if (entry.description) {\n lines.push(\"\", entry.description.trim());\n }\n return lines.join(\"\\n\");\n });\n\n return `# Generated Changelog\\n\\n${sections.join(\"\\n\\n---\\n\\n\")}\\n`;\n}\n\nfunction isIsoWithTimezone(value: string): boolean {\n if (!value.includes(\"T\")) return false;\n if (!(value.endsWith(\"Z\") || /[+-]\\d{2}:\\d{2}$/.test(value))) return false;\n return Number.isFinite(new Date(value).getTime());\n}\n\nexport interface DoctorReport {\n checks: string[];\n warnings: string[];\n errors: string[];\n}\n\nexport function runDoctor(entries: FeatureEntry[], now: Date = new Date()): DoctorReport {\n const checks: string[] = [];\n const warnings: string[] = [];\n const errors: string[] = [];\n\n checks.push(`Manifest entries loaded: ${entries.length}`);\n\n const ids = new Set<string>();\n let duplicateCount = 0;\n for (const entry of entries) {\n if (ids.has(entry.id)) duplicateCount += 1;\n ids.add(entry.id);\n }\n if (duplicateCount > 0) {\n errors.push(`${duplicateCount} duplicate feature id(s) found`);\n } else {\n checks.push(\"No duplicate IDs\");\n }\n\n let invalidDateCount = 0;\n let reversedDateCount = 0;\n let expiredCount = 0;\n let scheduledCount = 0;\n let missingDescriptionCount = 0;\n\n for (const entry of entries) {\n if (!entry.description?.trim()) missingDescriptionCount += 1;\n if (!isIsoWithTimezone(entry.releasedAt) || !isIsoWithTimezone(entry.showNewUntil)) {\n invalidDateCount += 1;\n continue;\n }\n const released = new Date(entry.releasedAt).getTime();\n const showUntil = new Date(entry.showNewUntil).getTime();\n if (showUntil <= released) reversedDateCount += 1;\n if (showUntil < now.getTime()) expiredCount += 1;\n if (entry.publishAt) {\n const publishMs = new Date(entry.publishAt).getTime();\n if (Number.isFinite(publishMs) && publishMs > now.getTime()) scheduledCount += 1;\n }\n }\n\n if (invalidDateCount > 0) {\n errors.push(`${invalidDateCount} entries have invalid ISO 8601 dates with timezone`);\n } else {\n checks.push(\"All dates are valid ISO 8601 with timezone\");\n }\n\n if (reversedDateCount > 0) {\n errors.push(`${reversedDateCount} entries have showNewUntil before/at releasedAt`);\n }\n\n if (expiredCount > 0) warnings.push(`${expiredCount} entries have showNewUntil in the past`);\n if (scheduledCount > 0) warnings.push(`${scheduledCount} entries have publishAt in the future`);\n\n if (missingDescriptionCount > 0) {\n errors.push(`${missingDescriptionCount} entries have no description`);\n } else {\n checks.push(\"All entries have descriptions\");\n }\n\n if (hasDependencyCycle(entries)) {\n errors.push(\"Circular dependsOn relationship detected\");\n } else {\n checks.push(\"No circular dependencies in dependsOn chains\");\n }\n\n return { checks, warnings, errors };\n}\n","import { mkdir, readFile, readdir, stat, writeFile } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport { buildManifestFromPattern } from \"./changelog-as-code\";\nimport { validateManifest } from \"./schema\";\nimport type { FeatureEntry, FeatureType } from \"./types\";\n\nexport type InitFormat = \"markdown\" | \"json\";\n\nexport interface InitProjectOptions {\n cwd?: string;\n format?: InitFormat;\n force?: boolean;\n now?: Date;\n}\n\nexport interface InitProjectResult {\n format: InitFormat;\n created: string[];\n}\n\nexport interface AddFeatureOptions {\n cwd?: string;\n format?: InitFormat;\n id?: string;\n label: string;\n description?: string;\n type?: FeatureType;\n category?: string;\n url?: string;\n releasedAt?: string;\n showNewUntil?: string;\n showDays?: number;\n}\n\nexport interface AddFeatureResult {\n format: InitFormat;\n path: string;\n entry: FeatureEntry;\n}\n\nexport interface MigrateOptions {\n cwd?: string;\n from: MigrationSource;\n inputFile: string;\n outFile?: string;\n now?: Date;\n}\n\nexport type MigrationSource =\n | \"beamer\"\n | \"headway\"\n | \"announcekit\"\n | \"canny\"\n | \"launchnotes\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n const result = await stat(path).catch(() => null);\n return !!result;\n}\n\nfunction ensureIsoDate(value: string, field: string): string {\n const parsed = new Date(value).getTime();\n if (!Number.isFinite(parsed)) {\n throw new Error(`\"${field}\" must be a valid ISO date string`);\n }\n return new Date(parsed).toISOString();\n}\n\nfunction withDays(date: Date, days: number): string {\n return new Date(date.getTime() + days * 24 * 60 * 60 * 1000).toISOString();\n}\n\nfunction toSlug(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/-{2,}/g, \"-\");\n}\n\nfunction getPathDate(dateIso: string): string {\n return dateIso.slice(0, 10);\n}\n\nfunction getFrontmatterValue(value: string): string {\n return value.replace(/\\n/g, \" \").trim();\n}\n\nexport function slugifyFeatureId(label: string): string {\n const slug = toSlug(label);\n return slug || \"feature\";\n}\n\nexport function createFeatureEntry(options: AddFeatureOptions, now: Date = new Date()): FeatureEntry {\n const releasedAt = options.releasedAt\n ? ensureIsoDate(options.releasedAt, \"releasedAt\")\n : now.toISOString();\n const showNewUntil = options.showNewUntil\n ? ensureIsoDate(options.showNewUntil, \"showNewUntil\")\n : withDays(new Date(releasedAt), options.showDays ?? 14);\n const id = options.id ? slugifyFeatureId(options.id) : slugifyFeatureId(options.label);\n\n const entry: FeatureEntry = {\n id,\n label: options.label.trim(),\n releasedAt,\n showNewUntil,\n type: options.type ?? \"feature\",\n };\n\n if (options.description?.trim()) entry.description = options.description.trim();\n if (options.category?.trim()) entry.category = options.category.trim();\n if (options.url?.trim()) entry.url = options.url.trim();\n\n return entry;\n}\n\nexport function renderFeatureMarkdown(entry: FeatureEntry): string {\n const lines = [\n \"---\",\n `id: ${getFrontmatterValue(entry.id)}`,\n `label: ${getFrontmatterValue(entry.label)}`,\n `releasedAt: ${entry.releasedAt}`,\n `showNewUntil: ${entry.showNewUntil}`,\n ];\n if (entry.type) lines.push(`type: ${entry.type}`);\n if (entry.category) lines.push(`category: ${getFrontmatterValue(entry.category)}`);\n if (entry.url) lines.push(`url: ${getFrontmatterValue(entry.url)}`);\n lines.push(\"---\", \"\");\n if (entry.description) {\n lines.push(entry.description.trim(), \"\");\n } else {\n lines.push(\"Describe the feature here.\", \"\");\n }\n return `${lines.join(\"\\n\")}`;\n}\n\nfunction getNextAvailablePath(existingNames: ReadonlySet<string>, baseName: string): string {\n if (!existingNames.has(baseName)) return baseName;\n const ext = baseName.endsWith(\".md\") ? \".md\" : \"\";\n const withoutExt = ext ? baseName.slice(0, -ext.length) : baseName;\n let index = 2;\n while (existingNames.has(`${withoutExt}-${index}${ext}`)) {\n index += 1;\n }\n return `${withoutExt}-${index}${ext}`;\n}\n\nasync function detectProjectFormat(cwd: string, explicit?: InitFormat): Promise<InitFormat> {\n if (explicit) return explicit;\n if (await pathExists(join(cwd, \"features\"))) return \"markdown\";\n if (await pathExists(join(cwd, \"features.json\"))) return \"json\";\n return \"markdown\";\n}\n\nexport async function initFeaturedropProject(options: InitProjectOptions = {}): Promise<InitProjectResult> {\n const cwd = options.cwd ?? process.cwd();\n const format = options.format ?? \"markdown\";\n const now = options.now ?? new Date();\n const force = options.force ?? false;\n const created: string[] = [];\n\n if (format === \"markdown\") {\n const featuresDir = join(cwd, \"features\");\n if (await pathExists(featuresDir)) {\n const existing = await readdir(featuresDir).catch(() => []);\n if (existing.length > 0 && !force) {\n throw new Error(\"features/ already exists and is not empty (use --force to overwrite sample files)\");\n }\n }\n await mkdir(featuresDir, { recursive: true });\n const sample = createFeatureEntry(\n {\n id: \"welcome-featuredrop\",\n label: \"Welcome to featuredrop\",\n description: \"Update this file with your first product announcement.\",\n category: \"onboarding\",\n type: \"feature\",\n releasedAt: now.toISOString(),\n showDays: 30,\n },\n now,\n );\n const sampleName = `${getPathDate(sample.releasedAt)}-${sample.id}.md`;\n const samplePath = join(featuresDir, sampleName);\n await writeFile(samplePath, renderFeatureMarkdown(sample), \"utf8\");\n created.push(\"features/\");\n created.push(`features/${sampleName}`);\n return { format, created };\n }\n\n const manifestPath = join(cwd, \"features.json\");\n if (await pathExists(manifestPath)) {\n if (!force) {\n throw new Error(\"features.json already exists (use --force to overwrite)\");\n }\n }\n const sample = createFeatureEntry(\n {\n id: \"welcome-featuredrop\",\n label: \"Welcome to featuredrop\",\n description: \"Replace this sample entry with your own release notes.\",\n category: \"onboarding\",\n type: \"feature\",\n releasedAt: now.toISOString(),\n showDays: 30,\n },\n now,\n );\n await writeFile(manifestPath, `${JSON.stringify([sample], null, 2)}\\n`, \"utf8\");\n created.push(\"features.json\");\n return { format, created };\n}\n\nasync function ensureUniqueIdForMarkdown(cwd: string, id: string): Promise<void> {\n const featuresDir = join(cwd, \"features\");\n if (!(await pathExists(featuresDir))) return;\n const entries = await buildManifestFromPattern({ cwd, pattern: \"features/**/*.md\" }).catch(() => []);\n if (entries.some((entry) => entry.id === id)) {\n throw new Error(`Feature id \"${id}\" already exists`);\n }\n}\n\nasync function addFeatureToMarkdown(cwd: string, entry: FeatureEntry): Promise<string> {\n await mkdir(join(cwd, \"features\"), { recursive: true });\n await ensureUniqueIdForMarkdown(cwd, entry.id);\n const existingFiles = new Set(\n (await readdir(join(cwd, \"features\")).catch(() => []))\n .filter((name) => name.endsWith(\".md\")),\n );\n const baseName = `${getPathDate(entry.releasedAt)}-${entry.id}.md`;\n const fileName = getNextAvailablePath(existingFiles, baseName);\n const relPath = `features/${fileName}`;\n await writeFile(join(cwd, relPath), renderFeatureMarkdown(entry), \"utf8\");\n return relPath;\n}\n\nasync function addFeatureToJson(cwd: string, entry: FeatureEntry): Promise<string> {\n const manifestPath = join(cwd, \"features.json\");\n const raw = await readFile(manifestPath, \"utf8\").catch(() => \"[]\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(\"features.json is not valid JSON\");\n }\n if (!Array.isArray(parsed)) {\n throw new Error(\"features.json must contain an array of feature entries\");\n }\n const existing = parsed as FeatureEntry[];\n if (existing.some((item) => item.id === entry.id)) {\n throw new Error(`Feature id \"${entry.id}\" already exists`);\n }\n const next = [...existing, entry];\n const validation = validateManifest(next);\n if (!validation.valid) {\n throw new Error(`features.json validation failed: ${validation.errors[0]?.message ?? \"unknown error\"}`);\n }\n await writeFile(manifestPath, `${JSON.stringify(next, null, 2)}\\n`, \"utf8\");\n return \"features.json\";\n}\n\nexport async function addFeatureEntry(options: AddFeatureOptions): Promise<AddFeatureResult> {\n const cwd = options.cwd ?? process.cwd();\n const format = await detectProjectFormat(cwd, options.format);\n const entry = createFeatureEntry(options);\n const path = format === \"markdown\"\n ? await addFeatureToMarkdown(cwd, entry)\n : await addFeatureToJson(cwd, entry);\n return { format, path, entry };\n}\n\nfunction pickString(obj: Record<string, unknown>, keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const value = obj[key];\n if (typeof value === \"string\" && value.trim()) return value.trim();\n }\n return undefined;\n}\n\nfunction getMigrationItems(payload: unknown): unknown[] {\n if (Array.isArray(payload)) return payload;\n if (!isRecord(payload)) throw new Error(\"Migration payload must be an array or object\");\n for (const key of [\"posts\", \"items\", \"announcements\", \"entries\"] as const) {\n const value = payload[key];\n if (Array.isArray(value)) return value;\n }\n throw new Error(\"Could not find entries array in migration payload\");\n}\n\nfunction normalizeDate(raw: string | undefined, fallback: Date): string {\n if (!raw) return fallback.toISOString();\n const parsed = new Date(raw).getTime();\n if (!Number.isFinite(parsed)) return fallback.toISOString();\n return new Date(parsed).toISOString();\n}\n\nfunction buildFallbackId(prefix: string, index: number): string {\n return `${prefix}-entry-${index + 1}`;\n}\n\ninterface MigrationProfile {\n fallbackPrefix: string;\n labelKeys: readonly string[];\n idKeys: readonly string[];\n dateKeys: readonly string[];\n categoryKeys: readonly string[];\n urlKeys: readonly string[];\n descriptionKeys: readonly string[];\n showUntilKeys: readonly string[];\n}\n\nconst MIGRATION_PROFILES: Record<MigrationSource, MigrationProfile> = {\n beamer: {\n fallbackPrefix: \"beamer\",\n labelKeys: [\"title\", \"name\", \"headline\"],\n idKeys: [\"id\", \"uid\", \"slug\", \"postId\", \"post_id\"],\n dateKeys: [\"publishedAt\", \"published_at\", \"published\", \"createdAt\", \"created_at\", \"date\"],\n categoryKeys: [\"category\", \"type\", \"segment\"],\n urlKeys: [\"url\", \"link\", \"permalink\"],\n descriptionKeys: [\"description\", \"content\", \"body\", \"html\"],\n showUntilKeys: [\"showNewUntil\", \"show_new_until\", \"newUntil\", \"new_until\"],\n },\n headway: {\n fallbackPrefix: \"headway\",\n labelKeys: [\"title\", \"name\", \"headline\"],\n idKeys: [\"id\", \"slug\", \"entryId\", \"entry_id\"],\n dateKeys: [\"publishedAt\", \"published_at\", \"createdAt\", \"created_at\", \"date\"],\n categoryKeys: [\"category\", \"tag\", \"tags\"],\n urlKeys: [\"url\", \"link\", \"permalink\"],\n descriptionKeys: [\"description\", \"summary\", \"content\", \"body\"],\n showUntilKeys: [\"showNewUntil\", \"new_until\"],\n },\n announcekit: {\n fallbackPrefix: \"announcekit\",\n labelKeys: [\"title\", \"subject\", \"name\"],\n idKeys: [\"id\", \"post_id\", \"postId\", \"slug\"],\n dateKeys: [\"published_at\", \"publishedAt\", \"created_at\", \"createdAt\", \"date\"],\n categoryKeys: [\"category\", \"segment\", \"tab\", \"label\"],\n urlKeys: [\"url\", \"link\", \"permalink\"],\n descriptionKeys: [\"description\", \"content\", \"html\", \"body\"],\n showUntilKeys: [\"show_new_until\", \"showNewUntil\", \"new_until\"],\n },\n canny: {\n fallbackPrefix: \"canny\",\n labelKeys: [\"title\", \"name\"],\n idKeys: [\"id\", \"postId\", \"post_id\", \"slug\"],\n dateKeys: [\"createdAt\", \"created_at\", \"publishedAt\", \"published_at\", \"date\"],\n categoryKeys: [\"category\", \"type\", \"boardName\"],\n urlKeys: [\"url\", \"link\", \"permalink\"],\n descriptionKeys: [\"details\", \"description\", \"content\", \"body\"],\n showUntilKeys: [\"showNewUntil\", \"new_until\"],\n },\n launchnotes: {\n fallbackPrefix: \"launchnotes\",\n labelKeys: [\"title\", \"headline\", \"name\"],\n idKeys: [\"id\", \"slug\", \"noteId\", \"note_id\"],\n dateKeys: [\"publishedAt\", \"published_at\", \"createdAt\", \"created_at\", \"date\"],\n categoryKeys: [\"category\", \"segment\", \"channel\"],\n urlKeys: [\"url\", \"link\", \"permalink\"],\n descriptionKeys: [\"description\", \"body\", \"content\", \"summary\"],\n showUntilKeys: [\"showNewUntil\", \"new_until\"],\n },\n};\n\nexport function migrateFromSourcePayload(\n source: MigrationSource,\n payload: unknown,\n now: Date = new Date(),\n): FeatureEntry[] {\n const profile = MIGRATION_PROFILES[source];\n const items = getMigrationItems(payload);\n const usedIds = new Set<string>();\n\n return items\n .map((raw, index) => {\n if (!isRecord(raw)) return null;\n const release = normalizeDate(\n pickString(raw, profile.dateKeys),\n now,\n );\n const label = pickString(raw, profile.labelKeys) ?? `Update ${index + 1}`;\n const idSeed = pickString(raw, profile.idKeys) ?? label;\n let id = slugifyFeatureId(idSeed);\n if (!id) id = buildFallbackId(profile.fallbackPrefix, index);\n while (usedIds.has(id)) {\n id = `${id}-${index + 1}`;\n }\n usedIds.add(id);\n\n const category = pickString(raw, profile.categoryKeys);\n const url = pickString(raw, profile.urlKeys);\n const description = pickString(raw, profile.descriptionKeys);\n const explicitShowUntil = normalizeDate(\n pickString(raw, profile.showUntilKeys),\n new Date(withDays(new Date(release), 30)),\n );\n\n const entry: FeatureEntry = {\n id,\n label,\n releasedAt: release,\n showNewUntil: explicitShowUntil,\n type: \"feature\",\n };\n if (description) entry.description = description;\n if (category) entry.category = category;\n if (url) entry.url = url;\n return entry;\n })\n .filter((value): value is FeatureEntry => !!value);\n}\n\nexport function migrateFromBeamerPayload(payload: unknown, now: Date = new Date()): FeatureEntry[] {\n return migrateFromSourcePayload(\"beamer\", payload, now);\n}\n\nexport function migrateFromHeadwayPayload(payload: unknown, now: Date = new Date()): FeatureEntry[] {\n return migrateFromSourcePayload(\"headway\", payload, now);\n}\n\nexport function migrateFromAnnounceKitPayload(payload: unknown, now: Date = new Date()): FeatureEntry[] {\n return migrateFromSourcePayload(\"announcekit\", payload, now);\n}\n\nexport function migrateFromCannyPayload(payload: unknown, now: Date = new Date()): FeatureEntry[] {\n return migrateFromSourcePayload(\"canny\", payload, now);\n}\n\nexport function migrateFromLaunchNotesPayload(payload: unknown, now: Date = new Date()): FeatureEntry[] {\n return migrateFromSourcePayload(\"launchnotes\", payload, now);\n}\n\nexport async function migrateManifest(options: MigrateOptions): Promise<{ outFile: string; entries: FeatureEntry[] }> {\n const cwd = options.cwd ?? process.cwd();\n const outFile = options.outFile ?? \"featuredrop.manifest.json\";\n const inputPath = join(cwd, options.inputFile);\n const raw = await readFile(inputPath, \"utf8\");\n const payload = JSON.parse(raw) as unknown;\n\n const entries = migrateFromSourcePayload(options.from, payload, options.now ?? new Date());\n await writeFile(join(cwd, outFile), `${JSON.stringify(entries, null, 2)}\\n`, \"utf8\");\n return { outFile: basename(outFile), entries };\n}\n","import * as moduleApi from \"module\";\n\n// Lightweight markdown parser with optional `marked` + `shiki` support.\n// The function is synchronous and always returns sanitized HTML.\n\ntype MarkedRenderer = {\n link?: (href: string | null, title: string | null, text: string) => string;\n image?: (href: string | null, title: string | null, text: string) => string;\n paragraph?: (text: string) => string;\n heading?: (text: string, level: number) => string;\n};\n\ntype MarkedModule = {\n Renderer?: new () => MarkedRenderer;\n parse?: (markdown: string, options?: { renderer?: MarkedRenderer }) => string | Promise<string>;\n};\n\ntype ShikiLike = {\n codeToHtml?: (code: string, options?: { lang?: string; theme?: string }) => string | Promise<string>;\n};\n\nconst dynamicRequire =\n typeof moduleApi.createRequire === \"function\" ? moduleApi.createRequire(import.meta.url) : null;\n\nlet cachedMarked: MarkedModule | null | false = null;\nlet cachedShiki: ShikiLike | null | false = null;\n\nfunction optionalRequire<T>(name: string): T | null {\n if (!dynamicRequire) return null;\n try {\n // Using dynamic require so missing optional peers don't break bundling/runtime.\n return dynamicRequire(name) as T;\n } catch (error: unknown) {\n if (error && typeof error === \"object\" && \"code\" in error && (error as { code?: string }).code === \"MODULE_NOT_FOUND\") {\n return null;\n }\n // Any other error should still be treated as a failure to keep parsing resilient.\n return null;\n }\n}\n\nfunction getMarked(): MarkedModule | null {\n if (cachedMarked !== null) return cachedMarked || null;\n cachedMarked = optionalRequire<MarkedModule>(\"marked\") ?? false;\n return cachedMarked || null;\n}\n\nfunction getShiki(): ShikiLike | null {\n if (cachedShiki !== null) return cachedShiki || null;\n cachedShiki = optionalRequire<ShikiLike>(\"shiki\") ?? false;\n return cachedShiki || null;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction sanitizeUrl(url: string | null | undefined): string | null {\n if (!url) return null;\n const trimmed = url.trim();\n if (!trimmed) return null;\n\n const lower = trimmed.toLowerCase();\n if (lower.startsWith(\"javascript:\")) return null;\n if (lower.startsWith(\"data:\")) return null;\n if (lower.startsWith(\"vbscript:\")) return null;\n\n // Disallow characters that can break attribute context\n if (/['\"<>\\s]/.test(trimmed)) return null;\n\n return trimmed;\n}\n\nfunction sanitizeHtml(html: string): string {\n return html\n // Remove script/style tags entirely\n .replace(/<script[\\s\\S]*?>[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/<style[\\s\\S]*?>[\\s\\S]*?<\\/style>/gi, \"\")\n // Remove inline event handlers (on*)\n .replace(/\\s+on[a-z]+\\s*=\\s*(\"[^\"]*\"|'[^']*'|[^\\s>]+)/gi, \"\")\n // Remove javascript: or data: URLs in href/src/xlink:href\n .replace(/\\s+(?:href|src|xlink:href)\\s*=\\s*(\"|')(?:javascript:|data:)[^\"']*\\1/gi, \"\");\n}\n\nfunction decodeAllowedEntities(html: string): string {\n const allowTags = [\n \"p\",\n \"strong\",\n \"em\",\n \"a\",\n \"code\",\n \"pre\",\n \"img\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"br\",\n ];\n\n // Decode common entities inside allowed tags only\n return html.replace(/<(\\/?)([a-z0-9]+)([^>]*)>/gi, (match, slash, tag, rest) => {\n if (!allowTags.includes(tag.toLowerCase())) return match;\n const decodedRest = rest\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n return `<${slash}${tag}${decodedRest}>`;\n });\n}\n\nfunction renderCodeBlock(code: string, language: string | undefined): string {\n const shiki = getShiki();\n if (shiki?.codeToHtml) {\n try {\n const rendered = shiki.codeToHtml(code, { lang: language || \"text\", theme: \"github-dark\" });\n if (typeof rendered === \"string\") return rendered;\n } catch {\n // Fall through to non-highlighted rendering\n }\n }\n\n const langAttr = language ? ` class=\"language-${escapeHtml(language)}\"` : \"\";\n return `<pre><code${langAttr}>${escapeHtml(code)}</code></pre>`;\n}\n\nfunction inlineMarkdown(text: string): string {\n // Escape user-provided HTML before applying markdown conversions.\n let result = escapeHtml(text);\n\n // Protect inline code spans so subsequent replacements don't mangle them.\n const codeSpans: string[] = [];\n result = result.replace(/`([^`]+)`/g, (_match, code) => {\n const idx = codeSpans.length;\n codeSpans.push(`<code>${escapeHtml(code)}</code>`);\n return `§§CODE${idx}§§`;\n });\n\n // Images: \n result = result.replace(/!\\[([^\\]]*)\\]\\(([^)]+)\\)/g, (_match, alt, url) => {\n const safeUrl = sanitizeUrl(url);\n const safeAlt = escapeHtml(alt ?? \"\");\n if (!safeUrl) return safeAlt;\n return `<img src=\"${escapeHtml(safeUrl)}\" alt=\"${safeAlt}\" />`;\n });\n\n // Links: [text](url)\n result = result.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (_match, label, url) => {\n const safeUrl = sanitizeUrl(url);\n const safeLabel = escapeHtml(label ?? \"\");\n if (!safeUrl) return safeLabel;\n return `<a href=\"${escapeHtml(safeUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">${safeLabel}</a>`;\n });\n\n // Bold and italic (basic)\n result = result.replace(/\\*\\*([^*]+)\\*\\*/g, \"<strong>$1</strong>\");\n result = result.replace(/\\*([^*]+)\\*/g, \"<em>$1</em>\");\n\n // Restore code spans\n result = result.replace(/§§CODE(\\d+)§§/g, (_m, idx) => codeSpans[Number(idx)] ?? \"\");\n\n return result;\n}\n\nfunction fallbackParse(markdown: string): string {\n const lines = markdown.split(/\\r?\\n/);\n const blocks: string[] = [];\n let listBuffer: string[] | null = null;\n let quoteBuffer: string[] | null = null;\n let inCodeBlock = false;\n let codeLang: string | undefined;\n let codeLines: string[] = [];\n\n const flushList = () => {\n if (!listBuffer) return;\n blocks.push(`<ul>${listBuffer.map((item) => `<li>${item}</li>`).join(\"\")}</ul>`);\n listBuffer = null;\n };\n\n const flushQuote = () => {\n if (!quoteBuffer) return;\n const content = quoteBuffer.map((line) => inlineMarkdown(line.trim())).join(\"<br>\");\n blocks.push(`<blockquote>${content}</blockquote>`);\n quoteBuffer = null;\n };\n\n const flushCode = () => {\n if (!inCodeBlock) return;\n blocks.push(renderCodeBlock(codeLines.join(\"\\n\"), codeLang));\n codeLines = [];\n codeLang = undefined;\n inCodeBlock = false;\n };\n\n for (const rawLine of lines) {\n const line = rawLine.replace(/\\s+$/, \"\");\n\n const codeFence = line.match(/^```(.*)$/);\n if (codeFence) {\n if (inCodeBlock) {\n flushCode();\n } else {\n flushList();\n flushQuote();\n inCodeBlock = true;\n codeLang = codeFence[1]?.trim() || undefined;\n codeLines = [];\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeLines.push(rawLine);\n continue;\n }\n\n const listMatch = line.match(/^\\s*[-*+]\\s+(.*)$/);\n if (listMatch) {\n flushQuote();\n listBuffer = listBuffer ?? [];\n listBuffer.push(inlineMarkdown(listMatch[1].trim()));\n continue;\n }\n\n if (listBuffer) flushList();\n\n const headingMatch = line.match(/^(#{1,6})\\s+(.*)$/);\n if (headingMatch) {\n flushQuote();\n const level = headingMatch[1].length;\n const content = inlineMarkdown(headingMatch[2].trim());\n blocks.push(`<h${level}>${content}</h${level}>`);\n continue;\n }\n\n const quoteMatch = line.match(/^>\\s?(.*)$/);\n if (quoteMatch) {\n quoteBuffer = quoteBuffer ?? [];\n quoteBuffer.push(quoteMatch[1]);\n continue;\n }\n\n if (quoteBuffer) flushQuote();\n\n if (!line.trim()) {\n continue;\n }\n\n blocks.push(`<p>${inlineMarkdown(line.trim())}</p>`);\n }\n\n flushList();\n flushQuote();\n flushCode();\n\n return blocks.join(\"\\n\");\n}\n\nfunction renderWithMarked(markdown: string, marked: MarkedModule): string | null {\n if (!marked.parse) return null;\n\n const renderer = marked.Renderer ? new marked.Renderer() : undefined;\n\n if (renderer) {\n renderer.link = (href, _title, text) => {\n const safeUrl = sanitizeUrl(href);\n if (!safeUrl) return escapeHtml(text);\n return `<a href=\"${escapeHtml(safeUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">${text}</a>`;\n };\n renderer.image = (href, _title, text) => {\n const safeUrl = sanitizeUrl(href);\n const safeAlt = escapeHtml(text ?? \"\");\n if (!safeUrl) return safeAlt;\n return `<img src=\"${escapeHtml(safeUrl)}\" alt=\"${safeAlt}\" />`;\n };\n }\n\n const output = marked.parse(markdown, renderer ? { renderer } : undefined);\n if (typeof output === \"string\") return output;\n return output ? String(output) : null;\n}\n\n/**\n * Parse a feature description from markdown into sanitized HTML.\n * - Uses `marked` when installed (optional peer dep)\n * - Falls back to a tiny built-in parser when `marked` is absent\n * - Strips script tags, event handlers, and javascript:/data: URLs\n */\nexport function parseDescription(markdown: string): string {\n if (!markdown) return \"\";\n\n const marked = getMarked();\n if (marked) {\n try {\n const rendered = renderWithMarked(markdown, marked);\n if (rendered) {\n const sanitized = sanitizeHtml(rendered);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n }\n } catch {\n // If marked fails for any reason, fall back to the tiny parser.\n }\n }\n\n // Fast path: raw HTML provided without `marked` installed\n if (/<[^>]+>/.test(markdown)) {\n const sanitized = sanitizeHtml(markdown);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n }\n\n const fallback = fallbackParse(markdown);\n const sanitized = sanitizeHtml(fallback);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n}\n","import type { FeatureManifest } from \"./types\";\nimport { parseDescription } from \"./markdown\";\n\nfunction escape(str: string): string {\n return str\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n\n/**\n * Generate a simple RSS 2.0 feed from a feature manifest.\n * Titles and descriptions are sanitized via `parseDescription`.\n */\nexport function generateRSS(manifest: FeatureManifest, options?: { title?: string; link?: string; description?: string }): string {\n const title = escape(options?.title ?? \"Featuredrop Changelog\");\n const link = escape(options?.link ?? \"\");\n const desc = escape(options?.description ?? \"Product updates\");\n\n const items = manifest\n .slice()\n .sort((a, b) => new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime())\n .map((item) => {\n const descriptionHtml = item.description ? parseDescription(item.description) : \"\";\n const itemLink = item.url ? escape(item.url) : \"\";\n return [\n \"<item>\",\n `<title>${escape(item.label)}</title>`,\n itemLink ? `<link>${itemLink}</link>` : \"\",\n `<guid isPermaLink=\\\"false\\\">${escape(item.id)}</guid>`,\n `<pubDate>${new Date(item.releasedAt).toUTCString()}</pubDate>`,\n `<description><![CDATA[${descriptionHtml}]]></description>`,\n \"</item>\",\n ].join(\"\");\n })\n .join(\"\");\n\n return [\n \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\",\n \"<rss version=\\\"2.0\\\">\",\n \"<channel>\",\n `<title>${title}</title>`,\n link ? `<link>${link}</link>` : \"\",\n `<description>${desc}</description>`,\n items,\n \"</channel>\",\n \"</rss>\",\n ].join(\"\");\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, writeFile, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\n/** The claude skill markdown content */\nconst CLAUDE_SKILL = `# FeatureDrop — Setup & Configuration Skill\n\n## What it is\nOpen-source product adoption toolkit. Changelogs, badges, tours, checklists, feedback.\nZero dependencies. < 3 kB core. MIT licensed.\n\n## Quick Setup\n1. \\`npm install featuredrop\\`\n2. Create features.json manifest\n3. Wrap root in \\`<FeatureDropProvider manifest={features} storage={new LocalStorageAdapter()}>\\`\n4. Drop components or use hooks\n\n## Imports (ALWAYS use subpath imports)\n\\`\\`\\`\nfeaturedrop — core functions (isNew, getNewFeatures, createManifest)\nfeaturedrop/react — components + hooks (NewBadge, ChangelogWidget, Tour, Checklist)\nfeaturedrop/react/hooks — headless hooks only (useChangelog, useTour, useChecklist, useNewFeature)\nfeaturedrop/adapters — storage (PostgresAdapter, RedisAdapter, IndexedDBAdapter, etc.)\nfeaturedrop/engine — AdoptionEngine (smart timing, format selection, adoption scoring)\nfeaturedrop/schema — Zod validation (featureEntrySchema, validateManifest)\nfeaturedrop/testing — test helpers (createMockManifest, createMockStorage, createTestProvider)\nfeaturedrop/tailwind — Tailwind plugin (featureDropPlugin)\n\\`\\`\\`\n\n## Hooks Reference (prefer these for custom UI)\n\\`\\`\\`\nuseNewFeature(sidebarKey) → { isNew, feature, dismiss }\nuseNewCount() → number\nuseChangelog() → { features, newFeatures, newCount, dismiss, dismissAll, markAllSeen, getByCategory }\nuseTour(id) → { currentStep, stepIndex, totalSteps, isActive, start, next, prev, skip, complete }\nuseChecklist(id) → { tasks, progress, isComplete, completeTask, resetChecklist }\nuseSurvey(id) → { isOpen, show, hide, askLater, submitted, canShow }\nuseSmartFeature(id) → { show, format, feature, dismiss, confidence, reason }\nuseAdoptionScore() → { score, grade, breakdown, recommendations }\nuseFeatureDrop() → full provider context (low-level)\n\\`\\`\\`\n\n## Components (ready-made UI with headless render prop mode)\nNewBadge, ChangelogWidget, ChangelogPage, Tour, Checklist, Spotlight, SpotlightChain,\nHotspot, TooltipGroup, Banner, Toast, AnnouncementModal, Survey, FeedbackWidget,\nFeatureRequestButton, FeatureRequestForm, SmartAnnouncement\n\n## Manifest Format\n\\`\\`\\`json\n{\n \"id\": \"dark-mode\",\n \"label\": \"Dark Mode\",\n \"description\": \"Toggle between light and dark themes.\",\n \"releasedAt\": \"2026-02-20\",\n \"showNewUntil\": \"2026-04-20\",\n \"category\": \"ui\",\n \"priority\": \"normal\",\n \"type\": \"feature\"\n}\n\\`\\`\\`\n\n## Storage Adapters\n- LocalStorageAdapter (browser default, zero-config)\n- MemoryAdapter (testing, SSR)\n- IndexedDBAdapter (offline-first PWAs)\n- PostgresAdapter, RedisAdapter, MySQLAdapter, MongoAdapter, SQLiteAdapter (server)\n- SupabaseAdapter (Supabase with optional realtime)\n- RemoteAdapter (HTTP API with retry + circuit breaker)\n- HybridAdapter (local + remote with batched sync)\n\n## Rules\n- Always use subpath imports (never bare 'featuredrop' for React code)\n- Prefer hooks over components when user has a custom design system\n- Features auto-expire via showNewUntil — don't build manual expiry logic\n- Zero production dependencies must be maintained\n- TypeScript strict — no any types\n`;\n\n/** The .cursorrules content */\nconst CURSORRULES = `When working with FeatureDrop:\n- FeatureDrop is a product adoption library (changelogs, badges, tours, checklists, feedback)\n- ALWAYS import from subpaths: 'featuredrop/react', 'featuredrop/react/hooks', 'featuredrop/adapters'\n- For custom UI: use hooks from 'featuredrop/react/hooks' (useChangelog, useTour, useChecklist, useSmartFeature)\n- For ready-made UI: use components from 'featuredrop/react' (NewBadge, ChangelogWidget, Tour, SmartAnnouncement)\n- Features are defined in JSON: { id, label, description, releasedAt, showNewUntil? }\n- Wrap app in <FeatureDropProvider manifest={features} storage={new LocalStorageAdapter()}>\n- Storage default: LocalStorageAdapter. Server: PostgresAdapter, RedisAdapter from 'featuredrop/adapters'\n- Engine: import { createAdoptionEngine } from 'featuredrop/engine' for smart timing + format selection\n- Core < 3 kB, React ~12 kB, zero production deps, fully tree-shakable\n- All components support headless mode via render props\n- For shadcn projects: use hooks from 'featuredrop/react/hooks' + shadcn primitives\n- TypeScript strict mode, no 'any' types\n- Zero production dependencies — do not add external deps\n`;\n\n/** MCP server config for VS Code / Cursor / Claude Code */\nconst MCP_CONFIG = {\n featuredrop: {\n command: \"npx\",\n args: [\"@featuredrop/mcp\"],\n },\n};\n\ninterface SetupResult {\n detected: string[];\n created: string[];\n skipped: string[];\n}\n\nexport async function runAiSetup(cwd?: string): Promise<SetupResult> {\n const root = cwd ?? process.cwd();\n const result: SetupResult = { detected: [], created: [], skipped: [] };\n\n // 1. Detect Claude Code (.claude/ directory or settings)\n const claudeDir = join(root, \".claude\");\n const claudeSkillsDir = join(claudeDir, \"skills\");\n const claudeSkillPath = join(claudeSkillsDir, \"featuredrop.md\");\n\n if (existsSync(claudeDir) || existsSync(join(root, \"CLAUDE.md\"))) {\n result.detected.push(\"Claude Code\");\n\n if (existsSync(claudeSkillPath)) {\n result.skipped.push(claudeSkillPath);\n } else {\n await mkdir(claudeSkillsDir, { recursive: true });\n await writeFile(claudeSkillPath, CLAUDE_SKILL, \"utf8\");\n result.created.push(claudeSkillPath);\n }\n\n // Also create MCP config for Claude Code\n const claudeSettingsDir = claudeDir;\n const claudeMcpPath = join(claudeSettingsDir, \"settings.json\");\n if (!existsSync(claudeMcpPath)) {\n const settings = { mcpServers: MCP_CONFIG };\n await writeFile(claudeMcpPath, JSON.stringify(settings, null, 2) + \"\\n\", \"utf8\");\n result.created.push(claudeMcpPath);\n } else {\n // Try to merge MCP config into existing settings\n try {\n const existing = JSON.parse(await readFile(claudeMcpPath, \"utf8\")) as Record<string, unknown>;\n const mcpServers = (existing.mcpServers ?? {}) as Record<string, unknown>;\n if (!mcpServers.featuredrop) {\n mcpServers.featuredrop = MCP_CONFIG.featuredrop;\n existing.mcpServers = mcpServers;\n await writeFile(claudeMcpPath, JSON.stringify(existing, null, 2) + \"\\n\", \"utf8\");\n result.created.push(`${claudeMcpPath} (merged)`);\n } else {\n result.skipped.push(claudeMcpPath);\n }\n } catch {\n result.skipped.push(`${claudeMcpPath} (parse error)`);\n }\n }\n }\n\n // 2. Detect Cursor (.cursor/ directory or .cursorrules file)\n const cursorDir = join(root, \".cursor\");\n const cursorRulesPath = join(root, \".cursorrules\");\n const cursorMcpPath = join(cursorDir, \"mcp.json\");\n\n if (existsSync(cursorDir) || existsSync(cursorRulesPath)) {\n result.detected.push(\"Cursor\");\n\n // Append to .cursorrules (or create)\n if (existsSync(cursorRulesPath)) {\n const content = await readFile(cursorRulesPath, \"utf8\");\n if (content.includes(\"FeatureDrop\")) {\n result.skipped.push(cursorRulesPath);\n } else {\n await writeFile(cursorRulesPath, content + \"\\n\\n\" + CURSORRULES, \"utf8\");\n result.created.push(`${cursorRulesPath} (appended)`);\n }\n } else {\n await writeFile(cursorRulesPath, CURSORRULES, \"utf8\");\n result.created.push(cursorRulesPath);\n }\n\n // Create MCP config for Cursor\n if (existsSync(cursorDir)) {\n if (!existsSync(cursorMcpPath)) {\n const config = { servers: MCP_CONFIG };\n await mkdir(cursorDir, { recursive: true });\n await writeFile(cursorMcpPath, JSON.stringify(config, null, 2) + \"\\n\", \"utf8\");\n result.created.push(cursorMcpPath);\n } else {\n result.skipped.push(cursorMcpPath);\n }\n }\n }\n\n // 3. Detect VS Code (.vscode/ directory)\n const vscodeDir = join(root, \".vscode\");\n const vscodeMcpPath = join(vscodeDir, \"mcp.json\");\n\n if (existsSync(vscodeDir)) {\n result.detected.push(\"VS Code\");\n\n if (!existsSync(vscodeMcpPath)) {\n const config = { servers: MCP_CONFIG };\n await writeFile(vscodeMcpPath, JSON.stringify(config, null, 2) + \"\\n\", \"utf8\");\n result.created.push(vscodeMcpPath);\n } else {\n result.skipped.push(vscodeMcpPath);\n }\n }\n\n // 4. If nothing detected, create .cursorrules as default (most portable)\n if (result.detected.length === 0) {\n result.detected.push(\"(none detected — creating .cursorrules as default)\");\n await writeFile(cursorRulesPath, CURSORRULES, \"utf8\");\n result.created.push(cursorRulesPath);\n }\n\n return result;\n}\n","import { createInterface } from \"node:readline/promises\";\nimport { writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { hostname } from \"node:os\";\nimport { buildManifestFromPattern, validateFeatureFiles } from \"./changelog-as-code\";\nimport { getPostHogClient, shutdownPostHog } from \"./posthog-client\";\nimport {\n computeManifestStats,\n generateMarkdownChangelog,\n runDoctor,\n} from \"./cli-utils\";\nimport {\n addFeatureEntry,\n initFeaturedropProject,\n migrateManifest,\n type InitFormat,\n type MigrationSource,\n} from \"./cli-scaffold\";\nimport { generateRSS } from \"./rss\";\nimport { runAiSetup } from \"./cli-ai-setup\";\nimport type { FeatureType } from \"./types\";\n\ninterface ParsedArgs {\n command:\n | \"init\"\n | \"add\"\n | \"migrate\"\n | \"build\"\n | \"validate\"\n | \"stats\"\n | \"doctor\"\n | \"generate-rss\"\n | \"generate-changelog\"\n | \"ai-setup\"\n | \"help\";\n pattern?: string;\n outFile?: string;\n inputFile?: string;\n cwd?: string;\n title?: string;\n link?: string;\n description?: string;\n from?: MigrationSource;\n format?: InitFormat;\n force?: boolean;\n id?: string;\n label?: string;\n type?: FeatureType;\n category?: string;\n url?: string;\n releasedAt?: string;\n showNewUntil?: string;\n showDays?: number;\n}\n\nfunction parseArgs(argv: string[]): ParsedArgs {\n const [commandRaw, ...rest] = argv;\n const allowed = new Set([\n \"init\",\n \"add\",\n \"migrate\",\n \"build\",\n \"validate\",\n \"stats\",\n \"doctor\",\n \"generate-rss\",\n \"generate-changelog\",\n \"ai-setup\",\n ]);\n const command = allowed.has(commandRaw) ? (commandRaw as ParsedArgs[\"command\"]) : \"help\";\n const parsed: ParsedArgs = { command };\n\n for (let i = 0; i < rest.length; i++) {\n const arg = rest[i];\n if (arg === \"--pattern\") parsed.pattern = rest[++i];\n else if (arg === \"--out\") parsed.outFile = rest[++i];\n else if (arg === \"--cwd\") parsed.cwd = rest[++i];\n else if (arg === \"--title\") parsed.title = rest[++i];\n else if (arg === \"--link\") parsed.link = rest[++i];\n else if (arg === \"--description\") parsed.description = rest[++i];\n else if (arg === \"--input\") parsed.inputFile = rest[++i];\n else if (arg === \"--from\") parsed.from = rest[++i] as MigrationSource;\n else if (arg === \"--format\") parsed.format = rest[++i] as InitFormat;\n else if (arg === \"--force\") parsed.force = true;\n else if (arg === \"--id\") parsed.id = rest[++i];\n else if (arg === \"--label\") parsed.label = rest[++i];\n else if (arg === \"--type\") parsed.type = rest[++i] as FeatureType;\n else if (arg === \"--category\") parsed.category = rest[++i];\n else if (arg === \"--url\") parsed.url = rest[++i];\n else if (arg === \"--releasedAt\") parsed.releasedAt = rest[++i];\n else if (arg === \"--showNewUntil\") parsed.showNewUntil = rest[++i];\n else if (arg === \"--show-days\") parsed.showDays = Number(rest[++i]);\n }\n return parsed;\n}\n\nfunction printHelp(): void {\n console.log(\"featuredrop CLI\");\n console.log(\"\");\n console.log(\"Usage:\");\n console.log(\" featuredrop init [--format markdown|json] [--force] [--cwd .]\");\n console.log(\" featuredrop add [--label ...] [--id ...] [--description ...] [--type feature|improvement|fix|breaking] [--category ...] [--url ...] [--releasedAt ...] [--showNewUntil ...] [--show-days 14] [--format markdown|json] [--cwd .]\");\n console.log(\" featuredrop migrate --from beamer|headway|announcekit|canny|launchnotes [--input export.json] [--out featuredrop.manifest.json] [--cwd .]\");\n console.log(\" featuredrop build [--pattern features/**/*.md] [--out featuredrop.manifest.json] [--cwd .]\");\n console.log(\" featuredrop validate [--pattern features/**/*.md] [--cwd .]\");\n console.log(\" featuredrop stats [--pattern features/**/*.md] [--cwd .]\");\n console.log(\" featuredrop doctor [--pattern features/**/*.md] [--cwd .]\");\n console.log(\" featuredrop generate-rss [--pattern features/**/*.md] [--out featuredrop.rss.xml] [--title ...] [--link ...] [--description ...] [--cwd .]\");\n console.log(\" featuredrop generate-changelog [--pattern features/**/*.md] [--out CHANGELOG.generated.md] [--cwd .]\");\n console.log(\" featuredrop ai-setup [--cwd .] Detect AI tools and create context files\");\n}\n\nasync function promptForLabelIfNeeded(label?: string): Promise<string> {\n if (label?.trim()) return label.trim();\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n throw new Error(\"Missing --label. Provide --label in non-interactive mode.\");\n }\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n try {\n const value = (await rl.question(\"Feature label: \")).trim();\n if (!value) throw new Error(\"Feature label is required\");\n return value;\n } finally {\n rl.close();\n }\n}\n\nasync function run(): Promise<void> {\n const args = parseArgs(process.argv.slice(2));\n if (args.command === \"help\") {\n printHelp();\n process.exitCode = 1;\n return;\n }\n\n // Use hostname-based distinct ID for anonymous CLI telemetry\n const distinctId = `cli:${hostname()}`;\n const posthog = getPostHogClient();\n\n try {\n if (args.command === \"init\") {\n const result = await initFeaturedropProject({\n cwd: args.cwd,\n format: args.format,\n force: args.force,\n });\n console.log(`Initialized featuredrop project (${result.format})`);\n for (const path of result.created) {\n console.log(`- ${path}`);\n }\n posthog?.capture({\n distinctId,\n event: \"cli_init\",\n properties: { format: result.format, files_created: result.created.length },\n });\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"ai-setup\") {\n const result = await runAiSetup(args.cwd);\n if (result.detected.length > 0) {\n console.log(`Detected: ${result.detected.join(\", \")}`);\n }\n for (const path of result.created) {\n console.log(` Created: ${path}`);\n }\n for (const path of result.skipped) {\n console.log(` Skipped: ${path} (already exists)`);\n }\n if (result.created.length === 0 && result.skipped.length > 0) {\n console.log(\"All AI context files already up to date.\");\n }\n posthog?.capture({\n distinctId,\n event: \"cli_ai_setup\",\n properties: {\n detected: result.detected,\n files_created: result.created.length,\n files_skipped: result.skipped.length,\n },\n });\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"add\") {\n const label = await promptForLabelIfNeeded(args.label);\n const result = await addFeatureEntry({\n cwd: args.cwd,\n format: args.format,\n id: args.id,\n label,\n description: args.description,\n type: args.type,\n category: args.category,\n url: args.url,\n releasedAt: args.releasedAt,\n showNewUntil: args.showNewUntil,\n showDays: args.showDays,\n });\n console.log(`Added feature \"${result.entry.id}\" -> ${result.path}`);\n posthog?.capture({\n distinctId,\n event: \"cli_add_feature\",\n properties: {\n feature_id: result.entry.id,\n feature_type: result.entry.type,\n format: args.format,\n has_description: Boolean(args.description),\n has_url: Boolean(args.url),\n },\n });\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"migrate\") {\n const from = args.from;\n if (!from) {\n throw new Error('Missing required \"--from\" (beamer|headway|announcekit|canny|launchnotes)');\n }\n const inputFile = args.inputFile ?? `${from}-export.json`;\n const result = await migrateManifest({\n cwd: args.cwd,\n from,\n inputFile,\n outFile: args.outFile,\n });\n console.log(`Migrated ${result.entries.length} entries from ${from} -> ${result.outFile}`);\n posthog?.capture({\n distinctId,\n event: \"cli_migrate\",\n properties: { source: from, entries_migrated: result.entries.length, out_file: result.outFile },\n });\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"build\") {\n const out = args.outFile ?? \"featuredrop.manifest.json\";\n const entries = await buildManifestFromPattern({\n pattern: args.pattern,\n outFile: out,\n cwd: args.cwd,\n });\n console.log(`Built ${entries.length} feature entries -> ${out}`);\n posthog?.capture({\n distinctId,\n event: \"cli_build\",\n properties: { entries_built: entries.length, out_file: out, has_pattern: Boolean(args.pattern) },\n });\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"validate\") {\n await validateFeatureFiles({\n pattern: args.pattern,\n cwd: args.cwd,\n });\n console.log(\"Feature files valid\");\n await shutdownPostHog();\n return;\n }\n\n const entries = await buildManifestFromPattern({\n pattern: args.pattern,\n cwd: args.cwd,\n });\n\n if (args.command === \"stats\") {\n const stats = computeManifestStats(entries);\n console.log(`Total entries: ${stats.total}`);\n console.log(`By type: ${Object.entries(stats.byType).map(([k, v]) => `${k}=${v}`).join(\", \") || \"none\"}`);\n console.log(`By category: ${Object.entries(stats.byCategory).map(([k, v]) => `${k}=${v}`).join(\", \") || \"none\"}`);\n if (stats.newestRelease) console.log(`Newest release: ${stats.newestRelease}`);\n if (stats.oldestRelease) console.log(`Oldest release: ${stats.oldestRelease}`);\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"doctor\") {\n const report = runDoctor(entries);\n for (const check of report.checks) console.log(`✓ ${check}`);\n for (const warning of report.warnings) console.log(`⚠ ${warning}`);\n for (const error of report.errors) console.log(`✗ ${error}`);\n console.log(\"\");\n console.log(`${report.warnings.length} warning(s), ${report.errors.length} error(s).`);\n if (report.errors.length > 0) process.exitCode = 1;\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"generate-rss\") {\n const out = args.outFile ?? \"featuredrop.rss.xml\";\n const xml = generateRSS(entries, {\n title: args.title,\n link: args.link,\n description: args.description,\n });\n await writeFile(join(args.cwd ?? process.cwd(), out), `${xml}\\n`, \"utf8\");\n console.log(`Generated RSS feed -> ${out}`);\n posthog?.capture({\n distinctId,\n event: \"cli_generate_rss\",\n properties: { entries_count: entries.length, out_file: out },\n });\n await shutdownPostHog();\n return;\n }\n\n if (args.command === \"generate-changelog\") {\n const out = args.outFile ?? \"CHANGELOG.generated.md\";\n const markdown = generateMarkdownChangelog(entries);\n await writeFile(join(args.cwd ?? process.cwd(), out), markdown, \"utf8\");\n console.log(`Generated markdown changelog -> ${out}`);\n posthog?.capture({\n distinctId,\n event: \"cli_generate_changelog\",\n properties: { entries_count: entries.length, out_file: out },\n });\n await shutdownPostHog();\n return;\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`featuredrop: ${message}`);\n posthog?.captureException(error, distinctId, { command: args.command });\n posthog?.capture({\n distinctId,\n event: \"cli_error\",\n properties: { command: args.command, error_message: message },\n });\n await shutdownPostHog();\n process.exitCode = 1;\n }\n}\n\nvoid run();\n"]}
|