{"version":3,"file":"cli.cjs","names":["agentId","resolveFormat","findDefaultFile","AGENT_FILES","parseJson","readInput","convert","writeJsonFile","ConvertError","validateApi","checkApi","sync"],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * agent-perms CLI — convert, validate, check, and sync cross-agent permission policies.\n *\n * All flags, no positionals. Format names resolve to default config file locations.\n * Use \"-\" for stdin/stdout.\n *\n * Exit codes: 0 = success, 1 = error, 2 = validation failure.\n */\n\nimport { parseArgs } from \"node:util\";\nimport { resolve, join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport {\n  convert,\n  validate as validateApi,\n  check as checkApi,\n  resolveFormat,\n  ConvertError,\n  type Format,\n} from \"./api.ts\";\nimport { agentId } from \"./compat/codecs.ts\";\nimport { sync } from \"./sync.ts\";\nimport {\n  AGENT_FILES,\n  findDefaultFile,\n  readInput,\n  parseJson,\n  writeJsonFile,\n} from \"./agent-files.ts\";\n\nconst AGENTS = agentId.options;\ntype Agent = (typeof AGENTS)[number];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction error(message: string): never {\n  process.stderr.write(`error: ${message}\\n`);\n  process.exit(1);\n}\n\nfunction isAgent(value: string): value is Agent {\n  return AGENTS.includes(value as Agent);\n}\n\n// ---------------------------------------------------------------------------\n// Resolution helpers\n// ---------------------------------------------------------------------------\n\n/** Resolve a spec to an input file path. Format name → walk up, file path → direct, \"-\" → stdin. */\nfunction resolveInputSpec(spec: string | undefined): string | undefined {\n  if (spec === undefined || spec === \"-\") return undefined;\n  const format = resolveFormat(spec);\n  if (format) return findDefaultFile(format, process.cwd());\n  return resolve(spec);\n}\n\n/** Resolve a spec to an output file path. Format name → cwd, file path → direct, \"-\" → stdout. */\nfunction resolveOutputSpec(spec: string | undefined): string | undefined {\n  if (spec === undefined || spec === \"-\") return undefined;\n  const format = resolveFormat(spec);\n  if (format) {\n    const fileName = AGENT_FILES[format].name;\n    return resolve(join(process.cwd(), fileName));\n  }\n  return resolve(spec);\n}\nfunction firstString(\n  ...values: (string | boolean | undefined)[]\n): string | undefined {\n  for (const v of values) {\n    if (typeof v === \"string\") return v;\n  }\n  return undefined;\n}\n\nfunction allStrings(\n  ...values: ((string | boolean | undefined)[] | undefined)[]\n): string[] {\n  const result: string[] = [];\n  for (const arr of values) {\n    if (arr === undefined) continue;\n    for (const v of arr) {\n      if (typeof v === \"string\") result.push(v);\n    }\n  }\n  return result;\n}\n\n// ---------------------------------------------------------------------------\n// convert\n// ---------------------------------------------------------------------------\n\nasync function convertCommand(args: string[]): Promise<void> {\n  const { values } = parseArgs({\n    args,\n    options: {\n      from: { type: \"string\", short: \"f\" },\n      to: { type: \"string\", short: \"t\" },\n      input: { type: \"string\" },\n      in: { type: \"string\" },\n      output: { type: \"string\", short: \"o\" },\n      out: { type: \"string\" },\n      compact: { type: \"boolean\", short: \"c\" },\n      verbose: { type: \"boolean\", short: \"v\" },\n    },\n    strict: true,\n  });\n\n  // Merge aliases: --input/--in → --from\n  const fromSpec = firstString(values.from, values.input, values.in);\n  // --to is always the target format/file\n  const toSpec = values.to;\n  // --output/--out overrides destination (--to might set it too)\n  const outputSpec = firstString(values.output, values.out);\n  if (toSpec === undefined) error(\"--to is required\");\n\n  // Resolve input: format name finds file, file path reads directly, omitted = stdin\n  const inputPath = resolveInputSpec(fromSpec);\n  let fromFormat: Format | undefined;\n  if (fromSpec !== undefined && fromSpec !== \"-\") {\n    fromFormat = resolveFormat(fromSpec);\n    // If not a known format name and not an existing file, it's an unknown format\n    if (\n      fromFormat === undefined &&\n      inputPath !== undefined &&\n      !existsSync(inputPath)\n    ) {\n      error(\n        `unknown --from format: ${fromSpec}. Use an agent name, a config file path, or \"-\" for stdin`,\n      );\n    }\n  }\n\n  // Resolve output: format name → default file, file path → directly, \"-\" = stdout\n  const toFormat = resolveFormat(toSpec);\n  if (!toFormat) {\n    error(\n      `unknown --to format: ${toSpec}. Use an agent name (claude-code, codex, kiro, opencode, crush, canonical), a config file path, or \"-\" for stdout`,\n    );\n  }\n  const outputPath = outputSpec\n    ? resolveOutputSpec(outputSpec)\n    : resolveOutputSpec(toSpec);\n\n  // No need to validate --from — auto-detect handles unknown file paths\n\n  const source = inputPath ?? \"stdin\";\n  const raw = await readInput(inputPath);\n  const parsed = parseJson(raw, source);\n  if (!parsed.ok) error(parsed.error);\n  const json = parsed.value;\n\n  try {\n    const result = convert(fromFormat, toFormat, json);\n\n    const indent = values.compact ? undefined : 2;\n    const jsonStr = JSON.stringify(result.output, null, indent) + \"\\n\";\n\n    if (outputPath) {\n      await writeJsonFile(outputPath, jsonStr);\n    } else {\n      process.stdout.write(jsonStr);\n    }\n\n    if (values.verbose) {\n      const dest = outputPath ?? \"stdout\";\n      process.stderr.write(\n        `Decoded ${result.from} → canonical (${String(result.ruleCount)} rules), encoded → ${toFormat}, wrote ${dest}\\n`,\n      );\n    }\n  } catch (e) {\n    if (e instanceof ConvertError) {\n      process.stderr.write(`error: ${e.message}\\n`);\n      for (const err of e.errors) {\n        process.stderr.write(`  ${err.path}: ${err.message}\\n`);\n      }\n      process.exit(2);\n    }\n    const message = e instanceof Error ? e.message : String(e);\n    error(message);\n  }\n}\n\n// ---------------------------------------------------------------------------\n// validate\n// ---------------------------------------------------------------------------\n\nasync function validateCommand(args: string[]): Promise<void> {\n  const { values } = parseArgs({\n    args,\n    options: {\n      input: { type: \"string\", short: \"i\" },\n      in: { type: \"string\" },\n    },\n    strict: true,\n  });\n\n  const inputSpec = firstString(values.input, values.in);\n  const inputPath = resolveInputSpec(inputSpec);\n  const source = inputPath ?? \"stdin\";\n\n  const raw = await readInput(inputPath);\n  const parsed = parseJson(raw, source);\n  if (!parsed.ok) error(parsed.error);\n  const json = parsed.value;\n\n  const result = validateApi(json);\n  if (result.valid) {\n    process.stdout.write(\"valid\\n\");\n    return;\n  }\n\n  process.stderr.write(\"validation errors:\\n\");\n  for (const err of result.errors) {\n    process.stderr.write(`  ${err.path}: ${err.message}\\n`);\n  }\n  process.exit(2);\n}\n\n// ---------------------------------------------------------------------------\n// check\n// ---------------------------------------------------------------------------\n\nasync function checkCommand(args: string[]): Promise<void> {\n  const { values } = parseArgs({\n    args,\n    options: {\n      tool: { type: \"string\" },\n      input: { type: \"string\" },\n      \"policy-file\": { type: \"string\" },\n      cwd: { type: \"string\" },\n      branch: { type: \"string\" },\n    },\n    strict: true,\n  });\n\n  if (!values.tool) error(\"--tool is required\");\n  if (values.input === undefined) error(\"--input is required\");\n\n  const inputPath = resolveInputSpec(values[\"policy-file\"]);\n  const source = inputPath ?? \"stdin\";\n\n  const raw = await readInput(inputPath);\n  const parsed = parseJson(raw, source);\n  if (!parsed.ok) error(parsed.error);\n  const json = parsed.value;\n\n  try {\n    const ctx: { cwd?: string; branch?: string } = {};\n    if (values.cwd !== undefined) ctx.cwd = values.cwd;\n    if (values.branch !== undefined) ctx.branch = values.branch;\n    const result = checkApi(values.tool, values.input, json, ctx);\n    process.stdout.write(`${result.decision}\\n`);\n    process.exit(result.decision === \"deny\" ? 1 : 0);\n  } catch (e) {\n    if (e instanceof ConvertError) {\n      process.stderr.write(`error: ${e.message}\\n`);\n      for (const err of e.errors) {\n        process.stderr.write(`  ${err.path}: ${err.message}\\n`);\n      }\n      process.exit(2);\n    }\n    const message = e instanceof Error ? e.message : String(e);\n    error(message);\n  }\n}\n\n// ---------------------------------------------------------------------------\n// sync\n// ---------------------------------------------------------------------------\n\nasync function syncCommand(args: string[]): Promise<void> {\n  const { values } = parseArgs({\n    args,\n    options: {\n      \"working-dir\": { type: \"string\", short: \"d\" },\n      up: { type: \"string\", default: \"all\", short: \"u\" },\n      with: { type: \"string\", multiple: true, short: \"w\" },\n      without: { type: \"string\", multiple: true, short: \"x\" },\n      include: { type: \"string\", multiple: true },\n      exclude: { type: \"string\", multiple: true },\n      yes: { type: \"boolean\", short: \"y\" },\n      \"dry-run\": { type: \"boolean\" },\n      create: { type: \"boolean\", short: \"c\" },\n      verbose: { type: \"boolean\", short: \"v\" },\n      backup: { type: \"boolean\", short: \"b\" },\n    },\n    strict: true,\n  });\n\n  // Parse --up value\n  let up: number;\n  if (values.up === \"all\") {\n    up = Infinity;\n  } else {\n    up = Number(values.up);\n    if (!Number.isInteger(up) || up < 0) {\n      error(\"--up must be a non-negative integer or 'all'\");\n    }\n  }\n\n  // Merge --with and --include (aliases)\n  const withRaw = allStrings(values.with, values.include);\n  // Merge --without and --exclude (aliases)\n  const withoutRaw = allStrings(values.without, values.exclude);\n\n  if (withRaw.length > 0 && withoutRaw.length > 0) {\n    error(\"--with and --without are mutually exclusive\");\n  }\n\n  // Validate agent names\n  const withAgents: Agent[] = [];\n  for (const w of withRaw) {\n    if (w === \"canonical\") continue;\n    if (!isAgent(w))\n      error(\n        `unknown agent: ${w}. Valid: ${[...AGENTS, \"canonical\"].join(\", \")}`,\n      );\n    withAgents.push(w);\n  }\n\n  const withoutAgents: Agent[] = [];\n  for (const w of withoutRaw) {\n    if (w === \"canonical\") continue;\n    if (!isAgent(w))\n      error(\n        `unknown agent: ${w}. Valid: ${[...AGENTS, \"canonical\"].join(\", \")}`,\n      );\n    withoutAgents.push(w);\n  }\n\n  const cwd = values[\"working-dir\"]\n    ? resolve(values[\"working-dir\"])\n    : process.cwd();\n\n  await sync({\n    cwd,\n    up,\n    with: withAgents,\n    without: withoutAgents,\n    yes: values.yes ?? false,\n    dryRun: values[\"dry-run\"] ?? false,\n    create: values.create ?? false,\n    verbose: values.verbose ?? false,\n    backup: values.backup ?? false,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Main\n// ---------------------------------------------------------------------------\n\nfunction usage(): never {\n  process.stderr.write(`agent-perms — cross-agent permission policy tool\n\nUsage:\n  agent-perms convert [--from <spec>] --to <spec>\n  agent-perms validate [--input <spec>]\n  agent-perms check --tool <name> --input <cmd> [--policy-file <spec>]\n  agent-perms sync\n\nSpecs: agent name, config file path, or \"-\" for stdin/stdout.\n\n  Format names resolve to default config files:\n    claude-code  →  .claude/settings.json\n    canonical    →  .agents/permissions.json\n    opencode     →  opencode.json\n    kiro         →  .kiro/permissions.json\n    codex        →  codex.toml\n    crush        →  .crush.json\n\nCommands:\n  convert   Convert between agent formats\n  validate  Validate a policy file\n  check     Evaluate a tool call against a policy\n  sync      Detect, merge, and write agent configs (bidirectional)\n\nConvert flags:\n  -f, --from, --input, --in <spec>   Source (format, file, or \"-\" for stdin)\n  -t, --to, --output, --out <spec>   Target (format, file, or \"-\" for stdout)\n  -c, --compact                      Output compact JSON\n  -v, --verbose                      Show decode/encode summary on stderr\n\nValidate flags:\n  -i, --input, --in <spec>           Policy file (format, file, or \"-\" for stdin)\n\nCheck flags:\n  --tool <name>                      Tool name (required)\n  --input <cmd>                      Tool input string (required)\n  --policy-file <spec>               Policy file (format, file, or \"-\" for stdin)\n  --cwd, --branch                    Evaluation context\n\nSync flags:\n  -d, --working-dir <path>           Starting directory (default: cwd)\n  -u, --up <n|all>                   Ascend n parent directories (default: all)\n  -w, --with <agent>                 Only sync these agents (repeatable)\n  -x, --without <agent>              Sync all except these agents (repeatable)\n  -y, --yes                          Apply without prompting\n  --dry-run                          Show changes only, never write\n  -c, --create                       Create config files that don't exist\n  -v, --verbose                      Show rule provenance\n  -b, --backup                       Write .bak files before overwriting\n\nExamples:\n  agent-perms convert --from claude-code --to canonical\n  agent-perms convert --from .claude/settings.json --to crush\n  agent-perms convert --from claude-code --to -\n  cat settings.json | agent-perms convert --from - --to canonical --output -\n  agent-perms validate --input canonical\n  agent-perms validate --input .agents/permissions.json\n  agent-perms check --tool Bash --input \"git status\" --policy-file canonical\n  agent-perms sync\n  agent-perms sync -y\n  agent-perms sync --dry-run\n  agent-perms sync -w claude-code -w opencode\n  agent-perms sync -x codex\n  agent-perms sync -w claude-code --create\n`);\n  process.exit(1);\n}\n\nasync function main(): Promise<void> {\n  // If invoked as agent-perms-mcp, route directly to MCP server\n  const binName = process.argv[1]?.split(\"/\").pop() ?? \"\";\n  if (binName === \"agent-perms-mcp\") {\n    await import(\"./mcp.ts\");\n    return;\n  }\n\n  const args = process.argv.slice(2);\n  const command = args[0];\n\n  switch (command) {\n    case \"convert\":\n      await convertCommand(args.slice(1));\n      break;\n    case \"validate\":\n      await validateCommand(args.slice(1));\n      break;\n    case \"check\":\n      await checkCommand(args.slice(1));\n      break;\n    case \"sync\":\n      await syncCommand(args.slice(1));\n      break;\n    case \"mcp\":\n      await import(\"./mcp.ts\");\n      break;\n    case \"--help\":\n    case \"-h\":\n      usage();\n      break;\n    default:\n      if (command) {\n        process.stderr.write(`unknown command: ${command}\\n\\n`);\n      }\n      usage();\n  }\n}\n\nmain().catch((e: unknown) => {\n  process.stderr.write(\n    `fatal: ${e instanceof Error ? e.message : String(e)}\\n`,\n  );\n  process.exit(1);\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;AA+BA,MAAM,SAASA,8BAAQ;AAOvB,SAAS,MAAM,SAAwB;CACrC,QAAQ,OAAO,MAAM,UAAU,QAAQ,IAAI;CAC3C,QAAQ,KAAK,EAAE;;AAGjB,SAAS,QAAQ,OAA+B;CAC9C,OAAO,OAAO,SAAS,MAAe;;;AAQxC,SAAS,iBAAiB,MAA8C;CACtE,IAAI,SAAS,UAAa,SAAS,KAAK,OAAO;CAC/C,MAAM,SAASC,kCAAc,KAAK;CAClC,IAAI,QAAQ,OAAOC,oCAAgB,QAAQ,QAAQ,KAAK,CAAC;CACzD,8BAAe,KAAK;;;AAItB,SAAS,kBAAkB,MAA8C;CACvE,IAAI,SAAS,UAAa,SAAS,KAAK,OAAO;CAC/C,MAAM,SAASD,kCAAc,KAAK;CAClC,IAAI,QAAQ;EACV,MAAM,WAAWE,gCAAY,QAAQ;EACrC,kDAAoB,QAAQ,KAAK,EAAE,SAAS,CAAC;;CAE/C,8BAAe,KAAK;;AAEtB,SAAS,YACP,GAAG,QACiB;CACpB,KAAK,MAAM,KAAK,QACd,IAAI,OAAO,MAAM,UAAU,OAAO;;AAKtC,SAAS,WACP,GAAG,QACO;CACV,MAAM,SAAmB,EAAE;CAC3B,KAAK,MAAM,OAAO,QAAQ;EACxB,IAAI,QAAQ,QAAW;EACvB,KAAK,MAAM,KAAK,KACd,IAAI,OAAO,MAAM,UAAU,OAAO,KAAK,EAAE;;CAG7C,OAAO;;AAOT,eAAe,eAAe,MAA+B;CAC3D,MAAM,EAAE,oCAAqB;EAC3B;EACA,SAAS;GACP,MAAM;IAAE,MAAM;IAAU,OAAO;IAAK;GACpC,IAAI;IAAE,MAAM;IAAU,OAAO;IAAK;GAClC,OAAO,EAAE,MAAM,UAAU;GACzB,IAAI,EAAE,MAAM,UAAU;GACtB,QAAQ;IAAE,MAAM;IAAU,OAAO;IAAK;GACtC,KAAK,EAAE,MAAM,UAAU;GACvB,SAAS;IAAE,MAAM;IAAW,OAAO;IAAK;GACxC,SAAS;IAAE,MAAM;IAAW,OAAO;IAAK;GACzC;EACD,QAAQ;EACT,CAAC;CAGF,MAAM,WAAW,YAAY,OAAO,MAAM,OAAO,OAAO,OAAO,GAAG;CAElE,MAAM,SAAS,OAAO;CAEtB,MAAM,aAAa,YAAY,OAAO,QAAQ,OAAO,IAAI;CACzD,IAAI,WAAW,QAAW,MAAM,mBAAmB;CAGnD,MAAM,YAAY,iBAAiB,SAAS;CAC5C,IAAI;CACJ,IAAI,aAAa,UAAa,aAAa,KAAK;EAC9C,aAAaF,kCAAc,SAAS;EAEpC,IACE,eAAe,UACf,cAAc,UACd,yBAAY,UAAU,EAEtB,MACE,0BAA0B,SAAS,2DACpC;;CAKL,MAAM,WAAWA,kCAAc,OAAO;CACtC,IAAI,CAAC,UACH,MACE,wBAAwB,OAAO,mHAChC;CAEH,MAAM,aAAa,aACf,kBAAkB,WAAW,GAC7B,kBAAkB,OAAO;CAI7B,MAAM,SAAS,aAAa;CAE5B,MAAM,SAASG,8BAAU,MADPC,8BAAU,UAAU,EACR,OAAO;CACrC,IAAI,CAAC,OAAO,IAAI,MAAM,OAAO,MAAM;CACnC,MAAM,OAAO,OAAO;CAEpB,IAAI;EACF,MAAM,SAASC,4BAAQ,YAAY,UAAU,KAAK;EAElD,MAAM,SAAS,OAAO,UAAU,SAAY;EAC5C,MAAM,UAAU,KAAK,UAAU,OAAO,QAAQ,MAAM,OAAO,GAAG;EAE9D,IAAI,YACF,MAAMC,kCAAc,YAAY,QAAQ;OAExC,QAAQ,OAAO,MAAM,QAAQ;EAG/B,IAAI,OAAO,SAAS;GAClB,MAAM,OAAO,cAAc;GAC3B,QAAQ,OAAO,MACb,WAAW,OAAO,KAAK,gBAAgB,OAAO,OAAO,UAAU,CAAC,qBAAqB,SAAS,UAAU,KAAK,IAC9G;;UAEI,GAAG;EACV,IAAI,aAAaC,kCAAc;GAC7B,QAAQ,OAAO,MAAM,UAAU,EAAE,QAAQ,IAAI;GAC7C,KAAK,MAAM,OAAO,EAAE,QAClB,QAAQ,OAAO,MAAM,KAAK,IAAI,KAAK,IAAI,IAAI,QAAQ,IAAI;GAEzD,QAAQ,KAAK,EAAE;;EAGjB,MADgB,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,CAC5C;;;AAQlB,eAAe,gBAAgB,MAA+B;CAC5D,MAAM,EAAE,oCAAqB;EAC3B;EACA,SAAS;GACP,OAAO;IAAE,MAAM;IAAU,OAAO;IAAK;GACrC,IAAI,EAAE,MAAM,UAAU;GACvB;EACD,QAAQ;EACT,CAAC;CAGF,MAAM,YAAY,iBADA,YAAY,OAAO,OAAO,OAAO,GACP,CAAC;CAC7C,MAAM,SAAS,aAAa;CAG5B,MAAM,SAASJ,8BAAU,MADPC,8BAAU,UAAU,EACR,OAAO;CACrC,IAAI,CAAC,OAAO,IAAI,MAAM,OAAO,MAAM;CACnC,MAAM,OAAO,OAAO;CAEpB,MAAM,SAASI,6BAAY,KAAK;CAChC,IAAI,OAAO,OAAO;EAChB,QAAQ,OAAO,MAAM,UAAU;EAC/B;;CAGF,QAAQ,OAAO,MAAM,uBAAuB;CAC5C,KAAK,MAAM,OAAO,OAAO,QACvB,QAAQ,OAAO,MAAM,KAAK,IAAI,KAAK,IAAI,IAAI,QAAQ,IAAI;CAEzD,QAAQ,KAAK,EAAE;;AAOjB,eAAe,aAAa,MAA+B;CACzD,MAAM,EAAE,oCAAqB;EAC3B;EACA,SAAS;GACP,MAAM,EAAE,MAAM,UAAU;GACxB,OAAO,EAAE,MAAM,UAAU;GACzB,eAAe,EAAE,MAAM,UAAU;GACjC,KAAK,EAAE,MAAM,UAAU;GACvB,QAAQ,EAAE,MAAM,UAAU;GAC3B;EACD,QAAQ;EACT,CAAC;CAEF,IAAI,CAAC,OAAO,MAAM,MAAM,qBAAqB;CAC7C,IAAI,OAAO,UAAU,QAAW,MAAM,sBAAsB;CAE5D,MAAM,YAAY,iBAAiB,OAAO,eAAe;CACzD,MAAM,SAAS,aAAa;CAG5B,MAAM,SAASL,8BAAU,MADPC,8BAAU,UAAU,EACR,OAAO;CACrC,IAAI,CAAC,OAAO,IAAI,MAAM,OAAO,MAAM;CACnC,MAAM,OAAO,OAAO;CAEpB,IAAI;EACF,MAAM,MAAyC,EAAE;EACjD,IAAI,OAAO,QAAQ,QAAW,IAAI,MAAM,OAAO;EAC/C,IAAI,OAAO,WAAW,QAAW,IAAI,SAAS,OAAO;EACrD,MAAM,SAASK,0BAAS,OAAO,MAAM,OAAO,OAAO,MAAM,IAAI;EAC7D,QAAQ,OAAO,MAAM,GAAG,OAAO,SAAS,IAAI;EAC5C,QAAQ,KAAK,OAAO,aAAa,SAAS,IAAI,EAAE;UACzC,GAAG;EACV,IAAI,aAAaF,kCAAc;GAC7B,QAAQ,OAAO,MAAM,UAAU,EAAE,QAAQ,IAAI;GAC7C,KAAK,MAAM,OAAO,EAAE,QAClB,QAAQ,OAAO,MAAM,KAAK,IAAI,KAAK,IAAI,IAAI,QAAQ,IAAI;GAEzD,QAAQ,KAAK,EAAE;;EAGjB,MADgB,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,CAC5C;;;AAQlB,eAAe,YAAY,MAA+B;CACxD,MAAM,EAAE,oCAAqB;EAC3B;EACA,SAAS;GACP,eAAe;IAAE,MAAM;IAAU,OAAO;IAAK;GAC7C,IAAI;IAAE,MAAM;IAAU,SAAS;IAAO,OAAO;IAAK;GAClD,MAAM;IAAE,MAAM;IAAU,UAAU;IAAM,OAAO;IAAK;GACpD,SAAS;IAAE,MAAM;IAAU,UAAU;IAAM,OAAO;IAAK;GACvD,SAAS;IAAE,MAAM;IAAU,UAAU;IAAM;GAC3C,SAAS;IAAE,MAAM;IAAU,UAAU;IAAM;GAC3C,KAAK;IAAE,MAAM;IAAW,OAAO;IAAK;GACpC,WAAW,EAAE,MAAM,WAAW;GAC9B,QAAQ;IAAE,MAAM;IAAW,OAAO;IAAK;GACvC,SAAS;IAAE,MAAM;IAAW,OAAO;IAAK;GACxC,QAAQ;IAAE,MAAM;IAAW,OAAO;IAAK;GACxC;EACD,QAAQ;EACT,CAAC;CAGF,IAAI;CACJ,IAAI,OAAO,OAAO,OAChB,KAAK;MACA;EACL,KAAK,OAAO,OAAO,GAAG;EACtB,IAAI,CAAC,OAAO,UAAU,GAAG,IAAI,KAAK,GAChC,MAAM,+CAA+C;;CAKzD,MAAM,UAAU,WAAW,OAAO,MAAM,OAAO,QAAQ;CAEvD,MAAM,aAAa,WAAW,OAAO,SAAS,OAAO,QAAQ;CAE7D,IAAI,QAAQ,SAAS,KAAK,WAAW,SAAS,GAC5C,MAAM,8CAA8C;CAItD,MAAM,aAAsB,EAAE;CAC9B,KAAK,MAAM,KAAK,SAAS;EACvB,IAAI,MAAM,aAAa;EACvB,IAAI,CAAC,QAAQ,EAAE,EACb,MACE,kBAAkB,EAAE,WAAW,CAAC,GAAG,QAAQ,YAAY,CAAC,KAAK,KAAK,GACnE;EACH,WAAW,KAAK,EAAE;;CAGpB,MAAM,gBAAyB,EAAE;CACjC,KAAK,MAAM,KAAK,YAAY;EAC1B,IAAI,MAAM,aAAa;EACvB,IAAI,CAAC,QAAQ,EAAE,EACb,MACE,kBAAkB,EAAE,WAAW,CAAC,GAAG,QAAQ,YAAY,CAAC,KAAK,KAAK,GACnE;EACH,cAAc,KAAK,EAAE;;CAOvB,MAAMG,kBAAK;EACT,KALU,OAAO,wCACP,OAAO,eAAe,GAC9B,QAAQ,KAAK;EAIf;EACA,MAAM;EACN,SAAS;EACT,KAAK,OAAO,OAAO;EACnB,QAAQ,OAAO,cAAc;EAC7B,QAAQ,OAAO,UAAU;EACzB,SAAS,OAAO,WAAW;EAC3B,QAAQ,OAAO,UAAU;EAC1B,CAAC;;AAOJ,SAAS,QAAe;CACtB,QAAQ,OAAO,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgErB;CACA,QAAQ,KAAK,EAAE;;AAGjB,eAAe,OAAsB;CAGnC,KADgB,QAAQ,KAAK,IAAI,MAAM,IAAI,CAAC,KAAK,IAAI,QACrC,mBAAmB;EACjC,2CAAM;EACN;;CAGF,MAAM,OAAO,QAAQ,KAAK,MAAM,EAAE;CAClC,MAAM,UAAU,KAAK;CAErB,QAAQ,SAAR;EACE,KAAK;GACH,MAAM,eAAe,KAAK,MAAM,EAAE,CAAC;GACnC;EACF,KAAK;GACH,MAAM,gBAAgB,KAAK,MAAM,EAAE,CAAC;GACpC;EACF,KAAK;GACH,MAAM,aAAa,KAAK,MAAM,EAAE,CAAC;GACjC;EACF,KAAK;GACH,MAAM,YAAY,KAAK,MAAM,EAAE,CAAC;GAChC;EACF,KAAK;GACH,2CAAM;GACN;EACF,KAAK;EACL,KAAK;GACH,OAAO;GACP;EACF;GACE,IAAI,SACF,QAAQ,OAAO,MAAM,oBAAoB,QAAQ,MAAM;GAEzD,OAAO;;;AAIb,MAAM,CAAC,OAAO,MAAe;CAC3B,QAAQ,OAAO,MACb,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,CAAC,IACtD;CACD,QAAQ,KAAK,EAAE;EACf"}