{"version":3,"file":"command.cjs","names":["z","parseArgs","resolveCwds","checkProblemDirIsolation","readProblemMarkdownFrontMatter","judgeByStaticAnalysis","findEntryPointFile","DecisionCode","findLanguageDefinitionByPath","snapshotWorkingDirectory","copyTestCaseFileInput","runCustomRunner","wrapCommandWithSandboxUser","getSandboxUserEnvOverrides","cleanWorkingDirectory","readOutputFiles","spawnSyncWithTimeout","readFileTestCases","path"],"sources":["../../src/presets/command.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { z } from 'zod';\n\nimport { checkProblemDirIsolation } from '../helpers/checkProblemDirIsolation.js';\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printDebugBanner } from '../helpers/printDebugBanner.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { runCustomRunner } from '../helpers/runCustomRunner.js';\nimport {\n  getSandboxUserEnvOverrides,\n  makeAccessibleToSandboxUser,\n  wrapCommandWithSandboxUser,\n} from '../helpers/sandboxUser.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport {\n  printDebugCwdBanner,\n  printDebugExpectationFailureBanner,\n  resolveCwds,\n  type ResolvedCwd,\n} from '../helpers/resolveCwds.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 2;\nconst MAX_STDOUT_LENGTH = 50_000;\n\nconst judgeParamsSchema = z.object({\n  language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\ntype JudgeParams = z.infer<typeof judgeParamsSchema>;\n\ninterface BaseCommandTestCase {\n  id: string;\n  input?: string;\n  fileInputPath?: string;\n}\n\ntype CommandJudgeCaseResult = Pick<TestCaseResult, 'decisionCode' | 'feedbackMarkdown' | 'stderr'>;\n\nexport interface CommandRunResult {\n  stdin: string;\n  stdout: string;\n  stderr: string;\n  status: number | undefined;\n  timeSeconds: number;\n  memoryBytes: number;\n  outputLimitExceeded?: boolean;\n}\n\ninterface CommandJudgeContext {\n  timeLimitSeconds: number;\n  outputLimitLength: number;\n  problemMarkdownFrontMatter: Pick<ProblemMarkdownFrontMatter, 'memoryLimitByte' | 'requiredOutputFilePaths'>;\n}\n\nexport interface CommandJudgeLimits {\n  buildTimeoutSeconds: number;\n  maxOutputLength: number;\n}\n\nexport interface CommandJudgePresetOptions<\n  TTestCase extends BaseCommandTestCase = BaseCommandTestCase,\n  TRunResult extends CommandRunResult = CommandRunResult,\n> {\n  /**\n   * Set to false when the custom runner builds the submitted source itself.\n   * Defaults to true.\n   */\n  buildSubmission?: boolean;\n  limits?: CommandJudgeLimits;\n  runTimeoutSeconds?: number;\n  readTestCases?: (problemDir: string) => Promise<readonly TTestCase[]>;\n  /**\n   * Runs as the trusted harness user with the submission's `cwd`. Fixture files it creates there\n   * must be written with `createDirectoryWithoutFollowingSymlinks`/`writeFileWithoutFollowingSymlinks`\n   * (both exported): a submission can plant a symlink at a fixture path, and a plain `fs.writeFile`\n   * would follow it into a file only the harness can write.\n   */\n  resolveInput?: (context: { testCase: TTestCase; cwd: string; env: NodeJS.ProcessEnv }) => Promise<string> | string;\n  runCommand?: (context: {\n    testCase: TTestCase;\n    /**\n     * The command to run. Under `EXERCODE_SANDBOX_USER` delegation it is already wrapped so it\n     * executes as the sandbox user; spawn it as given (with the supplied `env`) instead of\n     * reconstructing it, or the submission runs as the trusted harness user.\n     *\n     * Its direct child is then a root-owned `sudo` whose descendants belong to the sandbox user, so\n     * the handler cannot signal them: enforce `timeLimitSeconds` with `startSandboxTimeoutWatchdog`\n     * and `killSandboxUserProcesses` (both exported) rather than `child.kill()` or an outer\n     * `timeout`. The preset terminates leftover sandbox processes after the handler returns.\n     */\n    command: readonly [string, ...string[]];\n    stdin: string;\n    cwd: string;\n    env: NodeJS.ProcessEnv;\n    timeLimitSeconds: number;\n  }) => Promise<TRunResult> | TRunResult;\n  test?: (context: {\n    testCase: TTestCase;\n    runResult: TRunResult;\n    outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n    context: CommandJudgeContext;\n  }) => Promise<Partial<CommandJudgeCaseResult>> | Partial<CommandJudgeCaseResult> | undefined;\n}\n\n/**\n * A preset function for judging by executable command.\n *\n * Keep problem-specific logic in `resolveInput` and `test`.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { commandJudgePreset } from '@exercode/problem-utils/presets/command';\n * import { DecisionCode } from '@exercode/problem-utils';\n *\n * await commandJudgePreset(import.meta.dirname, {\n *   readTestCases: async () => [\n *     { id: '01', input: '1 2' },\n *   ],\n *   test: ({ runResult }) => {\n *     return runResult.stdout.trim() === '3'\n *       ? { decisionCode: DecisionCode.ACCEPTED }\n *       : { decisionCode: DecisionCode.WRONG_ANSWER };\n *   },\n * });\n * ```\n *\n * Run with the required parameters:\n * ```bash\n * bun judge.ts model_answers/python '{ \"language\": \"python\" }'\n * ```\n *\n * Run without a cwd argument to judge each `<problemDir>/model_answers/*` directory\n * for debugging. A prominent banner is printed for each run.\n * ```bash\n * bun judge.ts\n * ```\n */\nexport async function commandJudgePreset<\n  TTestCase extends BaseCommandTestCase = BaseCommandTestCase,\n  TRunResult extends CommandRunResult = CommandRunResult,\n>(problemDir: string, options: CommandJudgePresetOptions<TTestCase, TRunResult>): Promise<void> {\n  const args = parseArgs(process.argv);\n  const params = judgeParamsSchema.parse(args.params);\n\n  const { cwds, isDebugMode } = await resolveCwds(problemDir, args.cwd);\n\n  if (isDebugMode) {\n    const acceptedCwd = cwds.find((cwd) => cwd.expectedResult === 'accepted');\n    if (acceptedCwd) {\n      const isolationCheckResult = await checkProblemDirIsolation(problemDir, acceptedCwd, params);\n      if (!isolationCheckResult.passed) {\n        process.exitCode = 1;\n        return;\n      }\n    } else {\n      printDebugBanner([\n        '[DEBUG MODE] isolated problem directory check skipped',\n        '',\n        'No accepted model answer is available for checking that the copied judge still accepts a valid submission.',\n      ]);\n    }\n  }\n\n  for (const resolvedCwd of cwds) {\n    if (isDebugMode) printDebugCwdBanner(problemDir, resolvedCwd);\n    const result = await runCommandJudgeForCwd<TTestCase, TRunResult>(problemDir, resolvedCwd.cwd, params, options);\n    if (isDebugMode && !matchesExpectedResult(resolvedCwd, result)) {\n      process.exitCode = 1;\n      printDebugExpectationFailureBanner(problemDir, resolvedCwd);\n    }\n  }\n}\n\nasync function runCommandJudgeForCwd<\n  TTestCase extends BaseCommandTestCase,\n  TRunResult extends CommandRunResult = CommandRunResult,\n>(\n  problemDir: string,\n  cwd: string,\n  params: JudgeParams,\n  options: CommandJudgePresetOptions<TTestCase, TRunResult>\n): Promise<{ allAccepted: boolean }> {\n  // The sandboxed submission must read its sources and write build/run outputs in its directory.\n  makeAccessibleToSandboxUser(cwd);\n\n  const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n  const testCases = await (options.readTestCases ?? readCommandTestCases)(problemDir);\n  const prebuildTestCaseId = testCases[0]?.id ?? 'prebuild';\n  const limits = {\n    buildTimeoutSeconds: options.limits?.buildTimeoutSeconds ?? BUILD_TIMEOUT_SECONDS,\n    maxOutputLength: options.limits?.maxOutputLength ?? MAX_STDOUT_LENGTH,\n  };\n  const runTimeoutSeconds = options.runTimeoutSeconds ?? JUDGE_DEFAULT_TIMEOUT_SECONDS;\n\n  const staticAnalysisResult = await judgeByStaticAnalysis(cwd, problemMarkdownFrontMatter);\n  if (staticAnalysisResult) {\n    printTestCaseResult({ testCaseId: prebuildTestCaseId, ...staticAnalysisResult });\n    return { allAccepted: false };\n  }\n\n  const originalMainFilePath = await findEntryPointFile(cwd, params.language);\n  if (!originalMainFilePath) {\n    printTestCaseResult({\n      testCaseId: prebuildTestCaseId,\n      decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n      stderr: `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n    });\n    return { allAccepted: false };\n  }\n\n  const languageDefinition = findLanguageDefinitionByPath(originalMainFilePath);\n  if (!languageDefinition) {\n    printTestCaseResult({\n      testCaseId: prebuildTestCaseId,\n      decisionCode: DecisionCode.WRONG_ANSWER,\n      stderr: 'unsupported language',\n    });\n    return { allAccepted: false };\n  }\n\n  // `CI` changes affects Chainlit. `FORCE_COLOR` affects Bun.\n  const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n  let mainFilePath = originalMainFilePath;\n  if (options.buildSubmission !== false) {\n    if (languageDefinition.prebuild) {\n      try {\n        await languageDefinition.prebuild(cwd);\n        const prebuiltMainFilePath = await findEntryPointFile(cwd, params.language);\n        if (prebuiltMainFilePath) mainFilePath = prebuiltMainFilePath;\n      } catch (error) {\n        printTestCaseResult({\n          testCaseId: prebuildTestCaseId,\n          decisionCode: DecisionCode.BUILD_ERROR,\n          stderr: error instanceof Error ? error.message : String(error),\n        });\n        return { allAccepted: false };\n      }\n    }\n\n    const buildCommand = languageDefinition.buildCommand?.(mainFilePath);\n    if (buildCommand) {\n      const buildResult = runBuild(buildCommand, {\n        cwd,\n        env,\n        testCaseId: prebuildTestCaseId,\n        limits,\n      });\n      if (buildResult) {\n        printTestCaseResult(buildResult);\n        return { allAccepted: false };\n      }\n    }\n  }\n\n  const cwdSnapshot = await snapshotWorkingDirectory(cwd);\n\n  if (testCases.length === 0) {\n    printTestCaseResult({ testCaseId: 'default', decisionCode: DecisionCode.ACCEPTED });\n    return { allAccepted: true };\n  }\n\n  const sharedFileInputPath = (testCases as { shared?: { fileInputPath?: string } }).shared?.fileInputPath;\n\n  for (const testCase of testCases) {\n    if (sharedFileInputPath) await copyTestCaseFileInput(sharedFileInputPath, cwd);\n    if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, cwd);\n\n    const timeLimitSeconds =\n      typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n        ? problemMarkdownFrontMatter.timeLimitMs / 1000\n        : runTimeoutSeconds;\n\n    const command = languageDefinition.command(mainFilePath);\n    let stdin = testCase.input ?? '';\n    let runResult: TRunResult;\n    try {\n      if (options.resolveInput) {\n        stdin = await options.resolveInput({ testCase, cwd, env });\n      }\n\n      runResult = options.runCommand\n        ? await runCustomRunner(\n            () =>\n              // Hand custom runners a command that is already sandbox-wrapped, and the matching\n              // environment: they spawn it themselves, so an unwrapped command would run the\n              // submission as the trusted harness user and defeat the delegation boundary.\n              options.runCommand?.({\n                testCase,\n                command: wrapCommandWithSandboxUser(command),\n                stdin,\n                cwd,\n                env: { ...env, ...getSandboxUserEnvOverrides(env) },\n                timeLimitSeconds,\n              }) as Promise<TRunResult>\n          )\n        : (runCommand(command, {\n            stdin,\n            cwd,\n            env,\n            timeLimitSeconds,\n          }) as TRunResult);\n    } catch (error) {\n      printTestCaseResult({\n        testCaseId: testCase.id,\n        decisionCode: DecisionCode.RUNTIME_ERROR,\n        stdin,\n        stderr: errorToMessage(error),\n      });\n      await cleanWorkingDirectory(cwd, cwdSnapshot);\n      return { allAccepted: false };\n    }\n\n    const outputFiles = await readOutputFiles(cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n    const judgeContext: CommandJudgeContext = {\n      timeLimitSeconds,\n      outputLimitLength: limits.maxOutputLength,\n      problemMarkdownFrontMatter: {\n        memoryLimitByte: problemMarkdownFrontMatter.memoryLimitByte,\n        requiredOutputFilePaths: problemMarkdownFrontMatter.requiredOutputFilePaths,\n      },\n    };\n    const baseJudgeResult = evaluateByLimits({ runResult, outputFiles, context: judgeContext });\n    let judgeResult = baseJudgeResult;\n    if (baseJudgeResult.decisionCode === DecisionCode.ACCEPTED) {\n      try {\n        const extendedJudgeResult = await options.test?.({ testCase, runResult, outputFiles, context: judgeContext });\n        if (extendedJudgeResult) {\n          judgeResult = {\n            decisionCode: extendedJudgeResult.decisionCode ?? baseJudgeResult.decisionCode,\n            feedbackMarkdown: extendedJudgeResult.feedbackMarkdown,\n            stderr: extendedJudgeResult.stderr,\n          };\n        }\n      } catch (error) {\n        judgeResult = {\n          decisionCode: DecisionCode.RUNTIME_ERROR,\n          stderr: errorToMessage(error),\n        };\n      }\n    }\n\n    printTestCaseResult({\n      testCaseId: testCase.id,\n      ...judgeResult,\n      exitStatus: runResult.status,\n      stdin: runResult.stdin,\n      stdout: runResult.stdout.slice(0, limits.maxOutputLength) || undefined,\n      stderr: (judgeResult.stderr ?? runResult.stderr).slice(0, limits.maxOutputLength) || undefined,\n      timeSeconds: runResult.timeSeconds,\n      memoryBytes: runResult.memoryBytes,\n      outputFiles: outputFiles.length > 0 ? outputFiles : undefined,\n    });\n\n    await cleanWorkingDirectory(cwd, cwdSnapshot);\n    if (judgeResult.decisionCode !== DecisionCode.ACCEPTED) return { allAccepted: false };\n  }\n\n  return { allAccepted: true };\n}\n\nfunction matchesExpectedResult(resolvedCwd: ResolvedCwd, result: { allAccepted: boolean }): boolean {\n  return result.allAccepted === (resolvedCwd.expectedResult === 'accepted');\n}\n\nfunction runBuild(\n  buildCommand: readonly [string, ...string[]],\n  context: { cwd: string; env: NodeJS.ProcessEnv; testCaseId: string; limits: CommandJudgeLimits }\n): (Omit<TestCaseResult, 'testCaseId'> & { testCaseId: string }) | undefined {\n  const spawnResult = spawnSyncWithTimeout(\n    buildCommand[0],\n    buildCommand.slice(1),\n    { cwd: context.cwd, encoding: 'utf8', env: context.env },\n    context.limits.buildTimeoutSeconds\n  );\n  const exitStatus = spawnResult.status ?? undefined;\n\n  if (spawnResult.status !== 0) {\n    return {\n      testCaseId: context.testCaseId,\n      decisionCode: DecisionCode.BUILD_ERROR,\n      exitStatus,\n      stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n      stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n      timeSeconds: spawnResult.timeSeconds,\n      memoryBytes: spawnResult.memoryBytes,\n    };\n  }\n\n  if (spawnResult.timeSeconds > context.limits.buildTimeoutSeconds) {\n    return {\n      testCaseId: context.testCaseId,\n      decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n      exitStatus,\n      stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n      stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n      timeSeconds: spawnResult.timeSeconds,\n      memoryBytes: spawnResult.memoryBytes,\n    };\n  }\n\n  if (\n    spawnResult.stdout.length > context.limits.maxOutputLength ||\n    spawnResult.stderr.length > context.limits.maxOutputLength\n  ) {\n    return {\n      testCaseId: context.testCaseId,\n      decisionCode: DecisionCode.BUILD_OUTPUT_SIZE_LIMIT_EXCEEDED,\n      exitStatus,\n      stdout: spawnResult.stdout.slice(0, context.limits.maxOutputLength),\n      stderr: spawnResult.stderr.slice(0, context.limits.maxOutputLength),\n      timeSeconds: spawnResult.timeSeconds,\n      memoryBytes: spawnResult.memoryBytes,\n    };\n  }\n\n  return;\n}\n\nfunction errorToMessage(error: unknown): string {\n  return error instanceof Error ? error.message : String(error);\n}\n\nfunction toCommandTestCase(value: {\n  id: string;\n  input?: string;\n  fileInputPath?: string;\n  fileOutputPath?: string;\n  output?: string;\n}): BaseCommandTestCase {\n  return { id: value.id, input: value.input, fileInputPath: value.fileInputPath };\n}\n\nasync function readCommandTestCases<TTestCase extends BaseCommandTestCase = BaseCommandTestCase>(\n  problemDir: string\n): Promise<readonly TTestCase[]> {\n  const fileTestCases = await readFileTestCases(path.join(problemDir, 'test_cases'));\n  const commandTestCases = fileTestCases.map((testCase) => toCommandTestCase(testCase) as TTestCase);\n  if (fileTestCases.shared?.fileInputPath) {\n    return Object.assign(commandTestCases, { shared: { fileInputPath: fileTestCases.shared.fileInputPath } });\n  }\n  return commandTestCases;\n}\n\nfunction runCommand(\n  command: readonly [string, ...string[]],\n  context: {\n    stdin: string;\n    cwd: string;\n    env: NodeJS.ProcessEnv;\n    timeLimitSeconds: number;\n  }\n): CommandRunResult {\n  const spawnResult = spawnSyncWithTimeout(\n    command[0],\n    command.slice(1),\n    { cwd: context.cwd, encoding: 'utf8', input: context.stdin, env: context.env },\n    context.timeLimitSeconds\n  );\n\n  return {\n    stdin: context.stdin,\n    stdout: spawnResult.stdout,\n    stderr: spawnResult.stderr,\n    status: spawnResult.status ?? undefined,\n    timeSeconds: spawnResult.timeSeconds,\n    memoryBytes: spawnResult.memoryBytes,\n  };\n}\n\nfunction evaluateByLimits(context: {\n  runResult: CommandRunResult;\n  outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n  context: CommandJudgeContext;\n}): CommandJudgeCaseResult {\n  if (context.runResult.status !== 0) {\n    return { decisionCode: DecisionCode.RUNTIME_ERROR, stderr: context.runResult.stderr };\n  }\n\n  if (context.runResult.timeSeconds > context.context.timeLimitSeconds) {\n    return { decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n  }\n\n  if (\n    context.runResult.memoryBytes >\n    (context.context.problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)\n  ) {\n    return { decisionCode: DecisionCode.MEMORY_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n  }\n\n  if (\n    context.runResult.outputLimitExceeded ||\n    context.runResult.stdout.length > context.context.outputLimitLength ||\n    context.runResult.stderr.length > context.context.outputLimitLength\n  ) {\n    return { decisionCode: DecisionCode.OUTPUT_SIZE_LIMIT_EXCEEDED, stderr: context.runResult.stderr };\n  }\n\n  const requiredOutputFileCount = context.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0;\n  if (context.outputFiles.length < requiredOutputFileCount) {\n    return { decisionCode: DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR };\n  }\n\n  return { decisionCode: DecisionCode.ACCEPTED };\n}\n"],"mappings":"i+BAiCA,MAIM,EAAoBA,EAAAA,EAAE,OAAO,CACjC,SAAUA,EAAAA,EAAE,MAAM,CAACA,EAAAA,EAAE,OAAO,EAAGA,EAAAA,EAAE,MAAMA,EAAAA,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAChE,CAAC,EAgHD,eAAsB,EAGpB,EAAoB,EAA0E,CAC9F,IAAM,EAAOC,EAAAA,UAAU,QAAQ,IAAI,EAC7B,EAAS,EAAkB,MAAM,EAAK,MAAM,EAE5C,CAAE,OAAM,eAAgB,MAAMC,EAAAA,YAAY,EAAY,EAAK,GAAG,EAEpE,GAAI,EAAa,CACf,IAAM,EAAc,EAAK,KAAM,GAAQ,EAAI,iBAAmB,UAAU,EACxE,GAAI,EAEE,IAAA,EAAC,MAD8BC,EAAAA,yBAAyB,EAAY,EAAa,CAAM,EAAA,CACjE,OAAQ,CAChC,QAAQ,SAAW,EACnB,MACF,OAEA,EAAA,iBAAiB,CACf,wDACA,GACA,4GACF,CAAC,CAEL,CAEA,IAAK,IAAM,KAAe,EAAM,CAC1B,GAAa,EAAA,oBAAoB,EAAY,CAAW,EAC5D,IAAM,EAAS,MAAM,EAA6C,EAAY,EAAY,IAAK,EAAQ,CAAO,EAC1G,GAAe,CAAC,EAAsB,EAAa,CAAM,IAC3D,QAAQ,SAAW,EACnB,EAAA,mCAAmC,EAAY,CAAW,EAE9D,CACF,CAEA,eAAe,EAIb,EACA,EACA,EACA,EACmC,CAEnC,EAAA,4BAA4B,CAAG,EAE/B,IAAM,EAA6B,MAAMC,EAAAA,+BAA+B,CAAU,EAC5E,EAAY,MAAO,EAAQ,eAAiB,EAAA,CAAsB,CAAU,EAC5E,EAAqB,EAAU,EAAE,EAAE,IAAM,WACzC,EAAS,CACb,oBAAqB,EAAQ,QAAQ,qBAAuB,GAC5D,gBAAiB,EAAQ,QAAQ,iBAAmB,GACtD,EACM,EAAoB,EAAQ,mBAAqB,EAEjD,EAAuB,MAAMC,EAAAA,sBAAsB,EAAK,CAA0B,EACxF,GAAI,EAEF,OADA,EAAA,oBAAoB,CAAE,WAAY,EAAoB,GAAG,CAAqB,CAAC,EACxE,CAAE,YAAa,EAAM,EAG9B,IAAM,EAAuB,MAAMC,EAAAA,mBAAmB,EAAK,EAAO,QAAQ,EAC1E,GAAI,CAAC,EAMH,OALA,EAAA,oBAAoB,CAClB,WAAY,EACZ,aAAcC,EAAAA,aAAa,uCAC3B,OAAQ,sBAAsB,EAAO,SAAW,eAAe,EAAO,WAAa,IACrF,CAAC,EACM,CAAE,YAAa,EAAM,EAG9B,IAAM,EAAqBC,EAAAA,6BAA6B,CAAoB,EAC5E,GAAI,CAAC,EAMH,OALA,EAAA,oBAAoB,CAClB,WAAY,EACZ,aAAcD,EAAAA,aAAa,aAC3B,OAAQ,sBACV,CAAC,EACM,CAAE,YAAa,EAAM,EAI9B,IAAM,EAAM,CAAE,GAAG,QAAQ,IAAK,GAAI,GAAI,YAAa,GAAI,EAEnD,EAAe,EACnB,GAAI,EAAQ,kBAAoB,GAAO,CACrC,GAAI,EAAmB,SACrB,GAAI,CACF,MAAM,EAAmB,SAAS,CAAG,EACrC,IAAM,EAAuB,MAAMD,EAAAA,mBAAmB,EAAK,EAAO,QAAQ,EACtE,IAAsB,EAAe,EAC3C,OAAS,EAAO,CAMd,OALA,EAAA,oBAAoB,CAClB,WAAY,EACZ,aAAcC,EAAAA,aAAa,YAC3B,OAAQ,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CAC/D,CAAC,EACM,CAAE,YAAa,EAAM,CAC9B,CAGF,IAAM,EAAe,EAAmB,eAAe,CAAY,EACnE,GAAI,EAAc,CAChB,IAAM,EAAc,EAAS,EAAc,CACzC,MACA,MACA,WAAY,EACZ,QACF,CAAC,EACD,GAAI,EAEF,OADA,EAAA,oBAAoB,CAAW,EACxB,CAAE,YAAa,EAAM,CAEhC,CACF,CAEA,IAAM,EAAc,MAAME,EAAAA,yBAAyB,CAAG,EAEtD,GAAI,EAAU,SAAW,EAEvB,OADA,EAAA,oBAAoB,CAAE,WAAY,UAAW,aAAcF,EAAAA,aAAa,QAAS,CAAC,EAC3E,CAAE,YAAa,EAAK,EAG7B,IAAM,EAAuB,EAAsD,QAAQ,cAE3F,IAAK,IAAM,KAAY,EAAW,CAC5B,GAAqB,MAAMG,EAAAA,sBAAsB,EAAqB,CAAG,EACzE,EAAS,eAAe,MAAMA,EAAAA,sBAAsB,EAAS,cAAe,CAAG,EAEnF,IAAM,EACJ,OAAO,EAA2B,aAAgB,SAC9C,EAA2B,YAAc,IACzC,EAEA,EAAU,EAAmB,QAAQ,CAAY,EACnD,EAAQ,EAAS,OAAS,GAC1B,EACJ,GAAI,CACE,EAAQ,eACV,EAAQ,MAAM,EAAQ,aAAa,CAAE,WAAU,MAAK,KAAI,CAAC,GAG3D,EAAY,EAAQ,WAChB,MAAMC,EAAAA,oBAKF,EAAQ,aAAa,CACnB,WACA,QAASC,EAAAA,2BAA2B,CAAO,EAC3C,QACA,MACA,IAAK,CAAE,GAAG,EAAK,GAAGC,EAAAA,2BAA2B,CAAG,CAAE,EAClD,kBACF,CAAC,CACL,EACC,EAAW,EAAS,CACnB,QACA,MACA,MACA,kBACF,CAAC,CACP,OAAS,EAAO,CAQd,OAPA,EAAA,oBAAoB,CAClB,WAAY,EAAS,GACrB,aAAcN,EAAAA,aAAa,cAC3B,QACA,OAAQ,EAAe,CAAK,CAC9B,CAAC,EACD,MAAMO,EAAAA,sBAAsB,EAAK,CAAW,EACrC,CAAE,YAAa,EAAM,CAC9B,CAEA,IAAM,EAAc,MAAMC,EAAAA,gBAAgB,EAAK,EAA2B,yBAA2B,CAAC,CAAC,EACjG,EAAoC,CACxC,mBACA,kBAAmB,EAAO,gBAC1B,2BAA4B,CAC1B,gBAAiB,EAA2B,gBAC5C,wBAAyB,EAA2B,uBACtD,CACF,EACM,EAAkB,EAAiB,CAAE,YAAW,cAAa,QAAS,CAAa,CAAC,EACtF,EAAc,EAClB,GAAI,EAAgB,eAAiBR,EAAAA,aAAa,SAChD,GAAI,CACF,IAAM,EAAsB,MAAM,EAAQ,OAAO,CAAE,WAAU,YAAW,cAAa,QAAS,CAAa,CAAC,EACxG,IACF,EAAc,CACZ,aAAc,EAAoB,cAAgB,EAAgB,aAClE,iBAAkB,EAAoB,iBACtC,OAAQ,EAAoB,MAC9B,EAEJ,OAAS,EAAO,CACd,EAAc,CACZ,aAAcA,EAAAA,aAAa,cAC3B,OAAQ,EAAe,CAAK,CAC9B,CACF,CAgBF,GAbA,EAAA,oBAAoB,CAClB,WAAY,EAAS,GACrB,GAAG,EACH,WAAY,EAAU,OACtB,MAAO,EAAU,MACjB,OAAQ,EAAU,OAAO,MAAM,EAAG,EAAO,eAAe,GAAK,IAAA,GAC7D,QAAS,EAAY,QAAU,EAAU,OAAA,CAAQ,MAAM,EAAG,EAAO,eAAe,GAAK,IAAA,GACrF,YAAa,EAAU,YACvB,YAAa,EAAU,YACvB,YAAa,EAAY,OAAS,EAAI,EAAc,IAAA,EACtD,CAAC,EAED,MAAMO,EAAAA,sBAAsB,EAAK,CAAW,EACxC,EAAY,eAAiBP,EAAAA,aAAa,SAAU,MAAO,CAAE,YAAa,EAAM,CACtF,CAEA,MAAO,CAAE,YAAa,EAAK,CAC7B,CAEA,SAAS,EAAsB,EAA0B,EAA2C,CAClG,OAAO,EAAO,eAAiB,EAAY,iBAAmB,WAChE,CAEA,SAAS,EACP,EACA,EAC2E,CAC3E,IAAM,EAAcS,EAAAA,qBAClB,EAAa,GACb,EAAa,MAAM,CAAC,EACpB,CAAE,IAAK,EAAQ,IAAK,SAAU,OAAQ,IAAK,EAAQ,GAAI,EACvD,EAAQ,OAAO,mBACjB,EACM,EAAa,EAAY,QAAU,IAAA,GAEzC,GAAI,EAAY,SAAW,EACzB,MAAO,CACL,WAAY,EAAQ,WACpB,aAAcT,EAAAA,aAAa,YAC3B,aACA,OAAQ,EAAY,OAAO,MAAM,EAAG,EAAQ,OAAO,eAAe,EAClE,OAAQ,EAAY,OAAO,MAAM,EAAG,EAAQ,OAAO,eAAe,EAClE,YAAa,EAAY,YACzB,YAAa,EAAY,WAC3B,EAGF,GAAI,EAAY,YAAc,EAAQ,OAAO,oBAC3C,MAAO,CACL,WAAY,EAAQ,WACpB,aAAcA,EAAAA,aAAa,0BAC3B,aACA,OAAQ,EAAY,OAAO,MAAM,EAAG,EAAQ,OAAO,eAAe,EAClE,OAAQ,EAAY,OAAO,MAAM,EAAG,EAAQ,OAAO,eAAe,EAClE,YAAa,EAAY,YACzB,YAAa,EAAY,WAC3B,EAGF,GACE,EAAY,OAAO,OAAS,EAAQ,OAAO,iBAC3C,EAAY,OAAO,OAAS,EAAQ,OAAO,gBAE3C,MAAO,CACL,WAAY,EAAQ,WACpB,aAAcA,EAAAA,aAAa,iCAC3B,aACA,OAAQ,EAAY,OAAO,MAAM,EAAG,EAAQ,OAAO,eAAe,EAClE,OAAQ,EAAY,OAAO,MAAM,EAAG,EAAQ,OAAO,eAAe,EAClE,YAAa,EAAY,YACzB,YAAa,EAAY,WAC3B,CAIJ,CAEA,SAAS,EAAe,EAAwB,CAC9C,OAAO,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CAC9D,CAEA,SAAS,EAAkB,EAMH,CACtB,MAAO,CAAE,GAAI,EAAM,GAAI,MAAO,EAAM,MAAO,cAAe,EAAM,aAAc,CAChF,CAEA,eAAe,EACb,EAC+B,CAC/B,IAAM,EAAgB,MAAMU,EAAAA,cAAkBC,EAAAA,QAAK,KAAK,EAAY,YAAY,CAAC,EAC3E,EAAmB,EAAc,IAAK,GAAa,EAAkB,CAAQ,CAAc,EAIjG,OAHI,EAAc,QAAQ,cACjB,OAAO,OAAO,EAAkB,CAAE,OAAQ,CAAE,cAAe,EAAc,OAAO,aAAc,CAAE,CAAC,EAEnG,CACT,CAEA,SAAS,EACP,EACA,EAMkB,CAClB,IAAM,EAAcF,EAAAA,qBAClB,EAAQ,GACR,EAAQ,MAAM,CAAC,EACf,CAAE,IAAK,EAAQ,IAAK,SAAU,OAAQ,MAAO,EAAQ,MAAO,IAAK,EAAQ,GAAI,EAC7E,EAAQ,gBACV,EAEA,MAAO,CACL,MAAO,EAAQ,MACf,OAAQ,EAAY,OACpB,OAAQ,EAAY,OACpB,OAAQ,EAAY,QAAU,IAAA,GAC9B,YAAa,EAAY,YACzB,YAAa,EAAY,WAC3B,CACF,CAEA,SAAS,EAAiB,EAIC,CACzB,GAAI,EAAQ,UAAU,SAAW,EAC/B,MAAO,CAAE,aAAcT,EAAAA,aAAa,cAAe,OAAQ,EAAQ,UAAU,MAAO,EAGtF,GAAI,EAAQ,UAAU,YAAc,EAAQ,QAAQ,iBAClD,MAAO,CAAE,aAAcA,EAAAA,aAAa,oBAAqB,OAAQ,EAAQ,UAAU,MAAO,EAG5F,GACE,EAAQ,UAAU,aACjB,EAAQ,QAAQ,2BAA2B,iBAAmB,KAE/D,MAAO,CAAE,aAAcA,EAAAA,aAAa,sBAAuB,OAAQ,EAAQ,UAAU,MAAO,EAG9F,GACE,EAAQ,UAAU,qBAClB,EAAQ,UAAU,OAAO,OAAS,EAAQ,QAAQ,mBAClD,EAAQ,UAAU,OAAO,OAAS,EAAQ,QAAQ,kBAElD,MAAO,CAAE,aAAcA,EAAAA,aAAa,2BAA4B,OAAQ,EAAQ,UAAU,MAAO,EAGnG,IAAM,EAA0B,EAAQ,QAAQ,2BAA2B,yBAAyB,QAAU,EAK9G,OAJI,EAAQ,YAAY,OAAS,EACxB,CAAE,aAAcA,EAAAA,aAAa,kCAAmC,EAGlE,CAAE,aAAcA,EAAAA,aAAa,QAAS,CAC/C"}