@geolonia/geonicdb-cli 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/config.ts","../src/output.ts","../src/commands/help.ts","../src/commands/config.ts","../src/commands/auth.ts","../src/client.ts","../src/helpers.ts","../src/prompt.ts","../src/token.ts","../src/oauth.ts","../src/commands/profile.ts","../src/input.ts","../src/commands/attrs.ts","../src/commands/entities.ts","../src/commands/batch.ts","../src/commands/subscriptions.ts","../src/commands/registrations.ts","../src/commands/types.ts","../src/commands/temporal.ts","../src/commands/snapshots.ts","../src/commands/admin/tenants.ts","../src/commands/admin/users.ts","../src/commands/admin/policies.ts","../src/commands/admin/oauth-clients.ts","../src/commands/admin/index.ts","../src/commands/rules.ts","../src/commands/models.ts","../src/commands/catalog.ts","../src/commands/health.ts","../src/commands/cli.ts","../src/update-notifier.ts","../src/index.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { Command } from \"commander\";\nimport { registerConfigCommand } from \"./commands/config.js\";\nimport { registerAuthCommands } from \"./commands/auth.js\";\nimport { registerProfileCommands } from \"./commands/profile.js\";\nimport { registerEntitiesCommand } from \"./commands/entities.js\";\nimport { registerBatchCommand } from \"./commands/batch.js\";\nimport { registerSubscriptionsCommand } from \"./commands/subscriptions.js\";\nimport { registerRegistrationsCommand } from \"./commands/registrations.js\";\nimport { registerTypesCommand } from \"./commands/types.js\";\nimport { registerTemporalCommand } from \"./commands/temporal.js\";\nimport { registerSnapshotsCommand } from \"./commands/snapshots.js\";\nimport { registerAdminCommand } from \"./commands/admin/index.js\";\nimport { registerRulesCommand } from \"./commands/rules.js\";\nimport { registerModelsCommand } from \"./commands/models.js\";\nimport { registerCatalogCommand } from \"./commands/catalog.js\";\nimport { registerHealthCommand, registerVersionCommand } from \"./commands/health.js\";\nimport { registerHelpCommand } from \"./commands/help.js\";\nimport { registerCliCommand } from \"./commands/cli.js\";\nimport { addAttrsSubcommands } from \"./commands/attrs.js\";\n\nexport function createProgram(): Command {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { description: string };\n const program = new Command();\n\n program\n .name(\"geonic\")\n .description(pkg.description)\n .option(\"-u, --url <url>\", \"Base URL of the GeonicDB server\")\n .option(\"-s, --service <name>\", \"NGSILD-Tenant header\")\n .option(\"--token <token>\", \"Authentication token\")\n .option(\"-p, --profile <name>\", \"Use a named profile\")\n .option(\"--api-key <key>\", \"API key for authentication\")\n .option(\"-f, --format <fmt>\", \"Output format: json, table, geojson\")\n .option(\"--no-color\", \"Disable color output\")\n .option(\"-v, --verbose\", \"Verbose output\");\n\n registerHelpCommand(program);\n registerConfigCommand(program);\n registerAuthCommands(program);\n registerProfileCommands(program);\n registerEntitiesCommand(program);\n registerBatchCommand(program);\n registerSubscriptionsCommand(program);\n registerRegistrationsCommand(program);\n registerTypesCommand(program);\n registerTemporalCommand(program);\n registerSnapshotsCommand(program);\n registerAdminCommand(program);\n registerRulesCommand(program);\n registerModelsCommand(program);\n registerCatalogCommand(program);\n registerHealthCommand(program);\n registerVersionCommand(program);\n registerCliCommand(program);\n\n // Backward-compatible hidden 'attrs' command at top level\n const hiddenAttrs = new Command(\"attrs\")\n .description(\"Manage entity attributes\");\n addAttrsSubcommands(hiddenAttrs);\n program.addCommand(hiddenAttrs, { hidden: true });\n\n return program;\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { GdbConfig, GdbConfigFile } from \"./types.js\";\n\nexport function getConfigDir(): string {\n return process.env.GEONIC_CONFIG_DIR ?? join(homedir(), \".config\", \"geonic\");\n}\n\nfunction getConfigFile(): string {\n return join(getConfigDir(), \"config.json\");\n}\n\nexport function ensureConfigDir(): void {\n const dir = getConfigDir();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\nfunction migrateV1ToV2(data: Record<string, unknown>): GdbConfigFile {\n const profile: GdbConfig = {};\n const knownKeys = [\n \"url\",\n \"service\",\n \"token\",\n \"refreshToken\",\n \"format\",\n \"apiKey\",\n ];\n for (const key of knownKeys) {\n if (key in data) {\n (profile as Record<string, unknown>)[key] = data[key];\n }\n }\n return {\n version: 2,\n currentProfile: \"default\",\n profiles: { default: profile },\n };\n}\n\nfunction isGdbConfigFile(value: unknown): value is GdbConfigFile {\n /* v8 ignore next -- loadConfigFile always passes an object with version key */\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n return (\n v.version === 2 &&\n typeof v.currentProfile === \"string\" &&\n typeof v.profiles === \"object\" &&\n v.profiles !== null\n );\n}\n\nfunction defaultConfig(): GdbConfigFile {\n return { version: 2, currentProfile: \"default\", profiles: { default: {} } };\n}\n\nexport function loadConfigFile(): GdbConfigFile {\n try {\n const raw = readFileSync(getConfigFile(), \"utf-8\");\n const data = JSON.parse(raw) as Record<string, unknown>;\n\n if (!(\"version\" in data)) {\n const migrated = migrateV1ToV2(data);\n saveConfigFile(migrated);\n return migrated;\n }\n\n if (!isGdbConfigFile(data)) {\n return defaultConfig();\n }\n\n return data;\n } catch {\n return defaultConfig();\n }\n}\n\nexport function saveConfigFile(configFile: GdbConfigFile): void {\n ensureConfigDir();\n writeFileSync(getConfigFile(), JSON.stringify(configFile, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function loadConfig(profileName?: string): GdbConfig {\n const configFile = loadConfigFile();\n const name = profileName ?? configFile.currentProfile;\n return configFile.profiles[name] ?? {};\n}\n\nexport function saveConfig(config: GdbConfig, profileName?: string): void {\n const configFile = loadConfigFile();\n const name = profileName ?? configFile.currentProfile;\n configFile.profiles[name] = config;\n saveConfigFile(configFile);\n}\n\nexport function getConfigValue(key: string, profileName?: string): unknown {\n const config = loadConfig(profileName);\n return config[key as keyof GdbConfig];\n}\n\nexport function validateUrl(url: string): string {\n url = url.trim();\n if (!url) {\n throw new Error(\"URL must not be empty.\");\n }\n if (!/^https?:\\/\\//i.test(url)) {\n throw new Error(`Invalid URL: \"${url}\". URL must start with http:// or https://.`);\n }\n try {\n new URL(url);\n } catch {\n throw new Error(`Invalid URL: \"${url}\".`);\n }\n return url.replace(/\\/+$/, \"\") + \"/\";\n}\n\nexport function setConfigValue(key: string, value: string, profileName?: string): void {\n const config = loadConfig(profileName);\n if (key === \"url\") {\n value = validateUrl(value);\n }\n (config as Record<string, unknown>)[key] = value;\n saveConfig(config, profileName);\n}\n\nexport function deleteConfigValue(key: string, profileName?: string): void {\n const config = loadConfig(profileName);\n delete (config as Record<string, unknown>)[key];\n saveConfig(config, profileName);\n}\n\nexport function getConfigPath(): string {\n return getConfigFile();\n}\n\nexport function listProfiles(): { name: string; active: boolean }[] {\n const configFile = loadConfigFile();\n return Object.keys(configFile.profiles).map((name) => ({\n name,\n active: name === configFile.currentProfile,\n }));\n}\n\nexport function getCurrentProfile(): string {\n return loadConfigFile().currentProfile;\n}\n\nexport function setCurrentProfile(name: string): void {\n const configFile = loadConfigFile();\n if (!(name in configFile.profiles)) {\n throw new Error(`Profile \"${name}\" does not exist.`);\n }\n configFile.currentProfile = name;\n saveConfigFile(configFile);\n}\n\nexport function createProfile(name: string): void {\n const configFile = loadConfigFile();\n if (name in configFile.profiles) {\n throw new Error(`Profile \"${name}\" already exists.`);\n }\n configFile.profiles[name] = {};\n saveConfigFile(configFile);\n}\n\nexport function deleteProfile(name: string): void {\n if (name === \"default\") {\n throw new Error('Cannot delete the \"default\" profile.');\n }\n const configFile = loadConfigFile();\n if (!(name in configFile.profiles)) {\n throw new Error(`Profile \"${name}\" does not exist.`);\n }\n delete configFile.profiles[name];\n if (configFile.currentProfile === name) {\n configFile.currentProfile = \"default\";\n }\n saveConfigFile(configFile);\n}\n","import chalk from \"chalk\";\nimport type { OutputFormat } from \"./types.js\";\n\nexport function formatOutput(data: unknown, format: OutputFormat): string {\n switch (format) {\n case \"json\":\n return JSON.stringify(data, null, 2);\n case \"table\":\n return formatTable(data);\n case \"geojson\":\n return JSON.stringify(toGeoJSON(data), null, 2);\n default:\n return JSON.stringify(data, null, 2);\n }\n}\n\nexport function printOutput(data: unknown, format: OutputFormat): void {\n console.log(formatOutput(data, format));\n}\n\nexport function printSuccess(message: string): void {\n console.log(chalk.green(message));\n}\n\nexport function printError(message: string): void {\n console.error(chalk.red(`Error: ${message}`));\n}\n\nexport function printInfo(message: string): void {\n console.log(chalk.cyan(message));\n}\n\nexport function printWarning(message: string): void {\n console.error(chalk.yellow(message));\n}\n\nexport function printCount(count: number): void {\n console.log(chalk.dim(`Count: ${count}`));\n}\n\nfunction formatTable(data: unknown): string {\n if (!Array.isArray(data)) {\n if (typeof data === \"object\" && data !== null) {\n return formatObjectTable(data as Record<string, unknown>);\n }\n return String(data);\n }\n\n if (data.length === 0) return \"(empty)\";\n\n const items = data as Record<string, unknown>[];\n const keys = collectKeys(items);\n\n const widths = new Map<string, number>();\n for (const key of keys) {\n widths.set(key, key.length);\n }\n for (const item of items) {\n for (const key of keys) {\n const val = cellValue(item[key]);\n widths.set(key, Math.max(widths.get(key)!, val.length));\n }\n }\n\n const header = keys.map((k) => chalk.bold(k.padEnd(widths.get(k)!))).join(\" \");\n const separator = keys.map((k) => \"─\".repeat(widths.get(k)!)).join(\"──\");\n const rows = items.map((item) =>\n keys.map((k) => cellValue(item[k]).padEnd(widths.get(k)!)).join(\" \"),\n );\n\n return [header, separator, ...rows].join(\"\\n\");\n}\n\nfunction formatObjectTable(obj: Record<string, unknown>): string {\n const entries = Object.entries(obj);\n if (entries.length === 0) return \"(empty)\";\n\n const keyWidth = Math.max(...entries.map(([k]) => k.length));\n return entries.map(([k, v]) => `${chalk.bold(k.padEnd(keyWidth))} ${cellValue(v)}`).join(\"\\n\");\n}\n\nfunction collectKeys(items: Record<string, unknown>[]): string[] {\n const priority = [\"id\", \"type\"];\n const keySet = new Set<string>();\n for (const item of items) {\n for (const key of Object.keys(item)) {\n keySet.add(key);\n }\n }\n const sorted: string[] = [];\n for (const p of priority) {\n if (keySet.has(p)) {\n sorted.push(p);\n keySet.delete(p);\n }\n }\n sorted.push(...Array.from(keySet).sort());\n return sorted;\n}\n\nfunction cellValue(val: unknown): string {\n if (val === undefined || val === null) return \"\";\n if (typeof val === \"object\") {\n const obj = val as Record<string, unknown>;\n if (\"value\" in obj) return String(obj.value);\n return JSON.stringify(val);\n }\n return String(val);\n}\n\nfunction toGeoJSON(data: unknown): unknown {\n if (Array.isArray(data)) {\n return {\n type: \"FeatureCollection\",\n features: data.map(entityToFeature),\n };\n }\n return entityToFeature(data);\n}\n\nfunction entityToFeature(entity: unknown): unknown {\n if (typeof entity !== \"object\" || entity === null) {\n return { type: \"Feature\", geometry: null, properties: entity };\n }\n\n const obj = entity as Record<string, unknown>;\n let geometry = null;\n\n if (obj.location) {\n const loc = obj.location as Record<string, unknown>;\n geometry = loc.value ?? loc;\n }\n\n const properties: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (key === \"location\") continue;\n if (typeof value === \"object\" && value !== null && \"value\" in (value as object)) {\n properties[key] = (value as Record<string, unknown>).value;\n } else {\n properties[key] = value;\n }\n }\n\n return { type: \"Feature\", geometry, properties };\n}\n","import chalk from \"chalk\";\nimport type { Command, Help, Option } from \"commander\";\n\ninterface Example {\n description: string;\n command: string;\n}\n\nconst examplesMap = new WeakMap<Command, Example[]>();\n\nexport function addExamples(cmd: Command, examples: Example[]): void {\n examplesMap.set(cmd, examples);\n}\n\nfunction header(title: string): string {\n return chalk.yellow.bold(title);\n}\n\nfunction findCommand(parent: Command, name: string): Command | undefined {\n return parent.commands.find(\n (c) => c.name() === name || c.aliases().includes(name),\n );\n}\n\nfunction getCommandPath(cmd: Command): string {\n const parts: string[] = [];\n let current: Command | null = cmd;\n while (current) {\n parts.unshift(current.name());\n current = current.parent;\n }\n return parts.join(\" \");\n}\n\nfunction getRootProgram(cmd: Command): Command {\n let root = cmd;\n while (root.parent) {\n root = root.parent;\n }\n return root;\n}\n\nfunction formatOptionSynopsis(opt: Option): string {\n /* v8 ignore next -- Commander always sets long or short */\n const flag = opt.long || opt.short || \"\";\n if (opt.required) {\n const match = opt.flags.match(/<([^>]+)>/);\n const valueName = match ? match[1] : \"value\";\n return `[${flag}=<${valueName}>]`;\n } else if (opt.optional) {\n const match = opt.flags.match(/\\[([^\\]]+)\\]/);\n const valueName = match ? match[1] : \"value\";\n return `[${flag}[=<${valueName}>]]`;\n }\n return `[${flag}]`;\n}\n\nfunction formatSynopsis(path: string, cmd: Command): string {\n const parts = [path];\n\n for (const arg of cmd.registeredArguments) {\n if (arg.required) {\n parts.push(`<${arg.name()}>`);\n } else {\n parts.push(`[<${arg.name()}>]`);\n }\n }\n\n for (const opt of cmd.options) {\n if (opt.hidden) continue;\n parts.push(formatOptionSynopsis(opt));\n }\n\n return parts.join(\" \");\n}\n\nfunction formatOptionList(options: readonly Option[]): string[] {\n const maxLen = Math.max(...options.map((o) => o.flags.length));\n return options.map((opt) => {\n const flags = opt.flags.padEnd(maxLen + 2);\n /* v8 ignore next -- Commander always sets description to '' */\n return ` ${chalk.green(flags)}${opt.description ?? \"\"}`;\n });\n}\n\nfunction formatGlobalParameters(program: Command): string {\n const lines: string[] = [];\n lines.push(header(\"GLOBAL PARAMETERS\"));\n lines.push(\"\");\n lines.push(...formatOptionList(program.options));\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nexport function formatTopLevelHelp(program: Command): string {\n const lines: string[] = [];\n\n lines.push(header(\"NAME\"));\n lines.push(\"\");\n lines.push(` ${program.name()}`);\n lines.push(\"\");\n lines.push(header(\"DESCRIPTION\"));\n lines.push(\"\");\n lines.push(` ${program.description()}`);\n lines.push(\"\");\n lines.push(header(\"AVAILABLE COMMANDS\"));\n lines.push(\"\");\n\n const commands = program.commands\n .filter((c) => !(c as Command & { _hidden?: boolean })._hidden)\n .slice()\n .sort((a, b) => a.name().localeCompare(b.name()));\n\n const maxLen = Math.max(...commands.map((c) => c.name().length));\n\n for (const cmd of commands) {\n const name = cmd.name().padEnd(maxLen + 2);\n lines.push(` ${chalk.green(name)}${cmd.summary() || cmd.description()}`);\n }\n\n lines.push(\"\");\n lines.push(formatGlobalParameters(program));\n\n return lines.join(\"\\n\");\n}\n\nexport function formatCommandDetails(\n program: Command,\n cmd: Command,\n path: string,\n): string {\n const lines: string[] = [];\n\n // NAME\n lines.push(header(\"NAME\"));\n lines.push(\"\");\n const aliases = cmd.aliases().filter((a) => a.length > 0);\n if (aliases.length > 0) {\n lines.push(` ${path} ${chalk.dim(`(alias: ${aliases.join(\", \")})`)}`);\n } else {\n lines.push(` ${path}`);\n }\n\n // DESCRIPTION\n lines.push(\"\");\n lines.push(header(\"DESCRIPTION\"));\n lines.push(\"\");\n for (const descLine of cmd.description().split(\"\\n\")) {\n lines.push(` ${descLine}`);\n }\n\n const subcommands = cmd.commands.filter(\n (c) => !(c as Command & { _hidden?: boolean })._hidden,\n );\n\n if (subcommands.length > 0) {\n // Command group with subcommands\n lines.push(\"\");\n lines.push(header(\"SYNOPSIS\"));\n lines.push(\"\");\n lines.push(` ${path} <command>`);\n lines.push(\"\");\n lines.push(header(\"SUBCOMMANDS\"));\n lines.push(\"\");\n\n const maxLen = Math.max(...subcommands.map((c) => c.name().length));\n for (const sub of subcommands) {\n const name = sub.name().padEnd(maxLen + 2);\n lines.push(` ${chalk.green(name)}${sub.summary() || sub.description()}`);\n }\n } else {\n // Leaf command\n lines.push(\"\");\n lines.push(header(\"SYNOPSIS\"));\n lines.push(\"\");\n lines.push(` ${formatSynopsis(path, cmd)}`);\n\n const options = cmd.options.filter((o) => !o.hidden);\n if (options.length > 0) {\n lines.push(\"\");\n lines.push(header(\"OPTIONS\"));\n lines.push(\"\");\n lines.push(...formatOptionList(options));\n }\n }\n\n // EXAMPLES\n const examples = examplesMap.get(cmd);\n if (examples && examples.length > 0) {\n lines.push(\"\");\n lines.push(header(\"EXAMPLES\"));\n lines.push(\"\");\n for (const ex of examples) {\n lines.push(` ${ex.description}:`);\n lines.push(` $ ${ex.command}`);\n lines.push(\"\");\n }\n }\n\n // GLOBAL PARAMETERS\n lines.push(\"\");\n lines.push(formatGlobalParameters(program));\n\n return lines.join(\"\\n\");\n}\n\nfunction showHelp(program: Command, args: string[]): void {\n if (args.length === 0) {\n console.log(formatTopLevelHelp(program));\n return;\n }\n\n let current = program;\n const resolved: Command[] = [];\n\n for (let i = 0; i < args.length; i++) {\n const found = findCommand(current, args[i]);\n if (!found) {\n const attempted = args.slice(0, i + 1).join(\" \");\n console.error(\n chalk.red(`Error: '${attempted}' is not a geonic command.`),\n );\n console.error(`\\nSee 'geonic help' for available commands.`);\n process.exit(1);\n }\n resolved.push(found);\n current = found;\n }\n\n const target = resolved[resolved.length - 1];\n const path = [program.name(), ...resolved.map((c) => c.name())].join(\" \");\n\n console.log(formatCommandDetails(program, target, path));\n}\n\nexport function registerHelpCommand(program: Command): void {\n // Disable Commander's built-in help command\n program.addHelpCommand(false);\n\n // Override --help to use our wp-cli style format\n program.configureHelp({\n formatHelp: (cmd: Command, _helper: Help): string => {\n const root = getRootProgram(cmd);\n if (cmd === root) {\n return formatTopLevelHelp(root);\n }\n const path = getCommandPath(cmd);\n return formatCommandDetails(root, cmd, path);\n },\n });\n\n // Register the `help` command\n program\n .command(\"help\")\n .description(\"Get help on a specific command\")\n .argument(\"[args...]\")\n .allowUnknownOption()\n .action((args: string[]) => {\n showHelp(program, args);\n });\n\n // Show help when `geonic` is run with no arguments, or show error for unknown commands\n program.argument(\"[command...]\").action((commands: string[]) => {\n if (commands.length > 0) {\n console.error(\n `geonic: '${commands[0]}' is not a geonic command. See 'geonic help'.`,\n );\n process.exitCode = 1;\n return;\n }\n showHelp(program, []);\n });\n}\n","import type { Command } from \"commander\";\nimport {\n loadConfig,\n getConfigValue,\n setConfigValue,\n deleteConfigValue,\n getConfigPath,\n} from \"../config.js\";\nimport { printOutput, printSuccess, printInfo } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nconst SENSITIVE_CONFIG_KEYS = new Set([\"token\", \"refreshToken\", \"apiKey\"]);\n\nexport function registerConfigCommand(program: Command): void {\n const config = program\n .command(\"config\")\n .description(\"Manage CLI configuration\");\n\n const set = config\n .command(\"set\")\n .description(\"Save a config value\")\n .argument(\n \"<key>\",\n \"Configuration key (url, service, token, refreshToken, format, apiKey)\",\n )\n .argument(\"<value>\", \"Configuration value\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const key = args[0] as string;\n const value = args[1] as string;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n setConfigValue(key, value, profile);\n const display = SENSITIVE_CONFIG_KEYS.has(key) ? \"***\" : value;\n printSuccess(`Set ${key} = ${display}`);\n });\n\n addExamples(set, [\n {\n description: \"Set server URL\",\n command: \"geonic config set url https://api.example.com\",\n },\n {\n description: \"Set tenant (NGSILD-Tenant header)\",\n command: \"geonic config set service my-tenant\",\n },\n {\n description: \"Set authentication token\",\n command: \"geonic config set token eyJhbGciOi...\",\n },\n {\n description: \"Set API key\",\n command: \"geonic config set apiKey your-api-key\",\n },\n {\n description: \"Set default output format\",\n command: \"geonic config set format table\",\n },\n {\n description: \"Set config for a specific profile\",\n command:\n \"geonic config set url https://staging.example.com --profile staging\",\n },\n ]);\n\n const get = config\n .command(\"get\")\n .description(\"Get a config value\")\n .argument(\"<key>\", \"Configuration key\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const key = args[0] as string;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n const value = getConfigValue(key, profile);\n if (value === undefined) {\n printInfo(`Key \"${key}\" is not set.`);\n } else {\n printOutput(value, \"json\");\n }\n });\n\n addExamples(get, [\n {\n description: \"Get server URL\",\n command: \"geonic config get url\",\n },\n {\n description: \"Get config value for a specific profile\",\n command: \"geonic config get url --profile staging\",\n },\n ]);\n\n const list = config\n .command(\"list\")\n .description(\"List all config values\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n const all = loadConfig(profile);\n if (Object.keys(all).length === 0) {\n printInfo(`No configuration set. Config path: ${getConfigPath()}`);\n } else {\n printOutput(all, \"json\");\n }\n });\n\n addExamples(list, [\n {\n description: \"List all configuration values\",\n command: \"geonic config list\",\n },\n ]);\n\n const del = config\n .command(\"delete\")\n .description(\"Delete a config value\")\n .argument(\"<key>\", \"Configuration key\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const key = args[0] as string;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n deleteConfigValue(key, profile);\n printSuccess(`Deleted key \"${key}\".`);\n });\n\n addExamples(del, [\n {\n description: \"Delete a config value\",\n command: \"geonic config delete url\",\n },\n ]);\n}\n","import { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n resolveOptions,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { loadConfig, saveConfig, getCurrentProfile } from \"../config.js\";\nimport { printSuccess, printError, printInfo, printWarning } from \"../output.js\";\nimport { isInteractive, promptEmail, promptPassword } from \"../prompt.js\";\nimport { getTokenStatus, formatDuration } from \"../token.js\";\nimport { clientCredentialsGrant } from \"../oauth.js\";\nimport { addExamples } from \"./help.js\";\n\nfunction createLoginCommand(): Command {\n return new Command(\"login\")\n .description(\"Authenticate and save token\")\n .option(\"--client-credentials\", \"Use OAuth 2.0 Client Credentials flow\")\n .option(\"--client-id <id>\", \"OAuth client ID\")\n .option(\"--client-secret <secret>\", \"OAuth client secret\")\n .option(\"--scope <scopes>\", \"OAuth scopes (space-separated)\")\n .option(\"--tenant-id <id>\", \"Tenant ID for scoped authentication\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const loginOpts = cmd.opts() as {\n clientCredentials?: boolean;\n clientId?: string;\n clientSecret?: string;\n scope?: string;\n tenantId?: string;\n };\n const globalOpts = resolveOptions(cmd);\n\n if (loginOpts.clientCredentials) {\n const clientId = loginOpts.clientId ?? process.env.GDB_OAUTH_CLIENT_ID;\n const clientSecret = loginOpts.clientSecret ?? process.env.GDB_OAUTH_CLIENT_SECRET;\n\n if (!clientId || !clientSecret) {\n printError(\n \"Client ID and secret are required. Use --client-id/--client-secret or GDB_OAUTH_CLIENT_ID/GDB_OAUTH_CLIENT_SECRET.\",\n );\n process.exit(1);\n }\n\n if (!globalOpts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n\n const result = await clientCredentialsGrant({\n baseUrl: globalOpts.url,\n clientId,\n clientSecret,\n scope: loginOpts.scope,\n });\n\n const config = loadConfig(globalOpts.profile);\n config.token = result.access_token;\n delete config.refreshToken;\n saveConfig(config, globalOpts.profile);\n\n printSuccess(\"Login successful (OAuth Client Credentials). Token saved to config.\");\n return;\n }\n\n // Email/password flow\n let email = process.env.GDB_EMAIL;\n let password = process.env.GDB_PASSWORD;\n\n if (!email || !password) {\n if (isInteractive()) {\n if (!email) email = await promptEmail();\n if (!password) password = await promptPassword();\n } else {\n printError(\n \"Set GDB_EMAIL and GDB_PASSWORD environment variables, or run in a terminal for interactive login.\",\n );\n process.exit(1);\n }\n }\n\n const client = createClient(cmd);\n const body: Record<string, string> = { email, password };\n if (loginOpts.tenantId) {\n body.tenantId = loginOpts.tenantId;\n }\n\n const response = await client.rawRequest(\"POST\", \"/auth/login\", { body });\n\n const data = response.data as Record<string, unknown>;\n const token = (data.accessToken ?? data.token) as string | undefined;\n const refreshToken = data.refreshToken as string | undefined;\n\n if (!token) {\n printError(\"No token received from server.\");\n process.exit(1);\n }\n\n const config = loadConfig(globalOpts.profile);\n config.token = token;\n if (refreshToken) {\n config.refreshToken = refreshToken;\n } else {\n delete config.refreshToken;\n }\n saveConfig(config, globalOpts.profile);\n\n printSuccess(\"Login successful. Token saved to config.\");\n }),\n );\n}\n\nfunction createLogoutCommand(): Command {\n return new Command(\"logout\")\n .description(\"Clear saved authentication token\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const globalOpts = resolveOptions(cmd);\n const config = loadConfig(globalOpts.profile);\n\n // Try to notify server (best effort)\n if (config.token && globalOpts.url) {\n try {\n const client = createClient(cmd);\n await client.rawRequest(\"POST\", \"/auth/logout\");\n } catch {\n // Ignore errors - token may already be invalid\n }\n }\n\n delete config.token;\n delete config.refreshToken;\n saveConfig(config, globalOpts.profile);\n printSuccess(\"Logged out. Token cleared from config.\");\n }),\n );\n}\n\nfunction createMeAction() {\n return withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const globalOpts = resolveOptions(cmd);\n\n if (!globalOpts.token && !globalOpts.apiKey) {\n printInfo(\"Not logged in. Use `geonic auth login` to authenticate.\");\n return;\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/me\");\n outputResponse(response, format);\n\n // Suppress additional human-readable logs for structured formats\n if (format && format !== \"table\") {\n return;\n }\n\n // Show token expiry if token exists (re-read in case of auto-refresh)\n const latestConfig = loadConfig(globalOpts.profile);\n if (latestConfig.token) {\n const status = getTokenStatus(latestConfig.token);\n if (status.expiresAt) {\n if (status.isExpired) {\n printError(`Token expires: ${status.expiresAt.toISOString()} (expired)`);\n } else if (status.isExpiringSoon) {\n printWarning(\n `Token expires: ${status.expiresAt.toISOString()} (${formatDuration(status.remainingMs!)} remaining)`,\n );\n } else {\n printInfo(\n `Token expires: ${status.expiresAt.toISOString()} (${formatDuration(status.remainingMs!)} remaining)`,\n );\n }\n }\n }\n\n // Show current profile\n const profileName = globalOpts.profile ?? getCurrentProfile();\n printInfo(`Profile: ${profileName}`);\n });\n}\n\nexport function registerAuthCommands(program: Command): void {\n // auth command group with login/logout subcommands\n const auth = program\n .command(\"auth\")\n .description(\"Manage authentication\");\n\n const login = createLoginCommand();\n addExamples(login, [\n {\n description: \"Interactive login (email/password prompt)\",\n command: \"geonic auth login\",\n },\n {\n description: \"Login with OAuth client credentials\",\n command:\n \"geonic auth login --client-credentials --client-id MY_ID --client-secret MY_SECRET\",\n },\n {\n description: \"Login with environment variables\",\n command: \"GDB_EMAIL=user@example.com GDB_PASSWORD=pass geonic auth login\",\n },\n {\n description: \"Login to a specific tenant\",\n command: \"geonic auth login --tenant-id my-tenant\",\n },\n ]);\n auth.addCommand(login);\n\n const logout = createLogoutCommand();\n addExamples(logout, [\n {\n description: \"Clear saved authentication token\",\n command: \"geonic auth logout\",\n },\n ]);\n auth.addCommand(logout);\n\n // me command (top-level, maps to /me API endpoint)\n const me = program\n .command(\"me\")\n .description(\"Display current authenticated user\")\n .action(createMeAction());\n\n addExamples(me, [\n {\n description: \"Show current user info\",\n command: \"geonic me\",\n },\n ]);\n\n // Backward-compatible hidden aliases\n program.addCommand(createLoginCommand(), { hidden: true });\n program.addCommand(createLogoutCommand(), { hidden: true });\n\n const hiddenWhoami = new Command(\"whoami\")\n .description(\"Display current authenticated user\")\n .action(createMeAction());\n program.addCommand(hiddenWhoami, { hidden: true });\n}\n","import type { ClientOptions, ClientResponse, NgsiError } from \"./types.js\";\n\nexport class GdbClient {\n private baseUrl: string;\n private service?: string;\n private token?: string;\n private refreshToken?: string;\n private apiKey?: string;\n private onTokenRefresh?: (token: string, refreshToken?: string) => void;\n private verbose: boolean;\n private refreshPromise?: Promise<boolean>;\n\n constructor(options: ClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.service = options.service;\n this.token = options.token;\n this.refreshToken = options.refreshToken;\n this.apiKey = options.apiKey;\n this.onTokenRefresh = options.onTokenRefresh;\n this.verbose = options.verbose ?? false;\n }\n\n private buildHeaders(extra?: Record<string, string>): Record<string, string> {\n const headers: Record<string, string> = {};\n\n headers[\"Content-Type\"] = \"application/ld+json\";\n headers[\"Accept\"] = \"application/ld+json\";\n if (this.service) headers[\"NGSILD-Tenant\"] = this.service;\n\n if (this.token) {\n headers[\"Authorization\"] = `Bearer ${this.token}`;\n } else if (this.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.apiKey}`;\n }\n\n if (extra) {\n Object.assign(headers, extra);\n }\n\n return headers;\n }\n\n private buildUrl(path: string, params?: Record<string, string>): string {\n const url = new URL(path, this.baseUrl);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== \"\") {\n url.searchParams.set(key, value);\n }\n }\n }\n return url.toString();\n }\n\n private getBasePath(): string {\n return \"/ngsi-ld/v1\";\n }\n\n private static readonly SENSITIVE_HEADERS = new Set([\"authorization\"]);\n private static readonly SENSITIVE_BODY_KEYS = new Set([\n \"password\",\n \"refreshToken\",\n \"token\",\n \"client_secret\",\n \"clientSecret\",\n ]);\n\n private logRequest(\n method: string,\n url: string,\n headers: Record<string, string>,\n body?: string,\n ): void {\n if (!this.verbose) return;\n process.stderr.write(`> ${method} ${url}\\n`);\n for (const [k, v] of Object.entries(headers)) {\n if (GdbClient.SENSITIVE_HEADERS.has(k.toLowerCase())) {\n process.stderr.write(`> ${k}: ***\\n`);\n } else {\n process.stderr.write(`> ${k}: ${v}\\n`);\n }\n }\n if (body) {\n process.stderr.write(`> Body: ${GdbClient.maskBodySecrets(body)}\\n`);\n }\n process.stderr.write(\"\\n\");\n }\n\n private static maskBodySecrets(raw: string): string {\n try {\n const obj = JSON.parse(raw) as Record<string, unknown>;\n for (const key of Object.keys(obj)) {\n if (GdbClient.SENSITIVE_BODY_KEYS.has(key)) {\n obj[key] = \"***\";\n }\n }\n return JSON.stringify(obj);\n } catch {\n return raw;\n }\n }\n\n private logResponse(response: Response): void {\n if (!this.verbose) return;\n process.stderr.write(`< ${response.status} ${response.statusText}\\n`);\n response.headers.forEach((v, k) => {\n process.stderr.write(`< ${k}: ${v}\\n`);\n });\n process.stderr.write(\"\\n\");\n }\n\n private canRefresh(): boolean {\n return !!this.refreshToken && !this.apiKey;\n }\n\n private async performTokenRefresh(): Promise<boolean> {\n if (this.refreshPromise) return this.refreshPromise;\n\n this.refreshPromise = this.doRefresh();\n try {\n return await this.refreshPromise;\n } finally {\n this.refreshPromise = undefined;\n }\n }\n\n private async doRefresh(): Promise<boolean> {\n /* v8 ignore next -- canRefresh() guards this, refreshToken always exists here */\n if (!this.refreshToken) return false;\n\n try {\n const url = this.buildUrl(\"/auth/refresh\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ refreshToken: this.refreshToken }),\n });\n\n if (!response.ok) return false;\n\n const data = (await response.json()) as Record<string, unknown>;\n const newToken = (data.accessToken ?? data.token) as string | undefined;\n const newRefreshToken = data.refreshToken as string | undefined;\n\n if (!newToken) return false;\n\n this.token = newToken;\n if (newRefreshToken) this.refreshToken = newRefreshToken;\n this.onTokenRefresh?.(newToken, newRefreshToken);\n return true;\n } catch {\n return false;\n }\n }\n\n private async executeRequest<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n },\n ): Promise<ClientResponse<T>> {\n const url = this.buildUrl(`${this.getBasePath()}${path}`, options?.params);\n const headers = this.buildHeaders(options?.headers);\n const body = options?.body ? JSON.stringify(options.body) : undefined;\n\n this.logRequest(method, url, headers, body);\n const response = await fetch(url, { method, headers, body });\n this.logResponse(response);\n\n const countHeader = response.headers.get(\"NGSILD-Results-Count\");\n const count = countHeader ? parseInt(countHeader, 10) : undefined;\n\n let data: T;\n /* v8 ignore next -- null coalescing for missing content-type header */\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const text = await response.text();\n if (text && (contentType.includes(\"json\") || contentType.includes(\"ld+json\"))) {\n data = JSON.parse(text) as T;\n } else {\n data = text as unknown as T;\n }\n\n if (!response.ok) {\n const err = data as unknown as NgsiError;\n const message =\n err?.description || err?.detail || err?.error || err?.title || `HTTP ${response.status}`;\n throw new GdbClientError(message, response.status, err);\n }\n\n return { status: response.status, headers: response.headers, data, count };\n }\n\n private async executeRawRequest<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n },\n ): Promise<ClientResponse<T>> {\n const url = this.buildUrl(path, options?.params);\n const headers = this.buildHeaders(options?.headers);\n const body = options?.body ? JSON.stringify(options.body) : undefined;\n\n this.logRequest(method, url, headers, body);\n const response = await fetch(url, { method, headers, body });\n this.logResponse(response);\n\n let data: T;\n /* v8 ignore next -- null coalescing for missing content-type header */\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const text = await response.text();\n if (text && (contentType.includes(\"json\") || contentType.includes(\"ld+json\"))) {\n data = JSON.parse(text) as T;\n } else {\n data = text as unknown as T;\n }\n\n if (!response.ok) {\n const err = data as unknown as NgsiError;\n const message =\n err?.description || err?.detail || err?.error || err?.title || `HTTP ${response.status}`;\n throw new GdbClientError(message, response.status, err);\n }\n\n return { status: response.status, headers: response.headers, data };\n }\n\n async request<T = unknown>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n },\n ): Promise<ClientResponse<T>> {\n try {\n return await this.executeRequest<T>(method, path, options);\n } catch (err) {\n if (err instanceof GdbClientError && err.status === 401 && this.canRefresh()) {\n const refreshed = await this.performTokenRefresh();\n if (refreshed) {\n return await this.executeRequest<T>(method, path, options);\n }\n }\n throw err;\n }\n }\n\n async get<T = unknown>(\n path: string,\n params?: Record<string, string>,\n headers?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"GET\", path, { params, headers });\n }\n\n async post<T = unknown>(\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"POST\", path, { body, params });\n }\n\n async patch<T = unknown>(\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"PATCH\", path, { body, params });\n }\n\n async put<T = unknown>(\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"PUT\", path, { body, params });\n }\n\n async delete<T = unknown>(\n path: string,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"DELETE\", path, { params });\n }\n\n /** Make a request to a raw URL path (not prefixed with API base path) */\n async rawRequest<T = unknown>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n },\n ): Promise<ClientResponse<T>> {\n try {\n return await this.executeRawRequest<T>(method, path, options);\n } catch (err) {\n if (err instanceof GdbClientError && err.status === 401 && this.canRefresh()) {\n const refreshed = await this.performTokenRefresh();\n if (refreshed) {\n return await this.executeRawRequest<T>(method, path, options);\n }\n }\n throw err;\n }\n }\n}\n\nexport class GdbClientError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly ngsiError?: NgsiError,\n ) {\n super(message);\n this.name = \"GdbClientError\";\n }\n}\n","import { Command } from \"commander\";\nimport { loadConfig, saveConfig, validateUrl } from \"./config.js\";\nimport { GdbClient, GdbClientError } from \"./client.js\";\nimport { printError, printOutput, printCount } from \"./output.js\";\nimport type { ClientResponse, GlobalOptions, OutputFormat } from \"./types.js\";\n\n/**\n * Resolve merged options from config + CLI flags.\n */\nexport function resolveOptions(cmd: Command): GlobalOptions {\n const opts = cmd.optsWithGlobals() as GlobalOptions;\n const config = loadConfig(opts.profile);\n return {\n url: opts.url ?? config.url,\n service: opts.service ?? config.service,\n token: opts.token ?? config.token,\n format: opts.format ?? config.format ?? \"json\",\n color: opts.color,\n verbose: opts.verbose,\n profile: opts.profile,\n apiKey: opts.apiKey ?? process.env.GDB_API_KEY ?? config.apiKey,\n };\n}\n\n/**\n * Create a GdbClient from resolved options.\n */\nexport function createClient(cmd: Command): GdbClient {\n const opts = resolveOptions(cmd);\n if (!opts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n opts.url = validateUrl(opts.url);\n const cliOpts = cmd.optsWithGlobals() as GlobalOptions;\n const usingCliToken = !!cliOpts.token;\n const config = loadConfig(opts.profile);\n return new GdbClient({\n baseUrl: opts.url,\n service: opts.service,\n token: opts.token,\n refreshToken: usingCliToken ? undefined : config.refreshToken,\n apiKey: opts.apiKey,\n onTokenRefresh: usingCliToken\n ? undefined\n : (token, refreshToken) => {\n const cfg = loadConfig(opts.profile);\n cfg.token = token;\n if (refreshToken) cfg.refreshToken = refreshToken;\n saveConfig(cfg, opts.profile);\n },\n verbose: opts.verbose,\n });\n}\n\n/**\n * Get the output format from resolved options.\n */\nexport function getFormat(cmd: Command): OutputFormat {\n const opts = resolveOptions(cmd);\n return opts.format as OutputFormat;\n}\n\n/**\n * Standard handler for outputting API responses.\n */\nexport function outputResponse(\n response: ClientResponse,\n format: OutputFormat,\n showCount?: boolean,\n): void {\n if (showCount && response.count !== undefined) {\n printCount(response.count);\n }\n if (response.data !== undefined && response.data !== \"\") {\n printOutput(response.data, format);\n }\n}\n\n/**\n * Wrap an async command handler with error handling.\n */\nexport function withErrorHandler<T extends unknown[]>(fn: (...args: T) => Promise<void>) {\n return async (...args: T) => {\n try {\n await fn(...args);\n } catch (err: unknown) {\n if (err instanceof GdbClientError && err.status === 401) {\n printError(\"Authentication failed. Please run `geonic login` to re-authenticate.\");\n } else if (err instanceof Error) {\n printError(err.message);\n } else {\n printError(String(err));\n }\n process.exit(1);\n }\n };\n}\n","import { createInterface } from \"node:readline/promises\";\n\nexport function isInteractive(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true;\n}\n\nexport async function promptEmail(): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n const email = await rl.question(\"Email: \");\n return email.trim();\n } finally {\n rl.close();\n }\n}\n\nexport async function promptPassword(): Promise<string> {\n return new Promise((resolve, reject) => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n\n stdout.write(\"Password: \");\n\n if (!stdin.isTTY) {\n let data = \"\";\n stdin.setEncoding(\"utf-8\");\n stdin.resume();\n const cleanup = () => {\n stdin.removeListener(\"data\", onData);\n stdin.removeListener(\"end\", onEnd);\n stdin.removeListener(\"error\", onError);\n stdin.pause();\n };\n const onData = (chunk: string) => {\n const newline = chunk.indexOf(\"\\n\");\n if (newline !== -1) {\n data += chunk.slice(0, newline);\n cleanup();\n stdout.write(\"\\n\");\n resolve(data);\n } else {\n data += chunk;\n }\n };\n const onEnd = () => {\n cleanup();\n stdout.write(\"\\n\");\n resolve(data);\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n stdin.on(\"data\", onData);\n stdin.on(\"end\", onEnd);\n stdin.on(\"error\", onError);\n return;\n }\n\n const wasRaw = stdin.isRaw;\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding(\"utf-8\");\n\n let password = \"\";\n\n const restoreTerminal = () => {\n stdin.removeListener(\"data\", onData);\n stdin.removeListener(\"error\", onError);\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n };\n\n const onError = (err: Error) => {\n restoreTerminal();\n stdout.write(\"\\n\");\n reject(err);\n };\n\n const onData = (char: string) => {\n const code = char.charCodeAt(0);\n\n if (char === \"\\r\" || char === \"\\n\") {\n restoreTerminal();\n stdout.write(\"\\n\");\n resolve(password);\n } else if (code === 3) {\n restoreTerminal();\n stdout.write(\"\\n\");\n reject(new Error(\"User cancelled\"));\n } else if (code === 127 || code === 8) {\n if (password.length > 0) {\n password = password.slice(0, -1);\n stdout.write(\"\\b \\b\");\n }\n } else if (code >= 32) {\n password += char;\n stdout.write(\"*\");\n }\n };\n\n stdin.on(\"data\", onData);\n stdin.on(\"error\", onError);\n });\n}\n","export interface TokenStatus {\n expiresAt: Date | null;\n isExpired: boolean;\n isExpiringSoon: boolean;\n remainingMs: number | null;\n}\n\nexport function decodeJwtPayload(token: string): Record<string, unknown> | null {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) return null;\n const payload = parts[1];\n const json = Buffer.from(payload, \"base64\").toString(\"utf-8\");\n return JSON.parse(json) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nexport function getTokenStatus(token: string): TokenStatus {\n const payload = decodeJwtPayload(token);\n if (!payload || typeof payload.exp !== \"number\") {\n return { expiresAt: null, isExpired: false, isExpiringSoon: false, remainingMs: null };\n }\n\n const expiresAt = new Date(payload.exp * 1000);\n const now = Date.now();\n const remainingMs = expiresAt.getTime() - now;\n const fiveMinutes = 5 * 60 * 1000;\n\n return {\n expiresAt,\n isExpired: remainingMs <= 0,\n isExpiringSoon: remainingMs > 0 && remainingMs <= fiveMinutes,\n remainingMs,\n };\n}\n\nexport function formatDuration(ms: number): string {\n if (ms <= 0) return \"expired\";\n\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n if (hours % 24 > 0) parts.push(`${hours % 24}h`);\n if (minutes % 60 > 0 && days === 0) parts.push(`${minutes % 60}m`);\n if (parts.length === 0) parts.push(`${seconds}s`);\n\n return parts.join(\" \");\n}\n","export interface OAuthTokenResponse {\n access_token: string;\n token_type: string;\n expires_in?: number;\n scope?: string;\n}\n\nexport async function clientCredentialsGrant(options: {\n baseUrl: string;\n clientId: string;\n clientSecret: string;\n scope?: string;\n}): Promise<OAuthTokenResponse> {\n const url = new URL(\"/oauth/token\", options.baseUrl).toString();\n const credentials = Buffer.from(`${options.clientId}:${options.clientSecret}`).toString(\"base64\");\n\n const params = new URLSearchParams();\n params.set(\"grant_type\", \"client_credentials\");\n if (options.scope) {\n params.set(\"scope\", options.scope);\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Authorization: `Basic ${credentials}`,\n },\n body: params.toString(),\n });\n\n if (!response.ok) {\n const text = await response.text();\n let message: string;\n try {\n const err = JSON.parse(text) as Record<string, unknown>;\n message = (err.error_description ?? err.error ?? text) as string;\n } catch {\n message = text || `HTTP ${response.status}`;\n }\n throw new Error(`OAuth token request failed: ${message}`);\n }\n\n return (await response.json()) as OAuthTokenResponse;\n}\n","import { Command } from \"commander\";\nimport {\n listProfiles,\n getCurrentProfile,\n setCurrentProfile,\n createProfile,\n deleteProfile,\n loadConfig,\n} from \"../config.js\";\nimport { printSuccess, printInfo, printError } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerProfileCommands(program: Command): void {\n const profile = program.command(\"profile\").description(\"Manage connection profiles\");\n\n const list = profile\n .command(\"list\")\n .description(\"List all profiles\")\n .action(() => {\n const profiles = listProfiles();\n for (const p of profiles) {\n const marker = p.active ? \" *\" : \"\";\n console.log(`${p.name}${marker}`);\n }\n });\n\n addExamples(list, [\n {\n description: \"List all profiles (active profile marked with *)\",\n command: \"geonic profile list\",\n },\n ]);\n\n const use = profile\n .command(\"use <name>\")\n .description(\"Switch active profile\")\n .action((name: string) => {\n try {\n setCurrentProfile(name);\n printSuccess(`Switched to profile \"${name}\".`);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n });\n\n addExamples(use, [\n {\n description: \"Switch to staging profile\",\n command: \"geonic profile use staging\",\n },\n ]);\n\n const profileCreate = profile\n .command(\"create <name>\")\n .description(\"Create a new profile\")\n .action((name: string) => {\n try {\n createProfile(name);\n printSuccess(`Profile \"${name}\" created.`);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n });\n\n addExamples(profileCreate, [\n {\n description: \"Create a new profile for staging\",\n command: \"geonic profile create staging\",\n },\n ]);\n\n const del = profile\n .command(\"delete <name>\")\n .description(\"Delete a profile\")\n .action((name: string) => {\n try {\n deleteProfile(name);\n printSuccess(`Profile \"${name}\" deleted.`);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n });\n\n addExamples(del, [\n {\n description: \"Delete a profile\",\n command: \"geonic profile delete staging\",\n },\n ]);\n\n const show = profile\n .command(\"show [name]\")\n .description(\"Show profile settings\")\n .action((name?: string) => {\n const profileName = name ?? getCurrentProfile();\n const config = loadConfig(profileName);\n const entries = Object.entries(config).filter(([, v]) => v !== undefined);\n if (entries.length === 0) {\n printInfo(`Profile \"${profileName}\" has no settings.`);\n return;\n }\n for (const [key, value] of entries) {\n if (\n (key === \"token\" || key === \"refreshToken\" || key === \"apiKey\") &&\n typeof value === \"string\"\n ) {\n console.log(`${key}: ***`);\n } else {\n console.log(`${key}: ${value}`);\n }\n }\n });\n\n addExamples(show, [\n {\n description: \"Show current profile settings\",\n command: \"geonic profile show\",\n },\n {\n description: \"Show settings for a specific profile\",\n command: \"geonic profile show production\",\n },\n ]);\n}\n","import JSON5 from \"json5\";\nimport { readFileSync } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\n\n/**\n * Parse JSON input from a string, file (@path), stdin (-), pipe, or interactive mode.\n *\n * Resolution order:\n * 1. Explicit input provided → parse directly (inline, @file, or - for stdin)\n * 2. No input + piped stdin (non-TTY) → auto-read stdin\n * 3. No input + TTY stdin → interactive mode with brace-balanced auto-submit\n *\n * Supports JSON5 syntax (unquoted keys, single quotes, trailing commas).\n */\nexport async function parseJsonInput(input?: string): Promise<unknown> {\n // 1. Explicit input\n if (input !== undefined) {\n if (input === \"-\") return parseData(readFileSync(0, \"utf-8\"));\n if (input.startsWith(\"@\")) return parseData(readFileSync(input.slice(1), \"utf-8\"));\n return parseData(input);\n }\n\n // 2. Piped stdin (non-TTY)\n if (!process.stdin.isTTY) {\n return parseData(readFileSync(0, \"utf-8\"));\n }\n\n // 3. Interactive mode (TTY)\n return readInteractiveJson();\n}\n\nfunction parseData(text: string): unknown {\n return JSON5.parse(text.trim());\n}\n\n/**\n * Read JSON interactively from TTY with brace-balance auto-submit.\n * Tracks depth of {}/[] while respecting string literals.\n * When depth returns to 0, automatically parses and returns.\n */\nasync function readInteractiveJson(): Promise<unknown> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n prompt: \"json> \",\n });\n\n process.stderr.write(\"Enter JSON (auto-submits when braces close, Ctrl+C to cancel):\\n\");\n rl.prompt();\n\n const lines: string[] = [];\n let depth = 0;\n let started = false;\n let inBlockComment = false;\n let inString = false;\n let stringChar = \"\";\n let cancelled = false;\n\n return new Promise<unknown>((resolve, reject) => {\n rl.on(\"SIGINT\", () => {\n cancelled = true;\n rl.close();\n });\n\n rl.on(\"line\", (line) => {\n lines.push(line);\n const result = trackDepth(line, depth, started, inBlockComment, inString, stringChar);\n depth = result.depth;\n started = result.started;\n inBlockComment = result.inBlockComment;\n inString = result.inString;\n stringChar = result.stringChar;\n\n if (started && depth <= 0 && !inBlockComment && !inString) {\n rl.close();\n try {\n resolve(parseData(lines.join(\"\\n\")));\n } catch (err) {\n reject(err);\n }\n } else {\n rl.setPrompt(\"... \");\n rl.prompt();\n }\n });\n\n rl.on(\"close\", () => {\n if (cancelled) {\n reject(new Error(\"Input cancelled.\"));\n return;\n }\n if (lines.length > 0 && (!started || depth > 0 || inBlockComment || inString)) {\n // EOF before balanced — attempt to parse what we have\n try {\n resolve(parseData(lines.join(\"\\n\")));\n } catch (err) {\n reject(err);\n }\n } else if (lines.length === 0) {\n reject(new Error(\"No input provided.\"));\n }\n });\n });\n}\n\n/**\n * Track brace/bracket depth for a line, respecting string literals and JSON5 comments.\n * String and block-comment state is passed in and returned to handle multi-line constructs.\n */\nfunction trackDepth(\n line: string,\n depth: number,\n started: boolean,\n inBlockComment: boolean,\n inString: boolean,\n stringChar: string,\n): { depth: number; started: boolean; inBlockComment: boolean; inString: boolean; stringChar: string } {\n\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n const next = i + 1 < line.length ? line[i + 1] : \"\";\n\n if (inBlockComment) {\n if (ch === \"*\" && next === \"/\") {\n inBlockComment = false;\n i++;\n }\n continue;\n }\n\n if (inString) {\n if (ch === \"\\\\\" && i + 1 < line.length) {\n i++; // skip escaped character\n } else if (ch === stringChar) {\n inString = false;\n }\n continue;\n }\n\n // Line comment — skip rest of line\n if (ch === \"/\" && next === \"/\") break;\n // Block comment start\n if (ch === \"/\" && next === \"*\") {\n inBlockComment = true;\n i++;\n continue;\n }\n\n if (ch === '\"' || ch === \"'\") {\n inString = true;\n stringChar = ch;\n } else if (ch === \"{\" || ch === \"[\") {\n depth++;\n started = true;\n } else if (ch === \"}\" || ch === \"]\") {\n depth--;\n }\n }\n\n return { depth, started, inBlockComment, inString, stringChar };\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function addAttrsSubcommands(attrs: Command): void {\n // attrs list\n const list = attrs\n .command(\"list\")\n .description(\"List all attributes of an entity\")\n .argument(\"<entityId>\", \"Entity ID\")\n .action(\n withErrorHandler(\n async (entityId: string, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/entities/${encodeURIComponent(entityId)}/attrs`,\n );\n outputResponse(response, format);\n },\n ),\n );\n\n addExamples(list, [\n {\n description: \"List all attributes of an entity\",\n command: \"geonic entities attrs list urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // attrs get\n const get = attrs\n .command(\"get\")\n .description(\"Get a specific attribute of an entity\")\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"<attrName>\", \"Attribute name\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n attrName: string,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/entities/${encodeURIComponent(entityId)}/attrs/${encodeURIComponent(attrName)}`,\n );\n outputResponse(response, format);\n },\n ),\n );\n\n addExamples(get, [\n {\n description: \"Get a specific attribute\",\n command: \"geonic entities attrs get urn:ngsi-ld:Sensor:001 temperature\",\n },\n ]);\n\n // attrs add\n const add = attrs\n .command(\"add\")\n .description(\"Add attributes to an entity\")\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n json: string | undefined,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.post(\n `/entities/${encodeURIComponent(entityId)}/attrs`,\n data,\n );\n printSuccess(\"Attributes added.\");\n },\n ),\n );\n\n addExamples(add, [\n {\n description: \"Add attributes from a file\",\n command: \"geonic entities attrs add urn:ngsi-ld:Sensor:001 @attrs.json\",\n },\n ]);\n\n // attrs update\n const attrUpdate = attrs\n .command(\"update\")\n .description(\"Update a specific attribute of an entity\")\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"<attrName>\", \"Attribute name\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n attrName: string,\n json: string | undefined,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.put(\n `/entities/${encodeURIComponent(entityId)}/attrs/${encodeURIComponent(attrName)}`,\n data,\n );\n printSuccess(\"Attribute updated.\");\n },\n ),\n );\n\n addExamples(attrUpdate, [\n {\n description: \"Update a specific attribute\",\n command:\n \"geonic entities attrs update urn:ngsi-ld:Sensor:001 temperature '{\\\"value\\\":25}'\",\n },\n ]);\n\n // attrs delete\n const del = attrs\n .command(\"delete\")\n .description(\"Delete a specific attribute from an entity\")\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"<attrName>\", \"Attribute name\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n attrName: string,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/entities/${encodeURIComponent(entityId)}/attrs/${encodeURIComponent(attrName)}`,\n );\n printSuccess(\"Attribute deleted.\");\n },\n ),\n );\n\n addExamples(del, [\n {\n description: \"Delete a specific attribute\",\n command:\n \"geonic entities attrs delete urn:ngsi-ld:Sensor:001 temperature\",\n },\n ]);\n}\n\nexport function registerAttrsSubcommand(entitiesCmd: Command): void {\n const attrs = entitiesCmd\n .command(\"attrs\")\n .description(\"Manage entity attributes\");\n\n addAttrsSubcommands(attrs);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { registerAttrsSubcommand } from \"./attrs.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerEntitiesCommand(program: Command): void {\n const entities = program\n .command(\"entities\")\n .description(\"Manage context entities\");\n\n // entities list\n const list = entities\n .command(\"list\")\n .description(\"List entities with optional filters\")\n .option(\"--type <type>\", \"Filter by entity type\")\n .option(\"--id-pattern <pat>\", \"Filter by entity ID pattern (regex)\")\n .option(\"--query <q>\", \"NGSI query expression\")\n .option(\"--attrs <a,b>\", \"Comma-separated list of attributes to include\")\n .option(\"--georel <rel>\", \"Geo-relationship (e.g. near;maxDistance:1000)\")\n .option(\"--geometry <geo>\", \"Geometry type for geo-query (e.g. point)\")\n .option(\"--coords <coords>\", \"Coordinates for geo-query\")\n .option(\"--spatial-id <zfxy>\", \"Spatial ID filter (ZFXY tile)\")\n .option(\"--limit <n>\", \"Maximum number of entities to return\", parseInt)\n .option(\"--offset <n>\", \"Skip first N entities\", parseInt)\n .option(\"--order-by <field>\", \"Order results by field\")\n .option(\"--count\", \"Include total count in response\")\n .option(\"--key-values\", \"Request simplified key-value format\")\n .action(\n withErrorHandler(async (opts: Record<string, unknown>, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const params: Record<string, string> = {};\n\n if (opts.type) params.type = String(opts.type);\n if (opts.idPattern) params.idPattern = String(opts.idPattern);\n if (opts.query) params.q = String(opts.query);\n if (opts.attrs) params.attrs = String(opts.attrs);\n if (opts.georel) params.georel = String(opts.georel);\n if (opts.geometry) params.geometry = String(opts.geometry);\n if (opts.coords) params.coordinates = String(opts.coords);\n if (opts.spatialId) params.spatialId = String(opts.spatialId);\n if (opts.limit !== undefined) params.limit = String(opts.limit);\n if (opts.offset !== undefined) params.offset = String(opts.offset);\n if (opts.orderBy) params.orderBy = String(opts.orderBy);\n if (opts.count) params.count = \"true\";\n if (opts.keyValues) params.options = \"keyValues\";\n\n const response = await client.get(\"/entities\", params);\n outputResponse(response, format, !!opts.count);\n }),\n );\n\n addExamples(list, [\n {\n description: \"Filter by entity type\",\n command: \"geonic entities list --type Sensor\",\n },\n {\n description: \"Filter by entity ID pattern (regex)\",\n command: \"geonic entities list --id-pattern 'urn:ngsi-ld:Sensor:.*'\",\n },\n {\n description: \"Filter by attribute value\",\n command: \"geonic entities list --query 'temperature>30'\",\n },\n {\n description: \"AND conditions (semicolon)\",\n command: \"geonic entities list --query 'temperature>30;humidity<50'\",\n },\n {\n description: \"String match\",\n command: \"geonic entities list --query 'name==\\\"Tokyo\\\"'\",\n },\n {\n description: \"Pattern match\",\n command: \"geonic entities list --query 'name~=\\\"Tok.*\\\"'\",\n },\n {\n description: \"Check attribute existence\",\n command: \"geonic entities list --query 'temperature'\",\n },\n {\n description: \"Select specific attributes\",\n command: \"geonic entities list --attrs temperature,humidity\",\n },\n {\n description: \"Geo-query: entities near a point (within 1km)\",\n command:\n \"geonic entities list --georel 'near;maxDistance==1000' --geometry Point --coords '[139.7671,35.6812]'\",\n },\n {\n description: \"Geo-query: entities within a polygon\",\n command:\n \"geonic entities list --georel within --geometry Polygon --coords '[[[139.7,35.7],[139.8,35.7],[139.8,35.6],[139.7,35.6],[139.7,35.7]]]'\",\n },\n {\n description: \"Filter by Spatial ID (ZFXY tile)\",\n command: \"geonic entities list --spatial-id 15/0/29101/12903\",\n },\n {\n description: \"Paginate results\",\n command: \"geonic entities list --limit 20 --offset 40\",\n },\n {\n description: \"Order by attribute\",\n command: \"geonic entities list --order-by temperature\",\n },\n {\n description: \"Get total count with results\",\n command: \"geonic entities list --type Sensor --count\",\n },\n ]);\n\n // entities get\n const get = entities\n .command(\"get\")\n .description(\"Get a single entity by ID\")\n .argument(\"<id>\", \"Entity ID\")\n .option(\"--key-values\", \"Request simplified key-value format\")\n .action(\n withErrorHandler(async (id: string, opts: Record<string, unknown>, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const params: Record<string, string> = {};\n if (opts.keyValues) {\n params.options = \"keyValues\";\n }\n\n const response = await client.get(\n `/entities/${encodeURIComponent(id)}`,\n params,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get entity by ID\",\n command: \"geonic entities get urn:ngsi-ld:Sensor:001\",\n },\n {\n description: \"Get entity in keyValues format\",\n command: \"geonic entities get urn:ngsi-ld:Sensor:001 --key-values\",\n },\n ]);\n\n // entities create\n const create = entities\n .command(\"create\")\n .description(\"Create a new entity\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(async (json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.post(\"/entities\", data);\n printSuccess(\"Entity created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create from inline JSON\",\n command: `geonic entities create '{\"id\":\"urn:ngsi-ld:Sensor:001\",\"type\":\"Sensor\"}'`,\n },\n {\n description: \"Create from a file\",\n command: \"geonic entities create @entity.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat entity.json | geonic entities create\",\n },\n ]);\n\n // entities update\n const update = entities\n .command(\"update\")\n .description(\"Update attributes of an entity (PATCH)\")\n .argument(\"<id>\", \"Entity ID\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (id: string, json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.patch(\n `/entities/${encodeURIComponent(id)}/attrs`,\n data,\n );\n printSuccess(\"Entity updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update entity attributes from inline JSON\",\n command:\n \"geonic entities update urn:ngsi-ld:Sensor:001 '{\\\"temperature\\\":{\\\"value\\\":25}}'\",\n },\n {\n description: \"Update entity attributes from a file\",\n command: \"geonic entities update urn:ngsi-ld:Sensor:001 @attrs.json\",\n },\n ]);\n\n // entities replace\n const replace = entities\n .command(\"replace\")\n .description(\"Replace all attributes of an entity (PUT)\")\n .argument(\"<id>\", \"Entity ID\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (id: string, json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.put(\n `/entities/${encodeURIComponent(id)}/attrs`,\n data,\n );\n printSuccess(\"Entity replaced.\");\n },\n ),\n );\n\n addExamples(replace, [\n {\n description: \"Replace all attributes from a file\",\n command: \"geonic entities replace urn:ngsi-ld:Sensor:001 @attrs.json\",\n },\n ]);\n\n // entities upsert\n const upsert = entities\n .command(\"upsert\")\n .description(\"Create or update entities\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(async (json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.post(\"/entityOperations/upsert\", data);\n printSuccess(\"Entity upserted.\");\n }),\n );\n\n addExamples(upsert, [\n {\n description: \"Upsert entities from a file\",\n command: \"geonic entities upsert @entities.json\",\n },\n {\n description: \"Upsert from stdin pipe\",\n command: \"cat entities.json | geonic entities upsert\",\n },\n ]);\n\n // entities delete\n const del = entities\n .command(\"delete\")\n .description(\"Delete an entity by ID\")\n .argument(\"<id>\", \"Entity ID\")\n .action(\n withErrorHandler(async (id: string, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(`/entities/${encodeURIComponent(id)}`);\n printSuccess(\"Entity deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an entity by ID\",\n command: \"geonic entities delete urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // Register attrs as a subcommand of entities\n registerAttrsSubcommand(entities);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerBatchCommand(program: Command): void {\n const batch = program\n .command(\"entityOperations\")\n .alias(\"batch\")\n .description(\"Perform batch operations on entities\");\n\n // batch create\n const create = batch\n .command(\"create [json]\")\n .description(\"Batch create entities\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/create\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(create, [\n {\n description: \"Batch create from a file\",\n command: \"geonic batch create @entities.json\",\n },\n {\n description: \"Batch create from stdin\",\n command: \"cat entities.json | geonic batch create\",\n },\n ]);\n\n // batch upsert\n const upsert = batch\n .command(\"upsert [json]\")\n .description(\"Batch upsert entities\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/upsert\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(upsert, [\n {\n description: \"Batch upsert from a file\",\n command: \"geonic batch upsert @entities.json\",\n },\n {\n description: \"Batch upsert from stdin\",\n command: \"cat entities.json | geonic batch upsert\",\n },\n ]);\n\n // batch update\n const update = batch\n .command(\"update [json]\")\n .description(\"Batch update entity attributes\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/update\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(update, [\n {\n description: \"Batch update from a file\",\n command: \"geonic batch update @updates.json\",\n },\n {\n description: \"Batch update from stdin\",\n command: \"cat updates.json | geonic batch update\",\n },\n ]);\n\n // batch delete\n const del = batch\n .command(\"delete [json]\")\n .description(\"Batch delete entities by ID\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/delete\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(del, [\n {\n description: \"Batch delete from a file\",\n command: \"geonic batch delete @entity-ids.json\",\n },\n {\n description: \"Batch delete from stdin\",\n command: \"cat entity-ids.json | geonic batch delete\",\n },\n ]);\n\n // batch query\n const query = batch\n .command(\"query [json]\")\n .description(\"Query entities by posting a query payload\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/query\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(query, [\n {\n description: \"Query entities from a file\",\n command: \"geonic batch query @query.json\",\n },\n {\n description: \"Query entities from stdin\",\n command: \"cat query.json | geonic batch query\",\n },\n ]);\n\n // batch merge\n const merge = batch\n .command(\"merge [json]\")\n .description(\"Batch merge-patch entities\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/merge\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(merge, [\n {\n description: \"Batch merge-patch from a file\",\n command: \"geonic batch merge @patches.json\",\n },\n {\n description: \"Batch merge-patch from stdin\",\n command: \"cat patches.json | geonic batch merge\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerSubscriptionsCommand(program: Command): void {\n const subscriptions = program\n .command(\"subscriptions\")\n .alias(\"sub\")\n .description(\"Manage context subscriptions\");\n\n // subscriptions list\n const list = subscriptions\n .command(\"list\")\n .description(\"List subscriptions\")\n .option(\"--limit <n>\", \"Maximum number of results\", parseInt)\n .option(\"--offset <n>\", \"Skip N results\", parseInt)\n .option(\"--count\", \"Include total count in response\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n if (cmdOpts.count) params[\"count\"] = \"true\";\n\n const response = await client.get(\"/subscriptions\", params);\n outputResponse(response, format, !!cmdOpts.count);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all subscriptions\",\n command: \"geonic subscriptions list\",\n },\n {\n description: \"List with pagination\",\n command: \"geonic subscriptions list --limit 10 --offset 20\",\n },\n {\n description: \"List with total count\",\n command: \"geonic subscriptions list --count\",\n },\n ]);\n\n // subscriptions get\n const get = subscriptions\n .command(\"get <id>\")\n .description(\"Get a subscription by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/subscriptions/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get subscription by ID\",\n command: \"geonic subscriptions get urn:ngsi-ld:Subscription:001\",\n },\n ]);\n\n // subscriptions create\n const create = subscriptions\n .command(\"create [json]\")\n .description(\"Create a subscription\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/subscriptions\", data);\n outputResponse(response, format);\n printSuccess(\"Subscription created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create from a JSON file\",\n command: \"geonic subscriptions create @subscription.json\",\n },\n {\n description: \"Create from stdin\",\n command: \"cat subscription.json | geonic subscriptions create\",\n },\n ]);\n\n // subscriptions update\n const update = subscriptions\n .command(\"update <id> [json]\")\n .description(\"Update a subscription\")\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.patch(\n `/subscriptions/${encodeURIComponent(String(id))}`,\n data,\n );\n outputResponse(response, format);\n printSuccess(\"Subscription updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update a subscription from a file\",\n command:\n \"geonic subscriptions update urn:ngsi-ld:Subscription:001 @sub.json\",\n },\n ]);\n\n // subscriptions delete\n const del = subscriptions\n .command(\"delete <id>\")\n .description(\"Delete a subscription\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/subscriptions/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Subscription deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a subscription\",\n command: \"geonic subscriptions delete urn:ngsi-ld:Subscription:001\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerRegistrationsCommand(program: Command): void {\n const registrations = program\n .command(\"registrations\")\n .alias(\"reg\")\n .description(\"Manage context registrations\");\n\n // registrations list\n const list = registrations\n .command(\"list\")\n .description(\"List registrations\")\n .option(\"--limit <n>\", \"Maximum number of results\", parseInt)\n .option(\"--offset <n>\", \"Skip N results\", parseInt)\n .option(\"--count\", \"Include total count in response\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n if (cmdOpts.count) params[\"count\"] = \"true\";\n\n const response = await client.get(\"/csourceRegistrations\", params);\n outputResponse(response, format, !!cmdOpts.count);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all registrations\",\n command: \"geonic registrations list\",\n },\n {\n description: \"List with pagination\",\n command: \"geonic registrations list --limit 10\",\n },\n ]);\n\n // registrations get\n const get = registrations\n .command(\"get <id>\")\n .description(\"Get a registration by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/csourceRegistrations/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get registration by ID\",\n command:\n \"geonic registrations get urn:ngsi-ld:ContextSourceRegistration:001\",\n },\n ]);\n\n // registrations create\n const create = registrations\n .command(\"create [json]\")\n .description(\"Create a registration\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/csourceRegistrations\", data);\n outputResponse(response, format);\n printSuccess(\"Registration created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a registration from a file\",\n command: \"geonic registrations create @registration.json\",\n },\n ]);\n\n // registrations update\n const regUpdate = registrations\n .command(\"update <id> [json]\")\n .description(\"Update a registration\")\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.patch(\n `/csourceRegistrations/${encodeURIComponent(String(id))}`,\n data,\n );\n outputResponse(response, format);\n printSuccess(\"Registration updated.\");\n },\n ),\n );\n\n addExamples(regUpdate, [\n {\n description: \"Update a registration from a file\",\n command:\n \"geonic registrations update urn:ngsi-ld:ContextSourceRegistration:001 @registration.json\",\n },\n ]);\n\n // registrations delete\n const del = registrations\n .command(\"delete <id>\")\n .description(\"Delete a registration\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/csourceRegistrations/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Registration deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a registration\",\n command:\n \"geonic registrations delete urn:ngsi-ld:ContextSourceRegistration:001\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerTypesCommand(program: Command): void {\n const types = program\n .command(\"types\")\n .description(\"Browse entity types\");\n\n // types list\n const list = types\n .command(\"list\")\n .description(\"List available entity types\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\"/types\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all entity types\",\n command: \"geonic types list\",\n },\n ]);\n\n // types get\n const get = types\n .command(\"get <typeName>\")\n .description(\"Get details for an entity type\")\n .action(\n withErrorHandler(\n async (typeName: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/types/${encodeURIComponent(String(typeName))}`,\n );\n outputResponse(response, format);\n },\n ),\n );\n\n addExamples(get, [\n {\n description: \"Get details for a specific type\",\n command: \"geonic types get Sensor\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nfunction addTemporalListOptions(cmd: Command): Command {\n return cmd\n .option(\"--type <type>\", \"Filter by entity type\")\n .option(\"--attrs <a,b>\", \"Comma-separated list of attributes to include\")\n .option(\"--query <q>\", \"NGSI query expression\")\n .option(\"--georel <rel>\", \"Geo-relationship (e.g. near;maxDistance:1000)\")\n .option(\"--geometry <geo>\", \"Geometry type for geo-query (e.g. point)\")\n .option(\"--coords <coords>\", \"Coordinates for geo-query\")\n .option(\"--time-rel <rel>\", \"Temporal relationship (before, after, between)\")\n .option(\"--time-at <time>\", \"Temporal query start time (ISO 8601)\")\n .option(\"--end-time-at <time>\", \"Temporal query end time (ISO 8601)\")\n .option(\"--last-n <n>\", \"Return last N temporal values\", parseInt)\n .option(\"--limit <n>\", \"Maximum number of entities to return\", parseInt)\n .option(\"--offset <n>\", \"Skip first N entities\", parseInt)\n .option(\"--count\", \"Include total count in response\");\n}\n\nfunction createListAction() {\n return withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.type) params[\"type\"] = cmdOpts.type;\n if (cmdOpts.attrs) params[\"attrs\"] = cmdOpts.attrs;\n if (cmdOpts.query) params[\"q\"] = cmdOpts.query;\n if (cmdOpts.georel) params[\"georel\"] = cmdOpts.georel;\n if (cmdOpts.geometry) params[\"geometry\"] = cmdOpts.geometry;\n if (cmdOpts.coords) params[\"coordinates\"] = cmdOpts.coords;\n if (cmdOpts.timeRel) params[\"timerel\"] = cmdOpts.timeRel;\n if (cmdOpts.timeAt) params[\"timeAt\"] = cmdOpts.timeAt;\n if (cmdOpts.endTimeAt) params[\"endTimeAt\"] = cmdOpts.endTimeAt;\n if (cmdOpts.lastN !== undefined) params[\"lastN\"] = String(cmdOpts.lastN);\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n if (cmdOpts.count) params[\"count\"] = \"true\";\n\n const response = await client.get(\"/temporal/entities\", params);\n outputResponse(response, format, cmdOpts.count);\n });\n}\n\nfunction addTemporalGetOptions(cmd: Command): Command {\n return cmd\n .option(\"--attrs <a,b>\", \"Comma-separated list of attributes to include\")\n .option(\"--time-rel <rel>\", \"Temporal relationship (before, after, between)\")\n .option(\"--time-at <time>\", \"Temporal query start time (ISO 8601)\")\n .option(\"--end-time-at <time>\", \"Temporal query end time (ISO 8601)\")\n .option(\"--last-n <n>\", \"Return last N temporal values\", parseInt);\n}\n\nfunction createGetAction() {\n return withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.attrs) params[\"attrs\"] = cmdOpts.attrs;\n if (cmdOpts.timeRel) params[\"timerel\"] = cmdOpts.timeRel;\n if (cmdOpts.timeAt) params[\"timeAt\"] = cmdOpts.timeAt;\n if (cmdOpts.endTimeAt) params[\"endTimeAt\"] = cmdOpts.endTimeAt;\n if (cmdOpts.lastN !== undefined) params[\"lastN\"] = String(cmdOpts.lastN);\n\n const response = await client.get(\n `/temporal/entities/${encodeURIComponent(String(id))}`,\n params,\n );\n outputResponse(response, format);\n });\n}\n\nfunction createCreateAction() {\n return withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n\n await client.post(\"/temporal/entities\", body);\n printSuccess(\"Temporal entity created.\");\n });\n}\n\nfunction createDeleteAction() {\n return withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/temporal/entities/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Temporal entity deleted.\");\n });\n}\n\nfunction createQueryAction() {\n return withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.aggrMethods) params[\"aggrMethods\"] = cmdOpts.aggrMethods;\n if (cmdOpts.aggrPeriod) params[\"aggrPeriodDuration\"] = cmdOpts.aggrPeriod;\n\n const response = await client.post(\n \"/temporal/entityOperations/query\",\n body,\n params,\n );\n outputResponse(response, format);\n });\n}\n\nfunction addQueryOptions(cmd: Command): Command {\n return cmd\n .option(\"--aggr-methods <methods>\", \"Aggregation methods (e.g. totalCount,sum)\")\n .option(\"--aggr-period <period>\", \"Aggregation period (e.g. PT1H)\");\n}\n\nexport function registerTemporalCommand(program: Command): void {\n const temporal = program\n .command(\"temporal\")\n .description(\"Manage temporal entities\");\n\n const entities = temporal\n .command(\"entities\")\n .description(\"List, get, create, and delete temporal entities\");\n\n const entityOperations = temporal\n .command(\"entityOperations\")\n .description(\"Perform batch operations on temporal entities\");\n\n // temporal entities list\n const entitiesList = addTemporalListOptions(\n entities.command(\"list\").description(\"List temporal entities with optional filters\"),\n );\n entitiesList.action(createListAction());\n\n addExamples(entitiesList, [\n {\n description: \"List by type with time range\",\n command:\n \"geonic temporal entities list --type Sensor --time-rel between --time-at 2025-01-01T00:00:00Z --end-time-at 2025-01-31T23:59:59Z\",\n },\n {\n description: \"Get last 5 temporal values\",\n command: \"geonic temporal entities list --type Sensor --last-n 5\",\n },\n {\n description: \"Filter by time (after a point)\",\n command:\n \"geonic temporal entities list --time-rel after --time-at 2025-06-01T00:00:00Z\",\n },\n ]);\n\n // temporal entities get\n const entitiesGet = addTemporalGetOptions(\n entities.command(\"get <id>\").description(\"Get a temporal entity by ID\"),\n );\n entitiesGet.action(createGetAction());\n\n addExamples(entitiesGet, [\n {\n description: \"Get temporal entity with specific attributes\",\n command:\n \"geonic temporal entities get urn:ngsi-ld:Sensor:001 --attrs temperature,humidity\",\n },\n {\n description: \"Get last 10 values for an entity\",\n command: \"geonic temporal entities get urn:ngsi-ld:Sensor:001 --last-n 10\",\n },\n ]);\n\n // temporal entities create\n const create = entities\n .command(\"create [json]\")\n .description(\"Create a temporal entity\")\n .action(createCreateAction());\n\n addExamples(create, [\n {\n description: \"Create temporal entity from a file\",\n command: \"geonic temporal entities create @temporal-entity.json\",\n },\n ]);\n\n // temporal entities delete\n const del = entities\n .command(\"delete <id>\")\n .description(\"Delete a temporal entity by ID\")\n .action(createDeleteAction());\n\n addExamples(del, [\n {\n description: \"Delete temporal data for an entity\",\n command: \"geonic temporal entities delete urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // temporal entityOperations query\n const opsQuery = addQueryOptions(\n entityOperations.command(\"query [json]\").description(\"Query temporal entities (POST)\"),\n );\n opsQuery.action(createQueryAction());\n\n addExamples(opsQuery, [\n {\n description: \"Query with aggregation (hourly count)\",\n command:\n \"geonic temporal entityOperations query @query.json --aggr-methods totalCount --aggr-period PT1H\",\n },\n {\n description: \"Query from a file\",\n command: \"geonic temporal entityOperations query @query.json\",\n },\n ]);\n\n // Backward-compatible hidden aliases at the temporal level\n addTemporalListOptions(\n temporal\n .command(\"list\", { hidden: true })\n .description(\"List temporal entities (deprecated: use temporal entities list)\"),\n ).action(createListAction());\n\n addTemporalGetOptions(\n temporal\n .command(\"get <id>\", { hidden: true })\n .description(\"Get a temporal entity (deprecated: use temporal entities get)\"),\n ).action(createGetAction());\n\n temporal\n .command(\"create [json]\", { hidden: true })\n .description(\"Create a temporal entity (deprecated: use temporal entities create)\")\n .action(createCreateAction());\n\n temporal\n .command(\"delete <id>\", { hidden: true })\n .description(\"Delete a temporal entity (deprecated: use temporal entities delete)\")\n .action(createDeleteAction());\n\n addQueryOptions(\n temporal\n .command(\"query [json]\", { hidden: true })\n .description(\"Query temporal entities (deprecated: use temporal entityOperations query)\"),\n ).action(createQueryAction());\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerSnapshotsCommand(program: Command): void {\n const snapshots = program\n .command(\"snapshots\")\n .description(\"Manage snapshots\");\n\n // snapshots list\n const list = snapshots\n .command(\"list\")\n .description(\"List snapshots\")\n .option(\"--limit <n>\", \"Maximum number of snapshots to return\", parseInt)\n .option(\"--offset <n>\", \"Skip first N snapshots\", parseInt)\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n\n const response = await client.get(\"/snapshots\", params);\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all snapshots\",\n command: \"geonic snapshots list\",\n },\n {\n description: \"List with a limit\",\n command: \"geonic snapshots list --limit 10\",\n },\n ]);\n\n // snapshots get\n const get = snapshots\n .command(\"get <id>\")\n .description(\"Get a snapshot by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/snapshots/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a specific snapshot\",\n command: \"geonic snapshots get <snapshot-id>\",\n },\n ]);\n\n // snapshots create\n const create = snapshots\n .command(\"create\")\n .description(\"Create a new snapshot\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.post(\"/snapshots\");\n printSuccess(\"Snapshot created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a new snapshot\",\n command: \"geonic snapshots create\",\n },\n ]);\n\n // snapshots delete\n const del = snapshots\n .command(\"delete <id>\")\n .description(\"Delete a snapshot by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/snapshots/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Snapshot deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a snapshot\",\n command: \"geonic snapshots delete <snapshot-id>\",\n },\n ]);\n\n // snapshots clone\n const clone = snapshots\n .command(\"clone <id>\")\n .description(\"Clone a snapshot by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.post(\n `/snapshots/${encodeURIComponent(String(id))}/clone`,\n );\n if (response.data !== undefined && response.data !== \"\") {\n outputResponse(response, format);\n } else {\n printSuccess(\"Snapshot cloned.\");\n }\n }),\n );\n\n addExamples(clone, [\n {\n description: \"Clone a snapshot\",\n command: \"geonic snapshots clone <snapshot-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerTenantsCommand(parent: Command): void {\n const tenants = parent\n .command(\"tenants\")\n .description(\"Manage tenants\");\n\n // tenants list\n const list = tenants\n .command(\"list\")\n .description(\"List all tenants\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/tenants\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all tenants\",\n command: \"geonic admin tenants list\",\n },\n ]);\n\n // tenants get\n const get = tenants\n .command(\"get <id>\")\n .description(\"Get a tenant by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/tenants/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a tenant by ID\",\n command: \"geonic admin tenants get <tenant-id>\",\n },\n ]);\n\n // tenants create\n const create = tenants\n .command(\"create [json]\")\n .description(\"Create a new tenant\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/tenants\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"Tenant created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a tenant from a JSON file\",\n command: \"geonic admin tenants create @tenant.json\",\n },\n ]);\n\n // tenants update\n const update = tenants\n .command(\"update <id> [json]\")\n .description(\"Update a tenant\")\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/tenants/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Tenant updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update a tenant from a JSON file\",\n command: \"geonic admin tenants update <tenant-id> @tenant.json\",\n },\n ]);\n\n // tenants delete\n const del = tenants\n .command(\"delete <id>\")\n .description(\"Delete a tenant\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/tenants/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Tenant deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a tenant\",\n command: \"geonic admin tenants delete <tenant-id>\",\n },\n ]);\n\n // tenants activate\n const activate = tenants\n .command(\"activate <id>\")\n .description(\"Activate a tenant\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/tenants/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"Tenant activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a tenant\",\n command: \"geonic admin tenants activate <tenant-id>\",\n },\n ]);\n\n // tenants deactivate\n const deactivate = tenants\n .command(\"deactivate <id>\")\n .description(\"Deactivate a tenant\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/tenants/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"Tenant deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a tenant\",\n command: \"geonic admin tenants deactivate <tenant-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerUsersCommand(parent: Command): void {\n const users = parent\n .command(\"users\")\n .description(\"Manage users\");\n\n // users list\n const list = users\n .command(\"list\")\n .description(\"List all users\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/users\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all users\",\n command: \"geonic admin users list\",\n },\n ]);\n\n // users get\n const get = users\n .command(\"get <id>\")\n .description(\"Get a user by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/users/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a user by ID\",\n command: \"geonic admin users get <user-id>\",\n },\n ]);\n\n // users create\n const create = users\n .command(\"create [json]\")\n .description(\"Create a new user\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/users\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"User created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a user from a JSON file\",\n command: \"geonic admin users create @user.json\",\n },\n ]);\n\n // users update\n const update = users\n .command(\"update <id> [json]\")\n .description(\"Update a user\")\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/users/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"User updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update a user from a JSON file\",\n command: \"geonic admin users update <user-id> @user.json\",\n },\n ]);\n\n // users delete\n const del = users\n .command(\"delete <id>\")\n .description(\"Delete a user\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/users/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"User deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a user\",\n command: \"geonic admin users delete <user-id>\",\n },\n ]);\n\n // users activate\n const activate = users\n .command(\"activate <id>\")\n .description(\"Activate a user\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/users/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"User activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a user\",\n command: \"geonic admin users activate <user-id>\",\n },\n ]);\n\n // users deactivate\n const deactivate = users\n .command(\"deactivate <id>\")\n .description(\"Deactivate a user\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/users/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"User deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a user\",\n command: \"geonic admin users deactivate <user-id>\",\n },\n ]);\n\n // users unlock\n const unlock = users\n .command(\"unlock <id>\")\n .description(\"Unlock a user\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/users/${encodeURIComponent(String(id))}/unlock`,\n );\n printSuccess(\"User unlocked.\");\n }),\n );\n\n addExamples(unlock, [\n {\n description: \"Unlock a locked user account\",\n command: \"geonic admin users unlock <user-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerPoliciesCommand(parent: Command): void {\n const policies = parent\n .command(\"policies\")\n .description(\"Manage policies\");\n\n // policies list\n const list = policies\n .command(\"list\")\n .description(\"List all policies\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/policies\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all policies\",\n command: \"geonic admin policies list\",\n },\n ]);\n\n // policies get\n const get = policies\n .command(\"get <id>\")\n .description(\"Get a policy by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/policies/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a policy by ID\",\n command: \"geonic admin policies get <policy-id>\",\n },\n ]);\n\n // policies create\n const create = policies\n .command(\"create [json]\")\n .description(\"Create a new policy\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/policies\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"Policy created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a policy from a JSON file\",\n command: \"geonic admin policies create @policy.json\",\n },\n ]);\n\n // policies update\n const update = policies\n .command(\"update <id> [json]\")\n .description(\"Update a policy\")\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/policies/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Policy updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update a policy from a JSON file\",\n command: \"geonic admin policies update <policy-id> @policy.json\",\n },\n ]);\n\n // policies delete\n const del = policies\n .command(\"delete <id>\")\n .description(\"Delete a policy\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/policies/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Policy deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a policy\",\n command: \"geonic admin policies delete <policy-id>\",\n },\n ]);\n\n // policies activate\n const activate = policies\n .command(\"activate <id>\")\n .description(\"Activate a policy\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/policies/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"Policy activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a policy\",\n command: \"geonic admin policies activate <policy-id>\",\n },\n ]);\n\n // policies deactivate\n const deactivate = policies\n .command(\"deactivate <id>\")\n .description(\"Deactivate a policy\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/policies/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"Policy deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a policy\",\n command: \"geonic admin policies deactivate <policy-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerOAuthClientsCommand(parent: Command): void {\n const oauthClients = parent\n .command(\"oauth-clients\")\n .description(\"Manage OAuth clients\");\n\n // oauth-clients list\n const list = oauthClients\n .command(\"list\")\n .description(\"List all OAuth clients\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/oauth-clients\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all OAuth clients\",\n command: \"geonic admin oauth-clients list\",\n },\n ]);\n\n // oauth-clients get\n const get = oauthClients\n .command(\"get <id>\")\n .description(\"Get an OAuth client by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/oauth-clients/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get an OAuth client by ID\",\n command: \"geonic admin oauth-clients get <client-id>\",\n },\n ]);\n\n // oauth-clients create\n const create = oauthClients\n .command(\"create [json]\")\n .description(\"Create a new OAuth client\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/oauth-clients\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"OAuth client created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create an OAuth client from a JSON file\",\n command: \"geonic admin oauth-clients create @client.json\",\n },\n ]);\n\n // oauth-clients update\n const update = oauthClients\n .command(\"update <id> [json]\")\n .description(\"Update an OAuth client\")\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/oauth-clients/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"OAuth client updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update an OAuth client from a JSON file\",\n command: \"geonic admin oauth-clients update <client-id> @client.json\",\n },\n ]);\n\n // oauth-clients delete\n const del = oauthClients\n .command(\"delete <id>\")\n .description(\"Delete an OAuth client\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/oauth-clients/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"OAuth client deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an OAuth client\",\n command: \"geonic admin oauth-clients delete <client-id>\",\n },\n ]);\n}\n\nexport function registerCaddeCommand(parent: Command): void {\n const cadde = parent\n .command(\"cadde\")\n .description(\"Manage CADDE configuration\");\n\n // cadde get\n const caddeGet = cadde\n .command(\"get\")\n .description(\"Get CADDE configuration\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/cadde\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(caddeGet, [\n {\n description: \"Get CADDE configuration\",\n command: \"geonic admin cadde get\",\n },\n ]);\n\n // cadde set\n const caddeSet = cadde\n .command(\"set [json]\")\n .description(\"Set CADDE configuration\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"PUT\", \"/admin/cadde\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"CADDE configuration set.\");\n }),\n );\n\n addExamples(caddeSet, [\n {\n description: \"Set CADDE configuration from a JSON file\",\n command: \"geonic admin cadde set @cadde-config.json\",\n },\n ]);\n\n // cadde delete\n const caddeDelete = cadde\n .command(\"delete\")\n .description(\"Delete CADDE configuration\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\"DELETE\", \"/admin/cadde\");\n printSuccess(\"CADDE configuration deleted.\");\n }),\n );\n\n addExamples(caddeDelete, [\n {\n description: \"Delete CADDE configuration\",\n command: \"geonic admin cadde delete\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { registerTenantsCommand } from \"./tenants.js\";\nimport { registerUsersCommand } from \"./users.js\";\nimport { registerPoliciesCommand } from \"./policies.js\";\nimport { registerOAuthClientsCommand, registerCaddeCommand } from \"./oauth-clients.js\";\n\nexport function registerAdminCommand(program: Command): void {\n const admin = program\n .command(\"admin\")\n .description(\"Manage admin resources\");\n\n registerTenantsCommand(admin);\n registerUsersCommand(admin);\n registerPoliciesCommand(admin);\n registerOAuthClientsCommand(admin);\n registerCaddeCommand(admin);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerRulesCommand(program: Command): void {\n const rules = program\n .command(\"rules\")\n .description(\"Manage rule engine\");\n\n // rules list\n const list = rules\n .command(\"list\")\n .description(\"List all rules\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/rules\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all rules\",\n command: \"geonic rules list\",\n },\n ]);\n\n // rules get\n const get = rules\n .command(\"get <id>\")\n .description(\"Get a rule by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/rules/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a specific rule\",\n command: \"geonic rules get <rule-id>\",\n },\n ]);\n\n // rules create\n const create = rules\n .command(\"create [json]\")\n .description(\"Create a new rule\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/rules\", { body });\n outputResponse(response, format);\n printSuccess(\"Rule created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a rule from a file\",\n command: \"geonic rules create @rule.json\",\n },\n ]);\n\n // rules update\n const update = rules\n .command(\"update <id> [json]\")\n .description(\"Update a rule\")\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/rules/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Rule updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update a rule from a file\",\n command: \"geonic rules update <rule-id> @rule.json\",\n },\n ]);\n\n // rules delete\n const del = rules\n .command(\"delete <id>\")\n .description(\"Delete a rule\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/rules/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Rule deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a rule\",\n command: \"geonic rules delete <rule-id>\",\n },\n ]);\n\n // rules activate\n const activate = rules\n .command(\"activate <id>\")\n .description(\"Activate a rule\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/rules/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"Rule activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a rule\",\n command: \"geonic rules activate <rule-id>\",\n },\n ]);\n\n // rules deactivate\n const deactivate = rules\n .command(\"deactivate <id>\")\n .description(\"Deactivate a rule\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/rules/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"Rule deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a rule\",\n command: \"geonic rules deactivate <rule-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerModelsCommand(program: Command): void {\n const models = program\n .command(\"custom-data-models\")\n .alias(\"models\")\n .description(\"Manage custom data models\");\n\n // models list\n const list = models\n .command(\"list\")\n .description(\"List all models\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/custom-data-models\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all models\",\n command: \"geonic models list\",\n },\n ]);\n\n // models get\n const get = models\n .command(\"get <id>\")\n .description(\"Get a model by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/custom-data-models/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a specific model\",\n command: \"geonic models get <model-id>\",\n },\n ]);\n\n // models create\n const create = models\n .command(\"create [json]\")\n .description(\"Create a new model\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/custom-data-models\", { body });\n outputResponse(response, format);\n printSuccess(\"Model created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a model from a file\",\n command: \"geonic models create @model.json\",\n },\n ]);\n\n // models update\n const update = models\n .command(\"update <id> [json]\")\n .description(\"Update a model\")\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/custom-data-models/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Model updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update a model from a file\",\n command: \"geonic models update <model-id> @model.json\",\n },\n ]);\n\n // models delete\n const del = models\n .command(\"delete <id>\")\n .description(\"Delete a model\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/custom-data-models/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Model deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a model\",\n command: \"geonic models delete <model-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../helpers.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerCatalogCommand(program: Command): void {\n const catalog = program\n .command(\"catalog\")\n .description(\"Browse DCAT-AP catalog\");\n\n // catalog get\n const get = catalog\n .command(\"get\")\n .description(\"Get the catalog\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/catalog\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get the DCAT-AP catalog\",\n command: \"geonic catalog get\",\n },\n ]);\n\n // catalog datasets\n const datasets = catalog\n .command(\"datasets\")\n .description(\"Manage catalog datasets\");\n\n // catalog datasets list\n const datasetsList = datasets\n .command(\"list\")\n .description(\"List all datasets\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/catalog/datasets\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(datasetsList, [\n {\n description: \"List all catalog datasets\",\n command: \"geonic catalog datasets list\",\n },\n ]);\n\n // catalog datasets get\n const datasetsGet = datasets\n .command(\"get <id>\")\n .description(\"Get a dataset by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/catalog/datasets/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(datasetsGet, [\n {\n description: \"Get a specific dataset\",\n command: \"geonic catalog datasets get <dataset-id>\",\n },\n ]);\n\n // catalog datasets sample\n const datasetsSample = datasets\n .command(\"sample <id>\")\n .description(\"Get sample data for a dataset\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/catalog/datasets/${encodeURIComponent(String(id))}/sample`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(datasetsSample, [\n {\n description: \"Get sample data for a dataset\",\n command: \"geonic catalog datasets sample <dataset-id>\",\n },\n ]);\n}\n","import { createRequire } from \"node:module\";\nimport type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { printInfo } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerHealthCommand(program: Command): void {\n const health = program\n .command(\"health\")\n .description(\"Check the health status of the server\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.rawRequest(\"GET\", \"/health\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(health, [\n {\n description: \"Check server health\",\n command: \"geonic health\",\n },\n ]);\n}\n\nexport function registerVersionCommand(program: Command): void {\n const version = program\n .command(\"version\")\n .description(\"Display CLI and server version information\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { version: string };\n const cliVersion = pkg.version;\n\n printInfo(`CLI version: ${cliVersion}`);\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.rawRequest(\"GET\", \"/version\");\n printInfo(\"Server version:\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(version, [\n {\n description: \"Show CLI and server version\",\n command: \"geonic version\",\n },\n ]);\n}\n","import { createRequire } from \"node:module\";\nimport type { Command, Option } from \"commander\";\nimport { addExamples } from \"./help.js\";\n\nfunction findOption(\n cmd: Command,\n program: Command,\n flag: string,\n): Option | undefined {\n return (\n cmd.options.find((o) => o.long === flag || o.short === flag) ||\n program.options.find((o) => o.long === flag || o.short === flag)\n );\n}\n\nfunction optionTakesValue(\n cmd: Command,\n program: Command,\n flag: string,\n): boolean {\n const opt = findOption(cmd, program, flag);\n if (!opt) return false;\n return !!(opt.required || opt.optional);\n}\n\nfunction findSubcommand(cmd: Command, name: string): Command | undefined {\n return cmd.commands.find(\n (c) => c.name() === name || c.aliases().includes(name),\n );\n}\n\nexport function generateCompletions(\n program: Command,\n line: string,\n point: number,\n): string[] {\n const truncated = line.slice(0, point);\n const tokens = truncated.trim().split(/\\s+/).filter(Boolean);\n const startingNewWord = /\\s$/.test(truncated);\n\n // Determine partial input (what the user is currently typing)\n const partial =\n !startingNewWord && tokens.length > 1 ? tokens[tokens.length - 1] : \"\";\n\n // Tokens to walk the command tree (exclude program name and partial)\n const walkTokens = startingNewWord ? tokens.slice(1) : tokens.slice(1, -1);\n\n // Walk the command tree\n let currentCmd = program;\n let i = 0;\n\n while (i < walkTokens.length) {\n const token = walkTokens[i];\n\n if (token.startsWith(\"-\")) {\n if (optionTakesValue(currentCmd, program, token)) {\n i += 2; // skip option + its value\n } else {\n i += 1;\n }\n continue;\n }\n\n const sub = findSubcommand(currentCmd, token);\n if (sub) {\n currentCmd = sub;\n }\n i++;\n }\n\n // Special handling: `help` command mirrors the main command tree for completions\n if (currentCmd.name() === \"help\" && currentCmd.parent === program) {\n const helpIdx = walkTokens.indexOf(\"help\");\n const rawArgs = walkTokens.slice(helpIdx + 1);\n const helpArgs: string[] = [];\n for (let j = 0; j < rawArgs.length; j++) {\n const t = rawArgs[j];\n if (t.startsWith(\"-\")) {\n if (optionTakesValue(currentCmd, program, t)) {\n j++; // skip the option's value\n }\n continue;\n }\n helpArgs.push(t);\n }\n\n let target = program;\n for (const arg of helpArgs) {\n const sub = findSubcommand(target, arg);\n if (sub) target = sub;\n else break;\n }\n\n const subs = target.commands\n .filter((c) => !(c as { _hidden?: boolean })._hidden)\n .map((c) => c.name());\n return subs.filter((s) => s.startsWith(partial));\n }\n\n // Determine predecessor token (immediately before the completion point)\n const predecessor = startingNewWord\n ? tokens[tokens.length - 1]\n : tokens.length >= 2\n ? tokens[tokens.length - 2]\n : undefined;\n\n // Case 1: Previous token is a value-taking option → complete option values\n if (\n predecessor &&\n predecessor.startsWith(\"-\") &&\n optionTakesValue(currentCmd, program, predecessor)\n ) {\n return getOptionValueCompletions(predecessor, partial);\n }\n\n // Case 2: Partial starts with '-' → complete options\n if (partial.startsWith(\"-\")) {\n return getOptionCompletions(currentCmd, program, partial);\n }\n\n // Case 3: Current command has non-hidden subcommands → complete them\n const subcommands = currentCmd.commands\n .filter((c) => !(c as { _hidden?: boolean })._hidden)\n .map((c) => c.name());\n\n if (subcommands.length > 0) {\n return subcommands.filter((s) => s.startsWith(partial));\n }\n\n // Case 4: Command takes file arguments → signal <file>\n for (const arg of currentCmd.registeredArguments) {\n if (arg.description && arg.description.includes(\"@file\")) {\n return [\"<file>\"];\n }\n }\n\n return [];\n}\n\nfunction getOptionCompletions(\n cmd: Command,\n program: Command,\n partial: string,\n): string[] {\n const options = new Set<string>();\n\n for (const opt of cmd.options) {\n if (opt.hidden) continue;\n if (opt.long) options.add(opt.long);\n }\n\n for (const opt of program.options) {\n if (opt.hidden) continue;\n if (opt.long) options.add(opt.long);\n }\n\n return [...options].filter((o) => o.startsWith(partial));\n}\n\nfunction getOptionValueCompletions(\n optionFlag: string,\n partial: string,\n): string[] {\n if (optionFlag === \"--format\" || optionFlag === \"-f\") {\n return [\"json\", \"table\", \"geojson\"].filter((v) =>\n v.startsWith(partial),\n );\n }\n return [];\n}\n\nconst ZSH_SCRIPT = `_geonic_completions() {\n local completions\n completions=(\\${(f)\"$(geonic cli completions --line=\"$BUFFER\" --point=\"$CURSOR\" 2>/dev/null)\"})\n if [[ \"\\${completions[1]}\" == \"<file>\" ]]; then\n _files\n return\n fi\n compadd -a completions\n}\ncompdef _geonic_completions geonic`;\n\nconst BASH_SCRIPT = `_geonic_completions() {\n local cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n local completions\n completions=$(geonic cli completions --line=\"\\${COMP_LINE}\" --point=\"\\${COMP_POINT}\" 2>/dev/null)\n if [[ \"$completions\" == \"<file>\" ]]; then\n COMPREPLY=()\n return\n fi\n COMPREPLY=($(compgen -W \"$completions\" -- \"$cur\"))\n}\ncomplete -o default -F _geonic_completions geonic`;\n\nexport function registerCliCommand(program: Command): void {\n const cli = program\n .command(\"cli\")\n .summary(\"Manage CLI internals\")\n .description(\"Manage CLI internals such as shell completions.\");\n\n const completions = cli\n .command(\"completions\")\n .summary(\"Generate shell completions\")\n .description(\"Generate shell completions for geonic CLI.\")\n .option(\"--line <line>\", \"Current command line content\")\n .option(\"--point <point>\", \"Cursor position in the command line\")\n .action((opts: { line?: string; point?: string }) => {\n if (opts.line !== undefined && opts.point !== undefined) {\n const point = parseInt(opts.point, 10);\n const results = generateCompletions(program, opts.line, point);\n for (const r of results) {\n console.log(r);\n }\n }\n });\n\n const bash = completions\n .command(\"bash\")\n .description(\"Output bash completion script\")\n .action(() => {\n console.log(BASH_SCRIPT);\n });\n\n addExamples(bash, [\n {\n description: \"Print the bash completion script\",\n command: \"geonic cli completions bash\",\n },\n {\n description: \"Enable in current shell session\",\n command: 'eval \"$(geonic cli completions bash)\"',\n },\n {\n description: \"Persist in ~/.bashrc\",\n command:\n 'echo \\'eval \"$(geonic cli completions bash)\"\\' >> ~/.bashrc',\n },\n ]);\n\n const zsh = completions\n .command(\"zsh\")\n .description(\"Output zsh completion script\")\n .action(() => {\n console.log(ZSH_SCRIPT);\n });\n\n addExamples(zsh, [\n {\n description: \"Print the zsh completion script\",\n command: \"geonic cli completions zsh\",\n },\n {\n description: \"Enable in current shell session\",\n command: 'eval \"$(geonic cli completions zsh)\"',\n },\n {\n description: \"Persist in ~/.zshrc\",\n command:\n 'echo \\'eval \"$(geonic cli completions zsh)\"\\' >> ~/.zshrc',\n },\n ]);\n\n const version = cli\n .command(\"version\")\n .description(\"Display the CLI version\")\n .action(() => {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { version: string };\n console.log(pkg.version);\n });\n\n addExamples(version, [\n {\n description: \"Show CLI version\",\n command: \"geonic cli version\",\n },\n ]);\n}\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport chalk from \"chalk\";\nimport { getConfigDir, ensureConfigDir } from \"./config.js\";\n\nconst PACKAGE_NAME = \"@geolonia/geonicdb-cli\";\nconst REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;\nconst CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours\nconst FETCH_TIMEOUT_MS = 5000;\n\ninterface UpdateCache {\n lastCheck: number;\n latestVersion?: string;\n}\n\nexport interface UpdateCheckResult {\n currentVersion: string;\n latestVersion: string;\n}\n\nconst CI_ENV_VARS = [\n \"CI\",\n \"CONTINUOUS_INTEGRATION\",\n \"BUILD_NUMBER\",\n \"GITHUB_ACTIONS\",\n \"GITLAB_CI\",\n \"CIRCLECI\",\n \"JENKINS_URL\",\n \"HUDSON_URL\",\n \"TRAVIS\",\n];\n\nfunction getCacheFile(): string {\n return join(getConfigDir(), \"update-check.json\");\n}\n\nfunction isCheckDisabled(): boolean {\n if (process.env.NO_UPDATE_NOTIFIER) return true;\n if (!process.stdout.isTTY) return true;\n for (const envVar of CI_ENV_VARS) {\n if (process.env[envVar]) return true;\n }\n return false;\n}\n\nfunction loadCache(): UpdateCache | null {\n try {\n const raw = readFileSync(getCacheFile(), \"utf-8\");\n return JSON.parse(raw) as UpdateCache;\n } catch {\n return null;\n }\n}\n\nfunction saveCache(cache: UpdateCache): void {\n try {\n ensureConfigDir();\n writeFileSync(getCacheFile(), JSON.stringify(cache), \"utf-8\");\n } catch {\n /* v8 ignore next -- defensive: write errors silently ignored */\n }\n}\n\nfunction shouldCheck(cache: UpdateCache | null): boolean {\n if (!cache) return true;\n return Date.now() - cache.lastCheck >= CHECK_INTERVAL_MS;\n}\n\nexport function compareSemver(current: string, latest: string): boolean {\n const parse = (v: string) =>\n v.replace(/^v/, \"\").split(\".\").map(Number) as [number, number, number];\n const [cMajor, cMinor, cPatch] = parse(current);\n const [lMajor, lMinor, lPatch] = parse(latest);\n if (lMajor !== cMajor) return lMajor > cMajor;\n if (lMinor !== cMinor) return lMinor > cMinor;\n return lPatch > cPatch;\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const res = await fetch(REGISTRY_URL, {\n signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\n/* v8 ignore next 3 -- fallback for bundled builds where package.json is unavailable */\nfunction getCurrentVersion(): string {\n return process.env.npm_package_version ?? \"0.0.0\";\n}\n\nexport function formatUpdateBox(current: string, latest: string): string {\n const message = `Update available: ${current} → ${latest}`;\n const install = `Run ${chalk.cyan(`npm i -g ${PACKAGE_NAME}`)} to update`;\n const lines = [message, install];\n const maxLen = Math.max(\n ...lines.map((l) => stripAnsi(l).length),\n );\n const pad = (line: string) => {\n const visible = stripAnsi(line).length;\n return line + \" \".repeat(maxLen - visible);\n };\n const empty = \" \".repeat(maxLen);\n const top = `╭${\"─\".repeat(maxLen + 4)}╮`;\n const bottom = `╰${\"─\".repeat(maxLen + 4)}╯`;\n const boxLines = [\n top,\n `│ ${empty} │`,\n ...lines.map((l) => `│ ${pad(l)} │`),\n `│ ${empty} │`,\n bottom,\n ];\n return chalk.yellow(boxLines.join(\"\\n\"));\n}\n\nfunction stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n}\n\nexport async function startUpdateCheck(): Promise<UpdateCheckResult | null> {\n if (isCheckDisabled()) return null;\n\n let currentVersion: string;\n try {\n const pkgPath = new URL(\"../package.json\", import.meta.url);\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as {\n version: string;\n };\n currentVersion = pkg.version;\n /* v8 ignore start -- fallback for bundled builds */\n } catch {\n currentVersion = getCurrentVersion();\n }\n /* v8 ignore stop */\n\n const cache = loadCache();\n\n if (!shouldCheck(cache)) {\n if (cache?.latestVersion && compareSemver(currentVersion, cache.latestVersion)) {\n return { currentVersion, latestVersion: cache.latestVersion };\n }\n return null;\n }\n\n const latestVersion = await fetchLatestVersion();\n\n saveCache({\n lastCheck: Date.now(),\n latestVersion: latestVersion ?? cache?.latestVersion,\n });\n\n if (latestVersion && compareSemver(currentVersion, latestVersion)) {\n return { currentVersion, latestVersion };\n }\n\n return null;\n}\n\nexport function printUpdateNotification(result: UpdateCheckResult | null): void {\n if (!result) return;\n const box = formatUpdateBox(result.currentVersion, result.latestVersion);\n process.stderr.write(\"\\n\" + box + \"\\n\");\n}\n","import { createProgram } from \"./cli.js\";\nimport { startUpdateCheck, printUpdateNotification } from \"./update-notifier.js\";\n\nconst updateCheckPromise = startUpdateCheck();\nconst program = createProgram();\nawait program.parseAsync();\nconst updateResult = await updateCheckPromise;\nprintUpdateNotification(updateResult);\n"],"mappings":"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","names":["createRequire","Command","header","chalk","program","program","onData","onError","config","program","program","readFileSync","createInterface","program","program","program","program","program","program","program","program","program","program","program","program","require","createRequire","program","require","createRequire","require","createRequire","program","Command","readFileSync","writeFileSync","join","chalk","join","readFileSync","writeFileSync","chalk"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/config.ts","../src/output.ts","../src/commands/help.ts","../src/commands/config.ts","../src/commands/auth.ts","../src/oauth.ts","../src/client.ts","../src/helpers.ts","../src/prompt.ts","../src/token.ts","../src/input.ts","../src/commands/me-oauth-clients.ts","../src/commands/profile.ts","../src/commands/attrs.ts","../src/commands/entities.ts","../src/commands/batch.ts","../src/commands/subscriptions.ts","../src/commands/registrations.ts","../src/commands/types.ts","../src/commands/temporal.ts","../src/commands/snapshots.ts","../src/commands/admin/tenants.ts","../src/commands/admin/users.ts","../src/commands/admin/policies.ts","../src/commands/admin/oauth-clients.ts","../src/commands/admin/index.ts","../src/commands/rules.ts","../src/commands/models.ts","../src/commands/catalog.ts","../src/commands/health.ts","../src/commands/cli.ts","../src/update-notifier.ts","../src/index.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { Command } from \"commander\";\nimport { registerConfigCommand } from \"./commands/config.js\";\nimport { registerAuthCommands } from \"./commands/auth.js\";\nimport { registerProfileCommands } from \"./commands/profile.js\";\nimport { registerEntitiesCommand } from \"./commands/entities.js\";\nimport { registerBatchCommand } from \"./commands/batch.js\";\nimport { registerSubscriptionsCommand } from \"./commands/subscriptions.js\";\nimport { registerRegistrationsCommand } from \"./commands/registrations.js\";\nimport { registerTypesCommand } from \"./commands/types.js\";\nimport { registerTemporalCommand } from \"./commands/temporal.js\";\nimport { registerSnapshotsCommand } from \"./commands/snapshots.js\";\nimport { registerAdminCommand } from \"./commands/admin/index.js\";\nimport { registerRulesCommand } from \"./commands/rules.js\";\nimport { registerModelsCommand } from \"./commands/models.js\";\nimport { registerCatalogCommand } from \"./commands/catalog.js\";\nimport { registerHealthCommand, registerVersionCommand } from \"./commands/health.js\";\nimport { registerHelpCommand } from \"./commands/help.js\";\nimport { registerCliCommand } from \"./commands/cli.js\";\nimport { addAttrsSubcommands } from \"./commands/attrs.js\";\n\nexport function createProgram(): Command {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { description: string };\n const program = new Command();\n\n program\n .name(\"geonic\")\n .description(pkg.description)\n .option(\"-u, --url <url>\", \"Base URL of the GeonicDB server\")\n .option(\"-s, --service <name>\", \"NGSILD-Tenant header\")\n .option(\"--token <token>\", \"Authentication token\")\n .option(\"-p, --profile <name>\", \"Use a named profile\")\n .option(\"--api-key <key>\", \"API key for authentication\")\n .option(\"-f, --format <fmt>\", \"Output format: json, table, geojson\")\n .option(\"--no-color\", \"Disable color output\")\n .option(\"-v, --verbose\", \"Verbose output\")\n .option(\"--dry-run\", \"Print the equivalent curl command without executing\");\n\n registerHelpCommand(program);\n registerConfigCommand(program);\n registerAuthCommands(program);\n registerProfileCommands(program);\n registerEntitiesCommand(program);\n registerBatchCommand(program);\n registerSubscriptionsCommand(program);\n registerRegistrationsCommand(program);\n registerTypesCommand(program);\n registerTemporalCommand(program);\n registerSnapshotsCommand(program);\n registerAdminCommand(program);\n registerRulesCommand(program);\n registerModelsCommand(program);\n registerCatalogCommand(program);\n registerHealthCommand(program);\n registerVersionCommand(program);\n registerCliCommand(program);\n\n // Backward-compatible hidden 'attrs' command at top level\n const hiddenAttrs = new Command(\"attrs\")\n .description(\"Manage entity attributes\");\n addAttrsSubcommands(hiddenAttrs);\n program.addCommand(hiddenAttrs, { hidden: true });\n\n return program;\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { GdbConfig, GdbConfigFile } from \"./types.js\";\n\nexport function getConfigDir(): string {\n return process.env.GEONIC_CONFIG_DIR ?? join(homedir(), \".config\", \"geonic\");\n}\n\nfunction getConfigFile(): string {\n return join(getConfigDir(), \"config.json\");\n}\n\nexport function ensureConfigDir(): void {\n const dir = getConfigDir();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\nfunction migrateV1ToV2(data: Record<string, unknown>): GdbConfigFile {\n const profile: GdbConfig = {};\n const knownKeys = [\n \"url\",\n \"service\",\n \"token\",\n \"refreshToken\",\n \"format\",\n \"apiKey\",\n ];\n for (const key of knownKeys) {\n if (key in data) {\n (profile as Record<string, unknown>)[key] = data[key];\n }\n }\n return {\n version: 2,\n currentProfile: \"default\",\n profiles: { default: profile },\n };\n}\n\nfunction isGdbConfigFile(value: unknown): value is GdbConfigFile {\n /* v8 ignore next -- loadConfigFile always passes an object with version key */\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n return (\n v.version === 2 &&\n typeof v.currentProfile === \"string\" &&\n typeof v.profiles === \"object\" &&\n v.profiles !== null\n );\n}\n\nfunction defaultConfig(): GdbConfigFile {\n return { version: 2, currentProfile: \"default\", profiles: { default: {} } };\n}\n\nexport function loadConfigFile(): GdbConfigFile {\n try {\n const raw = readFileSync(getConfigFile(), \"utf-8\");\n const data = JSON.parse(raw) as Record<string, unknown>;\n\n if (!(\"version\" in data)) {\n const migrated = migrateV1ToV2(data);\n saveConfigFile(migrated);\n return migrated;\n }\n\n if (!isGdbConfigFile(data)) {\n return defaultConfig();\n }\n\n return data;\n } catch {\n return defaultConfig();\n }\n}\n\nexport function saveConfigFile(configFile: GdbConfigFile): void {\n ensureConfigDir();\n writeFileSync(getConfigFile(), JSON.stringify(configFile, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function loadConfig(profileName?: string): GdbConfig {\n const configFile = loadConfigFile();\n const name = profileName ?? configFile.currentProfile;\n return configFile.profiles[name] ?? {};\n}\n\nexport function saveConfig(config: GdbConfig, profileName?: string): void {\n const configFile = loadConfigFile();\n const name = profileName ?? configFile.currentProfile;\n configFile.profiles[name] = config;\n saveConfigFile(configFile);\n}\n\nexport function getConfigValue(key: string, profileName?: string): unknown {\n const config = loadConfig(profileName);\n return config[key as keyof GdbConfig];\n}\n\nexport function validateUrl(url: string): string {\n url = url.trim();\n if (!url) {\n throw new Error(\"URL must not be empty.\");\n }\n if (!/^https?:\\/\\//i.test(url)) {\n throw new Error(`Invalid URL: \"${url}\". URL must start with http:// or https://.`);\n }\n try {\n new URL(url);\n } catch {\n throw new Error(`Invalid URL: \"${url}\".`);\n }\n return url.replace(/\\/+$/, \"\") + \"/\";\n}\n\nexport function setConfigValue(key: string, value: string, profileName?: string): void {\n const config = loadConfig(profileName);\n if (key === \"url\") {\n value = validateUrl(value);\n }\n (config as Record<string, unknown>)[key] = value;\n saveConfig(config, profileName);\n}\n\nexport function deleteConfigValue(key: string, profileName?: string): void {\n const config = loadConfig(profileName);\n delete (config as Record<string, unknown>)[key];\n saveConfig(config, profileName);\n}\n\nexport function getConfigPath(): string {\n return getConfigFile();\n}\n\nexport function listProfiles(): { name: string; active: boolean }[] {\n const configFile = loadConfigFile();\n return Object.keys(configFile.profiles).map((name) => ({\n name,\n active: name === configFile.currentProfile,\n }));\n}\n\nexport function getCurrentProfile(): string {\n return loadConfigFile().currentProfile;\n}\n\nexport function setCurrentProfile(name: string): void {\n const configFile = loadConfigFile();\n if (!(name in configFile.profiles)) {\n throw new Error(`Profile \"${name}\" does not exist.`);\n }\n configFile.currentProfile = name;\n saveConfigFile(configFile);\n}\n\nexport function createProfile(name: string): void {\n const configFile = loadConfigFile();\n if (name in configFile.profiles) {\n throw new Error(`Profile \"${name}\" already exists.`);\n }\n configFile.profiles[name] = {};\n saveConfigFile(configFile);\n}\n\nexport function deleteProfile(name: string): void {\n if (name === \"default\") {\n throw new Error('Cannot delete the \"default\" profile.');\n }\n const configFile = loadConfigFile();\n if (!(name in configFile.profiles)) {\n throw new Error(`Profile \"${name}\" does not exist.`);\n }\n delete configFile.profiles[name];\n if (configFile.currentProfile === name) {\n configFile.currentProfile = \"default\";\n }\n saveConfigFile(configFile);\n}\n","import chalk from \"chalk\";\nimport type { OutputFormat } from \"./types.js\";\n\nexport function formatOutput(data: unknown, format: OutputFormat): string {\n switch (format) {\n case \"json\":\n return JSON.stringify(data, null, 2);\n case \"table\":\n return formatTable(data);\n case \"geojson\":\n return JSON.stringify(toGeoJSON(data), null, 2);\n default:\n return JSON.stringify(data, null, 2);\n }\n}\n\nexport function printOutput(data: unknown, format: OutputFormat): void {\n console.log(formatOutput(data, format));\n}\n\nexport function printSuccess(message: string): void {\n console.log(chalk.green(message));\n}\n\nexport function printError(message: string): void {\n console.error(chalk.red(`Error: ${message}`));\n}\n\nexport function printInfo(message: string): void {\n console.log(chalk.cyan(message));\n}\n\nexport function printWarning(message: string): void {\n console.error(chalk.yellow(message));\n}\n\nexport function printCount(count: number): void {\n console.log(chalk.dim(`Count: ${count}`));\n}\n\nfunction formatTable(data: unknown): string {\n if (!Array.isArray(data)) {\n if (typeof data === \"object\" && data !== null) {\n return formatObjectTable(data as Record<string, unknown>);\n }\n return String(data);\n }\n\n if (data.length === 0) return \"(empty)\";\n\n const items = data as Record<string, unknown>[];\n const keys = collectKeys(items);\n\n const widths = new Map<string, number>();\n for (const key of keys) {\n widths.set(key, key.length);\n }\n for (const item of items) {\n for (const key of keys) {\n const val = cellValue(item[key]);\n widths.set(key, Math.max(widths.get(key)!, val.length));\n }\n }\n\n const header = keys.map((k) => chalk.bold(k.padEnd(widths.get(k)!))).join(\" \");\n const separator = keys.map((k) => \"─\".repeat(widths.get(k)!)).join(\"──\");\n const rows = items.map((item) =>\n keys.map((k) => cellValue(item[k]).padEnd(widths.get(k)!)).join(\" \"),\n );\n\n return [header, separator, ...rows].join(\"\\n\");\n}\n\nfunction formatObjectTable(obj: Record<string, unknown>): string {\n const entries = Object.entries(obj);\n if (entries.length === 0) return \"(empty)\";\n\n const keyWidth = Math.max(...entries.map(([k]) => k.length));\n return entries.map(([k, v]) => `${chalk.bold(k.padEnd(keyWidth))} ${cellValue(v)}`).join(\"\\n\");\n}\n\nfunction collectKeys(items: Record<string, unknown>[]): string[] {\n const priority = [\"id\", \"type\"];\n const keySet = new Set<string>();\n for (const item of items) {\n for (const key of Object.keys(item)) {\n keySet.add(key);\n }\n }\n const sorted: string[] = [];\n for (const p of priority) {\n if (keySet.has(p)) {\n sorted.push(p);\n keySet.delete(p);\n }\n }\n sorted.push(...Array.from(keySet).sort());\n return sorted;\n}\n\nfunction cellValue(val: unknown): string {\n if (val === undefined || val === null) return \"\";\n if (typeof val === \"object\") {\n const obj = val as Record<string, unknown>;\n if (\"value\" in obj) return String(obj.value);\n return JSON.stringify(val);\n }\n return String(val);\n}\n\nfunction toGeoJSON(data: unknown): unknown {\n if (Array.isArray(data)) {\n return {\n type: \"FeatureCollection\",\n features: data.map(entityToFeature),\n };\n }\n return entityToFeature(data);\n}\n\nfunction entityToFeature(entity: unknown): unknown {\n if (typeof entity !== \"object\" || entity === null) {\n return { type: \"Feature\", geometry: null, properties: entity };\n }\n\n const obj = entity as Record<string, unknown>;\n let geometry = null;\n\n if (obj.location) {\n const loc = obj.location as Record<string, unknown>;\n geometry = loc.value ?? loc;\n }\n\n const properties: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (key === \"location\") continue;\n if (typeof value === \"object\" && value !== null && \"value\" in (value as object)) {\n properties[key] = (value as Record<string, unknown>).value;\n } else {\n properties[key] = value;\n }\n }\n\n return { type: \"Feature\", geometry, properties };\n}\n","import chalk from \"chalk\";\nimport type { Command, Help, Option } from \"commander\";\n\ninterface Example {\n description: string;\n command: string;\n}\n\nconst examplesMap = new WeakMap<Command, Example[]>();\n\nexport function addExamples(cmd: Command, examples: Example[]): void {\n examplesMap.set(cmd, examples);\n}\n\nfunction header(title: string): string {\n return chalk.yellow.bold(title);\n}\n\nfunction findCommand(parent: Command, name: string): Command | undefined {\n return parent.commands.find(\n (c) => c.name() === name || c.aliases().includes(name),\n );\n}\n\nfunction getCommandPath(cmd: Command): string {\n const parts: string[] = [];\n let current: Command | null = cmd;\n while (current) {\n parts.unshift(current.name());\n current = current.parent;\n }\n return parts.join(\" \");\n}\n\nfunction getRootProgram(cmd: Command): Command {\n let root = cmd;\n while (root.parent) {\n root = root.parent;\n }\n return root;\n}\n\nfunction formatOptionSynopsis(opt: Option): string {\n /* v8 ignore next -- Commander always sets long or short */\n const flag = opt.long || opt.short || \"\";\n if (opt.required) {\n const match = opt.flags.match(/<([^>]+)>/);\n const valueName = match ? match[1] : \"value\";\n return `[${flag}=<${valueName}>]`;\n } else if (opt.optional) {\n const match = opt.flags.match(/\\[([^\\]]+)\\]/);\n const valueName = match ? match[1] : \"value\";\n return `[${flag}[=<${valueName}>]]`;\n }\n return `[${flag}]`;\n}\n\nfunction formatSynopsis(path: string, cmd: Command): string {\n const parts = [path];\n\n for (const arg of cmd.registeredArguments) {\n if (arg.required) {\n parts.push(`<${arg.name()}>`);\n } else {\n parts.push(`[<${arg.name()}>]`);\n }\n }\n\n for (const opt of cmd.options) {\n if (opt.hidden) continue;\n parts.push(formatOptionSynopsis(opt));\n }\n\n return parts.join(\" \");\n}\n\nfunction formatOptionList(options: readonly Option[]): string[] {\n const maxLen = Math.max(...options.map((o) => o.flags.length));\n return options.map((opt) => {\n const flags = opt.flags.padEnd(maxLen + 2);\n /* v8 ignore next -- Commander always sets description to '' */\n return ` ${chalk.green(flags)}${opt.description ?? \"\"}`;\n });\n}\n\nfunction formatGlobalParameters(program: Command): string {\n const lines: string[] = [];\n lines.push(header(\"GLOBAL PARAMETERS\"));\n lines.push(\"\");\n lines.push(...formatOptionList(program.options));\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nexport function formatTopLevelHelp(program: Command): string {\n const lines: string[] = [];\n\n lines.push(header(\"NAME\"));\n lines.push(\"\");\n lines.push(` ${program.name()}`);\n lines.push(\"\");\n lines.push(header(\"DESCRIPTION\"));\n lines.push(\"\");\n lines.push(` ${program.description()}`);\n lines.push(\"\");\n lines.push(header(\"AVAILABLE COMMANDS\"));\n lines.push(\"\");\n\n const commands = program.commands\n .filter((c) => !(c as Command & { _hidden?: boolean })._hidden)\n .slice()\n .sort((a, b) => a.name().localeCompare(b.name()));\n\n const maxLen = Math.max(...commands.map((c) => c.name().length));\n\n for (const cmd of commands) {\n const name = cmd.name().padEnd(maxLen + 2);\n lines.push(` ${chalk.green(name)}${cmd.summary() || cmd.description()}`);\n }\n\n lines.push(\"\");\n lines.push(formatGlobalParameters(program));\n\n return lines.join(\"\\n\");\n}\n\nexport function formatCommandDetails(\n program: Command,\n cmd: Command,\n path: string,\n): string {\n const lines: string[] = [];\n\n // NAME\n lines.push(header(\"NAME\"));\n lines.push(\"\");\n const aliases = cmd.aliases().filter((a) => a.length > 0);\n if (aliases.length > 0) {\n lines.push(` ${path} ${chalk.dim(`(alias: ${aliases.join(\", \")})`)}`);\n } else {\n lines.push(` ${path}`);\n }\n\n // DESCRIPTION\n lines.push(\"\");\n lines.push(header(\"DESCRIPTION\"));\n lines.push(\"\");\n for (const descLine of cmd.description().split(\"\\n\")) {\n lines.push(` ${descLine}`);\n }\n\n const subcommands = cmd.commands.filter(\n (c) => !(c as Command & { _hidden?: boolean })._hidden,\n );\n\n if (subcommands.length > 0) {\n // Command group with subcommands\n lines.push(\"\");\n lines.push(header(\"SYNOPSIS\"));\n lines.push(\"\");\n lines.push(` ${path} <command>`);\n lines.push(\"\");\n lines.push(header(\"SUBCOMMANDS\"));\n lines.push(\"\");\n\n const maxLen = Math.max(...subcommands.map((c) => c.name().length));\n for (const sub of subcommands) {\n const name = sub.name().padEnd(maxLen + 2);\n lines.push(` ${chalk.green(name)}${sub.summary() || sub.description()}`);\n }\n } else {\n // Leaf command\n lines.push(\"\");\n lines.push(header(\"SYNOPSIS\"));\n lines.push(\"\");\n lines.push(` ${formatSynopsis(path, cmd)}`);\n\n const options = cmd.options.filter((o) => !o.hidden);\n if (options.length > 0) {\n lines.push(\"\");\n lines.push(header(\"OPTIONS\"));\n lines.push(\"\");\n lines.push(...formatOptionList(options));\n }\n }\n\n // EXAMPLES\n const examples = examplesMap.get(cmd);\n if (examples && examples.length > 0) {\n lines.push(\"\");\n lines.push(header(\"EXAMPLES\"));\n lines.push(\"\");\n for (const ex of examples) {\n lines.push(` ${ex.description}:`);\n lines.push(` $ ${ex.command}`);\n lines.push(\"\");\n }\n }\n\n // GLOBAL PARAMETERS\n lines.push(\"\");\n lines.push(formatGlobalParameters(program));\n\n return lines.join(\"\\n\");\n}\n\nfunction showHelp(program: Command, args: string[]): void {\n if (args.length === 0) {\n console.log(formatTopLevelHelp(program));\n return;\n }\n\n let current = program;\n const resolved: Command[] = [];\n\n for (let i = 0; i < args.length; i++) {\n const found = findCommand(current, args[i]);\n if (!found) {\n const attempted = args.slice(0, i + 1).join(\" \");\n console.error(\n chalk.red(`Error: '${attempted}' is not a geonic command.`),\n );\n console.error(`\\nSee 'geonic help' for available commands.`);\n process.exit(1);\n }\n resolved.push(found);\n current = found;\n }\n\n const target = resolved[resolved.length - 1];\n const path = [program.name(), ...resolved.map((c) => c.name())].join(\" \");\n\n console.log(formatCommandDetails(program, target, path));\n}\n\nexport function registerHelpCommand(program: Command): void {\n // Disable Commander's built-in help command\n program.addHelpCommand(false);\n\n // Override --help to use our wp-cli style format\n program.configureHelp({\n formatHelp: (cmd: Command, _helper: Help): string => {\n const root = getRootProgram(cmd);\n if (cmd === root) {\n return formatTopLevelHelp(root);\n }\n const path = getCommandPath(cmd);\n return formatCommandDetails(root, cmd, path);\n },\n });\n\n // Register the `help` command\n program\n .command(\"help\")\n .description(\"Get help on a specific command\")\n .argument(\"[args...]\")\n .allowUnknownOption()\n .action((args: string[]) => {\n showHelp(program, args);\n });\n\n // Show help when `geonic` is run with no arguments, or show error for unknown commands\n program.argument(\"[command...]\").action((commands: string[]) => {\n if (commands.length > 0) {\n console.error(\n `geonic: '${commands[0]}' is not a geonic command. See 'geonic help'.`,\n );\n process.exitCode = 1;\n return;\n }\n showHelp(program, []);\n });\n}\n","import type { Command } from \"commander\";\nimport {\n loadConfig,\n getConfigValue,\n setConfigValue,\n deleteConfigValue,\n getConfigPath,\n} from \"../config.js\";\nimport { printOutput, printSuccess, printInfo } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nconst SENSITIVE_CONFIG_KEYS = new Set([\"token\", \"refreshToken\", \"apiKey\"]);\n\nexport function registerConfigCommand(program: Command): void {\n const config = program\n .command(\"config\")\n .description(\"Manage CLI configuration\");\n\n const set = config\n .command(\"set\")\n .description(\"Save a config value\")\n .argument(\n \"<key>\",\n \"Configuration key (url, service, token, refreshToken, format, apiKey)\",\n )\n .argument(\"<value>\", \"Configuration value\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const key = args[0] as string;\n const value = args[1] as string;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n setConfigValue(key, value, profile);\n const display = SENSITIVE_CONFIG_KEYS.has(key) ? \"***\" : value;\n printSuccess(`Set ${key} = ${display}`);\n });\n\n addExamples(set, [\n {\n description: \"Set server URL\",\n command: \"geonic config set url https://api.example.com\",\n },\n {\n description: \"Set tenant (NGSILD-Tenant header)\",\n command: \"geonic config set service my-tenant\",\n },\n {\n description: \"Set authentication token\",\n command: \"geonic config set token eyJhbGciOi...\",\n },\n {\n description: \"Set API key\",\n command: \"geonic config set apiKey your-api-key\",\n },\n {\n description: \"Set default output format\",\n command: \"geonic config set format table\",\n },\n {\n description: \"Set config for a specific profile\",\n command:\n \"geonic config set url https://staging.example.com --profile staging\",\n },\n ]);\n\n const get = config\n .command(\"get\")\n .description(\"Get a config value\")\n .argument(\"<key>\", \"Configuration key\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const key = args[0] as string;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n const value = getConfigValue(key, profile);\n if (value === undefined) {\n printInfo(`Key \"${key}\" is not set.`);\n } else {\n printOutput(value, \"json\");\n }\n });\n\n addExamples(get, [\n {\n description: \"Get server URL\",\n command: \"geonic config get url\",\n },\n {\n description: \"Get config value for a specific profile\",\n command: \"geonic config get url --profile staging\",\n },\n ]);\n\n const list = config\n .command(\"list\")\n .description(\"List all config values\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n const all = loadConfig(profile);\n if (Object.keys(all).length === 0) {\n printInfo(`No configuration set. Config path: ${getConfigPath()}`);\n } else {\n printOutput(all, \"json\");\n }\n });\n\n addExamples(list, [\n {\n description: \"List all configuration values\",\n command: \"geonic config list\",\n },\n ]);\n\n const del = config\n .command(\"delete\")\n .description(\"Delete a config value\")\n .argument(\"<key>\", \"Configuration key\")\n .action((...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const key = args[0] as string;\n const profile = (cmd.optsWithGlobals() as { profile?: string }).profile;\n deleteConfigValue(key, profile);\n printSuccess(`Deleted key \"${key}\".`);\n });\n\n addExamples(del, [\n {\n description: \"Delete a config value\",\n command: \"geonic config delete url\",\n },\n ]);\n}\n","import { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n resolveOptions,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { loadConfig, saveConfig, getCurrentProfile } from \"../config.js\";\nimport { printSuccess, printError, printInfo, printWarning } from \"../output.js\";\nimport { isInteractive, promptEmail, promptPassword } from \"../prompt.js\";\nimport { getTokenStatus, formatDuration } from \"../token.js\";\nimport { clientCredentialsGrant } from \"../oauth.js\";\nimport { addExamples } from \"./help.js\";\nimport { addMeOAuthClientsSubcommand } from \"./me-oauth-clients.js\";\n\nfunction createLoginCommand(): Command {\n return new Command(\"login\")\n .description(\"Authenticate and save token\")\n .option(\"--client-credentials\", \"Use OAuth 2.0 Client Credentials flow\")\n .option(\"--client-id <id>\", \"OAuth client ID\")\n .option(\"--client-secret <secret>\", \"OAuth client secret\")\n .option(\"--scope <scopes>\", \"OAuth scopes (space-separated)\")\n .option(\"--tenant-id <id>\", \"Tenant ID for scoped authentication\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const loginOpts = cmd.opts() as {\n clientCredentials?: boolean;\n clientId?: string;\n clientSecret?: string;\n scope?: string;\n tenantId?: string;\n };\n const globalOpts = resolveOptions(cmd);\n\n if (loginOpts.clientCredentials) {\n const clientId = loginOpts.clientId ?? process.env.GDB_OAUTH_CLIENT_ID;\n const clientSecret = loginOpts.clientSecret ?? process.env.GDB_OAUTH_CLIENT_SECRET;\n\n if (!clientId || !clientSecret) {\n printError(\n \"Client ID and secret are required. Use --client-id/--client-secret or GDB_OAUTH_CLIENT_ID/GDB_OAUTH_CLIENT_SECRET.\",\n );\n process.exit(1);\n }\n\n if (!globalOpts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n\n const result = await clientCredentialsGrant({\n baseUrl: globalOpts.url,\n clientId,\n clientSecret,\n scope: loginOpts.scope,\n });\n\n const config = loadConfig(globalOpts.profile);\n config.token = result.access_token;\n delete config.refreshToken;\n saveConfig(config, globalOpts.profile);\n\n printSuccess(\"Login successful (OAuth Client Credentials). Token saved to config.\");\n return;\n }\n\n // Email/password flow\n let email = process.env.GDB_EMAIL;\n let password = process.env.GDB_PASSWORD;\n\n if (!email || !password) {\n if (isInteractive()) {\n if (!email) email = await promptEmail();\n if (!password) password = await promptPassword();\n } else {\n printError(\n \"Set GDB_EMAIL and GDB_PASSWORD environment variables, or run in a terminal for interactive login.\",\n );\n process.exit(1);\n }\n }\n\n const client = createClient(cmd);\n const body: Record<string, string> = { email, password };\n if (loginOpts.tenantId) {\n body.tenantId = loginOpts.tenantId;\n }\n\n const response = await client.rawRequest(\"POST\", \"/auth/login\", { body });\n\n const data = response.data as Record<string, unknown>;\n const token = (data.accessToken ?? data.token) as string | undefined;\n const refreshToken = data.refreshToken as string | undefined;\n\n if (!token) {\n printError(\"No token received from server.\");\n process.exit(1);\n }\n\n const config = loadConfig(globalOpts.profile);\n config.token = token;\n if (refreshToken) {\n config.refreshToken = refreshToken;\n } else {\n delete config.refreshToken;\n }\n saveConfig(config, globalOpts.profile);\n\n printSuccess(\"Login successful. Token saved to config.\");\n }),\n );\n}\n\nfunction createLogoutCommand(): Command {\n return new Command(\"logout\")\n .description(\"Clear saved authentication token\")\n .action(\n withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const globalOpts = resolveOptions(cmd);\n const config = loadConfig(globalOpts.profile);\n\n // Try to notify server (best effort)\n if (config.token && globalOpts.url) {\n try {\n const client = createClient(cmd);\n await client.rawRequest(\"POST\", \"/auth/logout\");\n } catch {\n // Ignore errors - token may already be invalid\n }\n }\n\n delete config.token;\n delete config.refreshToken;\n saveConfig(config, globalOpts.profile);\n printSuccess(\"Logged out. Token cleared from config.\");\n }),\n );\n}\n\nfunction createMeAction() {\n return withErrorHandler(async (...args: unknown[]) => {\n const cmd = args[args.length - 1] as Command;\n const globalOpts = resolveOptions(cmd);\n\n if (!globalOpts.token && !globalOpts.apiKey) {\n printInfo(\"Not logged in. Use `geonic auth login` to authenticate.\");\n return;\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/me\");\n outputResponse(response, format);\n\n // Suppress additional human-readable logs for structured formats\n if (format && format !== \"table\") {\n return;\n }\n\n // Show token expiry if token exists (re-read in case of auto-refresh)\n const latestConfig = loadConfig(globalOpts.profile);\n if (latestConfig.token) {\n const status = getTokenStatus(latestConfig.token);\n if (status.expiresAt) {\n if (status.isExpired) {\n printError(`Token expires: ${status.expiresAt.toISOString()} (expired)`);\n } else if (status.isExpiringSoon) {\n printWarning(\n `Token expires: ${status.expiresAt.toISOString()} (${formatDuration(status.remainingMs!)} remaining)`,\n );\n } else {\n printInfo(\n `Token expires: ${status.expiresAt.toISOString()} (${formatDuration(status.remainingMs!)} remaining)`,\n );\n }\n }\n }\n\n // Show current profile\n const profileName = globalOpts.profile ?? getCurrentProfile();\n printInfo(`Profile: ${profileName}`);\n });\n}\n\nexport function registerAuthCommands(program: Command): void {\n // auth command group with login/logout subcommands\n const auth = program\n .command(\"auth\")\n .description(\"Manage authentication\");\n\n const login = createLoginCommand();\n addExamples(login, [\n {\n description: \"Interactive login (email/password prompt)\",\n command: \"geonic auth login\",\n },\n {\n description: \"Login with OAuth client credentials\",\n command:\n \"geonic auth login --client-credentials --client-id MY_ID --client-secret MY_SECRET\",\n },\n {\n description: \"Login with environment variables\",\n command: \"GDB_EMAIL=user@example.com GDB_PASSWORD=pass geonic auth login\",\n },\n {\n description: \"Login to a specific tenant\",\n command: \"geonic auth login --tenant-id my-tenant\",\n },\n ]);\n auth.addCommand(login);\n\n const logout = createLogoutCommand();\n addExamples(logout, [\n {\n description: \"Clear saved authentication token\",\n command: \"geonic auth logout\",\n },\n ]);\n auth.addCommand(logout);\n\n // me command (top-level, maps to /me API endpoint)\n const me = program\n .command(\"me\")\n .description(\"Display current authenticated user and manage user resources\");\n\n // Default action: show user info when no subcommand is given\n const meInfo = me\n .command(\"info\", { isDefault: true, hidden: true })\n .description(\"Display current authenticated user\")\n .action(createMeAction());\n\n addExamples(me, [\n {\n description: \"Show current user info\",\n command: \"geonic me\",\n },\n {\n description: \"List your OAuth clients\",\n command: \"geonic me oauth-clients list\",\n },\n ]);\n\n addExamples(meInfo, [\n {\n description: \"Show current user info\",\n command: \"geonic me\",\n },\n ]);\n\n // Add me oauth-clients subcommands\n addMeOAuthClientsSubcommand(me);\n\n // Backward-compatible hidden aliases\n program.addCommand(createLoginCommand(), { hidden: true });\n program.addCommand(createLogoutCommand(), { hidden: true });\n\n const hiddenWhoami = new Command(\"whoami\")\n .description(\"Display current authenticated user\")\n .action(createMeAction());\n program.addCommand(hiddenWhoami, { hidden: true });\n}\n","export interface OAuthTokenResponse {\n access_token: string;\n token_type: string;\n expires_in?: number;\n scope?: string;\n}\n\nexport async function clientCredentialsGrant(options: {\n baseUrl: string;\n clientId: string;\n clientSecret: string;\n scope?: string;\n}): Promise<OAuthTokenResponse> {\n const url = new URL(\"/oauth/token\", options.baseUrl).toString();\n const credentials = Buffer.from(`${options.clientId}:${options.clientSecret}`).toString(\"base64\");\n\n const body: Record<string, string> = { grant_type: \"client_credentials\" };\n if (options.scope) {\n body.scope = options.scope;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${credentials}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n let message: string;\n try {\n const err = JSON.parse(text) as Record<string, unknown>;\n message = (err.error_description ?? err.error ?? text) as string;\n } catch {\n message = text || `HTTP ${response.status}`;\n }\n throw new Error(`OAuth token request failed: ${message}`);\n }\n\n return (await response.json()) as OAuthTokenResponse;\n}\n","import type { ClientOptions, ClientResponse, NgsiError } from \"./types.js\";\nimport { clientCredentialsGrant } from \"./oauth.js\";\n\nexport class DryRunSignal extends Error {\n constructor() {\n super(\"dry-run\");\n this.name = \"DryRunSignal\";\n }\n}\n\nexport class GdbClient {\n private baseUrl: string;\n private service?: string;\n private token?: string;\n private refreshToken?: string;\n private apiKey?: string;\n private clientId?: string;\n private clientSecret?: string;\n private onTokenRefresh?: (token: string, refreshToken?: string) => void;\n private verbose: boolean;\n private dryRun: boolean;\n private refreshPromise?: Promise<boolean>;\n\n constructor(options: ClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.service = options.service;\n this.token = options.token;\n this.refreshToken = options.refreshToken;\n this.apiKey = options.apiKey;\n this.clientId = options.clientId;\n this.clientSecret = options.clientSecret;\n this.onTokenRefresh = options.onTokenRefresh;\n this.verbose = options.verbose ?? false;\n this.dryRun = options.dryRun ?? false;\n }\n\n private buildHeaders(extra?: Record<string, string>): Record<string, string> {\n const headers: Record<string, string> = {};\n\n headers[\"Content-Type\"] = \"application/ld+json\";\n headers[\"Accept\"] = \"application/ld+json\";\n if (this.service) headers[\"NGSILD-Tenant\"] = this.service;\n\n if (this.token) {\n headers[\"Authorization\"] = `Bearer ${this.token}`;\n } else if (this.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.apiKey}`;\n }\n\n if (extra) {\n Object.assign(headers, extra);\n }\n\n return headers;\n }\n\n private buildUrl(path: string, params?: Record<string, string>): string {\n const url = new URL(path, this.baseUrl);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== \"\") {\n url.searchParams.set(key, value);\n }\n }\n }\n return url.toString();\n }\n\n private getBasePath(): string {\n return \"/ngsi-ld/v1\";\n }\n\n private static readonly SENSITIVE_HEADERS = new Set([\"authorization\"]);\n private static readonly SENSITIVE_BODY_KEYS = new Set([\n \"password\",\n \"refreshToken\",\n \"token\",\n \"client_secret\",\n \"clientSecret\",\n ]);\n\n private logRequest(\n method: string,\n url: string,\n headers: Record<string, string>,\n body?: string,\n ): void {\n if (!this.verbose) return;\n process.stderr.write(`> ${method} ${url}\\n`);\n for (const [k, v] of Object.entries(headers)) {\n if (GdbClient.SENSITIVE_HEADERS.has(k.toLowerCase())) {\n process.stderr.write(`> ${k}: ***\\n`);\n } else {\n process.stderr.write(`> ${k}: ${v}\\n`);\n }\n }\n if (body) {\n process.stderr.write(`> Body: ${GdbClient.maskBodySecrets(body)}\\n`);\n }\n process.stderr.write(\"\\n\");\n }\n\n private static maskBodySecrets(raw: string): string {\n try {\n const obj = JSON.parse(raw) as Record<string, unknown>;\n for (const key of Object.keys(obj)) {\n if (GdbClient.SENSITIVE_BODY_KEYS.has(key)) {\n obj[key] = \"***\";\n }\n }\n return JSON.stringify(obj);\n } catch {\n return raw;\n }\n }\n\n private logResponse(response: Response): void {\n if (!this.verbose) return;\n process.stderr.write(`< ${response.status} ${response.statusText}\\n`);\n response.headers.forEach((v, k) => {\n process.stderr.write(`< ${k}: ${v}\\n`);\n });\n process.stderr.write(\"\\n\");\n }\n\n private static shellQuote(value: string): string {\n return `'${value.split(\"'\").join(\"'\\\"'\\\"'\")}'`;\n }\n\n static buildCurlCommand(\n method: string,\n url: string,\n headers: Record<string, string>,\n body?: string,\n ): string {\n const parts: string[] = [\"curl\"];\n if (method !== \"GET\") {\n parts.push(`-X ${method}`);\n }\n for (const [key, value] of Object.entries(headers)) {\n parts.push(`-H ${GdbClient.shellQuote(`${key}: ${value}`)}`);\n }\n if (body) {\n parts.push(`-d ${GdbClient.shellQuote(body)}`);\n }\n parts.push(GdbClient.shellQuote(url));\n return parts.join(\" \\\\\\n \");\n }\n\n private handleDryRun(\n method: string,\n url: string,\n headers: Record<string, string>,\n body?: string,\n ): void {\n if (!this.dryRun) return;\n console.log(GdbClient.buildCurlCommand(method, url, headers, body));\n throw new DryRunSignal();\n }\n\n private canRefresh(): boolean {\n return (!!this.refreshToken || (!!this.clientId && !!this.clientSecret)) && !this.apiKey;\n }\n\n private async performTokenRefresh(): Promise<boolean> {\n if (this.refreshPromise) return this.refreshPromise;\n\n this.refreshPromise = this.doRefresh();\n try {\n return await this.refreshPromise;\n } finally {\n this.refreshPromise = undefined;\n }\n }\n\n private async doRefresh(): Promise<boolean> {\n // Try refreshToken first\n if (this.refreshToken) {\n try {\n const url = this.buildUrl(\"/auth/refresh\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ refreshToken: this.refreshToken }),\n });\n\n if (response.ok) {\n const data = (await response.json()) as Record<string, unknown>;\n const newToken = (data.accessToken ?? data.token) as string | undefined;\n const newRefreshToken = data.refreshToken as string | undefined;\n\n if (newToken) {\n this.token = newToken;\n if (newRefreshToken) this.refreshToken = newRefreshToken;\n this.onTokenRefresh?.(newToken, newRefreshToken);\n return true;\n }\n }\n } catch {\n // Fall through to client credentials\n }\n }\n\n // Fallback: client_credentials grant\n if (this.clientId && this.clientSecret) {\n try {\n const result = await clientCredentialsGrant({\n baseUrl: this.baseUrl,\n clientId: this.clientId,\n clientSecret: this.clientSecret,\n });\n this.token = result.access_token;\n this.onTokenRefresh?.(result.access_token);\n return true;\n } catch {\n return false;\n }\n }\n\n return false;\n }\n\n private async executeRequest<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n },\n ): Promise<ClientResponse<T>> {\n const url = this.buildUrl(`${this.getBasePath()}${path}`, options?.params);\n const headers = this.buildHeaders(options?.headers);\n const body = options?.body ? JSON.stringify(options.body) : undefined;\n\n this.logRequest(method, url, headers, body);\n this.handleDryRun(method, url, headers, body);\n const response = await fetch(url, { method, headers, body });\n this.logResponse(response);\n\n const countHeader = response.headers.get(\"NGSILD-Results-Count\");\n const count = countHeader ? parseInt(countHeader, 10) : undefined;\n\n let data: T;\n /* v8 ignore next -- null coalescing for missing content-type header */\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const text = await response.text();\n if (text && (contentType.includes(\"json\") || contentType.includes(\"ld+json\"))) {\n data = JSON.parse(text) as T;\n } else {\n data = text as unknown as T;\n }\n\n if (!response.ok) {\n const err = data as unknown as NgsiError;\n const message =\n err?.description || err?.detail || err?.error || err?.title || `HTTP ${response.status}`;\n throw new GdbClientError(message, response.status, err);\n }\n\n return { status: response.status, headers: response.headers, data, count };\n }\n\n private async executeRawRequest<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n },\n ): Promise<ClientResponse<T>> {\n const url = this.buildUrl(path, options?.params);\n const headers = this.buildHeaders(options?.headers);\n const body = options?.body ? JSON.stringify(options.body) : undefined;\n\n this.logRequest(method, url, headers, body);\n this.handleDryRun(method, url, headers, body);\n const response = await fetch(url, { method, headers, body });\n this.logResponse(response);\n\n let data: T;\n /* v8 ignore next -- null coalescing for missing content-type header */\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const text = await response.text();\n if (text && (contentType.includes(\"json\") || contentType.includes(\"ld+json\"))) {\n data = JSON.parse(text) as T;\n } else {\n data = text as unknown as T;\n }\n\n if (!response.ok) {\n const err = data as unknown as NgsiError;\n const message =\n err?.description || err?.detail || err?.error || err?.title || `HTTP ${response.status}`;\n throw new GdbClientError(message, response.status, err);\n }\n\n return { status: response.status, headers: response.headers, data };\n }\n\n async request<T = unknown>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n },\n ): Promise<ClientResponse<T>> {\n try {\n return await this.executeRequest<T>(method, path, options);\n } catch (err) {\n if (err instanceof GdbClientError && err.status === 401 && this.canRefresh()) {\n const refreshed = await this.performTokenRefresh();\n if (refreshed) {\n return await this.executeRequest<T>(method, path, options);\n }\n }\n throw err;\n }\n }\n\n async get<T = unknown>(\n path: string,\n params?: Record<string, string>,\n headers?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"GET\", path, { params, headers });\n }\n\n async post<T = unknown>(\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"POST\", path, { body, params });\n }\n\n async patch<T = unknown>(\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"PATCH\", path, { body, params });\n }\n\n async put<T = unknown>(\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"PUT\", path, { body, params });\n }\n\n async delete<T = unknown>(\n path: string,\n params?: Record<string, string>,\n ): Promise<ClientResponse<T>> {\n return this.request<T>(\"DELETE\", path, { params });\n }\n\n /** Make a request to a raw URL path (not prefixed with API base path) */\n async rawRequest<T = unknown>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n },\n ): Promise<ClientResponse<T>> {\n try {\n return await this.executeRawRequest<T>(method, path, options);\n } catch (err) {\n if (err instanceof GdbClientError && err.status === 401 && this.canRefresh()) {\n const refreshed = await this.performTokenRefresh();\n if (refreshed) {\n return await this.executeRawRequest<T>(method, path, options);\n }\n }\n throw err;\n }\n }\n}\n\nexport class GdbClientError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly ngsiError?: NgsiError,\n ) {\n super(message);\n this.name = \"GdbClientError\";\n }\n}\n","import { Command } from \"commander\";\nimport { loadConfig, saveConfig, validateUrl } from \"./config.js\";\nimport { DryRunSignal, GdbClient, GdbClientError } from \"./client.js\";\nimport { printError, printOutput, printCount } from \"./output.js\";\nimport type { ClientResponse, GlobalOptions, OutputFormat } from \"./types.js\";\n\n/**\n * Resolve merged options from config + CLI flags.\n */\nexport function resolveOptions(cmd: Command): GlobalOptions {\n const opts = cmd.optsWithGlobals() as GlobalOptions;\n const config = loadConfig(opts.profile);\n return {\n url: opts.url ?? config.url,\n service: opts.service ?? config.service,\n token: opts.token ?? config.token,\n format: opts.format ?? config.format ?? \"json\",\n color: opts.color,\n verbose: opts.verbose,\n profile: opts.profile,\n apiKey: opts.apiKey ?? process.env.GDB_API_KEY ?? config.apiKey,\n dryRun: opts.dryRun,\n };\n}\n\n/**\n * Create a GdbClient from resolved options.\n */\nexport function createClient(cmd: Command): GdbClient {\n const opts = resolveOptions(cmd);\n if (!opts.url) {\n printError(\"No URL configured. Use `geonic config set url <url>` or pass --url.\");\n process.exit(1);\n }\n opts.url = validateUrl(opts.url);\n const cliOpts = cmd.optsWithGlobals() as GlobalOptions;\n const usingCliToken = !!cliOpts.token;\n const config = loadConfig(opts.profile);\n return new GdbClient({\n baseUrl: opts.url,\n service: opts.service,\n token: opts.token,\n refreshToken: usingCliToken ? undefined : config.refreshToken,\n clientId: usingCliToken ? undefined : config.clientId,\n clientSecret: usingCliToken ? undefined : config.clientSecret,\n apiKey: opts.apiKey,\n onTokenRefresh: usingCliToken\n ? undefined\n : (token, refreshToken) => {\n const cfg = loadConfig(opts.profile);\n cfg.token = token;\n if (refreshToken) cfg.refreshToken = refreshToken;\n saveConfig(cfg, opts.profile);\n },\n verbose: opts.verbose,\n dryRun: opts.dryRun,\n });\n}\n\n/**\n * Get the output format from resolved options.\n */\nexport function getFormat(cmd: Command): OutputFormat {\n const opts = resolveOptions(cmd);\n return opts.format as OutputFormat;\n}\n\n/**\n * Standard handler for outputting API responses.\n */\nexport function outputResponse(\n response: ClientResponse,\n format: OutputFormat,\n showCount?: boolean,\n): void {\n if (showCount && response.count !== undefined) {\n printCount(response.count);\n }\n if (response.data !== undefined && response.data !== \"\") {\n printOutput(response.data, format);\n }\n}\n\n/**\n * Wrap an async command handler with error handling.\n */\nexport function withErrorHandler<T extends unknown[]>(fn: (...args: T) => Promise<void>) {\n return async (...args: T) => {\n try {\n await fn(...args);\n } catch (err: unknown) {\n if (err instanceof DryRunSignal) {\n return;\n }\n if (err instanceof GdbClientError && err.status === 401) {\n printError(\"Authentication failed. Please run `geonic login` to re-authenticate.\");\n } else if (err instanceof Error) {\n printError(err.message);\n } else {\n printError(String(err));\n }\n process.exit(1);\n }\n };\n}\n","import { createInterface } from \"node:readline/promises\";\n\nexport function isInteractive(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true;\n}\n\nexport async function promptEmail(): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n const email = await rl.question(\"Email: \");\n return email.trim();\n } finally {\n rl.close();\n }\n}\n\nexport async function promptPassword(): Promise<string> {\n return new Promise((resolve, reject) => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n\n stdout.write(\"Password: \");\n\n if (!stdin.isTTY) {\n let data = \"\";\n stdin.setEncoding(\"utf-8\");\n stdin.resume();\n const cleanup = () => {\n stdin.removeListener(\"data\", onData);\n stdin.removeListener(\"end\", onEnd);\n stdin.removeListener(\"error\", onError);\n stdin.pause();\n };\n const onData = (chunk: string) => {\n const newline = chunk.indexOf(\"\\n\");\n if (newline !== -1) {\n data += chunk.slice(0, newline);\n cleanup();\n stdout.write(\"\\n\");\n resolve(data);\n } else {\n data += chunk;\n }\n };\n const onEnd = () => {\n cleanup();\n stdout.write(\"\\n\");\n resolve(data);\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n stdin.on(\"data\", onData);\n stdin.on(\"end\", onEnd);\n stdin.on(\"error\", onError);\n return;\n }\n\n const wasRaw = stdin.isRaw;\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding(\"utf-8\");\n\n let password = \"\";\n\n const restoreTerminal = () => {\n stdin.removeListener(\"data\", onData);\n stdin.removeListener(\"error\", onError);\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n };\n\n const onError = (err: Error) => {\n restoreTerminal();\n stdout.write(\"\\n\");\n reject(err);\n };\n\n const onData = (char: string) => {\n const code = char.charCodeAt(0);\n\n if (char === \"\\r\" || char === \"\\n\") {\n restoreTerminal();\n stdout.write(\"\\n\");\n resolve(password);\n } else if (code === 3) {\n restoreTerminal();\n stdout.write(\"\\n\");\n reject(new Error(\"User cancelled\"));\n } else if (code === 127 || code === 8) {\n if (password.length > 0) {\n password = password.slice(0, -1);\n stdout.write(\"\\b \\b\");\n }\n } else if (code >= 32) {\n password += char;\n stdout.write(\"*\");\n }\n };\n\n stdin.on(\"data\", onData);\n stdin.on(\"error\", onError);\n });\n}\n","export interface TokenStatus {\n expiresAt: Date | null;\n isExpired: boolean;\n isExpiringSoon: boolean;\n remainingMs: number | null;\n}\n\nexport function decodeJwtPayload(token: string): Record<string, unknown> | null {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) return null;\n const payload = parts[1];\n const json = Buffer.from(payload, \"base64\").toString(\"utf-8\");\n return JSON.parse(json) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nexport function getTokenStatus(token: string): TokenStatus {\n const payload = decodeJwtPayload(token);\n if (!payload || typeof payload.exp !== \"number\") {\n return { expiresAt: null, isExpired: false, isExpiringSoon: false, remainingMs: null };\n }\n\n const expiresAt = new Date(payload.exp * 1000);\n const now = Date.now();\n const remainingMs = expiresAt.getTime() - now;\n const fiveMinutes = 5 * 60 * 1000;\n\n return {\n expiresAt,\n isExpired: remainingMs <= 0,\n isExpiringSoon: remainingMs > 0 && remainingMs <= fiveMinutes,\n remainingMs,\n };\n}\n\nexport function formatDuration(ms: number): string {\n if (ms <= 0) return \"expired\";\n\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n if (hours % 24 > 0) parts.push(`${hours % 24}h`);\n if (minutes % 60 > 0 && days === 0) parts.push(`${minutes % 60}m`);\n if (parts.length === 0) parts.push(`${seconds}s`);\n\n return parts.join(\" \");\n}\n","import JSON5 from \"json5\";\nimport { readFileSync } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\n\n/**\n * Parse JSON input from a string, file (@path), stdin (-), pipe, or interactive mode.\n *\n * Resolution order:\n * 1. Explicit input provided → parse directly (inline, @file, or - for stdin)\n * 2. No input + piped stdin (non-TTY) → auto-read stdin\n * 3. No input + TTY stdin → interactive mode with brace-balanced auto-submit\n *\n * Supports JSON5 syntax (unquoted keys, single quotes, trailing commas).\n */\nexport async function parseJsonInput(input?: string): Promise<unknown> {\n // 1. Explicit input\n if (input !== undefined) {\n if (input === \"-\") return parseData(readFileSync(0, \"utf-8\"));\n if (input.startsWith(\"@\")) return parseData(readFileSync(input.slice(1), \"utf-8\"));\n return parseData(input);\n }\n\n // 2. Piped stdin (non-TTY)\n if (!process.stdin.isTTY) {\n return parseData(readFileSync(0, \"utf-8\"));\n }\n\n // 3. Interactive mode (TTY)\n return readInteractiveJson();\n}\n\nfunction parseData(text: string): unknown {\n return JSON5.parse(text.trim());\n}\n\n/**\n * Read JSON interactively from TTY with brace-balance auto-submit.\n * Tracks depth of {}/[] while respecting string literals.\n * When depth returns to 0, automatically parses and returns.\n */\nasync function readInteractiveJson(): Promise<unknown> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n prompt: \"json> \",\n });\n\n process.stderr.write(\"Enter JSON (auto-submits when braces close, Ctrl+C to cancel):\\n\");\n rl.prompt();\n\n const lines: string[] = [];\n let depth = 0;\n let started = false;\n let inBlockComment = false;\n let inString = false;\n let stringChar = \"\";\n let cancelled = false;\n\n return new Promise<unknown>((resolve, reject) => {\n rl.on(\"SIGINT\", () => {\n cancelled = true;\n rl.close();\n });\n\n rl.on(\"line\", (line) => {\n lines.push(line);\n const result = trackDepth(line, depth, started, inBlockComment, inString, stringChar);\n depth = result.depth;\n started = result.started;\n inBlockComment = result.inBlockComment;\n inString = result.inString;\n stringChar = result.stringChar;\n\n if (started && depth <= 0 && !inBlockComment && !inString) {\n rl.close();\n try {\n resolve(parseData(lines.join(\"\\n\")));\n } catch (err) {\n reject(err);\n }\n } else {\n rl.setPrompt(\"... \");\n rl.prompt();\n }\n });\n\n rl.on(\"close\", () => {\n if (cancelled) {\n reject(new Error(\"Input cancelled.\"));\n return;\n }\n if (lines.length > 0 && (!started || depth > 0 || inBlockComment || inString)) {\n // EOF before balanced — attempt to parse what we have\n try {\n resolve(parseData(lines.join(\"\\n\")));\n } catch (err) {\n reject(err);\n }\n } else if (lines.length === 0) {\n reject(new Error(\"No input provided.\"));\n }\n });\n });\n}\n\n/**\n * Track brace/bracket depth for a line, respecting string literals and JSON5 comments.\n * String and block-comment state is passed in and returned to handle multi-line constructs.\n */\nfunction trackDepth(\n line: string,\n depth: number,\n started: boolean,\n inBlockComment: boolean,\n inString: boolean,\n stringChar: string,\n): { depth: number; started: boolean; inBlockComment: boolean; inString: boolean; stringChar: string } {\n\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n const next = i + 1 < line.length ? line[i + 1] : \"\";\n\n if (inBlockComment) {\n if (ch === \"*\" && next === \"/\") {\n inBlockComment = false;\n i++;\n }\n continue;\n }\n\n if (inString) {\n if (ch === \"\\\\\" && i + 1 < line.length) {\n i++; // skip escaped character\n } else if (ch === stringChar) {\n inString = false;\n }\n continue;\n }\n\n // Line comment — skip rest of line\n if (ch === \"/\" && next === \"/\") break;\n // Block comment start\n if (ch === \"/\" && next === \"*\") {\n inBlockComment = true;\n i++;\n continue;\n }\n\n if (ch === '\"' || ch === \"'\") {\n inString = true;\n stringChar = ch;\n } else if (ch === \"{\" || ch === \"[\") {\n depth++;\n started = true;\n } else if (ch === \"}\" || ch === \"]\") {\n depth--;\n }\n }\n\n return { depth, started, inBlockComment, inString, stringChar };\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, resolveOptions, getFormat, outputResponse } from \"../helpers.js\";\nimport { loadConfig, saveConfig, validateUrl } from \"../config.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess, printError, printInfo, printWarning } from \"../output.js\";\nimport { clientCredentialsGrant } from \"../oauth.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function addMeOAuthClientsSubcommand(me: Command): void {\n const oauthClients = me\n .command(\"oauth-clients\")\n .description(\"Manage your OAuth clients\");\n\n // oauth-clients list\n const list = oauthClients\n .command(\"list\")\n .description(\"List your OAuth clients\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/me/oauth-clients\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List your OAuth clients\",\n command: \"geonic me oauth-clients list\",\n },\n ]);\n\n // oauth-clients create\n const create = oauthClients\n .command(\"create [json]\")\n .description(\"Create a new OAuth client\")\n .option(\"--name <name>\", \"Client name\")\n .option(\"--scopes <scopes>\", \"Allowed scopes (comma-separated)\")\n .option(\"--save\", \"Save credentials to config for automatic re-authentication\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const opts = cmd.opts() as {\n name?: string;\n scopes?: string;\n save?: boolean;\n };\n\n let body: unknown;\n if (json) {\n body = await parseJsonInput(json as string | undefined);\n } else if (opts.name || opts.scopes) {\n // Build body from flags\n const payload: Record<string, unknown> = {};\n if (opts.name) payload.clientName = opts.name;\n if (opts.scopes) payload.allowedScopes = opts.scopes.split(\",\").map((s) => s.trim());\n body = payload;\n } else {\n // Read from stdin (pipe or interactive)\n body = await parseJsonInput();\n }\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/me/oauth-clients\", { body });\n\n const data = response.data as Record<string, unknown>;\n\n if (opts.save) {\n const globalOpts = resolveOptions(cmd);\n const clientId = data.clientId as string | undefined;\n const clientSecret = data.clientSecret as string | undefined;\n\n if (!clientId || !clientSecret) {\n printError(\"Response missing clientId or clientSecret. Cannot save credentials.\");\n outputResponse(response, format);\n printSuccess(\"OAuth client created.\");\n return;\n }\n\n // Perform client_credentials grant to get a fresh token\n const baseUrl = validateUrl(globalOpts.url!);\n const tokenResult = await clientCredentialsGrant({\n baseUrl,\n clientId,\n clientSecret,\n scope: (data.allowedScopes as string[] | undefined)?.join(\" \"),\n });\n\n const config = loadConfig(globalOpts.profile);\n config.clientId = clientId;\n config.clientSecret = clientSecret;\n config.token = tokenResult.access_token;\n delete config.refreshToken;\n saveConfig(config, globalOpts.profile);\n\n printInfo(\"Client credentials saved to config. Auto-reauth enabled.\");\n } else {\n printWarning(\n \"Save the clientSecret now — it will not be shown again.\",\n );\n }\n\n outputResponse(response, format);\n printSuccess(\"OAuth client created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create an OAuth client with flags\",\n command: \"geonic me oauth-clients create --name my-ci-bot --scopes read:entities,write:entities\",\n },\n {\n description: \"Create and save credentials for auto-reauth\",\n command: \"geonic me oauth-clients create --name my-ci-bot --save\",\n },\n {\n description: \"Create an OAuth client from JSON\",\n command: 'geonic me oauth-clients create \\'{\"clientName\":\"my-bot\",\"allowedScopes\":[\"read:entities\"]}\\'',\n },\n ]);\n\n // oauth-clients delete\n const del = oauthClients\n .command(\"delete <id>\")\n .description(\"Delete an OAuth client\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/me/oauth-clients/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"OAuth client deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an OAuth client\",\n command: \"geonic me oauth-clients delete <client-id>\",\n },\n ]);\n}\n","import { Command } from \"commander\";\nimport {\n listProfiles,\n getCurrentProfile,\n setCurrentProfile,\n createProfile,\n deleteProfile,\n loadConfig,\n} from \"../config.js\";\nimport { printSuccess, printInfo, printError } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerProfileCommands(program: Command): void {\n const profile = program.command(\"profile\").description(\"Manage connection profiles\");\n\n const list = profile\n .command(\"list\")\n .description(\"List all profiles\")\n .action(() => {\n const profiles = listProfiles();\n for (const p of profiles) {\n const marker = p.active ? \" *\" : \"\";\n console.log(`${p.name}${marker}`);\n }\n });\n\n addExamples(list, [\n {\n description: \"List all profiles (active profile marked with *)\",\n command: \"geonic profile list\",\n },\n ]);\n\n const use = profile\n .command(\"use <name>\")\n .description(\"Switch active profile\")\n .action((name: string) => {\n try {\n setCurrentProfile(name);\n printSuccess(`Switched to profile \"${name}\".`);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n });\n\n addExamples(use, [\n {\n description: \"Switch to staging profile\",\n command: \"geonic profile use staging\",\n },\n ]);\n\n const profileCreate = profile\n .command(\"create <name>\")\n .description(\"Create a new profile\")\n .action((name: string) => {\n try {\n createProfile(name);\n printSuccess(`Profile \"${name}\" created.`);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n });\n\n addExamples(profileCreate, [\n {\n description: \"Create a new profile for staging\",\n command: \"geonic profile create staging\",\n },\n ]);\n\n const del = profile\n .command(\"delete <name>\")\n .description(\"Delete a profile\")\n .action((name: string) => {\n try {\n deleteProfile(name);\n printSuccess(`Profile \"${name}\" deleted.`);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n });\n\n addExamples(del, [\n {\n description: \"Delete a profile\",\n command: \"geonic profile delete staging\",\n },\n ]);\n\n const show = profile\n .command(\"show [name]\")\n .description(\"Show profile settings\")\n .action((name?: string) => {\n const profileName = name ?? getCurrentProfile();\n const config = loadConfig(profileName);\n const entries = Object.entries(config).filter(([, v]) => v !== undefined);\n if (entries.length === 0) {\n printInfo(`Profile \"${profileName}\" has no settings.`);\n return;\n }\n for (const [key, value] of entries) {\n if (\n (key === \"token\" || key === \"refreshToken\" || key === \"apiKey\") &&\n typeof value === \"string\"\n ) {\n console.log(`${key}: ***`);\n } else {\n console.log(`${key}: ${value}`);\n }\n }\n });\n\n addExamples(show, [\n {\n description: \"Show current profile settings\",\n command: \"geonic profile show\",\n },\n {\n description: \"Show settings for a specific profile\",\n command: \"geonic profile show production\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function addAttrsSubcommands(attrs: Command): void {\n // attrs list\n const list = attrs\n .command(\"list\")\n .description(\"List all attributes of an entity\")\n .argument(\"<entityId>\", \"Entity ID\")\n .action(\n withErrorHandler(\n async (entityId: string, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/entities/${encodeURIComponent(entityId)}/attrs`,\n );\n outputResponse(response, format);\n },\n ),\n );\n\n addExamples(list, [\n {\n description: \"List all attributes of an entity\",\n command: \"geonic entities attrs list urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // attrs get\n const get = attrs\n .command(\"get\")\n .description(\"Get a specific attribute of an entity\")\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"<attrName>\", \"Attribute name\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n attrName: string,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/entities/${encodeURIComponent(entityId)}/attrs/${encodeURIComponent(attrName)}`,\n );\n outputResponse(response, format);\n },\n ),\n );\n\n addExamples(get, [\n {\n description: \"Get a specific attribute\",\n command: \"geonic entities attrs get urn:ngsi-ld:Sensor:001 temperature\",\n },\n ]);\n\n // attrs add\n const add = attrs\n .command(\"add\")\n .description(\"Add attributes to an entity\")\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n json: string | undefined,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.post(\n `/entities/${encodeURIComponent(entityId)}/attrs`,\n data,\n );\n printSuccess(\"Attributes added.\");\n },\n ),\n );\n\n addExamples(add, [\n {\n description: \"Add attributes from a file\",\n command: \"geonic entities attrs add urn:ngsi-ld:Sensor:001 @attrs.json\",\n },\n ]);\n\n // attrs update\n const attrUpdate = attrs\n .command(\"update\")\n .description(\"Update a specific attribute of an entity\")\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"<attrName>\", \"Attribute name\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n attrName: string,\n json: string | undefined,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.put(\n `/entities/${encodeURIComponent(entityId)}/attrs/${encodeURIComponent(attrName)}`,\n data,\n );\n printSuccess(\"Attribute updated.\");\n },\n ),\n );\n\n addExamples(attrUpdate, [\n {\n description: \"Update a specific attribute\",\n command:\n \"geonic entities attrs update urn:ngsi-ld:Sensor:001 temperature '{\\\"value\\\":25}'\",\n },\n ]);\n\n // attrs delete\n const del = attrs\n .command(\"delete\")\n .description(\"Delete a specific attribute from an entity\")\n .argument(\"<entityId>\", \"Entity ID\")\n .argument(\"<attrName>\", \"Attribute name\")\n .action(\n withErrorHandler(\n async (\n entityId: string,\n attrName: string,\n _opts: unknown,\n cmd: Command,\n ) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/entities/${encodeURIComponent(entityId)}/attrs/${encodeURIComponent(attrName)}`,\n );\n printSuccess(\"Attribute deleted.\");\n },\n ),\n );\n\n addExamples(del, [\n {\n description: \"Delete a specific attribute\",\n command:\n \"geonic entities attrs delete urn:ngsi-ld:Sensor:001 temperature\",\n },\n ]);\n}\n\nexport function registerAttrsSubcommand(entitiesCmd: Command): void {\n const attrs = entitiesCmd\n .command(\"attrs\")\n .description(\"Manage entity attributes\");\n\n addAttrsSubcommands(attrs);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { registerAttrsSubcommand } from \"./attrs.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerEntitiesCommand(program: Command): void {\n const entities = program\n .command(\"entities\")\n .description(\"Manage context entities\");\n\n // entities list\n const list = entities\n .command(\"list\")\n .description(\"List entities with optional filters\")\n .option(\"--type <type>\", \"Filter by entity type\")\n .option(\"--id-pattern <pat>\", \"Filter by entity ID pattern (regex)\")\n .option(\"--query <q>\", \"NGSI query expression\")\n .option(\"--attrs <a,b>\", \"Comma-separated list of attributes to include\")\n .option(\"--georel <rel>\", \"Geo-relationship (e.g. near;maxDistance:1000)\")\n .option(\"--geometry <geo>\", \"Geometry type for geo-query (e.g. point)\")\n .option(\"--coords <coords>\", \"Coordinates for geo-query\")\n .option(\"--spatial-id <zfxy>\", \"Spatial ID filter (ZFXY tile)\")\n .option(\"--limit <n>\", \"Maximum number of entities to return\", parseInt)\n .option(\"--offset <n>\", \"Skip first N entities\", parseInt)\n .option(\"--order-by <field>\", \"Order results by field\")\n .option(\"--count\", \"Include total count in response\")\n .option(\"--key-values\", \"Request simplified key-value format\")\n .action(\n withErrorHandler(async (opts: Record<string, unknown>, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const params: Record<string, string> = {};\n\n if (opts.type) params.type = String(opts.type);\n if (opts.idPattern) params.idPattern = String(opts.idPattern);\n if (opts.query) params.q = String(opts.query);\n if (opts.attrs) params.attrs = String(opts.attrs);\n if (opts.georel) params.georel = String(opts.georel);\n if (opts.geometry) params.geometry = String(opts.geometry);\n if (opts.coords) params.coordinates = String(opts.coords);\n if (opts.spatialId) params.spatialId = String(opts.spatialId);\n if (opts.limit !== undefined) params.limit = String(opts.limit);\n if (opts.offset !== undefined) params.offset = String(opts.offset);\n if (opts.orderBy) params.orderBy = String(opts.orderBy);\n if (opts.count) params.count = \"true\";\n if (opts.keyValues) params.options = \"keyValues\";\n\n const response = await client.get(\"/entities\", params);\n outputResponse(response, format, !!opts.count);\n }),\n );\n\n addExamples(list, [\n {\n description: \"Filter by entity type\",\n command: \"geonic entities list --type Sensor\",\n },\n {\n description: \"Filter by entity ID pattern (regex)\",\n command: \"geonic entities list --id-pattern 'urn:ngsi-ld:Sensor:.*'\",\n },\n {\n description: \"Filter by attribute value\",\n command: \"geonic entities list --query 'temperature>30'\",\n },\n {\n description: \"AND conditions (semicolon)\",\n command: \"geonic entities list --query 'temperature>30;humidity<50'\",\n },\n {\n description: \"String match\",\n command: \"geonic entities list --query 'name==\\\"Tokyo\\\"'\",\n },\n {\n description: \"Pattern match\",\n command: \"geonic entities list --query 'name~=\\\"Tok.*\\\"'\",\n },\n {\n description: \"Check attribute existence\",\n command: \"geonic entities list --query 'temperature'\",\n },\n {\n description: \"Select specific attributes\",\n command: \"geonic entities list --attrs temperature,humidity\",\n },\n {\n description: \"Geo-query: entities near a point (within 1km)\",\n command:\n \"geonic entities list --georel 'near;maxDistance==1000' --geometry Point --coords '[139.7671,35.6812]'\",\n },\n {\n description: \"Geo-query: entities within a polygon\",\n command:\n \"geonic entities list --georel within --geometry Polygon --coords '[[[139.7,35.7],[139.8,35.7],[139.8,35.6],[139.7,35.6],[139.7,35.7]]]'\",\n },\n {\n description: \"Filter by Spatial ID (ZFXY tile)\",\n command: \"geonic entities list --spatial-id 15/0/29101/12903\",\n },\n {\n description: \"Paginate results\",\n command: \"geonic entities list --limit 20 --offset 40\",\n },\n {\n description: \"Order by attribute\",\n command: \"geonic entities list --order-by temperature\",\n },\n {\n description: \"Get total count with results\",\n command: \"geonic entities list --type Sensor --count\",\n },\n ]);\n\n // entities get\n const get = entities\n .command(\"get\")\n .description(\"Get a single entity by ID\")\n .argument(\"<id>\", \"Entity ID\")\n .option(\"--key-values\", \"Request simplified key-value format\")\n .action(\n withErrorHandler(async (id: string, opts: Record<string, unknown>, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const params: Record<string, string> = {};\n if (opts.keyValues) {\n params.options = \"keyValues\";\n }\n\n const response = await client.get(\n `/entities/${encodeURIComponent(id)}`,\n params,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get entity by ID\",\n command: \"geonic entities get urn:ngsi-ld:Sensor:001\",\n },\n {\n description: \"Get entity in keyValues format\",\n command: \"geonic entities get urn:ngsi-ld:Sensor:001 --key-values\",\n },\n ]);\n\n // entities create\n const create = entities\n .command(\"create\")\n .description(\"Create a new entity\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(async (json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.post(\"/entities\", data);\n printSuccess(\"Entity created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create from inline JSON\",\n command: `geonic entities create '{\"id\":\"urn:ngsi-ld:Sensor:001\",\"type\":\"Sensor\"}'`,\n },\n {\n description: \"Create from a file\",\n command: \"geonic entities create @entity.json\",\n },\n {\n description: \"Create from stdin pipe\",\n command: \"cat entity.json | geonic entities create\",\n },\n ]);\n\n // entities update\n const update = entities\n .command(\"update\")\n .description(\"Update attributes of an entity (PATCH)\")\n .argument(\"<id>\", \"Entity ID\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (id: string, json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.patch(\n `/entities/${encodeURIComponent(id)}/attrs`,\n data,\n );\n printSuccess(\"Entity updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update entity attributes from inline JSON\",\n command:\n \"geonic entities update urn:ngsi-ld:Sensor:001 '{\\\"temperature\\\":{\\\"value\\\":25}}'\",\n },\n {\n description: \"Update entity attributes from a file\",\n command: \"geonic entities update urn:ngsi-ld:Sensor:001 @attrs.json\",\n },\n ]);\n\n // entities replace\n const replace = entities\n .command(\"replace\")\n .description(\"Replace all attributes of an entity (PUT)\")\n .argument(\"<id>\", \"Entity ID\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(\n async (id: string, json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.put(\n `/entities/${encodeURIComponent(id)}/attrs`,\n data,\n );\n printSuccess(\"Entity replaced.\");\n },\n ),\n );\n\n addExamples(replace, [\n {\n description: \"Replace all attributes from a file\",\n command: \"geonic entities replace urn:ngsi-ld:Sensor:001 @attrs.json\",\n },\n ]);\n\n // entities upsert\n const upsert = entities\n .command(\"upsert\")\n .description(\"Create or update entities\")\n .argument(\"[json]\", \"JSON payload (inline, @file, - for stdin, or omit for interactive/pipe)\")\n .action(\n withErrorHandler(async (json: string | undefined, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const data = await parseJsonInput(json);\n\n await client.post(\"/entityOperations/upsert\", data);\n printSuccess(\"Entity upserted.\");\n }),\n );\n\n addExamples(upsert, [\n {\n description: \"Upsert entities from a file\",\n command: \"geonic entities upsert @entities.json\",\n },\n {\n description: \"Upsert from stdin pipe\",\n command: \"cat entities.json | geonic entities upsert\",\n },\n ]);\n\n // entities delete\n const del = entities\n .command(\"delete\")\n .description(\"Delete an entity by ID\")\n .argument(\"<id>\", \"Entity ID\")\n .action(\n withErrorHandler(async (id: string, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(`/entities/${encodeURIComponent(id)}`);\n printSuccess(\"Entity deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an entity by ID\",\n command: \"geonic entities delete urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // Register attrs as a subcommand of entities\n registerAttrsSubcommand(entities);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerBatchCommand(program: Command): void {\n const batch = program\n .command(\"entityOperations\")\n .alias(\"batch\")\n .description(\"Perform batch operations on entities\");\n\n // batch create\n const create = batch\n .command(\"create [json]\")\n .description(\"Batch create entities\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/create\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(create, [\n {\n description: \"Batch create from a file\",\n command: \"geonic batch create @entities.json\",\n },\n {\n description: \"Batch create from stdin\",\n command: \"cat entities.json | geonic batch create\",\n },\n ]);\n\n // batch upsert\n const upsert = batch\n .command(\"upsert [json]\")\n .description(\"Batch upsert entities\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/upsert\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(upsert, [\n {\n description: \"Batch upsert from a file\",\n command: \"geonic batch upsert @entities.json\",\n },\n {\n description: \"Batch upsert from stdin\",\n command: \"cat entities.json | geonic batch upsert\",\n },\n ]);\n\n // batch update\n const update = batch\n .command(\"update [json]\")\n .description(\"Batch update entity attributes\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/update\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(update, [\n {\n description: \"Batch update from a file\",\n command: \"geonic batch update @updates.json\",\n },\n {\n description: \"Batch update from stdin\",\n command: \"cat updates.json | geonic batch update\",\n },\n ]);\n\n // batch delete\n const del = batch\n .command(\"delete [json]\")\n .description(\"Batch delete entities by ID\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/delete\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(del, [\n {\n description: \"Batch delete from a file\",\n command: \"geonic batch delete @entity-ids.json\",\n },\n {\n description: \"Batch delete from stdin\",\n command: \"cat entity-ids.json | geonic batch delete\",\n },\n ]);\n\n // batch query\n const query = batch\n .command(\"query [json]\")\n .description(\"Query entities by posting a query payload\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/query\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(query, [\n {\n description: \"Query entities from a file\",\n command: \"geonic batch query @query.json\",\n },\n {\n description: \"Query entities from stdin\",\n command: \"cat query.json | geonic batch query\",\n },\n ]);\n\n // batch merge\n const merge = batch\n .command(\"merge [json]\")\n .description(\"Batch merge-patch entities\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/entityOperations/merge\", data);\n outputResponse(response, format);\n }),\n );\n\n addExamples(merge, [\n {\n description: \"Batch merge-patch from a file\",\n command: \"geonic batch merge @patches.json\",\n },\n {\n description: \"Batch merge-patch from stdin\",\n command: \"cat patches.json | geonic batch merge\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerSubscriptionsCommand(program: Command): void {\n const subscriptions = program\n .command(\"subscriptions\")\n .alias(\"sub\")\n .description(\"Manage context subscriptions\");\n\n // subscriptions list\n const list = subscriptions\n .command(\"list\")\n .description(\"List subscriptions\")\n .option(\"--limit <n>\", \"Maximum number of results\", parseInt)\n .option(\"--offset <n>\", \"Skip N results\", parseInt)\n .option(\"--count\", \"Include total count in response\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n if (cmdOpts.count) params[\"count\"] = \"true\";\n\n const response = await client.get(\"/subscriptions\", params);\n outputResponse(response, format, !!cmdOpts.count);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all subscriptions\",\n command: \"geonic subscriptions list\",\n },\n {\n description: \"List with pagination\",\n command: \"geonic subscriptions list --limit 10 --offset 20\",\n },\n {\n description: \"List with total count\",\n command: \"geonic subscriptions list --count\",\n },\n ]);\n\n // subscriptions get\n const get = subscriptions\n .command(\"get <id>\")\n .description(\"Get a subscription by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/subscriptions/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get subscription by ID\",\n command: \"geonic subscriptions get urn:ngsi-ld:Subscription:001\",\n },\n ]);\n\n // subscriptions create\n const create = subscriptions\n .command(\"create [json]\")\n .description(\"Create a subscription\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/subscriptions\", data);\n outputResponse(response, format);\n printSuccess(\"Subscription created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create from a JSON file\",\n command: \"geonic subscriptions create @subscription.json\",\n },\n {\n description: \"Create from stdin\",\n command: \"cat subscription.json | geonic subscriptions create\",\n },\n ]);\n\n // subscriptions update\n const update = subscriptions\n .command(\"update <id> [json]\")\n .description(\"Update a subscription\")\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.patch(\n `/subscriptions/${encodeURIComponent(String(id))}`,\n data,\n );\n outputResponse(response, format);\n printSuccess(\"Subscription updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update a subscription from a file\",\n command:\n \"geonic subscriptions update urn:ngsi-ld:Subscription:001 @sub.json\",\n },\n ]);\n\n // subscriptions delete\n const del = subscriptions\n .command(\"delete <id>\")\n .description(\"Delete a subscription\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/subscriptions/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Subscription deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a subscription\",\n command: \"geonic subscriptions delete urn:ngsi-ld:Subscription:001\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerRegistrationsCommand(program: Command): void {\n const registrations = program\n .command(\"registrations\")\n .alias(\"reg\")\n .description(\"Manage context registrations\");\n\n // registrations list\n const list = registrations\n .command(\"list\")\n .description(\"List registrations\")\n .option(\"--limit <n>\", \"Maximum number of results\", parseInt)\n .option(\"--offset <n>\", \"Skip N results\", parseInt)\n .option(\"--count\", \"Include total count in response\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n if (cmdOpts.count) params[\"count\"] = \"true\";\n\n const response = await client.get(\"/csourceRegistrations\", params);\n outputResponse(response, format, !!cmdOpts.count);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all registrations\",\n command: \"geonic registrations list\",\n },\n {\n description: \"List with pagination\",\n command: \"geonic registrations list --limit 10\",\n },\n ]);\n\n // registrations get\n const get = registrations\n .command(\"get <id>\")\n .description(\"Get a registration by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/csourceRegistrations/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get registration by ID\",\n command:\n \"geonic registrations get urn:ngsi-ld:ContextSourceRegistration:001\",\n },\n ]);\n\n // registrations create\n const create = registrations\n .command(\"create [json]\")\n .description(\"Create a registration\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.post(\"/csourceRegistrations\", data);\n outputResponse(response, format);\n printSuccess(\"Registration created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a registration from a file\",\n command: \"geonic registrations create @registration.json\",\n },\n ]);\n\n // registrations update\n const regUpdate = registrations\n .command(\"update <id> [json]\")\n .description(\"Update a registration\")\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const data = await parseJsonInput(json as string | undefined);\n\n const response = await client.patch(\n `/csourceRegistrations/${encodeURIComponent(String(id))}`,\n data,\n );\n outputResponse(response, format);\n printSuccess(\"Registration updated.\");\n },\n ),\n );\n\n addExamples(regUpdate, [\n {\n description: \"Update a registration from a file\",\n command:\n \"geonic registrations update urn:ngsi-ld:ContextSourceRegistration:001 @registration.json\",\n },\n ]);\n\n // registrations delete\n const del = registrations\n .command(\"delete <id>\")\n .description(\"Delete a registration\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/csourceRegistrations/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Registration deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a registration\",\n command:\n \"geonic registrations delete urn:ngsi-ld:ContextSourceRegistration:001\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerTypesCommand(program: Command): void {\n const types = program\n .command(\"types\")\n .description(\"Browse entity types\");\n\n // types list\n const list = types\n .command(\"list\")\n .description(\"List available entity types\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\"/types\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all entity types\",\n command: \"geonic types list\",\n },\n ]);\n\n // types get\n const get = types\n .command(\"get <typeName>\")\n .description(\"Get details for an entity type\")\n .action(\n withErrorHandler(\n async (typeName: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/types/${encodeURIComponent(String(typeName))}`,\n );\n outputResponse(response, format);\n },\n ),\n );\n\n addExamples(get, [\n {\n description: \"Get details for a specific type\",\n command: \"geonic types get Sensor\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nfunction addTemporalListOptions(cmd: Command): Command {\n return cmd\n .option(\"--type <type>\", \"Filter by entity type\")\n .option(\"--attrs <a,b>\", \"Comma-separated list of attributes to include\")\n .option(\"--query <q>\", \"NGSI query expression\")\n .option(\"--georel <rel>\", \"Geo-relationship (e.g. near;maxDistance:1000)\")\n .option(\"--geometry <geo>\", \"Geometry type for geo-query (e.g. point)\")\n .option(\"--coords <coords>\", \"Coordinates for geo-query\")\n .option(\"--time-rel <rel>\", \"Temporal relationship (before, after, between)\")\n .option(\"--time-at <time>\", \"Temporal query start time (ISO 8601)\")\n .option(\"--end-time-at <time>\", \"Temporal query end time (ISO 8601)\")\n .option(\"--last-n <n>\", \"Return last N temporal values\", parseInt)\n .option(\"--limit <n>\", \"Maximum number of entities to return\", parseInt)\n .option(\"--offset <n>\", \"Skip first N entities\", parseInt)\n .option(\"--count\", \"Include total count in response\");\n}\n\nfunction createListAction() {\n return withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.type) params[\"type\"] = cmdOpts.type;\n if (cmdOpts.attrs) params[\"attrs\"] = cmdOpts.attrs;\n if (cmdOpts.query) params[\"q\"] = cmdOpts.query;\n if (cmdOpts.georel) params[\"georel\"] = cmdOpts.georel;\n if (cmdOpts.geometry) params[\"geometry\"] = cmdOpts.geometry;\n if (cmdOpts.coords) params[\"coordinates\"] = cmdOpts.coords;\n if (cmdOpts.timeRel) params[\"timerel\"] = cmdOpts.timeRel;\n if (cmdOpts.timeAt) params[\"timeAt\"] = cmdOpts.timeAt;\n if (cmdOpts.endTimeAt) params[\"endTimeAt\"] = cmdOpts.endTimeAt;\n if (cmdOpts.lastN !== undefined) params[\"lastN\"] = String(cmdOpts.lastN);\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n if (cmdOpts.count) params[\"count\"] = \"true\";\n\n const response = await client.get(\"/temporal/entities\", params);\n outputResponse(response, format, cmdOpts.count);\n });\n}\n\nfunction addTemporalGetOptions(cmd: Command): Command {\n return cmd\n .option(\"--attrs <a,b>\", \"Comma-separated list of attributes to include\")\n .option(\"--time-rel <rel>\", \"Temporal relationship (before, after, between)\")\n .option(\"--time-at <time>\", \"Temporal query start time (ISO 8601)\")\n .option(\"--end-time-at <time>\", \"Temporal query end time (ISO 8601)\")\n .option(\"--last-n <n>\", \"Return last N temporal values\", parseInt);\n}\n\nfunction createGetAction() {\n return withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.attrs) params[\"attrs\"] = cmdOpts.attrs;\n if (cmdOpts.timeRel) params[\"timerel\"] = cmdOpts.timeRel;\n if (cmdOpts.timeAt) params[\"timeAt\"] = cmdOpts.timeAt;\n if (cmdOpts.endTimeAt) params[\"endTimeAt\"] = cmdOpts.endTimeAt;\n if (cmdOpts.lastN !== undefined) params[\"lastN\"] = String(cmdOpts.lastN);\n\n const response = await client.get(\n `/temporal/entities/${encodeURIComponent(String(id))}`,\n params,\n );\n outputResponse(response, format);\n });\n}\n\nfunction createCreateAction() {\n return withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n\n await client.post(\"/temporal/entities\", body);\n printSuccess(\"Temporal entity created.\");\n });\n}\n\nfunction createDeleteAction() {\n return withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/temporal/entities/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Temporal entity deleted.\");\n });\n}\n\nfunction createQueryAction() {\n return withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.aggrMethods) params[\"aggrMethods\"] = cmdOpts.aggrMethods;\n if (cmdOpts.aggrPeriod) params[\"aggrPeriodDuration\"] = cmdOpts.aggrPeriod;\n\n const response = await client.post(\n \"/temporal/entityOperations/query\",\n body,\n params,\n );\n outputResponse(response, format);\n });\n}\n\nfunction addQueryOptions(cmd: Command): Command {\n return cmd\n .option(\"--aggr-methods <methods>\", \"Aggregation methods (e.g. totalCount,sum)\")\n .option(\"--aggr-period <period>\", \"Aggregation period (e.g. PT1H)\");\n}\n\nexport function registerTemporalCommand(program: Command): void {\n const temporal = program\n .command(\"temporal\")\n .description(\"Manage temporal entities\");\n\n const entities = temporal\n .command(\"entities\")\n .description(\"List, get, create, and delete temporal entities\");\n\n const entityOperations = temporal\n .command(\"entityOperations\")\n .description(\"Perform batch operations on temporal entities\");\n\n // temporal entities list\n const entitiesList = addTemporalListOptions(\n entities.command(\"list\").description(\"List temporal entities with optional filters\"),\n );\n entitiesList.action(createListAction());\n\n addExamples(entitiesList, [\n {\n description: \"List by type with time range\",\n command:\n \"geonic temporal entities list --type Sensor --time-rel between --time-at 2025-01-01T00:00:00Z --end-time-at 2025-01-31T23:59:59Z\",\n },\n {\n description: \"Get last 5 temporal values\",\n command: \"geonic temporal entities list --type Sensor --last-n 5\",\n },\n {\n description: \"Filter by time (after a point)\",\n command:\n \"geonic temporal entities list --time-rel after --time-at 2025-06-01T00:00:00Z\",\n },\n ]);\n\n // temporal entities get\n const entitiesGet = addTemporalGetOptions(\n entities.command(\"get <id>\").description(\"Get a temporal entity by ID\"),\n );\n entitiesGet.action(createGetAction());\n\n addExamples(entitiesGet, [\n {\n description: \"Get temporal entity with specific attributes\",\n command:\n \"geonic temporal entities get urn:ngsi-ld:Sensor:001 --attrs temperature,humidity\",\n },\n {\n description: \"Get last 10 values for an entity\",\n command: \"geonic temporal entities get urn:ngsi-ld:Sensor:001 --last-n 10\",\n },\n ]);\n\n // temporal entities create\n const create = entities\n .command(\"create [json]\")\n .description(\"Create a temporal entity\")\n .action(createCreateAction());\n\n addExamples(create, [\n {\n description: \"Create temporal entity from a file\",\n command: \"geonic temporal entities create @temporal-entity.json\",\n },\n ]);\n\n // temporal entities delete\n const del = entities\n .command(\"delete <id>\")\n .description(\"Delete a temporal entity by ID\")\n .action(createDeleteAction());\n\n addExamples(del, [\n {\n description: \"Delete temporal data for an entity\",\n command: \"geonic temporal entities delete urn:ngsi-ld:Sensor:001\",\n },\n ]);\n\n // temporal entityOperations query\n const opsQuery = addQueryOptions(\n entityOperations.command(\"query [json]\").description(\"Query temporal entities (POST)\"),\n );\n opsQuery.action(createQueryAction());\n\n addExamples(opsQuery, [\n {\n description: \"Query with aggregation (hourly count)\",\n command:\n \"geonic temporal entityOperations query @query.json --aggr-methods totalCount --aggr-period PT1H\",\n },\n {\n description: \"Query from a file\",\n command: \"geonic temporal entityOperations query @query.json\",\n },\n ]);\n\n // Backward-compatible hidden aliases at the temporal level\n addTemporalListOptions(\n temporal\n .command(\"list\", { hidden: true })\n .description(\"List temporal entities (deprecated: use temporal entities list)\"),\n ).action(createListAction());\n\n addTemporalGetOptions(\n temporal\n .command(\"get <id>\", { hidden: true })\n .description(\"Get a temporal entity (deprecated: use temporal entities get)\"),\n ).action(createGetAction());\n\n temporal\n .command(\"create [json]\", { hidden: true })\n .description(\"Create a temporal entity (deprecated: use temporal entities create)\")\n .action(createCreateAction());\n\n temporal\n .command(\"delete <id>\", { hidden: true })\n .description(\"Delete a temporal entity (deprecated: use temporal entities delete)\")\n .action(createDeleteAction());\n\n addQueryOptions(\n temporal\n .command(\"query [json]\", { hidden: true })\n .description(\"Query temporal entities (deprecated: use temporal entityOperations query)\"),\n ).action(createQueryAction());\n}\n","import type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerSnapshotsCommand(program: Command): void {\n const snapshots = program\n .command(\"snapshots\")\n .description(\"Manage snapshots\");\n\n // snapshots list\n const list = snapshots\n .command(\"list\")\n .description(\"List snapshots\")\n .option(\"--limit <n>\", \"Maximum number of snapshots to return\", parseInt)\n .option(\"--offset <n>\", \"Skip first N snapshots\", parseInt)\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const cmdOpts = cmd.opts();\n\n const params: Record<string, string> = {};\n\n if (cmdOpts.limit !== undefined) params[\"limit\"] = String(cmdOpts.limit);\n if (cmdOpts.offset !== undefined) params[\"offset\"] = String(cmdOpts.offset);\n\n const response = await client.get(\"/snapshots\", params);\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all snapshots\",\n command: \"geonic snapshots list\",\n },\n {\n description: \"List with a limit\",\n command: \"geonic snapshots list --limit 10\",\n },\n ]);\n\n // snapshots get\n const get = snapshots\n .command(\"get <id>\")\n .description(\"Get a snapshot by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.get(\n `/snapshots/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a specific snapshot\",\n command: \"geonic snapshots get <snapshot-id>\",\n },\n ]);\n\n // snapshots create\n const create = snapshots\n .command(\"create\")\n .description(\"Create a new snapshot\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.post(\"/snapshots\");\n printSuccess(\"Snapshot created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a new snapshot\",\n command: \"geonic snapshots create\",\n },\n ]);\n\n // snapshots delete\n const del = snapshots\n .command(\"delete <id>\")\n .description(\"Delete a snapshot by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n\n await client.delete(\n `/snapshots/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Snapshot deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a snapshot\",\n command: \"geonic snapshots delete <snapshot-id>\",\n },\n ]);\n\n // snapshots clone\n const clone = snapshots\n .command(\"clone <id>\")\n .description(\"Clone a snapshot by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.post(\n `/snapshots/${encodeURIComponent(String(id))}/clone`,\n );\n if (response.data !== undefined && response.data !== \"\") {\n outputResponse(response, format);\n } else {\n printSuccess(\"Snapshot cloned.\");\n }\n }),\n );\n\n addExamples(clone, [\n {\n description: \"Clone a snapshot\",\n command: \"geonic snapshots clone <snapshot-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerTenantsCommand(parent: Command): void {\n const tenants = parent\n .command(\"tenants\")\n .description(\"Manage tenants\");\n\n // tenants list\n const list = tenants\n .command(\"list\")\n .description(\"List all tenants\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/tenants\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all tenants\",\n command: \"geonic admin tenants list\",\n },\n ]);\n\n // tenants get\n const get = tenants\n .command(\"get <id>\")\n .description(\"Get a tenant by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/tenants/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a tenant by ID\",\n command: \"geonic admin tenants get <tenant-id>\",\n },\n ]);\n\n // tenants create\n const create = tenants\n .command(\"create [json]\")\n .description(\"Create a new tenant\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/tenants\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"Tenant created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a tenant from a JSON file\",\n command: \"geonic admin tenants create @tenant.json\",\n },\n ]);\n\n // tenants update\n const update = tenants\n .command(\"update <id> [json]\")\n .description(\"Update a tenant\")\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/tenants/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Tenant updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update a tenant from a JSON file\",\n command: \"geonic admin tenants update <tenant-id> @tenant.json\",\n },\n ]);\n\n // tenants delete\n const del = tenants\n .command(\"delete <id>\")\n .description(\"Delete a tenant\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/tenants/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Tenant deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a tenant\",\n command: \"geonic admin tenants delete <tenant-id>\",\n },\n ]);\n\n // tenants activate\n const activate = tenants\n .command(\"activate <id>\")\n .description(\"Activate a tenant\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/tenants/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"Tenant activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a tenant\",\n command: \"geonic admin tenants activate <tenant-id>\",\n },\n ]);\n\n // tenants deactivate\n const deactivate = tenants\n .command(\"deactivate <id>\")\n .description(\"Deactivate a tenant\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/tenants/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"Tenant deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a tenant\",\n command: \"geonic admin tenants deactivate <tenant-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerUsersCommand(parent: Command): void {\n const users = parent\n .command(\"users\")\n .description(\"Manage users\");\n\n // users list\n const list = users\n .command(\"list\")\n .description(\"List all users\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/users\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all users\",\n command: \"geonic admin users list\",\n },\n ]);\n\n // users get\n const get = users\n .command(\"get <id>\")\n .description(\"Get a user by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/users/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a user by ID\",\n command: \"geonic admin users get <user-id>\",\n },\n ]);\n\n // users create\n const create = users\n .command(\"create [json]\")\n .description(\"Create a new user\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/users\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"User created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a user from a JSON file\",\n command: \"geonic admin users create @user.json\",\n },\n ]);\n\n // users update\n const update = users\n .command(\"update <id> [json]\")\n .description(\"Update a user\")\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/users/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"User updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update a user from a JSON file\",\n command: \"geonic admin users update <user-id> @user.json\",\n },\n ]);\n\n // users delete\n const del = users\n .command(\"delete <id>\")\n .description(\"Delete a user\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/users/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"User deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a user\",\n command: \"geonic admin users delete <user-id>\",\n },\n ]);\n\n // users activate\n const activate = users\n .command(\"activate <id>\")\n .description(\"Activate a user\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/users/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"User activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a user\",\n command: \"geonic admin users activate <user-id>\",\n },\n ]);\n\n // users deactivate\n const deactivate = users\n .command(\"deactivate <id>\")\n .description(\"Deactivate a user\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/users/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"User deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a user\",\n command: \"geonic admin users deactivate <user-id>\",\n },\n ]);\n\n // users unlock\n const unlock = users\n .command(\"unlock <id>\")\n .description(\"Unlock a user\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/users/${encodeURIComponent(String(id))}/unlock`,\n );\n printSuccess(\"User unlocked.\");\n }),\n );\n\n addExamples(unlock, [\n {\n description: \"Unlock a locked user account\",\n command: \"geonic admin users unlock <user-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerPoliciesCommand(parent: Command): void {\n const policies = parent\n .command(\"policies\")\n .description(\"Manage policies\");\n\n // policies list\n const list = policies\n .command(\"list\")\n .description(\"List all policies\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/policies\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all policies\",\n command: \"geonic admin policies list\",\n },\n ]);\n\n // policies get\n const get = policies\n .command(\"get <id>\")\n .description(\"Get a policy by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/policies/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a policy by ID\",\n command: \"geonic admin policies get <policy-id>\",\n },\n ]);\n\n // policies create\n const create = policies\n .command(\"create [json]\")\n .description(\"Create a new policy\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/policies\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"Policy created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a policy from a JSON file\",\n command: \"geonic admin policies create @policy.json\",\n },\n ]);\n\n // policies update\n const update = policies\n .command(\"update <id> [json]\")\n .description(\"Update a policy\")\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/policies/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Policy updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update a policy from a JSON file\",\n command: \"geonic admin policies update <policy-id> @policy.json\",\n },\n ]);\n\n // policies delete\n const del = policies\n .command(\"delete <id>\")\n .description(\"Delete a policy\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/policies/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Policy deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a policy\",\n command: \"geonic admin policies delete <policy-id>\",\n },\n ]);\n\n // policies activate\n const activate = policies\n .command(\"activate <id>\")\n .description(\"Activate a policy\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/policies/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"Policy activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a policy\",\n command: \"geonic admin policies activate <policy-id>\",\n },\n ]);\n\n // policies deactivate\n const deactivate = policies\n .command(\"deactivate <id>\")\n .description(\"Deactivate a policy\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/admin/policies/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"Policy deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a policy\",\n command: \"geonic admin policies deactivate <policy-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../../helpers.js\";\nimport { parseJsonInput } from \"../../input.js\";\nimport { printSuccess } from \"../../output.js\";\nimport { addExamples } from \"../help.js\";\n\nexport function registerOAuthClientsCommand(parent: Command): void {\n const oauthClients = parent\n .command(\"oauth-clients\")\n .description(\"Manage OAuth clients\");\n\n // oauth-clients list\n const list = oauthClients\n .command(\"list\")\n .description(\"List all OAuth clients\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/oauth-clients\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all OAuth clients\",\n command: \"geonic admin oauth-clients list\",\n },\n ]);\n\n // oauth-clients get\n const get = oauthClients\n .command(\"get <id>\")\n .description(\"Get an OAuth client by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/admin/oauth-clients/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get an OAuth client by ID\",\n command: \"geonic admin oauth-clients get <client-id>\",\n },\n ]);\n\n // oauth-clients create\n const create = oauthClients\n .command(\"create [json]\")\n .description(\"Create a new OAuth client\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/admin/oauth-clients\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"OAuth client created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create an OAuth client from a JSON file\",\n command: \"geonic admin oauth-clients create @client.json\",\n },\n ]);\n\n // oauth-clients update\n const update = oauthClients\n .command(\"update <id> [json]\")\n .description(\"Update an OAuth client\")\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/admin/oauth-clients/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"OAuth client updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update an OAuth client from a JSON file\",\n command: \"geonic admin oauth-clients update <client-id> @client.json\",\n },\n ]);\n\n // oauth-clients delete\n const del = oauthClients\n .command(\"delete <id>\")\n .description(\"Delete an OAuth client\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/admin/oauth-clients/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"OAuth client deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete an OAuth client\",\n command: \"geonic admin oauth-clients delete <client-id>\",\n },\n ]);\n}\n\nexport function registerCaddeCommand(parent: Command): void {\n const cadde = parent\n .command(\"cadde\")\n .description(\"Manage CADDE configuration\");\n\n // cadde get\n const caddeGet = cadde\n .command(\"get\")\n .description(\"Get CADDE configuration\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/admin/cadde\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(caddeGet, [\n {\n description: \"Get CADDE configuration\",\n command: \"geonic admin cadde get\",\n },\n ]);\n\n // cadde set\n const caddeSet = cadde\n .command(\"set [json]\")\n .description(\"Set CADDE configuration\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"PUT\", \"/admin/cadde\", {\n body,\n });\n outputResponse(response, format);\n printSuccess(\"CADDE configuration set.\");\n }),\n );\n\n addExamples(caddeSet, [\n {\n description: \"Set CADDE configuration from a JSON file\",\n command: \"geonic admin cadde set @cadde-config.json\",\n },\n ]);\n\n // cadde delete\n const caddeDelete = cadde\n .command(\"delete\")\n .description(\"Delete CADDE configuration\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\"DELETE\", \"/admin/cadde\");\n printSuccess(\"CADDE configuration deleted.\");\n }),\n );\n\n addExamples(caddeDelete, [\n {\n description: \"Delete CADDE configuration\",\n command: \"geonic admin cadde delete\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { registerTenantsCommand } from \"./tenants.js\";\nimport { registerUsersCommand } from \"./users.js\";\nimport { registerPoliciesCommand } from \"./policies.js\";\nimport { registerOAuthClientsCommand, registerCaddeCommand } from \"./oauth-clients.js\";\n\nexport function registerAdminCommand(program: Command): void {\n const admin = program\n .command(\"admin\")\n .description(\"Manage admin resources\");\n\n registerTenantsCommand(admin);\n registerUsersCommand(admin);\n registerPoliciesCommand(admin);\n registerOAuthClientsCommand(admin);\n registerCaddeCommand(admin);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerRulesCommand(program: Command): void {\n const rules = program\n .command(\"rules\")\n .description(\"Manage rule engine\");\n\n // rules list\n const list = rules\n .command(\"list\")\n .description(\"List all rules\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/rules\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all rules\",\n command: \"geonic rules list\",\n },\n ]);\n\n // rules get\n const get = rules\n .command(\"get <id>\")\n .description(\"Get a rule by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/rules/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a specific rule\",\n command: \"geonic rules get <rule-id>\",\n },\n ]);\n\n // rules create\n const create = rules\n .command(\"create [json]\")\n .description(\"Create a new rule\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/rules\", { body });\n outputResponse(response, format);\n printSuccess(\"Rule created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a rule from a file\",\n command: \"geonic rules create @rule.json\",\n },\n ]);\n\n // rules update\n const update = rules\n .command(\"update <id> [json]\")\n .description(\"Update a rule\")\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/rules/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Rule updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update a rule from a file\",\n command: \"geonic rules update <rule-id> @rule.json\",\n },\n ]);\n\n // rules delete\n const del = rules\n .command(\"delete <id>\")\n .description(\"Delete a rule\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/rules/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Rule deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a rule\",\n command: \"geonic rules delete <rule-id>\",\n },\n ]);\n\n // rules activate\n const activate = rules\n .command(\"activate <id>\")\n .description(\"Activate a rule\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/rules/${encodeURIComponent(String(id))}/activate`,\n );\n printSuccess(\"Rule activated.\");\n }),\n );\n\n addExamples(activate, [\n {\n description: \"Activate a rule\",\n command: \"geonic rules activate <rule-id>\",\n },\n ]);\n\n // rules deactivate\n const deactivate = rules\n .command(\"deactivate <id>\")\n .description(\"Deactivate a rule\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"POST\",\n `/rules/${encodeURIComponent(String(id))}/deactivate`,\n );\n printSuccess(\"Rule deactivated.\");\n }),\n );\n\n addExamples(deactivate, [\n {\n description: \"Deactivate a rule\",\n command: \"geonic rules deactivate <rule-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../helpers.js\";\nimport { parseJsonInput } from \"../input.js\";\nimport { printSuccess } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerModelsCommand(program: Command): void {\n const models = program\n .command(\"custom-data-models\")\n .alias(\"models\")\n .description(\"Manage custom data models\");\n\n // models list\n const list = models\n .command(\"list\")\n .description(\"List all models\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/custom-data-models\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(list, [\n {\n description: \"List all models\",\n command: \"geonic models list\",\n },\n ]);\n\n // models get\n const get = models\n .command(\"get <id>\")\n .description(\"Get a model by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/custom-data-models/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get a specific model\",\n command: \"geonic models get <model-id>\",\n },\n ]);\n\n // models create\n const create = models\n .command(\"create [json]\")\n .description(\"Create a new model\")\n .action(\n withErrorHandler(async (json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"POST\", \"/custom-data-models\", { body });\n outputResponse(response, format);\n printSuccess(\"Model created.\");\n }),\n );\n\n addExamples(create, [\n {\n description: \"Create a model from a file\",\n command: \"geonic models create @model.json\",\n },\n ]);\n\n // models update\n const update = models\n .command(\"update <id> [json]\")\n .description(\"Update a model\")\n .action(\n withErrorHandler(\n async (id: unknown, json: unknown, _opts: unknown, cmd: Command) => {\n const body = await parseJsonInput(json as string | undefined);\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"PATCH\",\n `/custom-data-models/${encodeURIComponent(String(id))}`,\n { body },\n );\n outputResponse(response, format);\n printSuccess(\"Model updated.\");\n },\n ),\n );\n\n addExamples(update, [\n {\n description: \"Update a model from a file\",\n command: \"geonic models update <model-id> @model.json\",\n },\n ]);\n\n // models delete\n const del = models\n .command(\"delete <id>\")\n .description(\"Delete a model\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n await client.rawRequest(\n \"DELETE\",\n `/custom-data-models/${encodeURIComponent(String(id))}`,\n );\n printSuccess(\"Model deleted.\");\n }),\n );\n\n addExamples(del, [\n {\n description: \"Delete a model\",\n command: \"geonic models delete <model-id>\",\n },\n ]);\n}\n","import type { Command } from \"commander\";\nimport { withErrorHandler, createClient, getFormat, outputResponse } from \"../helpers.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerCatalogCommand(program: Command): void {\n const catalog = program\n .command(\"catalog\")\n .description(\"Browse DCAT-AP catalog\");\n\n // catalog get\n const get = catalog\n .command(\"get\")\n .description(\"Get the catalog\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/catalog\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(get, [\n {\n description: \"Get the DCAT-AP catalog\",\n command: \"geonic catalog get\",\n },\n ]);\n\n // catalog datasets\n const datasets = catalog\n .command(\"datasets\")\n .description(\"Manage catalog datasets\");\n\n // catalog datasets list\n const datasetsList = datasets\n .command(\"list\")\n .description(\"List all datasets\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\"GET\", \"/catalog/datasets\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(datasetsList, [\n {\n description: \"List all catalog datasets\",\n command: \"geonic catalog datasets list\",\n },\n ]);\n\n // catalog datasets get\n const datasetsGet = datasets\n .command(\"get <id>\")\n .description(\"Get a dataset by ID\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/catalog/datasets/${encodeURIComponent(String(id))}`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(datasetsGet, [\n {\n description: \"Get a specific dataset\",\n command: \"geonic catalog datasets get <dataset-id>\",\n },\n ]);\n\n // catalog datasets sample\n const datasetsSample = datasets\n .command(\"sample <id>\")\n .description(\"Get sample data for a dataset\")\n .action(\n withErrorHandler(async (id: unknown, _opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n const response = await client.rawRequest(\n \"GET\",\n `/catalog/datasets/${encodeURIComponent(String(id))}/sample`,\n );\n outputResponse(response, format);\n }),\n );\n\n addExamples(datasetsSample, [\n {\n description: \"Get sample data for a dataset\",\n command: \"geonic catalog datasets sample <dataset-id>\",\n },\n ]);\n}\n","import { createRequire } from \"node:module\";\nimport type { Command } from \"commander\";\nimport {\n withErrorHandler,\n createClient,\n getFormat,\n outputResponse,\n} from \"../helpers.js\";\nimport { printInfo } from \"../output.js\";\nimport { addExamples } from \"./help.js\";\n\nexport function registerHealthCommand(program: Command): void {\n const health = program\n .command(\"health\")\n .description(\"Check the health status of the server\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.rawRequest(\"GET\", \"/health\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(health, [\n {\n description: \"Check server health\",\n command: \"geonic health\",\n },\n ]);\n}\n\nexport function registerVersionCommand(program: Command): void {\n const version = program\n .command(\"version\")\n .description(\"Display CLI and server version information\")\n .action(\n withErrorHandler(async (_opts: unknown, cmd: Command) => {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { version: string };\n const cliVersion = pkg.version;\n\n printInfo(`CLI version: ${cliVersion}`);\n\n const client = createClient(cmd);\n const format = getFormat(cmd);\n\n const response = await client.rawRequest(\"GET\", \"/version\");\n printInfo(\"Server version:\");\n outputResponse(response, format);\n }),\n );\n\n addExamples(version, [\n {\n description: \"Show CLI and server version\",\n command: \"geonic version\",\n },\n ]);\n}\n","import { createRequire } from \"node:module\";\nimport type { Command, Option } from \"commander\";\nimport { addExamples } from \"./help.js\";\n\nfunction findOption(\n cmd: Command,\n program: Command,\n flag: string,\n): Option | undefined {\n return (\n cmd.options.find((o) => o.long === flag || o.short === flag) ||\n program.options.find((o) => o.long === flag || o.short === flag)\n );\n}\n\nfunction optionTakesValue(\n cmd: Command,\n program: Command,\n flag: string,\n): boolean {\n const opt = findOption(cmd, program, flag);\n if (!opt) return false;\n return !!(opt.required || opt.optional);\n}\n\nfunction findSubcommand(cmd: Command, name: string): Command | undefined {\n return cmd.commands.find(\n (c) => c.name() === name || c.aliases().includes(name),\n );\n}\n\nexport function generateCompletions(\n program: Command,\n line: string,\n point: number,\n): string[] {\n const truncated = line.slice(0, point);\n const tokens = truncated.trim().split(/\\s+/).filter(Boolean);\n const startingNewWord = /\\s$/.test(truncated);\n\n // Determine partial input (what the user is currently typing)\n const partial =\n !startingNewWord && tokens.length > 1 ? tokens[tokens.length - 1] : \"\";\n\n // Tokens to walk the command tree (exclude program name and partial)\n const walkTokens = startingNewWord ? tokens.slice(1) : tokens.slice(1, -1);\n\n // Walk the command tree\n let currentCmd = program;\n let i = 0;\n\n while (i < walkTokens.length) {\n const token = walkTokens[i];\n\n if (token.startsWith(\"-\")) {\n if (optionTakesValue(currentCmd, program, token)) {\n i += 2; // skip option + its value\n } else {\n i += 1;\n }\n continue;\n }\n\n const sub = findSubcommand(currentCmd, token);\n if (sub) {\n currentCmd = sub;\n }\n i++;\n }\n\n // Special handling: `help` command mirrors the main command tree for completions\n if (currentCmd.name() === \"help\" && currentCmd.parent === program) {\n const helpIdx = walkTokens.indexOf(\"help\");\n const rawArgs = walkTokens.slice(helpIdx + 1);\n const helpArgs: string[] = [];\n for (let j = 0; j < rawArgs.length; j++) {\n const t = rawArgs[j];\n if (t.startsWith(\"-\")) {\n if (optionTakesValue(currentCmd, program, t)) {\n j++; // skip the option's value\n }\n continue;\n }\n helpArgs.push(t);\n }\n\n let target = program;\n for (const arg of helpArgs) {\n const sub = findSubcommand(target, arg);\n if (sub) target = sub;\n else break;\n }\n\n const subs = target.commands\n .filter((c) => !(c as { _hidden?: boolean })._hidden)\n .map((c) => c.name());\n return subs.filter((s) => s.startsWith(partial));\n }\n\n // Determine predecessor token (immediately before the completion point)\n const predecessor = startingNewWord\n ? tokens[tokens.length - 1]\n : tokens.length >= 2\n ? tokens[tokens.length - 2]\n : undefined;\n\n // Case 1: Previous token is a value-taking option → complete option values\n if (\n predecessor &&\n predecessor.startsWith(\"-\") &&\n optionTakesValue(currentCmd, program, predecessor)\n ) {\n return getOptionValueCompletions(predecessor, partial);\n }\n\n // Case 2: Partial starts with '-' → complete options\n if (partial.startsWith(\"-\")) {\n return getOptionCompletions(currentCmd, program, partial);\n }\n\n // Case 3: Current command has non-hidden subcommands → complete them\n const subcommands = currentCmd.commands\n .filter((c) => !(c as { _hidden?: boolean })._hidden)\n .map((c) => c.name());\n\n if (subcommands.length > 0) {\n return subcommands.filter((s) => s.startsWith(partial));\n }\n\n // Case 4: Command takes file arguments → signal <file>\n for (const arg of currentCmd.registeredArguments) {\n if (arg.description && arg.description.includes(\"@file\")) {\n return [\"<file>\"];\n }\n }\n\n return [];\n}\n\nfunction getOptionCompletions(\n cmd: Command,\n program: Command,\n partial: string,\n): string[] {\n const options = new Set<string>();\n\n for (const opt of cmd.options) {\n if (opt.hidden) continue;\n if (opt.long) options.add(opt.long);\n }\n\n for (const opt of program.options) {\n if (opt.hidden) continue;\n if (opt.long) options.add(opt.long);\n }\n\n return [...options].filter((o) => o.startsWith(partial));\n}\n\nfunction getOptionValueCompletions(\n optionFlag: string,\n partial: string,\n): string[] {\n if (optionFlag === \"--format\" || optionFlag === \"-f\") {\n return [\"json\", \"table\", \"geojson\"].filter((v) =>\n v.startsWith(partial),\n );\n }\n return [];\n}\n\nconst ZSH_SCRIPT = `_geonic_completions() {\n local completions\n completions=(\\${(f)\"$(geonic cli completions --line=\"$BUFFER\" --point=\"$CURSOR\" 2>/dev/null)\"})\n if [[ \"\\${completions[1]}\" == \"<file>\" ]]; then\n _files\n return\n fi\n compadd -a completions\n}\ncompdef _geonic_completions geonic`;\n\nconst BASH_SCRIPT = `_geonic_completions() {\n local cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n local completions\n completions=$(geonic cli completions --line=\"\\${COMP_LINE}\" --point=\"\\${COMP_POINT}\" 2>/dev/null)\n if [[ \"$completions\" == \"<file>\" ]]; then\n COMPREPLY=()\n return\n fi\n COMPREPLY=($(compgen -W \"$completions\" -- \"$cur\"))\n}\ncomplete -o default -F _geonic_completions geonic`;\n\nexport function registerCliCommand(program: Command): void {\n const cli = program\n .command(\"cli\")\n .summary(\"Manage CLI internals\")\n .description(\"Manage CLI internals such as shell completions.\");\n\n const completions = cli\n .command(\"completions\")\n .summary(\"Generate shell completions\")\n .description(\"Generate shell completions for geonic CLI.\")\n .option(\"--line <line>\", \"Current command line content\")\n .option(\"--point <point>\", \"Cursor position in the command line\")\n .action((opts: { line?: string; point?: string }) => {\n if (opts.line !== undefined && opts.point !== undefined) {\n const point = parseInt(opts.point, 10);\n const results = generateCompletions(program, opts.line, point);\n for (const r of results) {\n console.log(r);\n }\n }\n });\n\n const bash = completions\n .command(\"bash\")\n .description(\"Output bash completion script\")\n .action(() => {\n console.log(BASH_SCRIPT);\n });\n\n addExamples(bash, [\n {\n description: \"Print the bash completion script\",\n command: \"geonic cli completions bash\",\n },\n {\n description: \"Enable in current shell session\",\n command: 'eval \"$(geonic cli completions bash)\"',\n },\n {\n description: \"Persist in ~/.bashrc\",\n command:\n 'echo \\'eval \"$(geonic cli completions bash)\"\\' >> ~/.bashrc',\n },\n ]);\n\n const zsh = completions\n .command(\"zsh\")\n .description(\"Output zsh completion script\")\n .action(() => {\n console.log(ZSH_SCRIPT);\n });\n\n addExamples(zsh, [\n {\n description: \"Print the zsh completion script\",\n command: \"geonic cli completions zsh\",\n },\n {\n description: \"Enable in current shell session\",\n command: 'eval \"$(geonic cli completions zsh)\"',\n },\n {\n description: \"Persist in ~/.zshrc\",\n command:\n 'echo \\'eval \"$(geonic cli completions zsh)\"\\' >> ~/.zshrc',\n },\n ]);\n\n const version = cli\n .command(\"version\")\n .description(\"Display the CLI version\")\n .action(() => {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { version: string };\n console.log(pkg.version);\n });\n\n addExamples(version, [\n {\n description: \"Show CLI version\",\n command: \"geonic cli version\",\n },\n ]);\n}\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport chalk from \"chalk\";\nimport { getConfigDir, ensureConfigDir } from \"./config.js\";\n\nconst PACKAGE_NAME = \"@geolonia/geonicdb-cli\";\nconst REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;\nconst CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours\nconst FETCH_TIMEOUT_MS = 5000;\n\ninterface UpdateCache {\n lastCheck: number;\n latestVersion?: string;\n}\n\nexport interface UpdateCheckResult {\n currentVersion: string;\n latestVersion: string;\n}\n\nconst CI_ENV_VARS = [\n \"CI\",\n \"CONTINUOUS_INTEGRATION\",\n \"BUILD_NUMBER\",\n \"GITHUB_ACTIONS\",\n \"GITLAB_CI\",\n \"CIRCLECI\",\n \"JENKINS_URL\",\n \"HUDSON_URL\",\n \"TRAVIS\",\n];\n\nfunction getCacheFile(): string {\n return join(getConfigDir(), \"update-check.json\");\n}\n\nfunction isCheckDisabled(): boolean {\n if (process.env.NO_UPDATE_NOTIFIER) return true;\n if (!process.stdout.isTTY) return true;\n for (const envVar of CI_ENV_VARS) {\n if (process.env[envVar]) return true;\n }\n return false;\n}\n\nfunction loadCache(): UpdateCache | null {\n try {\n const raw = readFileSync(getCacheFile(), \"utf-8\");\n return JSON.parse(raw) as UpdateCache;\n } catch {\n return null;\n }\n}\n\nfunction saveCache(cache: UpdateCache): void {\n try {\n ensureConfigDir();\n writeFileSync(getCacheFile(), JSON.stringify(cache), \"utf-8\");\n } catch {\n /* v8 ignore next -- defensive: write errors silently ignored */\n }\n}\n\nfunction shouldCheck(cache: UpdateCache | null): boolean {\n if (!cache) return true;\n return Date.now() - cache.lastCheck >= CHECK_INTERVAL_MS;\n}\n\nexport function compareSemver(current: string, latest: string): boolean {\n const parse = (v: string) =>\n v.replace(/^v/, \"\").split(\".\").map(Number) as [number, number, number];\n const [cMajor, cMinor, cPatch] = parse(current);\n const [lMajor, lMinor, lPatch] = parse(latest);\n if (lMajor !== cMajor) return lMajor > cMajor;\n if (lMinor !== cMinor) return lMinor > cMinor;\n return lPatch > cPatch;\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const res = await fetch(REGISTRY_URL, {\n signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\n/* v8 ignore next 3 -- fallback for bundled builds where package.json is unavailable */\nfunction getCurrentVersion(): string {\n return process.env.npm_package_version ?? \"0.0.0\";\n}\n\nexport function formatUpdateBox(current: string, latest: string): string {\n const message = `Update available: ${current} → ${latest}`;\n const install = `Run ${chalk.cyan(`npm i -g ${PACKAGE_NAME}`)} to update`;\n const lines = [message, install];\n const maxLen = Math.max(\n ...lines.map((l) => stripAnsi(l).length),\n );\n const pad = (line: string) => {\n const visible = stripAnsi(line).length;\n return line + \" \".repeat(maxLen - visible);\n };\n const empty = \" \".repeat(maxLen);\n const top = `╭${\"─\".repeat(maxLen + 4)}╮`;\n const bottom = `╰${\"─\".repeat(maxLen + 4)}╯`;\n const boxLines = [\n top,\n `│ ${empty} │`,\n ...lines.map((l) => `│ ${pad(l)} │`),\n `│ ${empty} │`,\n bottom,\n ];\n return chalk.yellow(boxLines.join(\"\\n\"));\n}\n\nfunction stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n}\n\nexport async function startUpdateCheck(): Promise<UpdateCheckResult | null> {\n if (isCheckDisabled()) return null;\n\n let currentVersion: string;\n try {\n const pkgPath = new URL(\"../package.json\", import.meta.url);\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as {\n version: string;\n };\n currentVersion = pkg.version;\n /* v8 ignore start -- fallback for bundled builds */\n } catch {\n currentVersion = getCurrentVersion();\n }\n /* v8 ignore stop */\n\n const cache = loadCache();\n\n if (!shouldCheck(cache)) {\n if (cache?.latestVersion && compareSemver(currentVersion, cache.latestVersion)) {\n return { currentVersion, latestVersion: cache.latestVersion };\n }\n return null;\n }\n\n const latestVersion = await fetchLatestVersion();\n\n saveCache({\n lastCheck: Date.now(),\n latestVersion: latestVersion ?? cache?.latestVersion,\n });\n\n if (latestVersion && compareSemver(currentVersion, latestVersion)) {\n return { currentVersion, latestVersion };\n }\n\n return null;\n}\n\nexport function printUpdateNotification(result: UpdateCheckResult | null): void {\n if (!result) return;\n const box = formatUpdateBox(result.currentVersion, result.latestVersion);\n process.stderr.write(\"\\n\" + box + \"\\n\");\n}\n","import { createProgram } from \"./cli.js\";\nimport { startUpdateCheck, printUpdateNotification } from \"./update-notifier.js\";\n\nconst updateCheckPromise = startUpdateCheck();\nconst program = createProgram();\nawait program.parseAsync();\nconst updateResult = await updateCheckPromise;\nprintUpdateNotification(updateResult);\n"],"mappings":";;;AAAA,SAAS,iBAAAA,sBAAqB;AAC9B,SAAS,WAAAC,gBAAe;;;ACDxB,SAAS,cAAc,eAAe,WAAW,kBAAkB;AACnE,SAAS,YAAY;AACrB,SAAS,eAAe;AAGjB,SAAS,eAAuB;AACrC,SAAO,QAAQ,IAAI,qBAAqB,KAAK,QAAQ,GAAG,WAAW,QAAQ;AAC7E;AAEA,SAAS,gBAAwB;AAC/B,SAAO,KAAK,aAAa,GAAG,aAAa;AAC3C;AAEO,SAAS,kBAAwB;AACtC,QAAM,MAAM,aAAa;AACzB,MAAI,CAAC,WAAW,GAAG,GAAG;AACpB,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AACF;AAEA,SAAS,cAAc,MAA8C;AACnE,QAAM,UAAqB,CAAC;AAC5B,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,aAAW,OAAO,WAAW;AAC3B,QAAI,OAAO,MAAM;AACf,MAAC,QAAoC,GAAG,IAAI,KAAK,GAAG;AAAA,IACtD;AAAA,EACF;AACA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,UAAU,EAAE,SAAS,QAAQ;AAAA,EAC/B;AACF;AAEA,SAAS,gBAAgB,OAAwC;AAE/D,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,IAAI;AACV,SACE,EAAE,YAAY,KACd,OAAO,EAAE,mBAAmB,YAC5B,OAAO,EAAE,aAAa,YACtB,EAAE,aAAa;AAEnB;AAEA,SAAS,gBAA+B;AACtC,SAAO,EAAE,SAAS,GAAG,gBAAgB,WAAW,UAAU,EAAE,SAAS,CAAC,EAAE,EAAE;AAC5E;AAEO,SAAS,iBAAgC;AAC9C,MAAI;AACF,UAAM,MAAM,aAAa,cAAc,GAAG,OAAO;AACjD,UAAM,OAAO,KAAK,MAAM,GAAG;AAE3B,QAAI,EAAE,aAAa,OAAO;AACxB,YAAM,WAAW,cAAc,IAAI;AACnC,qBAAe,QAAQ;AACvB,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,gBAAgB,IAAI,GAAG;AAC1B,aAAO,cAAc;AAAA,IACvB;AAEA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,cAAc;AAAA,EACvB;AACF;AAEO,SAAS,eAAe,YAAiC;AAC9D,kBAAgB;AAChB,gBAAc,cAAc,GAAG,KAAK,UAAU,YAAY,MAAM,CAAC,IAAI,MAAM,OAAO;AACpF;AAEO,SAAS,WAAW,aAAiC;AAC1D,QAAM,aAAa,eAAe;AAClC,QAAM,OAAO,eAAe,WAAW;AACvC,SAAO,WAAW,SAAS,IAAI,KAAK,CAAC;AACvC;AAEO,SAAS,WAAW,QAAmB,aAA4B;AACxE,QAAM,aAAa,eAAe;AAClC,QAAM,OAAO,eAAe,WAAW;AACvC,aAAW,SAAS,IAAI,IAAI;AAC5B,iBAAe,UAAU;AAC3B;AAEO,SAAS,eAAe,KAAa,aAA+B;AACzE,QAAM,SAAS,WAAW,WAAW;AACrC,SAAO,OAAO,GAAsB;AACtC;AAEO,SAAS,YAAY,KAAqB;AAC/C,QAAM,IAAI,KAAK;AACf,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C;AACA,MAAI,CAAC,gBAAgB,KAAK,GAAG,GAAG;AAC9B,UAAM,IAAI,MAAM,iBAAiB,GAAG,6CAA6C;AAAA,EACnF;AACA,MAAI;AACF,QAAI,IAAI,GAAG;AAAA,EACb,QAAQ;AACN,UAAM,IAAI,MAAM,iBAAiB,GAAG,IAAI;AAAA,EAC1C;AACA,SAAO,IAAI,QAAQ,QAAQ,EAAE,IAAI;AACnC;AAEO,SAAS,eAAe,KAAa,OAAe,aAA4B;AACrF,QAAM,SAAS,WAAW,WAAW;AACrC,MAAI,QAAQ,OAAO;AACjB,YAAQ,YAAY,KAAK;AAAA,EAC3B;AACA,EAAC,OAAmC,GAAG,IAAI;AAC3C,aAAW,QAAQ,WAAW;AAChC;AAEO,SAAS,kBAAkB,KAAa,aAA4B;AACzE,QAAM,SAAS,WAAW,WAAW;AACrC,SAAQ,OAAmC,GAAG;AAC9C,aAAW,QAAQ,WAAW;AAChC;AAEO,SAAS,gBAAwB;AACtC,SAAO,cAAc;AACvB;AAEO,SAAS,eAAoD;AAClE,QAAM,aAAa,eAAe;AAClC,SAAO,OAAO,KAAK,WAAW,QAAQ,EAAE,IAAI,CAAC,UAAU;AAAA,IACrD;AAAA,IACA,QAAQ,SAAS,WAAW;AAAA,EAC9B,EAAE;AACJ;AAEO,SAAS,oBAA4B;AAC1C,SAAO,eAAe,EAAE;AAC1B;AAEO,SAAS,kBAAkB,MAAoB;AACpD,QAAM,aAAa,eAAe;AAClC,MAAI,EAAE,QAAQ,WAAW,WAAW;AAClC,UAAM,IAAI,MAAM,YAAY,IAAI,mBAAmB;AAAA,EACrD;AACA,aAAW,iBAAiB;AAC5B,iBAAe,UAAU;AAC3B;AAEO,SAAS,cAAc,MAAoB;AAChD,QAAM,aAAa,eAAe;AAClC,MAAI,QAAQ,WAAW,UAAU;AAC/B,UAAM,IAAI,MAAM,YAAY,IAAI,mBAAmB;AAAA,EACrD;AACA,aAAW,SAAS,IAAI,IAAI,CAAC;AAC7B,iBAAe,UAAU;AAC3B;AAEO,SAAS,cAAc,MAAoB;AAChD,MAAI,SAAS,WAAW;AACtB,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AACA,QAAM,aAAa,eAAe;AAClC,MAAI,EAAE,QAAQ,WAAW,WAAW;AAClC,UAAM,IAAI,MAAM,YAAY,IAAI,mBAAmB;AAAA,EACrD;AACA,SAAO,WAAW,SAAS,IAAI;AAC/B,MAAI,WAAW,mBAAmB,MAAM;AACtC,eAAW,iBAAiB;AAAA,EAC9B;AACA,iBAAe,UAAU;AAC3B;;;ACpLA,OAAO,WAAW;AAGX,SAAS,aAAa,MAAe,QAA8B;AACxE,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,IACrC,KAAK;AACH,aAAO,YAAY,IAAI;AAAA,IACzB,KAAK;AACH,aAAO,KAAK,UAAU,UAAU,IAAI,GAAG,MAAM,CAAC;AAAA,IAChD;AACE,aAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,EACvC;AACF;AAEO,SAAS,YAAY,MAAe,QAA4B;AACrE,UAAQ,IAAI,aAAa,MAAM,MAAM,CAAC;AACxC;AAEO,SAAS,aAAa,SAAuB;AAClD,UAAQ,IAAI,MAAM,MAAM,OAAO,CAAC;AAClC;AAEO,SAAS,WAAW,SAAuB;AAChD,UAAQ,MAAM,MAAM,IAAI,UAAU,OAAO,EAAE,CAAC;AAC9C;AAEO,SAAS,UAAU,SAAuB;AAC/C,UAAQ,IAAI,MAAM,KAAK,OAAO,CAAC;AACjC;AAEO,SAAS,aAAa,SAAuB;AAClD,UAAQ,MAAM,MAAM,OAAO,OAAO,CAAC;AACrC;AAEO,SAAS,WAAW,OAAqB;AAC9C,UAAQ,IAAI,MAAM,IAAI,UAAU,KAAK,EAAE,CAAC;AAC1C;AAEA,SAAS,YAAY,MAAuB;AAC1C,MAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,QAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,aAAO,kBAAkB,IAA+B;AAAA,IAC1D;AACA,WAAO,OAAO,IAAI;AAAA,EACpB;AAEA,MAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,QAAM,QAAQ;AACd,QAAM,OAAO,YAAY,KAAK;AAE9B,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,OAAO,MAAM;AACtB,WAAO,IAAI,KAAK,IAAI,MAAM;AAAA,EAC5B;AACA,aAAW,QAAQ,OAAO;AACxB,eAAW,OAAO,MAAM;AACtB,YAAM,MAAM,UAAU,KAAK,GAAG,CAAC;AAC/B,aAAO,IAAI,KAAK,KAAK,IAAI,OAAO,IAAI,GAAG,GAAI,IAAI,MAAM,CAAC;AAAA,IACxD;AAAA,EACF;AAEA,QAAMC,UAAS,KAAK,IAAI,CAAC,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,IAAI,CAAC,CAAE,CAAC,CAAC,EAAE,KAAK,IAAI;AAC9E,QAAM,YAAY,KAAK,IAAI,CAAC,MAAM,SAAI,OAAO,OAAO,IAAI,CAAC,CAAE,CAAC,EAAE,KAAK,cAAI;AACvE,QAAM,OAAO,MAAM;AAAA,IAAI,CAAC,SACtB,KAAK,IAAI,CAAC,MAAM,UAAU,KAAK,CAAC,CAAC,EAAE,OAAO,OAAO,IAAI,CAAC,CAAE,CAAC,EAAE,KAAK,IAAI;AAAA,EACtE;AAEA,SAAO,CAACA,SAAQ,WAAW,GAAG,IAAI,EAAE,KAAK,IAAI;AAC/C;AAEA,SAAS,kBAAkB,KAAsC;AAC/D,QAAM,UAAU,OAAO,QAAQ,GAAG;AAClC,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAM,WAAW,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC;AAC3D,SAAO,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,KAAK,EAAE,OAAO,QAAQ,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,EAAE,EAAE,KAAK,IAAI;AAChG;AAEA,SAAS,YAAY,OAA4C;AAC/D,QAAM,WAAW,CAAC,MAAM,MAAM;AAC9B,QAAM,SAAS,oBAAI,IAAY;AAC/B,aAAW,QAAQ,OAAO;AACxB,eAAW,OAAO,OAAO,KAAK,IAAI,GAAG;AACnC,aAAO,IAAI,GAAG;AAAA,IAChB;AAAA,EACF;AACA,QAAM,SAAmB,CAAC;AAC1B,aAAW,KAAK,UAAU;AACxB,QAAI,OAAO,IAAI,CAAC,GAAG;AACjB,aAAO,KAAK,CAAC;AACb,aAAO,OAAO,CAAC;AAAA,IACjB;AAAA,EACF;AACA,SAAO,KAAK,GAAG,MAAM,KAAK,MAAM,EAAE,KAAK,CAAC;AACxC,SAAO;AACT;AAEA,SAAS,UAAU,KAAsB;AACvC,MAAI,QAAQ,UAAa,QAAQ,KAAM,QAAO;AAC9C,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,MAAM;AACZ,QAAI,WAAW,IAAK,QAAO,OAAO,IAAI,KAAK;AAC3C,WAAO,KAAK,UAAU,GAAG;AAAA,EAC3B;AACA,SAAO,OAAO,GAAG;AACnB;AAEA,SAAS,UAAU,MAAwB;AACzC,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,KAAK,IAAI,eAAe;AAAA,IACpC;AAAA,EACF;AACA,SAAO,gBAAgB,IAAI;AAC7B;AAEA,SAAS,gBAAgB,QAA0B;AACjD,MAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AACjD,WAAO,EAAE,MAAM,WAAW,UAAU,MAAM,YAAY,OAAO;AAAA,EAC/D;AAEA,QAAM,MAAM;AACZ,MAAI,WAAW;AAEf,MAAI,IAAI,UAAU;AAChB,UAAM,MAAM,IAAI;AAChB,eAAW,IAAI,SAAS;AAAA,EAC1B;AAEA,QAAM,aAAsC,CAAC;AAC7C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,QAAQ,WAAY;AACxB,QAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,WAAY,OAAkB;AAC/E,iBAAW,GAAG,IAAK,MAAkC;AAAA,IACvD,OAAO;AACL,iBAAW,GAAG,IAAI;AAAA,IACpB;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,WAAW,UAAU,WAAW;AACjD;;;AChJA,OAAOC,YAAW;AAQlB,IAAM,cAAc,oBAAI,QAA4B;AAE7C,SAAS,YAAY,KAAc,UAA2B;AACnE,cAAY,IAAI,KAAK,QAAQ;AAC/B;AAEA,SAAS,OAAO,OAAuB;AACrC,SAAOA,OAAM,OAAO,KAAK,KAAK;AAChC;AAEA,SAAS,YAAY,QAAiB,MAAmC;AACvE,SAAO,OAAO,SAAS;AAAA,IACrB,CAAC,MAAM,EAAE,KAAK,MAAM,QAAQ,EAAE,QAAQ,EAAE,SAAS,IAAI;AAAA,EACvD;AACF;AAEA,SAAS,eAAe,KAAsB;AAC5C,QAAM,QAAkB,CAAC;AACzB,MAAI,UAA0B;AAC9B,SAAO,SAAS;AACd,UAAM,QAAQ,QAAQ,KAAK,CAAC;AAC5B,cAAU,QAAQ;AAAA,EACpB;AACA,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,eAAe,KAAuB;AAC7C,MAAI,OAAO;AACX,SAAO,KAAK,QAAQ;AAClB,WAAO,KAAK;AAAA,EACd;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,KAAqB;AAEjD,QAAM,OAAO,IAAI,QAAQ,IAAI,SAAS;AACtC,MAAI,IAAI,UAAU;AAChB,UAAM,QAAQ,IAAI,MAAM,MAAM,WAAW;AACzC,UAAM,YAAY,QAAQ,MAAM,CAAC,IAAI;AACrC,WAAO,IAAI,IAAI,KAAK,SAAS;AAAA,EAC/B,WAAW,IAAI,UAAU;AACvB,UAAM,QAAQ,IAAI,MAAM,MAAM,cAAc;AAC5C,UAAM,YAAY,QAAQ,MAAM,CAAC,IAAI;AACrC,WAAO,IAAI,IAAI,MAAM,SAAS;AAAA,EAChC;AACA,SAAO,IAAI,IAAI;AACjB;AAEA,SAAS,eAAe,MAAc,KAAsB;AAC1D,QAAM,QAAQ,CAAC,IAAI;AAEnB,aAAW,OAAO,IAAI,qBAAqB;AACzC,QAAI,IAAI,UAAU;AAChB,YAAM,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG;AAAA,IAC9B,OAAO;AACL,YAAM,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI;AAAA,IAChC;AAAA,EACF;AAEA,aAAW,OAAO,IAAI,SAAS;AAC7B,QAAI,IAAI,OAAQ;AAChB,UAAM,KAAK,qBAAqB,GAAG,CAAC;AAAA,EACtC;AAEA,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,iBAAiB,SAAsC;AAC9D,QAAM,SAAS,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC;AAC7D,SAAO,QAAQ,IAAI,CAAC,QAAQ;AAC1B,UAAM,QAAQ,IAAI,MAAM,OAAO,SAAS,CAAC;AAEzC,WAAO,KAAKA,OAAM,MAAM,KAAK,CAAC,GAAG,IAAI,eAAe,EAAE;AAAA,EACxD,CAAC;AACH;AAEA,SAAS,uBAAuBC,UAA0B;AACxD,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,OAAO,mBAAmB,CAAC;AACtC,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,GAAG,iBAAiBA,SAAQ,OAAO,CAAC;AAC/C,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,mBAAmBA,UAA0B;AAC3D,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,OAAO,MAAM,CAAC;AACzB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,KAAKA,SAAQ,KAAK,CAAC,EAAE;AAChC,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,OAAO,aAAa,CAAC;AAChC,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,KAAKA,SAAQ,YAAY,CAAC,EAAE;AACvC,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,OAAO,oBAAoB,CAAC;AACvC,QAAM,KAAK,EAAE;AAEb,QAAM,WAAWA,SAAQ,SACtB,OAAO,CAAC,MAAM,CAAE,EAAsC,OAAO,EAC7D,MAAM,EACN,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;AAElD,QAAM,SAAS,KAAK,IAAI,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;AAE/D,aAAW,OAAO,UAAU;AAC1B,UAAM,OAAO,IAAI,KAAK,EAAE,OAAO,SAAS,CAAC;AACzC,UAAM,KAAK,KAAKD,OAAM,MAAM,IAAI,CAAC,GAAG,IAAI,QAAQ,KAAK,IAAI,YAAY,CAAC,EAAE;AAAA,EAC1E;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,uBAAuBC,QAAO,CAAC;AAE1C,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,qBACdA,UACA,KACA,MACQ;AACR,QAAM,QAAkB,CAAC;AAGzB,QAAM,KAAK,OAAO,MAAM,CAAC;AACzB,QAAM,KAAK,EAAE;AACb,QAAM,UAAU,IAAI,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AACxD,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,KAAK,KAAK,IAAI,IAAID,OAAM,IAAI,WAAW,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE;AAAA,EACvE,OAAO;AACL,UAAM,KAAK,KAAK,IAAI,EAAE;AAAA,EACxB;AAGA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,OAAO,aAAa,CAAC;AAChC,QAAM,KAAK,EAAE;AACb,aAAW,YAAY,IAAI,YAAY,EAAE,MAAM,IAAI,GAAG;AACpD,UAAM,KAAK,KAAK,QAAQ,EAAE;AAAA,EAC5B;AAEA,QAAM,cAAc,IAAI,SAAS;AAAA,IAC/B,CAAC,MAAM,CAAE,EAAsC;AAAA,EACjD;AAEA,MAAI,YAAY,SAAS,GAAG;AAE1B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,OAAO,UAAU,CAAC;AAC7B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,KAAK,IAAI,YAAY;AAChC,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,OAAO,aAAa,CAAC;AAChC,UAAM,KAAK,EAAE;AAEb,UAAM,SAAS,KAAK,IAAI,GAAG,YAAY,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;AAClE,eAAW,OAAO,aAAa;AAC7B,YAAM,OAAO,IAAI,KAAK,EAAE,OAAO,SAAS,CAAC;AACzC,YAAM,KAAK,KAAKA,OAAM,MAAM,IAAI,CAAC,GAAG,IAAI,QAAQ,KAAK,IAAI,YAAY,CAAC,EAAE;AAAA,IAC1E;AAAA,EACF,OAAO;AAEL,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,OAAO,UAAU,CAAC;AAC7B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,KAAK,eAAe,MAAM,GAAG,CAAC,EAAE;AAE3C,UAAM,UAAU,IAAI,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM;AACnD,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,OAAO,SAAS,CAAC;AAC5B,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,GAAG,iBAAiB,OAAO,CAAC;AAAA,IACzC;AAAA,EACF;AAGA,QAAM,WAAW,YAAY,IAAI,GAAG;AACpC,MAAI,YAAY,SAAS,SAAS,GAAG;AACnC,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,OAAO,UAAU,CAAC;AAC7B,UAAM,KAAK,EAAE;AACb,eAAW,MAAM,UAAU;AACzB,YAAM,KAAK,KAAK,GAAG,WAAW,GAAG;AACjC,YAAM,KAAK,SAAS,GAAG,OAAO,EAAE;AAChC,YAAM,KAAK,EAAE;AAAA,IACf;AAAA,EACF;AAGA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,uBAAuBC,QAAO,CAAC;AAE1C,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,SAASA,UAAkB,MAAsB;AACxD,MAAI,KAAK,WAAW,GAAG;AACrB,YAAQ,IAAI,mBAAmBA,QAAO,CAAC;AACvC;AAAA,EACF;AAEA,MAAI,UAAUA;AACd,QAAM,WAAsB,CAAC;AAE7B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,QAAQ,YAAY,SAAS,KAAK,CAAC,CAAC;AAC1C,QAAI,CAAC,OAAO;AACV,YAAM,YAAY,KAAK,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,GAAG;AAC/C,cAAQ;AAAA,QACND,OAAM,IAAI,WAAW,SAAS,4BAA4B;AAAA,MAC5D;AACA,cAAQ,MAAM;AAAA,0CAA6C;AAC3D,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,aAAS,KAAK,KAAK;AACnB,cAAU;AAAA,EACZ;AAEA,QAAM,SAAS,SAAS,SAAS,SAAS,CAAC;AAC3C,QAAM,OAAO,CAACC,SAAQ,KAAK,GAAG,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG;AAExE,UAAQ,IAAI,qBAAqBA,UAAS,QAAQ,IAAI,CAAC;AACzD;AAEO,SAAS,oBAAoBA,UAAwB;AAE1D,EAAAA,SAAQ,eAAe,KAAK;AAG5B,EAAAA,SAAQ,cAAc;AAAA,IACpB,YAAY,CAAC,KAAc,YAA0B;AACnD,YAAM,OAAO,eAAe,GAAG;AAC/B,UAAI,QAAQ,MAAM;AAChB,eAAO,mBAAmB,IAAI;AAAA,MAChC;AACA,YAAM,OAAO,eAAe,GAAG;AAC/B,aAAO,qBAAqB,MAAM,KAAK,IAAI;AAAA,IAC7C;AAAA,EACF,CAAC;AAGD,EAAAA,SACG,QAAQ,MAAM,EACd,YAAY,gCAAgC,EAC5C,SAAS,WAAW,EACpB,mBAAmB,EACnB,OAAO,CAAC,SAAmB;AAC1B,aAASA,UAAS,IAAI;AAAA,EACxB,CAAC;AAGH,EAAAA,SAAQ,SAAS,cAAc,EAAE,OAAO,CAAC,aAAuB;AAC9D,QAAI,SAAS,SAAS,GAAG;AACvB,cAAQ;AAAA,QACN,YAAY,SAAS,CAAC,CAAC;AAAA,MACzB;AACA,cAAQ,WAAW;AACnB;AAAA,IACF;AACA,aAASA,UAAS,CAAC,CAAC;AAAA,EACtB,CAAC;AACH;;;ACrQA,IAAM,wBAAwB,oBAAI,IAAI,CAAC,SAAS,gBAAgB,QAAQ,CAAC;AAElE,SAAS,sBAAsBC,UAAwB;AAC5D,QAAM,SAASA,SACZ,QAAQ,QAAQ,EAChB,YAAY,0BAA0B;AAEzC,QAAM,MAAM,OACT,QAAQ,KAAK,EACb,YAAY,qBAAqB,EACjC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,SAAS,WAAW,qBAAqB,EACzC,OAAO,IAAI,SAAoB;AAC9B,UAAM,MAAM,KAAK,KAAK,SAAS,CAAC;AAChC,UAAM,MAAM,KAAK,CAAC;AAClB,UAAM,QAAQ,KAAK,CAAC;AACpB,UAAM,UAAW,IAAI,gBAAgB,EAA2B;AAChE,mBAAe,KAAK,OAAO,OAAO;AAClC,UAAM,UAAU,sBAAsB,IAAI,GAAG,IAAI,QAAQ;AACzD,iBAAa,OAAO,GAAG,MAAM,OAAO,EAAE;AAAA,EACxC,CAAC;AAEH,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,EACF,CAAC;AAED,QAAM,MAAM,OACT,QAAQ,KAAK,EACb,YAAY,oBAAoB,EAChC,SAAS,SAAS,mBAAmB,EACrC,OAAO,IAAI,SAAoB;AAC9B,UAAM,MAAM,KAAK,KAAK,SAAS,CAAC;AAChC,UAAM,MAAM,KAAK,CAAC;AAClB,UAAM,UAAW,IAAI,gBAAgB,EAA2B;AAChE,UAAM,QAAQ,eAAe,KAAK,OAAO;AACzC,QAAI,UAAU,QAAW;AACvB,gBAAU,QAAQ,GAAG,eAAe;AAAA,IACtC,OAAO;AACL,kBAAY,OAAO,MAAM;AAAA,IAC3B;AAAA,EACF,CAAC;AAEH,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,QAAM,OAAO,OACV,QAAQ,MAAM,EACd,YAAY,wBAAwB,EACpC,OAAO,IAAI,SAAoB;AAC9B,UAAM,MAAM,KAAK,KAAK,SAAS,CAAC;AAChC,UAAM,UAAW,IAAI,gBAAgB,EAA2B;AAChE,UAAM,MAAM,WAAW,OAAO;AAC9B,QAAI,OAAO,KAAK,GAAG,EAAE,WAAW,GAAG;AACjC,gBAAU,sCAAsC,cAAc,CAAC,EAAE;AAAA,IACnE,OAAO;AACL,kBAAY,KAAK,MAAM;AAAA,IACzB;AAAA,EACF,CAAC;AAEH,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,QAAM,MAAM,OACT,QAAQ,QAAQ,EAChB,YAAY,uBAAuB,EACnC,SAAS,SAAS,mBAAmB,EACrC,OAAO,IAAI,SAAoB;AAC9B,UAAM,MAAM,KAAK,KAAK,SAAS,CAAC;AAChC,UAAM,MAAM,KAAK,CAAC;AAClB,UAAM,UAAW,IAAI,gBAAgB,EAA2B;AAChE,sBAAkB,KAAK,OAAO;AAC9B,iBAAa,gBAAgB,GAAG,IAAI;AAAA,EACtC,CAAC;AAEH,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;AClIA,SAAS,eAAe;;;ACOxB,eAAsB,uBAAuB,SAKb;AAC9B,QAAM,MAAM,IAAI,IAAI,gBAAgB,QAAQ,OAAO,EAAE,SAAS;AAC9D,QAAM,cAAc,OAAO,KAAK,GAAG,QAAQ,QAAQ,IAAI,QAAQ,YAAY,EAAE,EAAE,SAAS,QAAQ;AAEhG,QAAM,OAA+B,EAAE,YAAY,qBAAqB;AACxE,MAAI,QAAQ,OAAO;AACjB,SAAK,QAAQ,QAAQ;AAAA,EACvB;AAEA,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,SAAS,WAAW;AAAA,IACrC;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,KAAK,MAAM,IAAI;AAC3B,gBAAW,IAAI,qBAAqB,IAAI,SAAS;AAAA,IACnD,QAAQ;AACN,gBAAU,QAAQ,QAAQ,SAAS,MAAM;AAAA,IAC3C;AACA,UAAM,IAAI,MAAM,+BAA+B,OAAO,EAAE;AAAA,EAC1D;AAEA,SAAQ,MAAM,SAAS,KAAK;AAC9B;;;ACxCO,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC,cAAc;AACZ,UAAM,SAAS;AACf,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,YAAN,MAAM,WAAU;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,SAAwB;AAClC,SAAK,UAAU,QAAQ,QAAQ,QAAQ,QAAQ,EAAE;AACjD,SAAK,UAAU,QAAQ;AACvB,SAAK,QAAQ,QAAQ;AACrB,SAAK,eAAe,QAAQ;AAC5B,SAAK,SAAS,QAAQ;AACtB,SAAK,WAAW,QAAQ;AACxB,SAAK,eAAe,QAAQ;AAC5B,SAAK,iBAAiB,QAAQ;AAC9B,SAAK,UAAU,QAAQ,WAAW;AAClC,SAAK,SAAS,QAAQ,UAAU;AAAA,EAClC;AAAA,EAEQ,aAAa,OAAwD;AAC3E,UAAM,UAAkC,CAAC;AAEzC,YAAQ,cAAc,IAAI;AAC1B,YAAQ,QAAQ,IAAI;AACpB,QAAI,KAAK,QAAS,SAAQ,eAAe,IAAI,KAAK;AAElD,QAAI,KAAK,OAAO;AACd,cAAQ,eAAe,IAAI,UAAU,KAAK,KAAK;AAAA,IACjD,WAAW,KAAK,QAAQ;AACtB,cAAQ,eAAe,IAAI,UAAU,KAAK,MAAM;AAAA,IAClD;AAEA,QAAI,OAAO;AACT,aAAO,OAAO,SAAS,KAAK;AAAA,IAC9B;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,MAAc,QAAyC;AACtE,UAAM,MAAM,IAAI,IAAI,MAAM,KAAK,OAAO;AACtC,QAAI,QAAQ;AACV,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,YAAI,UAAU,UAAa,UAAU,IAAI;AACvC,cAAI,aAAa,IAAI,KAAK,KAAK;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AACA,WAAO,IAAI,SAAS;AAAA,EACtB;AAAA,EAEQ,cAAsB;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,OAAwB,oBAAoB,oBAAI,IAAI,CAAC,eAAe,CAAC;AAAA,EACrE,OAAwB,sBAAsB,oBAAI,IAAI;AAAA,IACpD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EAEO,WACN,QACA,KACA,SACA,MACM;AACN,QAAI,CAAC,KAAK,QAAS;AACnB,YAAQ,OAAO,MAAM,KAAK,MAAM,IAAI,GAAG;AAAA,CAAI;AAC3C,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC5C,UAAI,WAAU,kBAAkB,IAAI,EAAE,YAAY,CAAC,GAAG;AACpD,gBAAQ,OAAO,MAAM,KAAK,CAAC;AAAA,CAAS;AAAA,MACtC,OAAO;AACL,gBAAQ,OAAO,MAAM,KAAK,CAAC,KAAK,CAAC;AAAA,CAAI;AAAA,MACvC;AAAA,IACF;AACA,QAAI,MAAM;AACR,cAAQ,OAAO,MAAM,WAAW,WAAU,gBAAgB,IAAI,CAAC;AAAA,CAAI;AAAA,IACrE;AACA,YAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AAAA,EAEA,OAAe,gBAAgB,KAAqB;AAClD,QAAI;AACF,YAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,iBAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,YAAI,WAAU,oBAAoB,IAAI,GAAG,GAAG;AAC1C,cAAI,GAAG,IAAI;AAAA,QACb;AAAA,MACF;AACA,aAAO,KAAK,UAAU,GAAG;AAAA,IAC3B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,YAAY,UAA0B;AAC5C,QAAI,CAAC,KAAK,QAAS;AACnB,YAAQ,OAAO,MAAM,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,CAAI;AACpE,aAAS,QAAQ,QAAQ,CAAC,GAAG,MAAM;AACjC,cAAQ,OAAO,MAAM,KAAK,CAAC,KAAK,CAAC;AAAA,CAAI;AAAA,IACvC,CAAC;AACD,YAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AAAA,EAEA,OAAe,WAAW,OAAuB;AAC/C,WAAO,IAAI,MAAM,MAAM,GAAG,EAAE,KAAK,OAAS,CAAC;AAAA,EAC7C;AAAA,EAEA,OAAO,iBACL,QACA,KACA,SACA,MACQ;AACR,UAAM,QAAkB,CAAC,MAAM;AAC/B,QAAI,WAAW,OAAO;AACpB,YAAM,KAAK,MAAM,MAAM,EAAE;AAAA,IAC3B;AACA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,YAAM,KAAK,MAAM,WAAU,WAAW,GAAG,GAAG,KAAK,KAAK,EAAE,CAAC,EAAE;AAAA,IAC7D;AACA,QAAI,MAAM;AACR,YAAM,KAAK,MAAM,WAAU,WAAW,IAAI,CAAC,EAAE;AAAA,IAC/C;AACA,UAAM,KAAK,WAAU,WAAW,GAAG,CAAC;AACpC,WAAO,MAAM,KAAK,SAAS;AAAA,EAC7B;AAAA,EAEQ,aACN,QACA,KACA,SACA,MACM;AACN,QAAI,CAAC,KAAK,OAAQ;AAClB,YAAQ,IAAI,WAAU,iBAAiB,QAAQ,KAAK,SAAS,IAAI,CAAC;AAClE,UAAM,IAAI,aAAa;AAAA,EACzB;AAAA,EAEQ,aAAsB;AAC5B,YAAQ,CAAC,CAAC,KAAK,gBAAiB,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,KAAK,iBAAkB,CAAC,KAAK;AAAA,EACpF;AAAA,EAEA,MAAc,sBAAwC;AACpD,QAAI,KAAK,eAAgB,QAAO,KAAK;AAErC,SAAK,iBAAiB,KAAK,UAAU;AACrC,QAAI;AACF,aAAO,MAAM,KAAK;AAAA,IACpB,UAAE;AACA,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAc,YAA8B;AAE1C,QAAI,KAAK,cAAc;AACrB,UAAI;AACF,cAAM,MAAM,KAAK,SAAS,eAAe;AACzC,cAAM,WAAW,MAAM,MAAM,KAAK;AAAA,UAChC,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,EAAE,cAAc,KAAK,aAAa,CAAC;AAAA,QAC1D,CAAC;AAED,YAAI,SAAS,IAAI;AACf,gBAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,gBAAM,WAAY,KAAK,eAAe,KAAK;AAC3C,gBAAM,kBAAkB,KAAK;AAE7B,cAAI,UAAU;AACZ,iBAAK,QAAQ;AACb,gBAAI,gBAAiB,MAAK,eAAe;AACzC,iBAAK,iBAAiB,UAAU,eAAe;AAC/C,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAGA,QAAI,KAAK,YAAY,KAAK,cAAc;AACtC,UAAI;AACF,cAAM,SAAS,MAAM,uBAAuB;AAAA,UAC1C,SAAS,KAAK;AAAA,UACd,UAAU,KAAK;AAAA,UACf,cAAc,KAAK;AAAA,QACrB,CAAC;AACD,aAAK,QAAQ,OAAO;AACpB,aAAK,iBAAiB,OAAO,YAAY;AACzC,eAAO;AAAA,MACT,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,eACZ,QACA,MACA,SAK4B;AAC5B,UAAM,MAAM,KAAK,SAAS,GAAG,KAAK,YAAY,CAAC,GAAG,IAAI,IAAI,SAAS,MAAM;AACzE,UAAM,UAAU,KAAK,aAAa,SAAS,OAAO;AAClD,UAAM,OAAO,SAAS,OAAO,KAAK,UAAU,QAAQ,IAAI,IAAI;AAE5D,SAAK,WAAW,QAAQ,KAAK,SAAS,IAAI;AAC1C,SAAK,aAAa,QAAQ,KAAK,SAAS,IAAI;AAC5C,UAAM,WAAW,MAAM,MAAM,KAAK,EAAE,QAAQ,SAAS,KAAK,CAAC;AAC3D,SAAK,YAAY,QAAQ;AAEzB,UAAM,cAAc,SAAS,QAAQ,IAAI,sBAAsB;AAC/D,UAAM,QAAQ,cAAc,SAAS,aAAa,EAAE,IAAI;AAExD,QAAI;AAEJ,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI,SAAS,YAAY,SAAS,MAAM,KAAK,YAAY,SAAS,SAAS,IAAI;AAC7E,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,OAAO;AACL,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,MAAM;AACZ,YAAM,UACJ,KAAK,eAAe,KAAK,UAAU,KAAK,SAAS,KAAK,SAAS,QAAQ,SAAS,MAAM;AACxF,YAAM,IAAI,eAAe,SAAS,SAAS,QAAQ,GAAG;AAAA,IACxD;AAEA,WAAO,EAAE,QAAQ,SAAS,QAAQ,SAAS,SAAS,SAAS,MAAM,MAAM;AAAA,EAC3E;AAAA,EAEA,MAAc,kBACZ,QACA,MACA,SAK4B;AAC5B,UAAM,MAAM,KAAK,SAAS,MAAM,SAAS,MAAM;AAC/C,UAAM,UAAU,KAAK,aAAa,SAAS,OAAO;AAClD,UAAM,OAAO,SAAS,OAAO,KAAK,UAAU,QAAQ,IAAI,IAAI;AAE5D,SAAK,WAAW,QAAQ,KAAK,SAAS,IAAI;AAC1C,SAAK,aAAa,QAAQ,KAAK,SAAS,IAAI;AAC5C,UAAM,WAAW,MAAM,MAAM,KAAK,EAAE,QAAQ,SAAS,KAAK,CAAC;AAC3D,SAAK,YAAY,QAAQ;AAEzB,QAAI;AAEJ,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI,SAAS,YAAY,SAAS,MAAM,KAAK,YAAY,SAAS,SAAS,IAAI;AAC7E,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,OAAO;AACL,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,MAAM;AACZ,YAAM,UACJ,KAAK,eAAe,KAAK,UAAU,KAAK,SAAS,KAAK,SAAS,QAAQ,SAAS,MAAM;AACxF,YAAM,IAAI,eAAe,SAAS,SAAS,QAAQ,GAAG;AAAA,IACxD;AAEA,WAAO,EAAE,QAAQ,SAAS,QAAQ,SAAS,SAAS,SAAS,KAAK;AAAA,EACpE;AAAA,EAEA,MAAM,QACJ,QACA,MACA,SAK4B;AAC5B,QAAI;AACF,aAAO,MAAM,KAAK,eAAkB,QAAQ,MAAM,OAAO;AAAA,IAC3D,SAAS,KAAK;AACZ,UAAI,eAAe,kBAAkB,IAAI,WAAW,OAAO,KAAK,WAAW,GAAG;AAC5E,cAAM,YAAY,MAAM,KAAK,oBAAoB;AACjD,YAAI,WAAW;AACb,iBAAO,MAAM,KAAK,eAAkB,QAAQ,MAAM,OAAO;AAAA,QAC3D;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,IACJ,MACA,QACA,SAC4B;AAC5B,WAAO,KAAK,QAAW,OAAO,MAAM,EAAE,QAAQ,QAAQ,CAAC;AAAA,EACzD;AAAA,EAEA,MAAM,KACJ,MACA,MACA,QAC4B;AAC5B,WAAO,KAAK,QAAW,QAAQ,MAAM,EAAE,MAAM,OAAO,CAAC;AAAA,EACvD;AAAA,EAEA,MAAM,MACJ,MACA,MACA,QAC4B;AAC5B,WAAO,KAAK,QAAW,SAAS,MAAM,EAAE,MAAM,OAAO,CAAC;AAAA,EACxD;AAAA,EAEA,MAAM,IACJ,MACA,MACA,QAC4B;AAC5B,WAAO,KAAK,QAAW,OAAO,MAAM,EAAE,MAAM,OAAO,CAAC;AAAA,EACtD;AAAA,EAEA,MAAM,OACJ,MACA,QAC4B;AAC5B,WAAO,KAAK,QAAW,UAAU,MAAM,EAAE,OAAO,CAAC;AAAA,EACnD;AAAA;AAAA,EAGA,MAAM,WACJ,QACA,MACA,SAK4B;AAC5B,QAAI;AACF,aAAO,MAAM,KAAK,kBAAqB,QAAQ,MAAM,OAAO;AAAA,IAC9D,SAAS,KAAK;AACZ,UAAI,eAAe,kBAAkB,IAAI,WAAW,OAAO,KAAK,WAAW,GAAG;AAC5E,cAAM,YAAY,MAAM,KAAK,oBAAoB;AACjD,YAAI,WAAW;AACb,iBAAO,MAAM,KAAK,kBAAqB,QAAQ,MAAM,OAAO;AAAA,QAC9D;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC,YACE,SACgB,QACA,WAChB;AACA,UAAM,OAAO;AAHG;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;;;AClYO,SAAS,eAAe,KAA6B;AAC1D,QAAM,OAAO,IAAI,gBAAgB;AACjC,QAAM,SAAS,WAAW,KAAK,OAAO;AACtC,SAAO;AAAA,IACL,KAAK,KAAK,OAAO,OAAO;AAAA,IACxB,SAAS,KAAK,WAAW,OAAO;AAAA,IAChC,OAAO,KAAK,SAAS,OAAO;AAAA,IAC5B,QAAQ,KAAK,UAAU,OAAO,UAAU;AAAA,IACxC,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK,UAAU,QAAQ,IAAI,eAAe,OAAO;AAAA,IACzD,QAAQ,KAAK;AAAA,EACf;AACF;AAKO,SAAS,aAAa,KAAyB;AACpD,QAAM,OAAO,eAAe,GAAG;AAC/B,MAAI,CAAC,KAAK,KAAK;AACb,eAAW,qEAAqE;AAChF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,OAAK,MAAM,YAAY,KAAK,GAAG;AAC/B,QAAM,UAAU,IAAI,gBAAgB;AACpC,QAAM,gBAAgB,CAAC,CAAC,QAAQ;AAChC,QAAM,SAAS,WAAW,KAAK,OAAO;AACtC,SAAO,IAAI,UAAU;AAAA,IACnB,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,IACd,OAAO,KAAK;AAAA,IACZ,cAAc,gBAAgB,SAAY,OAAO;AAAA,IACjD,UAAU,gBAAgB,SAAY,OAAO;AAAA,IAC7C,cAAc,gBAAgB,SAAY,OAAO;AAAA,IACjD,QAAQ,KAAK;AAAA,IACb,gBAAgB,gBACZ,SACA,CAAC,OAAO,iBAAiB;AACvB,YAAM,MAAM,WAAW,KAAK,OAAO;AACnC,UAAI,QAAQ;AACZ,UAAI,aAAc,KAAI,eAAe;AACrC,iBAAW,KAAK,KAAK,OAAO;AAAA,IAC9B;AAAA,IACJ,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK;AAAA,EACf,CAAC;AACH;AAKO,SAAS,UAAU,KAA4B;AACpD,QAAM,OAAO,eAAe,GAAG;AAC/B,SAAO,KAAK;AACd;AAKO,SAAS,eACd,UACA,QACA,WACM;AACN,MAAI,aAAa,SAAS,UAAU,QAAW;AAC7C,eAAW,SAAS,KAAK;AAAA,EAC3B;AACA,MAAI,SAAS,SAAS,UAAa,SAAS,SAAS,IAAI;AACvD,gBAAY,SAAS,MAAM,MAAM;AAAA,EACnC;AACF;AAKO,SAAS,iBAAsC,IAAmC;AACvF,SAAO,UAAU,SAAY;AAC3B,QAAI;AACF,YAAM,GAAG,GAAG,IAAI;AAAA,IAClB,SAAS,KAAc;AACrB,UAAI,eAAe,cAAc;AAC/B;AAAA,MACF;AACA,UAAI,eAAe,kBAAkB,IAAI,WAAW,KAAK;AACvD,mBAAW,sEAAsE;AAAA,MACnF,WAAW,eAAe,OAAO;AAC/B,mBAAW,IAAI,OAAO;AAAA,MACxB,OAAO;AACL,mBAAW,OAAO,GAAG,CAAC;AAAA,MACxB;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF;;;ACxGA,SAAS,uBAAuB;AAEzB,SAAS,gBAAyB;AACvC,SAAO,QAAQ,MAAM,UAAU,QAAQ,QAAQ,OAAO,UAAU;AAClE;AAEA,eAAsB,cAA+B;AACnD,QAAM,KAAK,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,MAAI;AACF,UAAM,QAAQ,MAAM,GAAG,SAAS,SAAS;AACzC,WAAO,MAAM,KAAK;AAAA,EACpB,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;AAEA,eAAsB,iBAAkC;AACtD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,QAAQ,QAAQ;AACtB,UAAM,SAAS,QAAQ;AAEvB,WAAO,MAAM,YAAY;AAEzB,QAAI,CAAC,MAAM,OAAO;AAChB,UAAI,OAAO;AACX,YAAM,YAAY,OAAO;AACzB,YAAM,OAAO;AACb,YAAM,UAAU,MAAM;AACpB,cAAM,eAAe,QAAQC,OAAM;AACnC,cAAM,eAAe,OAAO,KAAK;AACjC,cAAM,eAAe,SAASC,QAAO;AACrC,cAAM,MAAM;AAAA,MACd;AACA,YAAMD,UAAS,CAAC,UAAkB;AAChC,cAAM,UAAU,MAAM,QAAQ,IAAI;AAClC,YAAI,YAAY,IAAI;AAClB,kBAAQ,MAAM,MAAM,GAAG,OAAO;AAC9B,kBAAQ;AACR,iBAAO,MAAM,IAAI;AACjB,kBAAQ,IAAI;AAAA,QACd,OAAO;AACL,kBAAQ;AAAA,QACV;AAAA,MACF;AACA,YAAM,QAAQ,MAAM;AAClB,gBAAQ;AACR,eAAO,MAAM,IAAI;AACjB,gBAAQ,IAAI;AAAA,MACd;AACA,YAAMC,WAAU,CAAC,QAAe;AAC9B,gBAAQ;AACR,eAAO,GAAG;AAAA,MACZ;AACA,YAAM,GAAG,QAAQD,OAAM;AACvB,YAAM,GAAG,OAAO,KAAK;AACrB,YAAM,GAAG,SAASC,QAAO;AACzB;AAAA,IACF;AAEA,UAAM,SAAS,MAAM;AACrB,UAAM,WAAW,IAAI;AACrB,UAAM,OAAO;AACb,UAAM,YAAY,OAAO;AAEzB,QAAI,WAAW;AAEf,UAAM,kBAAkB,MAAM;AAC5B,YAAM,eAAe,QAAQ,MAAM;AACnC,YAAM,eAAe,SAAS,OAAO;AACrC,YAAM,WAAW,UAAU,KAAK;AAChC,YAAM,MAAM;AAAA,IACd;AAEA,UAAM,UAAU,CAAC,QAAe;AAC9B,sBAAgB;AAChB,aAAO,MAAM,IAAI;AACjB,aAAO,GAAG;AAAA,IACZ;AAEA,UAAM,SAAS,CAAC,SAAiB;AAC/B,YAAM,OAAO,KAAK,WAAW,CAAC;AAE9B,UAAI,SAAS,QAAQ,SAAS,MAAM;AAClC,wBAAgB;AAChB,eAAO,MAAM,IAAI;AACjB,gBAAQ,QAAQ;AAAA,MAClB,WAAW,SAAS,GAAG;AACrB,wBAAgB;AAChB,eAAO,MAAM,IAAI;AACjB,eAAO,IAAI,MAAM,gBAAgB,CAAC;AAAA,MACpC,WAAW,SAAS,OAAO,SAAS,GAAG;AACrC,YAAI,SAAS,SAAS,GAAG;AACvB,qBAAW,SAAS,MAAM,GAAG,EAAE;AAC/B,iBAAO,MAAM,OAAO;AAAA,QACtB;AAAA,MACF,WAAW,QAAQ,IAAI;AACrB,oBAAY;AACZ,eAAO,MAAM,GAAG;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,GAAG,QAAQ,MAAM;AACvB,UAAM,GAAG,SAAS,OAAO;AAAA,EAC3B,CAAC;AACH;;;ACjGO,SAAS,iBAAiB,OAA+C;AAC9E,MAAI;AACF,UAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,UAAM,UAAU,MAAM,CAAC;AACvB,UAAM,OAAO,OAAO,KAAK,SAAS,QAAQ,EAAE,SAAS,OAAO;AAC5D,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,eAAe,OAA4B;AACzD,QAAM,UAAU,iBAAiB,KAAK;AACtC,MAAI,CAAC,WAAW,OAAO,QAAQ,QAAQ,UAAU;AAC/C,WAAO,EAAE,WAAW,MAAM,WAAW,OAAO,gBAAgB,OAAO,aAAa,KAAK;AAAA,EACvF;AAEA,QAAM,YAAY,IAAI,KAAK,QAAQ,MAAM,GAAI;AAC7C,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,cAAc,UAAU,QAAQ,IAAI;AAC1C,QAAM,cAAc,IAAI,KAAK;AAE7B,SAAO;AAAA,IACL;AAAA,IACA,WAAW,eAAe;AAAA,IAC1B,gBAAgB,cAAc,KAAK,eAAe;AAAA,IAClD;AAAA,EACF;AACF;AAEO,SAAS,eAAe,IAAoB;AACjD,MAAI,MAAM,EAAG,QAAO;AAEpB,QAAM,UAAU,KAAK,MAAM,KAAK,GAAI;AACpC,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAElC,QAAM,QAAkB,CAAC;AACzB,MAAI,OAAO,EAAG,OAAM,KAAK,GAAG,IAAI,GAAG;AACnC,MAAI,QAAQ,KAAK,EAAG,OAAM,KAAK,GAAG,QAAQ,EAAE,GAAG;AAC/C,MAAI,UAAU,KAAK,KAAK,SAAS,EAAG,OAAM,KAAK,GAAG,UAAU,EAAE,GAAG;AACjE,MAAI,MAAM,WAAW,EAAG,OAAM,KAAK,GAAG,OAAO,GAAG;AAEhD,SAAO,MAAM,KAAK,GAAG;AACvB;;;ACrDA,OAAO,WAAW;AAClB,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,mBAAAC,wBAAuB;AAYhC,eAAsB,eAAe,OAAkC;AAErE,MAAI,UAAU,QAAW;AACvB,QAAI,UAAU,IAAK,QAAO,UAAUD,cAAa,GAAG,OAAO,CAAC;AAC5D,QAAI,MAAM,WAAW,GAAG,EAAG,QAAO,UAAUA,cAAa,MAAM,MAAM,CAAC,GAAG,OAAO,CAAC;AACjF,WAAO,UAAU,KAAK;AAAA,EACxB;AAGA,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,WAAO,UAAUA,cAAa,GAAG,OAAO,CAAC;AAAA,EAC3C;AAGA,SAAO,oBAAoB;AAC7B;AAEA,SAAS,UAAU,MAAuB;AACxC,SAAO,MAAM,MAAM,KAAK,KAAK,CAAC;AAChC;AAOA,eAAe,sBAAwC;AACrD,QAAM,KAAKC,iBAAgB;AAAA,IACzB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,QAAQ;AAAA,EACV,CAAC;AAED,UAAQ,OAAO,MAAM,kEAAkE;AACvF,KAAG,OAAO;AAEV,QAAM,QAAkB,CAAC;AACzB,MAAI,QAAQ;AACZ,MAAI,UAAU;AACd,MAAI,iBAAiB;AACrB,MAAI,WAAW;AACf,MAAI,aAAa;AACjB,MAAI,YAAY;AAEhB,SAAO,IAAI,QAAiB,CAAC,SAAS,WAAW;AAC/C,OAAG,GAAG,UAAU,MAAM;AACpB,kBAAY;AACZ,SAAG,MAAM;AAAA,IACX,CAAC;AAED,OAAG,GAAG,QAAQ,CAAC,SAAS;AACtB,YAAM,KAAK,IAAI;AACf,YAAM,SAAS,WAAW,MAAM,OAAO,SAAS,gBAAgB,UAAU,UAAU;AACpF,cAAQ,OAAO;AACf,gBAAU,OAAO;AACjB,uBAAiB,OAAO;AACxB,iBAAW,OAAO;AAClB,mBAAa,OAAO;AAEpB,UAAI,WAAW,SAAS,KAAK,CAAC,kBAAkB,CAAC,UAAU;AACzD,WAAG,MAAM;AACT,YAAI;AACF,kBAAQ,UAAU,MAAM,KAAK,IAAI,CAAC,CAAC;AAAA,QACrC,SAAS,KAAK;AACZ,iBAAO,GAAG;AAAA,QACZ;AAAA,MACF,OAAO;AACL,WAAG,UAAU,OAAO;AACpB,WAAG,OAAO;AAAA,MACZ;AAAA,IACF,CAAC;AAED,OAAG,GAAG,SAAS,MAAM;AACnB,UAAI,WAAW;AACb,eAAO,IAAI,MAAM,kBAAkB,CAAC;AACpC;AAAA,MACF;AACA,UAAI,MAAM,SAAS,MAAM,CAAC,WAAW,QAAQ,KAAK,kBAAkB,WAAW;AAE7E,YAAI;AACF,kBAAQ,UAAU,MAAM,KAAK,IAAI,CAAC,CAAC;AAAA,QACrC,SAAS,KAAK;AACZ,iBAAO,GAAG;AAAA,QACZ;AAAA,MACF,WAAW,MAAM,WAAW,GAAG;AAC7B,eAAO,IAAI,MAAM,oBAAoB,CAAC;AAAA,MACxC;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAMA,SAAS,WACP,MACA,OACA,SACA,gBACA,UACA,YACqG;AAErG,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,KAAK,KAAK,CAAC;AACjB,UAAM,OAAO,IAAI,IAAI,KAAK,SAAS,KAAK,IAAI,CAAC,IAAI;AAEjD,QAAI,gBAAgB;AAClB,UAAI,OAAO,OAAO,SAAS,KAAK;AAC9B,yBAAiB;AACjB;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,UAAU;AACZ,UAAI,OAAO,QAAQ,IAAI,IAAI,KAAK,QAAQ;AACtC;AAAA,MACF,WAAW,OAAO,YAAY;AAC5B,mBAAW;AAAA,MACb;AACA;AAAA,IACF;AAGA,QAAI,OAAO,OAAO,SAAS,IAAK;AAEhC,QAAI,OAAO,OAAO,SAAS,KAAK;AAC9B,uBAAiB;AACjB;AACA;AAAA,IACF;AAEA,QAAI,OAAO,OAAO,OAAO,KAAK;AAC5B,iBAAW;AACX,mBAAa;AAAA,IACf,WAAW,OAAO,OAAO,OAAO,KAAK;AACnC;AACA,gBAAU;AAAA,IACZ,WAAW,OAAO,OAAO,OAAO,KAAK;AACnC;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,gBAAgB,UAAU,WAAW;AAChE;;;ACxJO,SAAS,4BAA4B,IAAmB;AAC7D,QAAM,eAAe,GAClB,QAAQ,eAAe,EACvB,YAAY,2BAA2B;AAG1C,QAAM,OAAO,aACV,QAAQ,MAAM,EACd,YAAY,yBAAyB,EACrC;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,mBAAmB;AACnE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,aACZ,QAAQ,eAAe,EACvB,YAAY,2BAA2B,EACvC,OAAO,iBAAiB,aAAa,EACrC,OAAO,qBAAqB,kCAAkC,EAC9D,OAAO,UAAU,4DAA4D,EAC7E;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,OAAO,IAAI,KAAK;AAMtB,UAAI;AACJ,UAAI,MAAM;AACR,eAAO,MAAM,eAAe,IAA0B;AAAA,MACxD,WAAW,KAAK,QAAQ,KAAK,QAAQ;AAEnC,cAAM,UAAmC,CAAC;AAC1C,YAAI,KAAK,KAAM,SAAQ,aAAa,KAAK;AACzC,YAAI,KAAK,OAAQ,SAAQ,gBAAgB,KAAK,OAAO,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACnF,eAAO;AAAA,MACT,OAAO;AAEL,eAAO,MAAM,eAAe;AAAA,MAC9B;AAEA,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,QAAQ,qBAAqB,EAAE,KAAK,CAAC;AAE9E,YAAM,OAAO,SAAS;AAEtB,UAAI,KAAK,MAAM;AACb,cAAM,aAAa,eAAe,GAAG;AACrC,cAAM,WAAW,KAAK;AACtB,cAAM,eAAe,KAAK;AAE1B,YAAI,CAAC,YAAY,CAAC,cAAc;AAC9B,qBAAW,qEAAqE;AAChF,yBAAe,UAAU,MAAM;AAC/B,uBAAa,uBAAuB;AACpC;AAAA,QACF;AAGA,cAAM,UAAU,YAAY,WAAW,GAAI;AAC3C,cAAM,cAAc,MAAM,uBAAuB;AAAA,UAC/C;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAQ,KAAK,eAAwC,KAAK,GAAG;AAAA,QAC/D,CAAC;AAED,cAAM,SAAS,WAAW,WAAW,OAAO;AAC5C,eAAO,WAAW;AAClB,eAAO,eAAe;AACtB,eAAO,QAAQ,YAAY;AAC3B,eAAO,OAAO;AACd,mBAAW,QAAQ,WAAW,OAAO;AAErC,kBAAU,0DAA0D;AAAA,MACtE,OAAO;AACL;AAAA,UACE;AAAA,QACF;AAAA,MACF;AAEA,qBAAe,UAAU,MAAM;AAC/B,mBAAa,uBAAuB;AAAA,IACtC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,aACT,QAAQ,aAAa,EACrB,YAAY,wBAAwB,EACpC;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,qBAAqB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACrD;AACA,mBAAa,uBAAuB;AAAA,IACtC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;APhIA,SAAS,qBAA8B;AACrC,SAAO,IAAI,QAAQ,OAAO,EACvB,YAAY,6BAA6B,EACzC,OAAO,wBAAwB,uCAAuC,EACtE,OAAO,oBAAoB,iBAAiB,EAC5C,OAAO,4BAA4B,qBAAqB,EACxD,OAAO,oBAAoB,gCAAgC,EAC3D,OAAO,oBAAoB,qCAAqC,EAChE;AAAA,IACC,iBAAiB,UAAU,SAAoB;AAC7C,YAAM,MAAM,KAAK,KAAK,SAAS,CAAC;AAChC,YAAM,YAAY,IAAI,KAAK;AAO3B,YAAM,aAAa,eAAe,GAAG;AAErC,UAAI,UAAU,mBAAmB;AAC/B,cAAM,WAAW,UAAU,YAAY,QAAQ,IAAI;AACnD,cAAM,eAAe,UAAU,gBAAgB,QAAQ,IAAI;AAE3D,YAAI,CAAC,YAAY,CAAC,cAAc;AAC9B;AAAA,YACE;AAAA,UACF;AACA,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAEA,YAAI,CAAC,WAAW,KAAK;AACnB,qBAAW,qEAAqE;AAChF,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAEA,cAAM,SAAS,MAAM,uBAAuB;AAAA,UAC1C,SAAS,WAAW;AAAA,UACpB;AAAA,UACA;AAAA,UACA,OAAO,UAAU;AAAA,QACnB,CAAC;AAED,cAAMC,UAAS,WAAW,WAAW,OAAO;AAC5C,QAAAA,QAAO,QAAQ,OAAO;AACtB,eAAOA,QAAO;AACd,mBAAWA,SAAQ,WAAW,OAAO;AAErC,qBAAa,qEAAqE;AAClF;AAAA,MACF;AAGA,UAAI,QAAQ,QAAQ,IAAI;AACxB,UAAI,WAAW,QAAQ,IAAI;AAE3B,UAAI,CAAC,SAAS,CAAC,UAAU;AACvB,YAAI,cAAc,GAAG;AACnB,cAAI,CAAC,MAAO,SAAQ,MAAM,YAAY;AACtC,cAAI,CAAC,SAAU,YAAW,MAAM,eAAe;AAAA,QACjD,OAAO;AACL;AAAA,YACE;AAAA,UACF;AACA,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAEA,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAA+B,EAAE,OAAO,SAAS;AACvD,UAAI,UAAU,UAAU;AACtB,aAAK,WAAW,UAAU;AAAA,MAC5B;AAEA,YAAM,WAAW,MAAM,OAAO,WAAW,QAAQ,eAAe,EAAE,KAAK,CAAC;AAExE,YAAM,OAAO,SAAS;AACtB,YAAM,QAAS,KAAK,eAAe,KAAK;AACxC,YAAM,eAAe,KAAK;AAE1B,UAAI,CAAC,OAAO;AACV,mBAAW,gCAAgC;AAC3C,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,SAAS,WAAW,WAAW,OAAO;AAC5C,aAAO,QAAQ;AACf,UAAI,cAAc;AAChB,eAAO,eAAe;AAAA,MACxB,OAAO;AACL,eAAO,OAAO;AAAA,MAChB;AACA,iBAAW,QAAQ,WAAW,OAAO;AAErC,mBAAa,0CAA0C;AAAA,IACzD,CAAC;AAAA,EACH;AACJ;AAEA,SAAS,sBAA+B;AACtC,SAAO,IAAI,QAAQ,QAAQ,EACxB,YAAY,kCAAkC,EAC9C;AAAA,IACC,iBAAiB,UAAU,SAAoB;AAC7C,YAAM,MAAM,KAAK,KAAK,SAAS,CAAC;AAChC,YAAM,aAAa,eAAe,GAAG;AACrC,YAAM,SAAS,WAAW,WAAW,OAAO;AAG5C,UAAI,OAAO,SAAS,WAAW,KAAK;AAClC,YAAI;AACF,gBAAM,SAAS,aAAa,GAAG;AAC/B,gBAAM,OAAO,WAAW,QAAQ,cAAc;AAAA,QAChD,QAAQ;AAAA,QAER;AAAA,MACF;AAEA,aAAO,OAAO;AACd,aAAO,OAAO;AACd,iBAAW,QAAQ,WAAW,OAAO;AACrC,mBAAa,wCAAwC;AAAA,IACvD,CAAC;AAAA,EACH;AACJ;AAEA,SAAS,iBAAiB;AACxB,SAAO,iBAAiB,UAAU,SAAoB;AACpD,UAAM,MAAM,KAAK,KAAK,SAAS,CAAC;AAChC,UAAM,aAAa,eAAe,GAAG;AAErC,QAAI,CAAC,WAAW,SAAS,CAAC,WAAW,QAAQ;AAC3C,gBAAU,yDAAyD;AACnE;AAAA,IACF;AAEA,UAAM,SAAS,aAAa,GAAG;AAC/B,UAAM,SAAS,UAAU,GAAG;AAC5B,UAAM,WAAW,MAAM,OAAO,WAAW,OAAO,KAAK;AACrD,mBAAe,UAAU,MAAM;AAG/B,QAAI,UAAU,WAAW,SAAS;AAChC;AAAA,IACF;AAGA,UAAM,eAAe,WAAW,WAAW,OAAO;AAClD,QAAI,aAAa,OAAO;AACtB,YAAM,SAAS,eAAe,aAAa,KAAK;AAChD,UAAI,OAAO,WAAW;AACpB,YAAI,OAAO,WAAW;AACpB,qBAAW,kBAAkB,OAAO,UAAU,YAAY,CAAC,YAAY;AAAA,QACzE,WAAW,OAAO,gBAAgB;AAChC;AAAA,YACE,kBAAkB,OAAO,UAAU,YAAY,CAAC,KAAK,eAAe,OAAO,WAAY,CAAC;AAAA,UAC1F;AAAA,QACF,OAAO;AACL;AAAA,YACE,kBAAkB,OAAO,UAAU,YAAY,CAAC,KAAK,eAAe,OAAO,WAAY,CAAC;AAAA,UAC1F;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,cAAc,WAAW,WAAW,kBAAkB;AAC5D,cAAU,YAAY,WAAW,EAAE;AAAA,EACrC,CAAC;AACH;AAEO,SAAS,qBAAqBC,UAAwB;AAE3D,QAAM,OAAOA,SACV,QAAQ,MAAM,EACd,YAAY,uBAAuB;AAEtC,QAAM,QAAQ,mBAAmB;AACjC,cAAY,OAAO;AAAA,IACjB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACD,OAAK,WAAW,KAAK;AAErB,QAAM,SAAS,oBAAoB;AACnC,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACD,OAAK,WAAW,MAAM;AAGtB,QAAM,KAAKA,SACR,QAAQ,IAAI,EACZ,YAAY,8DAA8D;AAG7E,QAAM,SAAS,GACZ,QAAQ,QAAQ,EAAE,WAAW,MAAM,QAAQ,KAAK,CAAC,EACjD,YAAY,oCAAoC,EAChD,OAAO,eAAe,CAAC;AAE1B,cAAY,IAAI;AAAA,IACd;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,8BAA4B,EAAE;AAG9B,EAAAA,SAAQ,WAAW,mBAAmB,GAAG,EAAE,QAAQ,KAAK,CAAC;AACzD,EAAAA,SAAQ,WAAW,oBAAoB,GAAG,EAAE,QAAQ,KAAK,CAAC;AAE1D,QAAM,eAAe,IAAI,QAAQ,QAAQ,EACtC,YAAY,oCAAoC,EAChD,OAAO,eAAe,CAAC;AAC1B,EAAAA,SAAQ,WAAW,cAAc,EAAE,QAAQ,KAAK,CAAC;AACnD;;;AQ5PO,SAAS,wBAAwBC,UAAwB;AAC9D,QAAM,UAAUA,SAAQ,QAAQ,SAAS,EAAE,YAAY,4BAA4B;AAEnF,QAAM,OAAO,QACV,QAAQ,MAAM,EACd,YAAY,mBAAmB,EAC/B,OAAO,MAAM;AACZ,UAAM,WAAW,aAAa;AAC9B,eAAW,KAAK,UAAU;AACxB,YAAM,SAAS,EAAE,SAAS,OAAO;AACjC,cAAQ,IAAI,GAAG,EAAE,IAAI,GAAG,MAAM,EAAE;AAAA,IAClC;AAAA,EACF,CAAC;AAEH,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,QAAM,MAAM,QACT,QAAQ,YAAY,EACpB,YAAY,uBAAuB,EACnC,OAAO,CAAC,SAAiB;AACxB,QAAI;AACF,wBAAkB,IAAI;AACtB,mBAAa,wBAAwB,IAAI,IAAI;AAAA,IAC/C,SAAS,KAAK;AACZ,iBAAY,IAAc,OAAO;AACjC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,QAAM,gBAAgB,QACnB,QAAQ,eAAe,EACvB,YAAY,sBAAsB,EAClC,OAAO,CAAC,SAAiB;AACxB,QAAI;AACF,oBAAc,IAAI;AAClB,mBAAa,YAAY,IAAI,YAAY;AAAA,IAC3C,SAAS,KAAK;AACZ,iBAAY,IAAc,OAAO;AACjC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,cAAY,eAAe;AAAA,IACzB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,QAAM,MAAM,QACT,QAAQ,eAAe,EACvB,YAAY,kBAAkB,EAC9B,OAAO,CAAC,SAAiB;AACxB,QAAI;AACF,oBAAc,IAAI;AAClB,mBAAa,YAAY,IAAI,YAAY;AAAA,IAC3C,SAAS,KAAK;AACZ,iBAAY,IAAc,OAAO;AACjC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,QAAM,OAAO,QACV,QAAQ,aAAa,EACrB,YAAY,uBAAuB,EACnC,OAAO,CAAC,SAAkB;AACzB,UAAM,cAAc,QAAQ,kBAAkB;AAC9C,UAAM,SAAS,WAAW,WAAW;AACrC,UAAM,UAAU,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,MAAS;AACxE,QAAI,QAAQ,WAAW,GAAG;AACxB,gBAAU,YAAY,WAAW,oBAAoB;AACrD;AAAA,IACF;AACA,eAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AAClC,WACG,QAAQ,WAAW,QAAQ,kBAAkB,QAAQ,aACtD,OAAO,UAAU,UACjB;AACA,gBAAQ,IAAI,GAAG,GAAG,OAAO;AAAA,MAC3B,OAAO;AACL,gBAAQ,IAAI,GAAG,GAAG,KAAK,KAAK,EAAE;AAAA,MAChC;AAAA,IACF;AAAA,EACF,CAAC;AAEH,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;ACnHO,SAAS,oBAAoB,OAAsB;AAExD,QAAM,OAAO,MACV,QAAQ,MAAM,EACd,YAAY,kCAAkC,EAC9C,SAAS,cAAc,WAAW,EAClC;AAAA,IACC;AAAA,MACE,OAAO,UAAkB,OAAgB,QAAiB;AACxD,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAE5B,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B,aAAa,mBAAmB,QAAQ,CAAC;AAAA,QAC3C;AACA,uBAAe,UAAU,MAAM;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,MACT,QAAQ,KAAK,EACb,YAAY,uCAAuC,EACnD,SAAS,cAAc,WAAW,EAClC,SAAS,cAAc,gBAAgB,EACvC;AAAA,IACC;AAAA,MACE,OACE,UACA,UACA,OACA,QACG;AACH,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAE5B,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B,aAAa,mBAAmB,QAAQ,CAAC,UAAU,mBAAmB,QAAQ,CAAC;AAAA,QACjF;AACA,uBAAe,UAAU,MAAM;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,MACT,QAAQ,KAAK,EACb,YAAY,6BAA6B,EACzC,SAAS,cAAc,WAAW,EAClC,SAAS,UAAU,yEAAyE,EAC5F;AAAA,IACC;AAAA,MACE,OACE,UACA,MACA,OACA,QACG;AACH,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,OAAO,MAAM,eAAe,IAAI;AAEtC,cAAM,OAAO;AAAA,UACX,aAAa,mBAAmB,QAAQ,CAAC;AAAA,UACzC;AAAA,QACF;AACA,qBAAa,mBAAmB;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,aAAa,MAChB,QAAQ,QAAQ,EAChB,YAAY,0CAA0C,EACtD,SAAS,cAAc,WAAW,EAClC,SAAS,cAAc,gBAAgB,EACvC,SAAS,UAAU,yEAAyE,EAC5F;AAAA,IACC;AAAA,MACE,OACE,UACA,UACA,MACA,OACA,QACG;AACH,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,OAAO,MAAM,eAAe,IAAI;AAEtC,cAAM,OAAO;AAAA,UACX,aAAa,mBAAmB,QAAQ,CAAC,UAAU,mBAAmB,QAAQ,CAAC;AAAA,UAC/E;AAAA,QACF;AACA,qBAAa,oBAAoB;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,YAAY;AAAA,IACtB;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,MACT,QAAQ,QAAQ,EAChB,YAAY,4CAA4C,EACxD,SAAS,cAAc,WAAW,EAClC,SAAS,cAAc,gBAAgB,EACvC;AAAA,IACC;AAAA,MACE,OACE,UACA,UACA,OACA,QACG;AACH,cAAM,SAAS,aAAa,GAAG;AAE/B,cAAM,OAAO;AAAA,UACX,aAAa,mBAAmB,QAAQ,CAAC,UAAU,mBAAmB,QAAQ,CAAC;AAAA,QACjF;AACA,qBAAa,oBAAoB;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,EACF,CAAC;AACH;AAEO,SAAS,wBAAwB,aAA4B;AAClE,QAAM,QAAQ,YACX,QAAQ,OAAO,EACf,YAAY,0BAA0B;AAEzC,sBAAoB,KAAK;AAC3B;;;ACtKO,SAAS,wBAAwBC,UAAwB;AAC9D,QAAM,WAAWA,SACd,QAAQ,UAAU,EAClB,YAAY,yBAAyB;AAGxC,QAAM,OAAO,SACV,QAAQ,MAAM,EACd,YAAY,qCAAqC,EACjD,OAAO,iBAAiB,uBAAuB,EAC/C,OAAO,sBAAsB,qCAAqC,EAClE,OAAO,eAAe,uBAAuB,EAC7C,OAAO,iBAAiB,+CAA+C,EACvE,OAAO,kBAAkB,+CAA+C,EACxE,OAAO,oBAAoB,0CAA0C,EACrE,OAAO,qBAAqB,2BAA2B,EACvD,OAAO,uBAAuB,+BAA+B,EAC7D,OAAO,eAAe,wCAAwC,QAAQ,EACtE,OAAO,gBAAgB,yBAAyB,QAAQ,EACxD,OAAO,sBAAsB,wBAAwB,EACrD,OAAO,WAAW,iCAAiC,EACnD,OAAO,gBAAgB,qCAAqC,EAC5D;AAAA,IACC,iBAAiB,OAAO,MAA+B,QAAiB;AACtE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAE5B,YAAM,SAAiC,CAAC;AAExC,UAAI,KAAK,KAAM,QAAO,OAAO,OAAO,KAAK,IAAI;AAC7C,UAAI,KAAK,UAAW,QAAO,YAAY,OAAO,KAAK,SAAS;AAC5D,UAAI,KAAK,MAAO,QAAO,IAAI,OAAO,KAAK,KAAK;AAC5C,UAAI,KAAK,MAAO,QAAO,QAAQ,OAAO,KAAK,KAAK;AAChD,UAAI,KAAK,OAAQ,QAAO,SAAS,OAAO,KAAK,MAAM;AACnD,UAAI,KAAK,SAAU,QAAO,WAAW,OAAO,KAAK,QAAQ;AACzD,UAAI,KAAK,OAAQ,QAAO,cAAc,OAAO,KAAK,MAAM;AACxD,UAAI,KAAK,UAAW,QAAO,YAAY,OAAO,KAAK,SAAS;AAC5D,UAAI,KAAK,UAAU,OAAW,QAAO,QAAQ,OAAO,KAAK,KAAK;AAC9D,UAAI,KAAK,WAAW,OAAW,QAAO,SAAS,OAAO,KAAK,MAAM;AACjE,UAAI,KAAK,QAAS,QAAO,UAAU,OAAO,KAAK,OAAO;AACtD,UAAI,KAAK,MAAO,QAAO,QAAQ;AAC/B,UAAI,KAAK,UAAW,QAAO,UAAU;AAErC,YAAM,WAAW,MAAM,OAAO,IAAI,aAAa,MAAM;AACrD,qBAAe,UAAU,QAAQ,CAAC,CAAC,KAAK,KAAK;AAAA,IAC/C,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,SACT,QAAQ,KAAK,EACb,YAAY,2BAA2B,EACvC,SAAS,QAAQ,WAAW,EAC5B,OAAO,gBAAgB,qCAAqC,EAC5D;AAAA,IACC,iBAAiB,OAAO,IAAY,MAA+B,QAAiB;AAClF,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAE5B,YAAM,SAAiC,CAAC;AACxC,UAAI,KAAK,WAAW;AAClB,eAAO,UAAU;AAAA,MACnB;AAEA,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B,aAAa,mBAAmB,EAAE,CAAC;AAAA,QACnC;AAAA,MACF;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,SACZ,QAAQ,QAAQ,EAChB,YAAY,qBAAqB,EACjC,SAAS,UAAU,yEAAyE,EAC5F;AAAA,IACC,iBAAiB,OAAO,MAA0B,OAAgB,QAAiB;AACjF,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO,MAAM,eAAe,IAAI;AAEtC,YAAM,OAAO,KAAK,aAAa,IAAI;AACnC,mBAAa,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,SACZ,QAAQ,QAAQ,EAChB,YAAY,wCAAwC,EACpD,SAAS,QAAQ,WAAW,EAC5B,SAAS,UAAU,yEAAyE,EAC5F;AAAA,IACC;AAAA,MACE,OAAO,IAAY,MAA0B,OAAgB,QAAiB;AAC5E,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,OAAO,MAAM,eAAe,IAAI;AAEtC,cAAM,OAAO;AAAA,UACX,aAAa,mBAAmB,EAAE,CAAC;AAAA,UACnC;AAAA,QACF;AACA,qBAAa,iBAAiB;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,UAAU,SACb,QAAQ,SAAS,EACjB,YAAY,2CAA2C,EACvD,SAAS,QAAQ,WAAW,EAC5B,SAAS,UAAU,yEAAyE,EAC5F;AAAA,IACC;AAAA,MACE,OAAO,IAAY,MAA0B,OAAgB,QAAiB;AAC5E,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,OAAO,MAAM,eAAe,IAAI;AAEtC,cAAM,OAAO;AAAA,UACX,aAAa,mBAAmB,EAAE,CAAC;AAAA,UACnC;AAAA,QACF;AACA,qBAAa,kBAAkB;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,SAAS;AAAA,IACnB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,SACZ,QAAQ,QAAQ,EAChB,YAAY,2BAA2B,EACvC,SAAS,UAAU,yEAAyE,EAC5F;AAAA,IACC,iBAAiB,OAAO,MAA0B,OAAgB,QAAiB;AACjF,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO,MAAM,eAAe,IAAI;AAEtC,YAAM,OAAO,KAAK,4BAA4B,IAAI;AAClD,mBAAa,kBAAkB;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,SACT,QAAQ,QAAQ,EAChB,YAAY,wBAAwB,EACpC,SAAS,QAAQ,WAAW,EAC5B;AAAA,IACC,iBAAiB,OAAO,IAAY,OAAgB,QAAiB;AACnE,YAAM,SAAS,aAAa,GAAG;AAE/B,YAAM,OAAO,OAAO,aAAa,mBAAmB,EAAE,CAAC,EAAE;AACzD,mBAAa,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,0BAAwB,QAAQ;AAClC;;;AC9RO,SAAS,qBAAqBC,UAAwB;AAC3D,QAAM,QAAQA,SACX,QAAQ,kBAAkB,EAC1B,MAAM,OAAO,EACb,YAAY,sCAAsC;AAGrD,QAAM,SAAS,MACZ,QAAQ,eAAe,EACvB,YAAY,uBAAuB,EACnC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,OAAO,MAAM,eAAe,IAA0B;AAE5D,YAAM,WAAW,MAAM,OAAO,KAAK,4BAA4B,IAAI;AACnE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,MACZ,QAAQ,eAAe,EACvB,YAAY,uBAAuB,EACnC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,OAAO,MAAM,eAAe,IAA0B;AAE5D,YAAM,WAAW,MAAM,OAAO,KAAK,4BAA4B,IAAI;AACnE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,MACZ,QAAQ,eAAe,EACvB,YAAY,gCAAgC,EAC5C;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,OAAO,MAAM,eAAe,IAA0B;AAE5D,YAAM,WAAW,MAAM,OAAO,KAAK,4BAA4B,IAAI;AACnE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,MACT,QAAQ,eAAe,EACvB,YAAY,6BAA6B,EACzC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,OAAO,MAAM,eAAe,IAA0B;AAE5D,YAAM,WAAW,MAAM,OAAO,KAAK,4BAA4B,IAAI;AACnE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,QAAQ,MACX,QAAQ,cAAc,EACtB,YAAY,2CAA2C,EACvD;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,OAAO,MAAM,eAAe,IAA0B;AAE5D,YAAM,WAAW,MAAM,OAAO,KAAK,2BAA2B,IAAI;AAClE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,OAAO;AAAA,IACjB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,QAAQ,MACX,QAAQ,cAAc,EACtB,YAAY,4BAA4B,EACxC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,OAAO,MAAM,eAAe,IAA0B;AAE5D,YAAM,WAAW,MAAM,OAAO,KAAK,2BAA2B,IAAI;AAClE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,OAAO;AAAA,IACjB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;AChKO,SAAS,6BAA6BC,UAAwB;AACnE,QAAM,gBAAgBA,SACnB,QAAQ,eAAe,EACvB,MAAM,KAAK,EACX,YAAY,8BAA8B;AAG7C,QAAM,OAAO,cACV,QAAQ,MAAM,EACd,YAAY,oBAAoB,EAChC,OAAO,eAAe,6BAA6B,QAAQ,EAC3D,OAAO,gBAAgB,kBAAkB,QAAQ,EACjD,OAAO,WAAW,iCAAiC,EACnD;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,UAAU,IAAI,KAAK;AAEzB,YAAM,SAAiC,CAAC;AACxC,UAAI,QAAQ,UAAU,OAAW,QAAO,OAAO,IAAI,OAAO,QAAQ,KAAK;AACvE,UAAI,QAAQ,WAAW,OAAW,QAAO,QAAQ,IAAI,OAAO,QAAQ,MAAM;AAC1E,UAAI,QAAQ,MAAO,QAAO,OAAO,IAAI;AAErC,YAAM,WAAW,MAAM,OAAO,IAAI,kBAAkB,MAAM;AAC1D,qBAAe,UAAU,QAAQ,CAAC,CAAC,QAAQ,KAAK;AAAA,IAClD,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,cACT,QAAQ,UAAU,EAClB,YAAY,0BAA0B,EACtC;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAE5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B,kBAAkB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAClD;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,cACZ,QAAQ,eAAe,EACvB,YAAY,uBAAuB,EACnC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,OAAO,MAAM,eAAe,IAA0B;AAE5D,YAAM,WAAW,MAAM,OAAO,KAAK,kBAAkB,IAAI;AACzD,qBAAe,UAAU,MAAM;AAC/B,mBAAa,uBAAuB;AAAA,IACtC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,cACZ,QAAQ,oBAAoB,EAC5B,YAAY,uBAAuB,EACnC;AAAA,IACC;AAAA,MACE,OAAO,IAAa,MAAe,OAAgB,QAAiB;AAClE,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAC5B,cAAM,OAAO,MAAM,eAAe,IAA0B;AAE5D,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B,kBAAkB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,UAChD;AAAA,QACF;AACA,uBAAe,UAAU,MAAM;AAC/B,qBAAa,uBAAuB;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,cACT,QAAQ,aAAa,EACrB,YAAY,uBAAuB,EACnC;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAE/B,YAAM,OAAO;AAAA,QACX,kBAAkB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAClD;AACA,mBAAa,uBAAuB;AAAA,IACtC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;AChJO,SAAS,6BAA6BC,UAAwB;AACnE,QAAM,gBAAgBA,SACnB,QAAQ,eAAe,EACvB,MAAM,KAAK,EACX,YAAY,8BAA8B;AAG7C,QAAM,OAAO,cACV,QAAQ,MAAM,EACd,YAAY,oBAAoB,EAChC,OAAO,eAAe,6BAA6B,QAAQ,EAC3D,OAAO,gBAAgB,kBAAkB,QAAQ,EACjD,OAAO,WAAW,iCAAiC,EACnD;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,UAAU,IAAI,KAAK;AAEzB,YAAM,SAAiC,CAAC;AACxC,UAAI,QAAQ,UAAU,OAAW,QAAO,OAAO,IAAI,OAAO,QAAQ,KAAK;AACvE,UAAI,QAAQ,WAAW,OAAW,QAAO,QAAQ,IAAI,OAAO,QAAQ,MAAM;AAC1E,UAAI,QAAQ,MAAO,QAAO,OAAO,IAAI;AAErC,YAAM,WAAW,MAAM,OAAO,IAAI,yBAAyB,MAAM;AACjE,qBAAe,UAAU,QAAQ,CAAC,CAAC,QAAQ,KAAK;AAAA,IAClD,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,cACT,QAAQ,UAAU,EAClB,YAAY,0BAA0B,EACtC;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAE5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B,yBAAyB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACzD;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,cACZ,QAAQ,eAAe,EACvB,YAAY,uBAAuB,EACnC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,OAAO,MAAM,eAAe,IAA0B;AAE5D,YAAM,WAAW,MAAM,OAAO,KAAK,yBAAyB,IAAI;AAChE,qBAAe,UAAU,MAAM;AAC/B,mBAAa,uBAAuB;AAAA,IACtC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,YAAY,cACf,QAAQ,oBAAoB,EAC5B,YAAY,uBAAuB,EACnC;AAAA,IACC;AAAA,MACE,OAAO,IAAa,MAAe,OAAgB,QAAiB;AAClE,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAC5B,cAAM,OAAO,MAAM,eAAe,IAA0B;AAE5D,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B,yBAAyB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,UACvD;AAAA,QACF;AACA,uBAAe,UAAU,MAAM;AAC/B,qBAAa,uBAAuB;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,WAAW;AAAA,IACrB;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,cACT,QAAQ,aAAa,EACrB,YAAY,uBAAuB,EACnC;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAE/B,YAAM,OAAO;AAAA,QACX,yBAAyB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACzD;AACA,mBAAa,uBAAuB;AAAA,IACtC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,EACF,CAAC;AACH;;;AC5IO,SAAS,qBAAqBC,UAAwB;AAC3D,QAAM,QAAQA,SACX,QAAQ,OAAO,EACf,YAAY,qBAAqB;AAGpC,QAAM,OAAO,MACV,QAAQ,MAAM,EACd,YAAY,6BAA6B,EACzC;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAE5B,YAAM,WAAW,MAAM,OAAO,IAAI,QAAQ;AAC1C,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,MACT,QAAQ,gBAAgB,EACxB,YAAY,gCAAgC,EAC5C;AAAA,IACC;AAAA,MACE,OAAO,UAAmB,OAAgB,QAAiB;AACzD,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAE5B,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B,UAAU,mBAAmB,OAAO,QAAQ,CAAC,CAAC;AAAA,QAChD;AACA,uBAAe,UAAU,MAAM;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;AChDA,SAAS,uBAAuB,KAAuB;AACrD,SAAO,IACJ,OAAO,iBAAiB,uBAAuB,EAC/C,OAAO,iBAAiB,+CAA+C,EACvE,OAAO,eAAe,uBAAuB,EAC7C,OAAO,kBAAkB,+CAA+C,EACxE,OAAO,oBAAoB,0CAA0C,EACrE,OAAO,qBAAqB,2BAA2B,EACvD,OAAO,oBAAoB,gDAAgD,EAC3E,OAAO,oBAAoB,sCAAsC,EACjE,OAAO,wBAAwB,oCAAoC,EACnE,OAAO,gBAAgB,iCAAiC,QAAQ,EAChE,OAAO,eAAe,wCAAwC,QAAQ,EACtE,OAAO,gBAAgB,yBAAyB,QAAQ,EACxD,OAAO,WAAW,iCAAiC;AACxD;AAEA,SAAS,mBAAmB;AAC1B,SAAO,iBAAiB,OAAO,OAAgB,QAAiB;AAC9D,UAAM,SAAS,aAAa,GAAG;AAC/B,UAAM,SAAS,UAAU,GAAG;AAC5B,UAAM,UAAU,IAAI,KAAK;AAEzB,UAAM,SAAiC,CAAC;AAExC,QAAI,QAAQ,KAAM,QAAO,MAAM,IAAI,QAAQ;AAC3C,QAAI,QAAQ,MAAO,QAAO,OAAO,IAAI,QAAQ;AAC7C,QAAI,QAAQ,MAAO,QAAO,GAAG,IAAI,QAAQ;AACzC,QAAI,QAAQ,OAAQ,QAAO,QAAQ,IAAI,QAAQ;AAC/C,QAAI,QAAQ,SAAU,QAAO,UAAU,IAAI,QAAQ;AACnD,QAAI,QAAQ,OAAQ,QAAO,aAAa,IAAI,QAAQ;AACpD,QAAI,QAAQ,QAAS,QAAO,SAAS,IAAI,QAAQ;AACjD,QAAI,QAAQ,OAAQ,QAAO,QAAQ,IAAI,QAAQ;AAC/C,QAAI,QAAQ,UAAW,QAAO,WAAW,IAAI,QAAQ;AACrD,QAAI,QAAQ,UAAU,OAAW,QAAO,OAAO,IAAI,OAAO,QAAQ,KAAK;AACvE,QAAI,QAAQ,UAAU,OAAW,QAAO,OAAO,IAAI,OAAO,QAAQ,KAAK;AACvE,QAAI,QAAQ,WAAW,OAAW,QAAO,QAAQ,IAAI,OAAO,QAAQ,MAAM;AAC1E,QAAI,QAAQ,MAAO,QAAO,OAAO,IAAI;AAErC,UAAM,WAAW,MAAM,OAAO,IAAI,sBAAsB,MAAM;AAC9D,mBAAe,UAAU,QAAQ,QAAQ,KAAK;AAAA,EAChD,CAAC;AACH;AAEA,SAAS,sBAAsB,KAAuB;AACpD,SAAO,IACJ,OAAO,iBAAiB,+CAA+C,EACvE,OAAO,oBAAoB,gDAAgD,EAC3E,OAAO,oBAAoB,sCAAsC,EACjE,OAAO,wBAAwB,oCAAoC,EACnE,OAAO,gBAAgB,iCAAiC,QAAQ;AACrE;AAEA,SAAS,kBAAkB;AACzB,SAAO,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AAC3E,UAAM,SAAS,aAAa,GAAG;AAC/B,UAAM,SAAS,UAAU,GAAG;AAC5B,UAAM,UAAU,IAAI,KAAK;AAEzB,UAAM,SAAiC,CAAC;AAExC,QAAI,QAAQ,MAAO,QAAO,OAAO,IAAI,QAAQ;AAC7C,QAAI,QAAQ,QAAS,QAAO,SAAS,IAAI,QAAQ;AACjD,QAAI,QAAQ,OAAQ,QAAO,QAAQ,IAAI,QAAQ;AAC/C,QAAI,QAAQ,UAAW,QAAO,WAAW,IAAI,QAAQ;AACrD,QAAI,QAAQ,UAAU,OAAW,QAAO,OAAO,IAAI,OAAO,QAAQ,KAAK;AAEvE,UAAM,WAAW,MAAM,OAAO;AAAA,MAC5B,sBAAsB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACpD;AAAA,IACF;AACA,mBAAe,UAAU,MAAM;AAAA,EACjC,CAAC;AACH;AAEA,SAAS,qBAAqB;AAC5B,SAAO,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AAC7E,UAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,UAAM,SAAS,aAAa,GAAG;AAE/B,UAAM,OAAO,KAAK,sBAAsB,IAAI;AAC5C,iBAAa,0BAA0B;AAAA,EACzC,CAAC;AACH;AAEA,SAAS,qBAAqB;AAC5B,SAAO,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AAC3E,UAAM,SAAS,aAAa,GAAG;AAE/B,UAAM,OAAO;AAAA,MACX,sBAAsB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,IACtD;AACA,iBAAa,0BAA0B;AAAA,EACzC,CAAC;AACH;AAEA,SAAS,oBAAoB;AAC3B,SAAO,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AAC7E,UAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,UAAM,SAAS,aAAa,GAAG;AAC/B,UAAM,SAAS,UAAU,GAAG;AAC5B,UAAM,UAAU,IAAI,KAAK;AAEzB,UAAM,SAAiC,CAAC;AAExC,QAAI,QAAQ,YAAa,QAAO,aAAa,IAAI,QAAQ;AACzD,QAAI,QAAQ,WAAY,QAAO,oBAAoB,IAAI,QAAQ;AAE/D,UAAM,WAAW,MAAM,OAAO;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,mBAAe,UAAU,MAAM;AAAA,EACjC,CAAC;AACH;AAEA,SAAS,gBAAgB,KAAuB;AAC9C,SAAO,IACJ,OAAO,4BAA4B,2CAA2C,EAC9E,OAAO,0BAA0B,gCAAgC;AACtE;AAEO,SAAS,wBAAwBC,UAAwB;AAC9D,QAAM,WAAWA,SACd,QAAQ,UAAU,EAClB,YAAY,0BAA0B;AAEzC,QAAM,WAAW,SACd,QAAQ,UAAU,EAClB,YAAY,iDAAiD;AAEhE,QAAM,mBAAmB,SACtB,QAAQ,kBAAkB,EAC1B,YAAY,+CAA+C;AAG9D,QAAM,eAAe;AAAA,IACnB,SAAS,QAAQ,MAAM,EAAE,YAAY,8CAA8C;AAAA,EACrF;AACA,eAAa,OAAO,iBAAiB,CAAC;AAEtC,cAAY,cAAc;AAAA,IACxB;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,EACF,CAAC;AAGD,QAAM,cAAc;AAAA,IAClB,SAAS,QAAQ,UAAU,EAAE,YAAY,6BAA6B;AAAA,EACxE;AACA,cAAY,OAAO,gBAAgB,CAAC;AAEpC,cAAY,aAAa;AAAA,IACvB;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,SACZ,QAAQ,eAAe,EACvB,YAAY,0BAA0B,EACtC,OAAO,mBAAmB,CAAC;AAE9B,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,SACT,QAAQ,aAAa,EACrB,YAAY,gCAAgC,EAC5C,OAAO,mBAAmB,CAAC;AAE9B,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,WAAW;AAAA,IACf,iBAAiB,QAAQ,cAAc,EAAE,YAAY,gCAAgC;AAAA,EACvF;AACA,WAAS,OAAO,kBAAkB,CAAC;AAEnC,cAAY,UAAU;AAAA,IACpB;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD;AAAA,IACE,SACG,QAAQ,QAAQ,EAAE,QAAQ,KAAK,CAAC,EAChC,YAAY,iEAAiE;AAAA,EAClF,EAAE,OAAO,iBAAiB,CAAC;AAE3B;AAAA,IACE,SACG,QAAQ,YAAY,EAAE,QAAQ,KAAK,CAAC,EACpC,YAAY,+DAA+D;AAAA,EAChF,EAAE,OAAO,gBAAgB,CAAC;AAE1B,WACG,QAAQ,iBAAiB,EAAE,QAAQ,KAAK,CAAC,EACzC,YAAY,qEAAqE,EACjF,OAAO,mBAAmB,CAAC;AAE9B,WACG,QAAQ,eAAe,EAAE,QAAQ,KAAK,CAAC,EACvC,YAAY,qEAAqE,EACjF,OAAO,mBAAmB,CAAC;AAE9B;AAAA,IACE,SACG,QAAQ,gBAAgB,EAAE,QAAQ,KAAK,CAAC,EACxC,YAAY,2EAA2E;AAAA,EAC5F,EAAE,OAAO,kBAAkB,CAAC;AAC9B;;;AC1PO,SAAS,yBAAyBC,UAAwB;AAC/D,QAAM,YAAYA,SACf,QAAQ,WAAW,EACnB,YAAY,kBAAkB;AAGjC,QAAM,OAAO,UACV,QAAQ,MAAM,EACd,YAAY,gBAAgB,EAC5B,OAAO,eAAe,yCAAyC,QAAQ,EACvE,OAAO,gBAAgB,0BAA0B,QAAQ,EACzD;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,UAAU,IAAI,KAAK;AAEzB,YAAM,SAAiC,CAAC;AAExC,UAAI,QAAQ,UAAU,OAAW,QAAO,OAAO,IAAI,OAAO,QAAQ,KAAK;AACvE,UAAI,QAAQ,WAAW,OAAW,QAAO,QAAQ,IAAI,OAAO,QAAQ,MAAM;AAE1E,YAAM,WAAW,MAAM,OAAO,IAAI,cAAc,MAAM;AACtD,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,UACT,QAAQ,UAAU,EAClB,YAAY,sBAAsB,EAClC;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAE5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B,cAAc,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAC9C;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,UACZ,QAAQ,QAAQ,EAChB,YAAY,uBAAuB,EACnC;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAE/B,YAAM,OAAO,KAAK,YAAY;AAC9B,mBAAa,mBAAmB;AAAA,IAClC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,UACT,QAAQ,aAAa,EACrB,YAAY,yBAAyB,EACrC;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAE/B,YAAM,OAAO;AAAA,QACX,cAAc,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAC9C;AACA,mBAAa,mBAAmB;AAAA,IAClC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,QAAQ,UACX,QAAQ,YAAY,EACpB,YAAY,wBAAwB,EACpC;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAE5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B,cAAc,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAC9C;AACA,UAAI,SAAS,SAAS,UAAa,SAAS,SAAS,IAAI;AACvD,uBAAe,UAAU,MAAM;AAAA,MACjC,OAAO;AACL,qBAAa,kBAAkB;AAAA,MACjC;AAAA,IACF,CAAC;AAAA,EACH;AAEF,cAAY,OAAO;AAAA,IACjB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;ACrIO,SAAS,uBAAuB,QAAuB;AAC5D,QAAM,UAAU,OACb,QAAQ,SAAS,EACjB,YAAY,gBAAgB;AAG/B,QAAM,OAAO,QACV,QAAQ,MAAM,EACd,YAAY,kBAAkB,EAC9B;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,gBAAgB;AAChE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,QACT,QAAQ,UAAU,EAClB,YAAY,oBAAoB,EAChC;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,kBAAkB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAClD;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,QACZ,QAAQ,eAAe,EACvB,YAAY,qBAAqB,EACjC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,QAAQ,kBAAkB;AAAA,QACjE;AAAA,MACF,CAAC;AACD,qBAAe,UAAU,MAAM;AAC/B,mBAAa,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,QACZ,QAAQ,oBAAoB,EAC5B,YAAY,iBAAiB,EAC7B;AAAA,IACC;AAAA,MACE,OAAO,IAAa,MAAe,OAAgB,QAAiB;AAClE,cAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAC5B,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B;AAAA,UACA,kBAAkB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,UAChD,EAAE,KAAK;AAAA,QACT;AACA,uBAAe,UAAU,MAAM;AAC/B,qBAAa,iBAAiB;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,QACT,QAAQ,aAAa,EACrB,YAAY,iBAAiB,EAC7B;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,kBAAkB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAClD;AACA,mBAAa,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,WAAW,QACd,QAAQ,eAAe,EACvB,YAAY,mBAAmB,EAC/B;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,kBAAkB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAClD;AACA,mBAAa,mBAAmB;AAAA,IAClC,CAAC;AAAA,EACH;AAEF,cAAY,UAAU;AAAA,IACpB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,aAAa,QAChB,QAAQ,iBAAiB,EACzB,YAAY,qBAAqB,EACjC;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,kBAAkB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAClD;AACA,mBAAa,qBAAqB;AAAA,IACpC,CAAC;AAAA,EACH;AAEF,cAAY,YAAY;AAAA,IACtB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;ACrKO,SAAS,qBAAqB,QAAuB;AAC1D,QAAM,QAAQ,OACX,QAAQ,OAAO,EACf,YAAY,cAAc;AAG7B,QAAM,OAAO,MACV,QAAQ,MAAM,EACd,YAAY,gBAAgB,EAC5B;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,cAAc;AAC9D,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,MACT,QAAQ,UAAU,EAClB,YAAY,kBAAkB,EAC9B;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,gBAAgB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAChD;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,MACZ,QAAQ,eAAe,EACvB,YAAY,mBAAmB,EAC/B;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,QAAQ,gBAAgB;AAAA,QAC/D;AAAA,MACF,CAAC;AACD,qBAAe,UAAU,MAAM;AAC/B,mBAAa,eAAe;AAAA,IAC9B,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,MACZ,QAAQ,oBAAoB,EAC5B,YAAY,eAAe,EAC3B;AAAA,IACC;AAAA,MACE,OAAO,IAAa,MAAe,OAAgB,QAAiB;AAClE,cAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAC5B,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B;AAAA,UACA,gBAAgB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,UAC9C,EAAE,KAAK;AAAA,QACT;AACA,uBAAe,UAAU,MAAM;AAC/B,qBAAa,eAAe;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,MACT,QAAQ,aAAa,EACrB,YAAY,eAAe,EAC3B;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,gBAAgB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAChD;AACA,mBAAa,eAAe;AAAA,IAC9B,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,WAAW,MACd,QAAQ,eAAe,EACvB,YAAY,iBAAiB,EAC7B;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,gBAAgB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAChD;AACA,mBAAa,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAEF,cAAY,UAAU;AAAA,IACpB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,aAAa,MAChB,QAAQ,iBAAiB,EACzB,YAAY,mBAAmB,EAC/B;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,gBAAgB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAChD;AACA,mBAAa,mBAAmB;AAAA,IAClC,CAAC;AAAA,EACH;AAEF,cAAY,YAAY;AAAA,IACtB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,MACZ,QAAQ,aAAa,EACrB,YAAY,eAAe,EAC3B;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,gBAAgB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAChD;AACA,mBAAa,gBAAgB;AAAA,IAC/B,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;AC3LO,SAAS,wBAAwB,QAAuB;AAC7D,QAAM,WAAW,OACd,QAAQ,UAAU,EAClB,YAAY,iBAAiB;AAGhC,QAAM,OAAO,SACV,QAAQ,MAAM,EACd,YAAY,mBAAmB,EAC/B;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,iBAAiB;AACjE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,SACT,QAAQ,UAAU,EAClB,YAAY,oBAAoB,EAChC;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,mBAAmB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACnD;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,SACZ,QAAQ,eAAe,EACvB,YAAY,qBAAqB,EACjC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,QAAQ,mBAAmB;AAAA,QAClE;AAAA,MACF,CAAC;AACD,qBAAe,UAAU,MAAM;AAC/B,mBAAa,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,SACZ,QAAQ,oBAAoB,EAC5B,YAAY,iBAAiB,EAC7B;AAAA,IACC;AAAA,MACE,OAAO,IAAa,MAAe,OAAgB,QAAiB;AAClE,cAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAC5B,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B;AAAA,UACA,mBAAmB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,UACjD,EAAE,KAAK;AAAA,QACT;AACA,uBAAe,UAAU,MAAM;AAC/B,qBAAa,iBAAiB;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,SACT,QAAQ,aAAa,EACrB,YAAY,iBAAiB,EAC7B;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,mBAAmB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACnD;AACA,mBAAa,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,WAAW,SACd,QAAQ,eAAe,EACvB,YAAY,mBAAmB,EAC/B;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,mBAAmB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACnD;AACA,mBAAa,mBAAmB;AAAA,IAClC,CAAC;AAAA,EACH;AAEF,cAAY,UAAU;AAAA,IACpB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,aAAa,SAChB,QAAQ,iBAAiB,EACzB,YAAY,qBAAqB,EACjC;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,mBAAmB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACnD;AACA,mBAAa,qBAAqB;AAAA,IACpC,CAAC;AAAA,EACH;AAEF,cAAY,YAAY;AAAA,IACtB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;ACrKO,SAAS,4BAA4B,QAAuB;AACjE,QAAM,eAAe,OAClB,QAAQ,eAAe,EACvB,YAAY,sBAAsB;AAGrC,QAAM,OAAO,aACV,QAAQ,MAAM,EACd,YAAY,wBAAwB,EACpC;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,sBAAsB;AACtE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,aACT,QAAQ,UAAU,EAClB,YAAY,2BAA2B,EACvC;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,wBAAwB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACxD;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,aACZ,QAAQ,eAAe,EACvB,YAAY,2BAA2B,EACvC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,QAAQ,wBAAwB;AAAA,QACvE;AAAA,MACF,CAAC;AACD,qBAAe,UAAU,MAAM;AAC/B,mBAAa,uBAAuB;AAAA,IACtC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,aACZ,QAAQ,oBAAoB,EAC5B,YAAY,wBAAwB,EACpC;AAAA,IACC;AAAA,MACE,OAAO,IAAa,MAAe,OAAgB,QAAiB;AAClE,cAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAC5B,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B;AAAA,UACA,wBAAwB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,UACtD,EAAE,KAAK;AAAA,QACT;AACA,uBAAe,UAAU,MAAM;AAC/B,qBAAa,uBAAuB;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,aACT,QAAQ,aAAa,EACrB,YAAY,wBAAwB,EACpC;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,wBAAwB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACxD;AACA,mBAAa,uBAAuB;AAAA,IACtC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;AAEO,SAAS,qBAAqB,QAAuB;AAC1D,QAAM,QAAQ,OACX,QAAQ,OAAO,EACf,YAAY,4BAA4B;AAG3C,QAAM,WAAW,MACd,QAAQ,KAAK,EACb,YAAY,yBAAyB,EACrC;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,cAAc;AAC9D,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,UAAU;AAAA,IACpB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,WAAW,MACd,QAAQ,YAAY,EACpB,YAAY,yBAAyB,EACrC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,gBAAgB;AAAA,QAC9D;AAAA,MACF,CAAC;AACD,qBAAe,UAAU,MAAM;AAC/B,mBAAa,0BAA0B;AAAA,IACzC,CAAC;AAAA,EACH;AAEF,cAAY,UAAU;AAAA,IACpB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,cAAc,MACjB,QAAQ,QAAQ,EAChB,YAAY,4BAA4B,EACxC;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO,WAAW,UAAU,cAAc;AAChD,mBAAa,8BAA8B;AAAA,IAC7C,CAAC;AAAA,EACH;AAEF,cAAY,aAAa;AAAA,IACvB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;AC9LO,SAAS,qBAAqBC,UAAwB;AAC3D,QAAM,QAAQA,SACX,QAAQ,OAAO,EACf,YAAY,wBAAwB;AAEvC,yBAAuB,KAAK;AAC5B,uBAAqB,KAAK;AAC1B,0BAAwB,KAAK;AAC7B,8BAA4B,KAAK;AACjC,uBAAqB,KAAK;AAC5B;;;ACVO,SAAS,qBAAqBC,UAAwB;AAC3D,QAAM,QAAQA,SACX,QAAQ,OAAO,EACf,YAAY,oBAAoB;AAGnC,QAAM,OAAO,MACV,QAAQ,MAAM,EACd,YAAY,gBAAgB,EAC5B;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,QAAQ;AACxD,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,MACT,QAAQ,UAAU,EAClB,YAAY,kBAAkB,EAC9B;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,UAAU,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAC1C;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,MACZ,QAAQ,eAAe,EACvB,YAAY,mBAAmB,EAC/B;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,QAAQ,UAAU,EAAE,KAAK,CAAC;AACnE,qBAAe,UAAU,MAAM;AAC/B,mBAAa,eAAe;AAAA,IAC9B,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,MACZ,QAAQ,oBAAoB,EAC5B,YAAY,eAAe,EAC3B;AAAA,IACC;AAAA,MACE,OAAO,IAAa,MAAe,OAAgB,QAAiB;AAClE,cAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAC5B,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B;AAAA,UACA,UAAU,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,UACxC,EAAE,KAAK;AAAA,QACT;AACA,uBAAe,UAAU,MAAM;AAC/B,qBAAa,eAAe;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,MACT,QAAQ,aAAa,EACrB,YAAY,eAAe,EAC3B;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,UAAU,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAC1C;AACA,mBAAa,eAAe;AAAA,IAC9B,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,WAAW,MACd,QAAQ,eAAe,EACvB,YAAY,iBAAiB,EAC7B;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,UAAU,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAC1C;AACA,mBAAa,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAEF,cAAY,UAAU;AAAA,IACpB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,aAAa,MAChB,QAAQ,iBAAiB,EACzB,YAAY,mBAAmB,EAC/B;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,UAAU,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAC1C;AACA,mBAAa,mBAAmB;AAAA,IAClC,CAAC;AAAA,EACH;AAEF,cAAY,YAAY;AAAA,IACtB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;ACnKO,SAAS,sBAAsBC,UAAwB;AAC5D,QAAM,SAASA,SACZ,QAAQ,oBAAoB,EAC5B,MAAM,QAAQ,EACd,YAAY,2BAA2B;AAG1C,QAAM,OAAO,OACV,QAAQ,MAAM,EACd,YAAY,iBAAiB,EAC7B;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,qBAAqB;AACrE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,OACT,QAAQ,UAAU,EAClB,YAAY,mBAAmB,EAC/B;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,uBAAuB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACvD;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,OACZ,QAAQ,eAAe,EACvB,YAAY,oBAAoB,EAChC;AAAA,IACC,iBAAiB,OAAO,MAAe,OAAgB,QAAiB;AACtE,YAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,QAAQ,uBAAuB,EAAE,KAAK,CAAC;AAChF,qBAAe,UAAU,MAAM;AAC/B,mBAAa,gBAAgB;AAAA,IAC/B,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,OACZ,QAAQ,oBAAoB,EAC5B,YAAY,gBAAgB,EAC5B;AAAA,IACC;AAAA,MACE,OAAO,IAAa,MAAe,OAAgB,QAAiB;AAClE,cAAM,OAAO,MAAM,eAAe,IAA0B;AAC5D,cAAM,SAAS,aAAa,GAAG;AAC/B,cAAM,SAAS,UAAU,GAAG;AAC5B,cAAM,WAAW,MAAM,OAAO;AAAA,UAC5B;AAAA,UACA,uBAAuB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,UACrD,EAAE,KAAK;AAAA,QACT;AACA,uBAAe,UAAU,MAAM;AAC/B,qBAAa,gBAAgB;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,OACT,QAAQ,aAAa,EACrB,YAAY,gBAAgB,EAC5B;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,OAAO;AAAA,QACX;AAAA,QACA,uBAAuB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACvD;AACA,mBAAa,gBAAgB;AAAA,IAC/B,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;AC1HO,SAAS,uBAAuBC,UAAwB;AAC7D,QAAM,UAAUA,SACb,QAAQ,SAAS,EACjB,YAAY,wBAAwB;AAGvC,QAAM,MAAM,QACT,QAAQ,KAAK,EACb,YAAY,iBAAiB,EAC7B;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,UAAU;AAC1D,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,WAAW,QACd,QAAQ,UAAU,EAClB,YAAY,yBAAyB;AAGxC,QAAM,eAAe,SAClB,QAAQ,MAAM,EACd,YAAY,mBAAmB,EAC/B;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,mBAAmB;AACnE,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,cAAc;AAAA,IACxB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,cAAc,SACjB,QAAQ,UAAU,EAClB,YAAY,qBAAqB,EACjC;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,qBAAqB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACrD;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,aAAa;AAAA,IACvB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,iBAAiB,SACpB,QAAQ,aAAa,EACrB,YAAY,+BAA+B,EAC3C;AAAA,IACC,iBAAiB,OAAO,IAAa,OAAgB,QAAiB;AACpE,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAC5B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,qBAAqB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MACrD;AACA,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,gBAAgB;AAAA,IAC1B;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;ACnGA,SAAS,qBAAqB;AAWvB,SAAS,sBAAsBC,UAAwB;AAC5D,QAAM,SAASA,SACZ,QAAQ,QAAQ,EAChB,YAAY,uCAAuC,EACnD;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAE5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,SAAS;AACzD,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,QAAQ;AAAA,IAClB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;AAEO,SAAS,uBAAuBA,UAAwB;AAC7D,QAAM,UAAUA,SACb,QAAQ,SAAS,EACjB,YAAY,4CAA4C,EACxD;AAAA,IACC,iBAAiB,OAAO,OAAgB,QAAiB;AACvD,YAAMC,WAAU,cAAc,YAAY,GAAG;AAC7C,YAAM,MAAMA,SAAQ,iBAAiB;AACrC,YAAM,aAAa,IAAI;AAEvB,gBAAU,gBAAgB,UAAU,EAAE;AAEtC,YAAM,SAAS,aAAa,GAAG;AAC/B,YAAM,SAAS,UAAU,GAAG;AAE5B,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO,UAAU;AAC1D,gBAAU,iBAAiB;AAC3B,qBAAe,UAAU,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAEF,cAAY,SAAS;AAAA,IACnB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;AC5DA,SAAS,iBAAAC,sBAAqB;AAI9B,SAAS,WACP,KACAC,UACA,MACoB;AACpB,SACE,IAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,UAAU,IAAI,KAC3DA,SAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,UAAU,IAAI;AAEnE;AAEA,SAAS,iBACP,KACAA,UACA,MACS;AACT,QAAM,MAAM,WAAW,KAAKA,UAAS,IAAI;AACzC,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,CAAC,EAAE,IAAI,YAAY,IAAI;AAChC;AAEA,SAAS,eAAe,KAAc,MAAmC;AACvE,SAAO,IAAI,SAAS;AAAA,IAClB,CAAC,MAAM,EAAE,KAAK,MAAM,QAAQ,EAAE,QAAQ,EAAE,SAAS,IAAI;AAAA,EACvD;AACF;AAEO,SAAS,oBACdA,UACA,MACA,OACU;AACV,QAAM,YAAY,KAAK,MAAM,GAAG,KAAK;AACrC,QAAM,SAAS,UAAU,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO;AAC3D,QAAM,kBAAkB,MAAM,KAAK,SAAS;AAG5C,QAAM,UACJ,CAAC,mBAAmB,OAAO,SAAS,IAAI,OAAO,OAAO,SAAS,CAAC,IAAI;AAGtE,QAAM,aAAa,kBAAkB,OAAO,MAAM,CAAC,IAAI,OAAO,MAAM,GAAG,EAAE;AAGzE,MAAI,aAAaA;AACjB,MAAI,IAAI;AAER,SAAO,IAAI,WAAW,QAAQ;AAC5B,UAAM,QAAQ,WAAW,CAAC;AAE1B,QAAI,MAAM,WAAW,GAAG,GAAG;AACzB,UAAI,iBAAiB,YAAYA,UAAS,KAAK,GAAG;AAChD,aAAK;AAAA,MACP,OAAO;AACL,aAAK;AAAA,MACP;AACA;AAAA,IACF;AAEA,UAAM,MAAM,eAAe,YAAY,KAAK;AAC5C,QAAI,KAAK;AACP,mBAAa;AAAA,IACf;AACA;AAAA,EACF;AAGA,MAAI,WAAW,KAAK,MAAM,UAAU,WAAW,WAAWA,UAAS;AACjE,UAAM,UAAU,WAAW,QAAQ,MAAM;AACzC,UAAM,UAAU,WAAW,MAAM,UAAU,CAAC;AAC5C,UAAM,WAAqB,CAAC;AAC5B,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,IAAI,QAAQ,CAAC;AACnB,UAAI,EAAE,WAAW,GAAG,GAAG;AACrB,YAAI,iBAAiB,YAAYA,UAAS,CAAC,GAAG;AAC5C;AAAA,QACF;AACA;AAAA,MACF;AACA,eAAS,KAAK,CAAC;AAAA,IACjB;AAEA,QAAI,SAASA;AACb,eAAW,OAAO,UAAU;AAC1B,YAAM,MAAM,eAAe,QAAQ,GAAG;AACtC,UAAI,IAAK,UAAS;AAAA,UACb;AAAA,IACP;AAEA,UAAM,OAAO,OAAO,SACjB,OAAO,CAAC,MAAM,CAAE,EAA4B,OAAO,EACnD,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACtB,WAAO,KAAK,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO,CAAC;AAAA,EACjD;AAGA,QAAM,cAAc,kBAChB,OAAO,OAAO,SAAS,CAAC,IACxB,OAAO,UAAU,IACf,OAAO,OAAO,SAAS,CAAC,IACxB;AAGN,MACE,eACA,YAAY,WAAW,GAAG,KAC1B,iBAAiB,YAAYA,UAAS,WAAW,GACjD;AACA,WAAO,0BAA0B,aAAa,OAAO;AAAA,EACvD;AAGA,MAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,WAAO,qBAAqB,YAAYA,UAAS,OAAO;AAAA,EAC1D;AAGA,QAAM,cAAc,WAAW,SAC5B,OAAO,CAAC,MAAM,CAAE,EAA4B,OAAO,EACnD,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAEtB,MAAI,YAAY,SAAS,GAAG;AAC1B,WAAO,YAAY,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO,CAAC;AAAA,EACxD;AAGA,aAAW,OAAO,WAAW,qBAAqB;AAChD,QAAI,IAAI,eAAe,IAAI,YAAY,SAAS,OAAO,GAAG;AACxD,aAAO,CAAC,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,SAAO,CAAC;AACV;AAEA,SAAS,qBACP,KACAA,UACA,SACU;AACV,QAAM,UAAU,oBAAI,IAAY;AAEhC,aAAW,OAAO,IAAI,SAAS;AAC7B,QAAI,IAAI,OAAQ;AAChB,QAAI,IAAI,KAAM,SAAQ,IAAI,IAAI,IAAI;AAAA,EACpC;AAEA,aAAW,OAAOA,SAAQ,SAAS;AACjC,QAAI,IAAI,OAAQ;AAChB,QAAI,IAAI,KAAM,SAAQ,IAAI,IAAI,IAAI;AAAA,EACpC;AAEA,SAAO,CAAC,GAAG,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO,CAAC;AACzD;AAEA,SAAS,0BACP,YACA,SACU;AACV,MAAI,eAAe,cAAc,eAAe,MAAM;AACpD,WAAO,CAAC,QAAQ,SAAS,SAAS,EAAE;AAAA,MAAO,CAAC,MAC1C,EAAE,WAAW,OAAO;AAAA,IACtB;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAEA,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWnB,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYb,SAAS,mBAAmBA,UAAwB;AACzD,QAAM,MAAMA,SACT,QAAQ,KAAK,EACb,QAAQ,sBAAsB,EAC9B,YAAY,iDAAiD;AAEhE,QAAM,cAAc,IACjB,QAAQ,aAAa,EACrB,QAAQ,4BAA4B,EACpC,YAAY,4CAA4C,EACxD,OAAO,iBAAiB,8BAA8B,EACtD,OAAO,mBAAmB,qCAAqC,EAC/D,OAAO,CAAC,SAA4C;AACnD,QAAI,KAAK,SAAS,UAAa,KAAK,UAAU,QAAW;AACvD,YAAM,QAAQ,SAAS,KAAK,OAAO,EAAE;AACrC,YAAM,UAAU,oBAAoBA,UAAS,KAAK,MAAM,KAAK;AAC7D,iBAAW,KAAK,SAAS;AACvB,gBAAQ,IAAI,CAAC;AAAA,MACf;AAAA,IACF;AAAA,EACF,CAAC;AAEH,QAAM,OAAO,YACV,QAAQ,MAAM,EACd,YAAY,+BAA+B,EAC3C,OAAO,MAAM;AACZ,YAAQ,IAAI,WAAW;AAAA,EACzB,CAAC;AAEH,cAAY,MAAM;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,EACF,CAAC;AAED,QAAM,MAAM,YACT,QAAQ,KAAK,EACb,YAAY,8BAA8B,EAC1C,OAAO,MAAM;AACZ,YAAQ,IAAI,UAAU;AAAA,EACxB,CAAC;AAEH,cAAY,KAAK;AAAA,IACf;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,EACF,CAAC;AAED,QAAM,UAAU,IACb,QAAQ,SAAS,EACjB,YAAY,yBAAyB,EACrC,OAAO,MAAM;AACZ,UAAMC,WAAUC,eAAc,YAAY,GAAG;AAC7C,UAAM,MAAMD,SAAQ,iBAAiB;AACrC,YAAQ,IAAI,IAAI,OAAO;AAAA,EACzB,CAAC;AAEH,cAAY,SAAS;AAAA,IACnB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;A/BhQO,SAAS,gBAAyB;AACvC,QAAME,WAAUC,eAAc,YAAY,GAAG;AAC7C,QAAM,MAAMD,SAAQ,iBAAiB;AACrC,QAAME,WAAU,IAAIC,SAAQ;AAE5B,EAAAD,SACG,KAAK,QAAQ,EACb,YAAY,IAAI,WAAW,EAC3B,OAAO,mBAAmB,iCAAiC,EAC3D,OAAO,wBAAwB,sBAAsB,EACrD,OAAO,mBAAmB,sBAAsB,EAChD,OAAO,wBAAwB,qBAAqB,EACpD,OAAO,mBAAmB,4BAA4B,EACtD,OAAO,sBAAsB,qCAAqC,EAClE,OAAO,cAAc,sBAAsB,EAC3C,OAAO,iBAAiB,gBAAgB,EACxC,OAAO,aAAa,qDAAqD;AAE5E,sBAAoBA,QAAO;AAC3B,wBAAsBA,QAAO;AAC7B,uBAAqBA,QAAO;AAC5B,0BAAwBA,QAAO;AAC/B,0BAAwBA,QAAO;AAC/B,uBAAqBA,QAAO;AAC5B,+BAA6BA,QAAO;AACpC,+BAA6BA,QAAO;AACpC,uBAAqBA,QAAO;AAC5B,0BAAwBA,QAAO;AAC/B,2BAAyBA,QAAO;AAChC,uBAAqBA,QAAO;AAC5B,uBAAqBA,QAAO;AAC5B,wBAAsBA,QAAO;AAC7B,yBAAuBA,QAAO;AAC9B,wBAAsBA,QAAO;AAC7B,yBAAuBA,QAAO;AAC9B,qBAAmBA,QAAO;AAG1B,QAAM,cAAc,IAAIC,SAAQ,OAAO,EACpC,YAAY,0BAA0B;AACzC,sBAAoB,WAAW;AAC/B,EAAAD,SAAQ,WAAW,aAAa,EAAE,QAAQ,KAAK,CAAC;AAEhD,SAAOA;AACT;;;AgCjEA,SAAS,gBAAAE,eAAc,iBAAAC,sBAAqB;AAC5C,SAAS,QAAAC,aAAY;AACrB,OAAOC,YAAW;AAGlB,IAAM,eAAe;AACrB,IAAM,eAAe,8BAA8B,YAAY;AAC/D,IAAM,oBAAoB,KAAK,KAAK,KAAK;AACzC,IAAM,mBAAmB;AAYzB,IAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,eAAuB;AAC9B,SAAOC,MAAK,aAAa,GAAG,mBAAmB;AACjD;AAEA,SAAS,kBAA2B;AAClC,MAAI,QAAQ,IAAI,mBAAoB,QAAO;AAC3C,MAAI,CAAC,QAAQ,OAAO,MAAO,QAAO;AAClC,aAAW,UAAU,aAAa;AAChC,QAAI,QAAQ,IAAI,MAAM,EAAG,QAAO;AAAA,EAClC;AACA,SAAO;AACT;AAEA,SAAS,YAAgC;AACvC,MAAI;AACF,UAAM,MAAMC,cAAa,aAAa,GAAG,OAAO;AAChD,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,OAA0B;AAC3C,MAAI;AACF,oBAAgB;AAChB,IAAAC,eAAc,aAAa,GAAG,KAAK,UAAU,KAAK,GAAG,OAAO;AAAA,EAC9D,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,YAAY,OAAoC;AACvD,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,KAAK,IAAI,IAAI,MAAM,aAAa;AACzC;AAEO,SAAS,cAAc,SAAiB,QAAyB;AACtE,QAAM,QAAQ,CAAC,MACb,EAAE,QAAQ,MAAM,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM;AAC3C,QAAM,CAAC,QAAQ,QAAQ,MAAM,IAAI,MAAM,OAAO;AAC9C,QAAM,CAAC,QAAQ,QAAQ,MAAM,IAAI,MAAM,MAAM;AAC7C,MAAI,WAAW,OAAQ,QAAO,SAAS;AACvC,MAAI,WAAW,OAAQ,QAAO,SAAS;AACvC,SAAO,SAAS;AAClB;AAEA,eAAe,qBAA6C;AAC1D,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,cAAc;AAAA,MACpC,QAAQ,YAAY,QAAQ,gBAAgB;AAAA,IAC9C,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,WAAO,KAAK,WAAW;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAS,oBAA4B;AACnC,SAAO,QAAQ,IAAI,uBAAuB;AAC5C;AAEO,SAAS,gBAAgB,SAAiB,QAAwB;AACvE,QAAM,UAAU,qBAAqB,OAAO,WAAM,MAAM;AACxD,QAAM,UAAU,OAAOC,OAAM,KAAK,YAAY,YAAY,EAAE,CAAC;AAC7D,QAAM,QAAQ,CAAC,SAAS,OAAO;AAC/B,QAAM,SAAS,KAAK;AAAA,IAClB,GAAG,MAAM,IAAI,CAAC,MAAM,UAAU,CAAC,EAAE,MAAM;AAAA,EACzC;AACA,QAAM,MAAM,CAAC,SAAiB;AAC5B,UAAM,UAAU,UAAU,IAAI,EAAE;AAChC,WAAO,OAAO,IAAI,OAAO,SAAS,OAAO;AAAA,EAC3C;AACA,QAAM,QAAQ,IAAI,OAAO,MAAM;AAC/B,QAAM,MAAM,SAAI,SAAI,OAAO,SAAS,CAAC,CAAC;AACtC,QAAM,SAAS,SAAI,SAAI,OAAO,SAAS,CAAC,CAAC;AACzC,QAAM,WAAW;AAAA,IACf;AAAA,IACA,WAAM,KAAK;AAAA,IACX,GAAG,MAAM,IAAI,CAAC,MAAM,WAAM,IAAI,CAAC,CAAC,UAAK;AAAA,IACrC,WAAM,KAAK;AAAA,IACX;AAAA,EACF;AACA,SAAOA,OAAM,OAAO,SAAS,KAAK,IAAI,CAAC;AACzC;AAEA,SAAS,UAAU,KAAqB;AAEtC,SAAO,IAAI,QAAQ,mBAAmB,EAAE;AAC1C;AAEA,eAAsB,mBAAsD;AAC1E,MAAI,gBAAgB,EAAG,QAAO;AAE9B,MAAI;AACJ,MAAI;AACF,UAAM,UAAU,IAAI,IAAI,mBAAmB,YAAY,GAAG;AAC1D,UAAM,MAAM,KAAK,MAAMF,cAAa,SAAS,OAAO,CAAC;AAGrD,qBAAiB,IAAI;AAAA,EAEvB,QAAQ;AACN,qBAAiB,kBAAkB;AAAA,EACrC;AAGA,QAAM,QAAQ,UAAU;AAExB,MAAI,CAAC,YAAY,KAAK,GAAG;AACvB,QAAI,OAAO,iBAAiB,cAAc,gBAAgB,MAAM,aAAa,GAAG;AAC9E,aAAO,EAAE,gBAAgB,eAAe,MAAM,cAAc;AAAA,IAC9D;AACA,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,MAAM,mBAAmB;AAE/C,YAAU;AAAA,IACR,WAAW,KAAK,IAAI;AAAA,IACpB,eAAe,iBAAiB,OAAO;AAAA,EACzC,CAAC;AAED,MAAI,iBAAiB,cAAc,gBAAgB,aAAa,GAAG;AACjE,WAAO,EAAE,gBAAgB,cAAc;AAAA,EACzC;AAEA,SAAO;AACT;AAEO,SAAS,wBAAwB,QAAwC;AAC9E,MAAI,CAAC,OAAQ;AACb,QAAM,MAAM,gBAAgB,OAAO,gBAAgB,OAAO,aAAa;AACvE,UAAQ,OAAO,MAAM,OAAO,MAAM,IAAI;AACxC;;;ACrKA,IAAM,qBAAqB,iBAAiB;AAC5C,IAAM,UAAU,cAAc;AAC9B,MAAM,QAAQ,WAAW;AACzB,IAAM,eAAe,MAAM;AAC3B,wBAAwB,YAAY;","names":["createRequire","Command","header","chalk","program","program","onData","onError","readFileSync","createInterface","config","program","program","program","program","program","program","program","program","program","program","program","program","program","program","require","createRequire","program","require","createRequire","require","createRequire","program","Command","readFileSync","writeFileSync","join","chalk","join","readFileSync","writeFileSync","chalk"]}