agentv 4.44.0-next.1 → 5.1.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +236 -54
  2. package/dist/{agentv-provider-AYXH7WLW-NJRC6UQX.js → agentv-provider-AYXH7WLW-6YZKZ7PS.js} +2 -2
  3. package/dist/{artifact-writer-72MQQELS.js → artifact-writer-IORG7CW5.js} +21 -12
  4. package/dist/{chunk-NPVGBFF6.js → chunk-7BGERE6L.js} +2 -43
  5. package/dist/chunk-7BGERE6L.js.map +1 -0
  6. package/dist/{chunk-CXHYTYHU.js → chunk-AM2IPHKS.js} +3496 -1955
  7. package/dist/chunk-AM2IPHKS.js.map +1 -0
  8. package/dist/{chunk-KAGZRUO6.js → chunk-CBBBRTQ3.js} +127 -80
  9. package/dist/chunk-CBBBRTQ3.js.map +1 -0
  10. package/dist/{chunk-2N3YSEMI.js → chunk-GIRUNQGP.js} +8323 -9226
  11. package/dist/chunk-GIRUNQGP.js.map +1 -0
  12. package/dist/{chunk-NCNDA3F6.js → chunk-GJWPQXHN.js} +1070 -791
  13. package/dist/chunk-GJWPQXHN.js.map +1 -0
  14. package/dist/{chunk-BPGJ4HBU.js → chunk-PEUTJS7B.js} +3 -3
  15. package/dist/{chunk-5H446C7X.js → chunk-QMRVH5ZP.js} +2 -8
  16. package/dist/{chunk-5DYGN547.js → chunk-ZGPCX334.js} +44263 -30424
  17. package/dist/chunk-ZGPCX334.js.map +1 -0
  18. package/dist/cli.js +8 -9
  19. package/dist/cli.js.map +1 -1
  20. package/dist/dashboard/assets/{index-DitffAxS.js → index-BSHoWrdr.js} +1 -1
  21. package/dist/dashboard/assets/index-BaLLxmVO.js +121 -0
  22. package/dist/dashboard/assets/index-zvUKAkKn.css +1 -0
  23. package/dist/dashboard/index.html +2 -2
  24. package/dist/{dist-L4YCQOQ6.js → dist-2D2GBHZV.js} +101 -51
  25. package/dist/{docker-workspace-RPPXBT27-B4AQHVWA.js → docker-workspace-NNK4Z6FR-QRTIG6TM.js} +3 -3
  26. package/dist/{exec-AR6JUUN5-6MBPURPR.js → exec-4HFFRQ3B-AXDMJNLJ.js} +3 -3
  27. package/dist/index.js +8 -9
  28. package/dist/{interactive-DRNRKLEQ.js → interactive-V4SEHLNY.js} +13 -29
  29. package/dist/interactive-V4SEHLNY.js.map +1 -0
  30. package/dist/skills/agentv-bench/SKILL.md +26 -26
  31. package/dist/skills/agentv-bench/agents/analyzer.md +7 -7
  32. package/dist/skills/agentv-bench/agents/comparator.md +4 -5
  33. package/dist/skills/agentv-bench/agents/grader.md +4 -4
  34. package/dist/skills/agentv-bench/references/autoresearch.md +4 -4
  35. package/dist/skills/agentv-bench/references/description-optimization.md +2 -2
  36. package/dist/skills/agentv-bench/references/environment-adaptation.md +10 -10
  37. package/dist/skills/agentv-bench/references/eval-yaml-spec.md +52 -26
  38. package/dist/skills/agentv-bench/references/migrating-from-skill-creator.md +6 -6
  39. package/dist/skills/agentv-bench/references/schemas.md +6 -6
  40. package/dist/skills/agentv-bench/references/subagent-pipeline.md +14 -13
  41. package/dist/skills/agentv-eval-migrations/SKILL.md +33 -0
  42. package/dist/skills/agentv-eval-migrations/references/breaking-changes.md +1013 -0
  43. package/dist/skills/agentv-eval-review/SKILL.md +6 -3
  44. package/dist/skills/agentv-eval-review/scripts/lint_eval.py +1 -1
  45. package/dist/skills/agentv-eval-writer/SKILL.md +329 -200
  46. package/dist/skills/agentv-eval-writer/references/{config-schema.json → config.schema.json} +6 -5
  47. package/dist/skills/agentv-eval-writer/references/custom-evaluators.md +23 -18
  48. package/dist/skills/agentv-eval-writer/references/eval.schema.json +10447 -0
  49. package/dist/skills/agentv-eval-writer/references/python-helpers.md +8 -8
  50. package/dist/skills/agentv-eval-writer/references/rubric-evaluator.md +21 -22
  51. package/dist/skills/agentv-trace-analyst/SKILL.md +4 -4
  52. package/dist/templates/.agentv/targets.yaml +41 -40
  53. package/dist/{ts-eval-loader-S7ESROX2-6CB3HB6H.js → ts-eval-loader-SSPJVEHD-AL2A3V5Z.js} +4 -4
  54. package/package.json +13 -4
  55. package/dist/chunk-2N3YSEMI.js.map +0 -1
  56. package/dist/chunk-5DYGN547.js.map +0 -1
  57. package/dist/chunk-76FOHROU.js +0 -96
  58. package/dist/chunk-76FOHROU.js.map +0 -1
  59. package/dist/chunk-CXHYTYHU.js.map +0 -1
  60. package/dist/chunk-HSHTTN6C.js +0 -565
  61. package/dist/chunk-HSHTTN6C.js.map +0 -1
  62. package/dist/chunk-KAGZRUO6.js.map +0 -1
  63. package/dist/chunk-LRULMAAA.js +0 -1711
  64. package/dist/chunk-LRULMAAA.js.map +0 -1
  65. package/dist/chunk-NCNDA3F6.js.map +0 -1
  66. package/dist/chunk-NPVGBFF6.js.map +0 -1
  67. package/dist/chunk-R3CXYNTN.js +0 -1238
  68. package/dist/chunk-R3CXYNTN.js.map +0 -1
  69. package/dist/chunk-VQ2ZO7XJ.js +0 -2098
  70. package/dist/chunk-VQ2ZO7XJ.js.map +0 -1
  71. package/dist/chunk-XALGXSKB.js +0 -21
  72. package/dist/chunk-XALGXSKB.js.map +0 -1
  73. package/dist/dashboard/assets/index-1Hvy8sBy.js +0 -119
  74. package/dist/dashboard/assets/index-J5sPcQO3.css +0 -1
  75. package/dist/esm-NNMQYIKT.js +0 -32
  76. package/dist/esm-R77SNOF5.js +0 -65
  77. package/dist/esm-RVQPUGWH.js +0 -1207
  78. package/dist/esm-RVQPUGWH.js.map +0 -1
  79. package/dist/esm-TTEMJEVV.js +0 -933
  80. package/dist/esm-TTEMJEVV.js.map +0 -1
  81. package/dist/esm-ZADQ4XQH-QUFGGZL4.js +0 -924
  82. package/dist/esm-ZADQ4XQH-QUFGGZL4.js.map +0 -1
  83. package/dist/exec-AR6JUUN5-6MBPURPR.js.map +0 -1
  84. package/dist/getMachineId-bsd-HSK5LZMG.js +0 -41
  85. package/dist/getMachineId-bsd-HSK5LZMG.js.map +0 -1
  86. package/dist/getMachineId-darwin-4DP6CCJV.js +0 -41
  87. package/dist/getMachineId-darwin-4DP6CCJV.js.map +0 -1
  88. package/dist/getMachineId-linux-44LJ5UJB.js +0 -33
  89. package/dist/getMachineId-linux-44LJ5UJB.js.map +0 -1
  90. package/dist/getMachineId-unsupported-NVK6IATM.js +0 -24
  91. package/dist/getMachineId-unsupported-NVK6IATM.js.map +0 -1
  92. package/dist/getMachineId-win-YZ36S7VA.js +0 -43
  93. package/dist/getMachineId-win-YZ36S7VA.js.map +0 -1
  94. package/dist/interactive-DRNRKLEQ.js.map +0 -1
  95. package/dist/otlp-json-file-exporter-RY63S3IG-PZBQPVYY.js +0 -9
  96. package/dist/otlp-json-file-exporter-RY63S3IG-PZBQPVYY.js.map +0 -1
  97. package/dist/skills/agentv-eval-writer/references/eval-schema.json +0 -17355
  98. package/dist/src-76ISS3LH.js +0 -1733
  99. package/dist/src-76ISS3LH.js.map +0 -1
  100. package/dist/ts-eval-loader-S7ESROX2-6CB3HB6H.js.map +0 -1
  101. /package/dist/{agentv-provider-AYXH7WLW-NJRC6UQX.js.map → agentv-provider-AYXH7WLW-6YZKZ7PS.js.map} +0 -0
  102. /package/dist/{artifact-writer-72MQQELS.js.map → artifact-writer-IORG7CW5.js.map} +0 -0
  103. /package/dist/{chunk-BPGJ4HBU.js.map → chunk-PEUTJS7B.js.map} +0 -0
  104. /package/dist/{chunk-5H446C7X.js.map → chunk-QMRVH5ZP.js.map} +0 -0
  105. /package/dist/{dist-L4YCQOQ6.js.map → dist-2D2GBHZV.js.map} +0 -0
  106. /package/dist/{docker-workspace-RPPXBT27-B4AQHVWA.js.map → docker-workspace-NNK4Z6FR-QRTIG6TM.js.map} +0 -0
  107. /package/dist/{esm-NNMQYIKT.js.map → exec-4HFFRQ3B-AXDMJNLJ.js.map} +0 -0
  108. /package/dist/{esm-R77SNOF5.js.map → ts-eval-loader-SSPJVEHD-AL2A3V5Z.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../packages/core/src/evaluation/dashboard-trace-read-model.ts","../../../packages/core/src/evaluation/trace-normalization.ts","../../../packages/core/src/evaluation/loaders/eval-yaml-transpiler.ts","../../../packages/core/src/evaluation/prepared-workspace.ts","../../../packages/core/src/evaluation/config.ts","../../../packages/core/src/evaluation/generators/rubric-generator.ts","../../../packages/core/src/evaluation/workspace/deps-scanner.ts","../../../packages/core/src/evaluation/results-repo.ts","../../../packages/core/src/project-sync.ts","../../../packages/core/src/evaluation/baseline.ts","../../../packages/core/src/evaluation/category.ts","../../../packages/core/src/observability/otel-exporter.ts","../../../packages/core/src/evaluation/run-budget-tracker.ts","../../../packages/core/src/evaluation/hooks.ts","../../../packages/core/src/import/claude-parser.ts","../../../packages/core/src/import/codex-parser.ts","../../../packages/core/src/import/codex-session-discovery.ts","../../../packages/core/src/import/session-discovery.ts","../../../packages/core/src/import/transcript-provider.ts","../../../packages/core/src/index.ts"],"sourcesContent":["/**\n * Dashboard trace/session wire read model.\n *\n * This module projects already-normalized `agentv.trace.v1` envelopes into the\n * stable snake_case payload consumed by the local Dashboard and served by the\n * CLI Dashboard API. It intentionally does not normalize raw OTLP/provider\n * traces; that stays in the trace normalization pipeline before artifacts reach\n * this projector.\n */\n\nimport type { ExternalTraceMetadataWire } from './external-trace.js';\n\nexport interface TraceSessionTokenUsage {\n input?: number;\n output?: number;\n reasoning?: number;\n cached?: number;\n total?: number;\n}\n\nexport interface TraceSessionSpanStatus {\n code?: string;\n message?: string;\n}\n\nexport type TraceSessionEventKind = 'annotation' | 'exception' | 'event' | 'score';\n\nexport interface TraceSessionEvent {\n event_id: string;\n span_id: string;\n name: string;\n kind: TraceSessionEventKind;\n time_unix_nano?: string;\n timestamp?: string;\n score?: number;\n text?: string;\n passed?: boolean;\n attributes?: Record<string, unknown>;\n}\n\nexport interface TraceSessionSpan {\n id: string;\n trace_id?: string;\n span_id: string;\n parent_span_id?: string | null;\n name: string;\n kind?: string;\n status?: TraceSessionSpanStatus;\n start_time_unix_nano?: string;\n end_time_unix_nano?: string;\n start_time?: string;\n end_time?: string;\n duration_ms?: number;\n token_usage?: TraceSessionTokenUsage;\n resource_attributes?: Record<string, unknown>;\n attributes?: Record<string, unknown>;\n events?: TraceSessionEvent[];\n}\n\nexport interface TraceSessionScore {\n name: string;\n type?: string;\n score: number;\n weight?: number;\n verdict?: string;\n source?: string;\n evaluated_at?: string;\n target_span_id?: string;\n evidence?: Record<string, unknown>;\n}\n\nexport interface TraceSessionSource {\n kind?: string;\n path?: string;\n provider?: string;\n format?: string;\n version?: string;\n artifact_path?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TraceSessionArtifactLink {\n name: string;\n path: string;\n}\n\nexport interface TraceSessionSourceRef {\n event_id?: string;\n message_id?: string;\n span_id?: string;\n trace_id?: string;\n raw_kind?: string;\n path?: string;\n line?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TraceSessionConversionWarning {\n code: string;\n severity?: 'info' | 'warning' | 'error' | string;\n span_id?: string;\n source_ref?: TraceSessionSourceRef;\n message: string;\n details?: Record<string, unknown>;\n}\n\nexport interface TraceSessionResponse {\n schema_version: 'agentv.dashboard.trace_session.v1';\n artifact_id?: string;\n created_at?: string;\n run_id?: string;\n test_id?: string;\n suite?: string;\n target?: string;\n trace_id?: string;\n root_span_id?: string;\n source?: TraceSessionSource;\n external_trace?: ExternalTraceMetadataWire;\n artifact_links?: TraceSessionArtifactLink[];\n resource_attributes?: Record<string, unknown>;\n conversion_warnings?: TraceSessionConversionWarning[];\n spans: TraceSessionSpan[];\n events: TraceSessionEvent[];\n scores?: TraceSessionScore[];\n}\n\nexport const TRACE_SESSION_SCHEMA_VERSION = 'agentv.dashboard.trace_session.v1' as const;\n\nexport interface TraceSessionProjectionOptions {\n runId?: string;\n artifactPath?: string;\n}\n\nexport interface TraceSpanNode {\n id: string;\n spanId: string;\n parentSpanId?: string | null;\n span: TraceSessionSpan;\n children: TraceSpanNode[];\n diagnostics?: TraceSpanTreeDiagnostic[];\n}\n\nexport type TraceSpanTreeDiagnosticCode =\n | 'cycle'\n | 'duplicate_span_id'\n | 'missing_parent'\n | 'missing_span_id'\n | 'self_parent';\n\nexport interface TraceSpanTreeDiagnostic {\n code: TraceSpanTreeDiagnosticCode;\n message: string;\n span_id?: string;\n node_id?: string;\n parent_span_id?: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return isRecord(value) ? value : undefined;\n}\n\nfunction asArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction finiteNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction finiteInteger(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isInteger(value) && value >= 0 ? value : undefined;\n}\n\nfunction boolValue(value: unknown): boolean | undefined {\n return typeof value === 'boolean' ? value : undefined;\n}\n\nfunction dropUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined)) as T;\n}\n\nfunction compactRecord(value: Record<string, unknown>): Record<string, unknown> | undefined {\n const compacted = dropUndefined(value);\n return Object.keys(compacted).length > 0 ? compacted : undefined;\n}\n\nfunction nonEmptyArray<T>(value: readonly T[] | undefined): readonly T[] | undefined {\n return value && value.length > 0 ? value : undefined;\n}\n\nfunction unixNanoToIso(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n try {\n return new Date(Number(BigInt(value) / 1_000_000n)).toISOString();\n } catch {\n return undefined;\n }\n}\n\nfunction durationMsFromNanos(\n start: string | undefined,\n end: string | undefined,\n): number | undefined {\n if (!start || !end) {\n return undefined;\n }\n try {\n const startNanos = BigInt(start);\n const endNanos = BigInt(end);\n if (endNanos < startNanos) {\n return undefined;\n }\n return Number(endNanos - startNanos) / 1_000_000;\n } catch {\n return undefined;\n }\n}\n\nfunction numberFromAttributes(\n attributes: Record<string, unknown>,\n keys: readonly string[],\n): number | undefined {\n for (const key of keys) {\n const value = finiteNumber(attributes[key]);\n if (value !== undefined) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction tokenUsageFromAttributes(\n attributes: Record<string, unknown> | undefined,\n): TraceSessionTokenUsage | undefined {\n if (!attributes) {\n return undefined;\n }\n\n const nested = asRecord(attributes.token_usage);\n const usage = compactRecord({\n input:\n finiteNumber(nested?.input) ??\n numberFromAttributes(attributes, [\n 'gen_ai.usage.input_tokens',\n 'llm.token_count.prompt',\n 'input_tokens',\n ]),\n output:\n finiteNumber(nested?.output) ??\n numberFromAttributes(attributes, [\n 'gen_ai.usage.output_tokens',\n 'llm.token_count.completion',\n 'output_tokens',\n ]),\n reasoning:\n finiteNumber(nested?.reasoning) ??\n numberFromAttributes(attributes, [\n 'gen_ai.usage.reasoning.output_tokens',\n 'reasoning_tokens',\n ]),\n cached:\n finiteNumber(nested?.cached) ??\n numberFromAttributes(attributes, ['gen_ai.usage.cache_read.input_tokens', 'cached_tokens']),\n total: finiteNumber(nested?.total) ?? numberFromAttributes(attributes, ['total_tokens']),\n });\n\n return usage as TraceSessionTokenUsage | undefined;\n}\n\nfunction isExternalTraceKey(key: string): boolean {\n return (\n key === 'external_trace' ||\n key.startsWith('external_trace_') ||\n key.startsWith('external_trace.')\n );\n}\n\nfunction isCredentialLikeKey(key: string): boolean {\n const normalized = key.toLowerCase();\n if (\n normalized === 'token_usage' ||\n normalized.endsWith('_tokens') ||\n normalized.endsWith('.tokens') ||\n normalized.includes('usage.')\n ) {\n return false;\n }\n return /(^|[._-])(api[._-]?key|authorization|bearer|password|secret|private[._-]?key|access[._-]?token|auth[._-]?token|client[._-]?secret|id[._-]?token|refresh[._-]?token|session[._-]?token|token)($|[._-])/.test(\n normalized,\n );\n}\n\nfunction sanitizeAttributeMap(\n value: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (!value) {\n return undefined;\n }\n const entries = Object.entries(value).flatMap(([key, entry]) => {\n if (isExternalTraceKey(key) || isCredentialLikeKey(key)) {\n return [];\n }\n if (isRecord(entry)) {\n const nested = sanitizeAttributeMap(entry);\n return nested ? [[key, nested] as const] : [];\n }\n return [[key, entry] as const];\n });\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n}\n\nfunction spanStatusFromValue(value: unknown): TraceSessionSpan['status'] {\n const record = asRecord(value);\n if (!record) {\n return undefined;\n }\n return compactRecord({\n code:\n stringValue(record.code) ??\n (typeof record.code === 'number' ? String(record.code) : undefined),\n message: stringValue(record.message),\n }) as TraceSessionSpan['status'];\n}\n\nfunction eventKind(\n name: string,\n attributes: Record<string, unknown> | undefined,\n): TraceSessionEventKind {\n const lowerName = name.toLowerCase();\n if (\n lowerName.includes('score') ||\n numberFromAttributes(attributes ?? {}, [\n 'score',\n 'agentv.score',\n 'agentv.grader.score',\n 'gen_ai.evaluation.score.value',\n 'openinference.evaluation.score',\n ]) !== undefined\n ) {\n return 'score';\n }\n if (\n lowerName.includes('annotation') ||\n stringValue(attributes?.text) !== undefined ||\n stringValue(attributes?.annotation) !== undefined ||\n stringValue(attributes?.['agentv.annotation.text']) !== undefined\n ) {\n return 'annotation';\n }\n if (lowerName === 'exception') {\n return 'exception';\n }\n return 'event';\n}\n\nfunction scoreFromEvent(attributes: Record<string, unknown> | undefined): number | undefined {\n if (!attributes) {\n return undefined;\n }\n return (\n finiteNumber(attributes.score) ??\n finiteNumber(attributes['agentv.score']) ??\n finiteNumber(attributes['agentv.grader.score']) ??\n finiteNumber(attributes['gen_ai.evaluation.score.value']) ??\n finiteNumber(attributes['openinference.evaluation.score'])\n );\n}\n\nfunction textFromEvent(attributes: Record<string, unknown> | undefined): string | undefined {\n if (!attributes) {\n return undefined;\n }\n return (\n stringValue(attributes.text) ??\n stringValue(attributes.annotation) ??\n stringValue(attributes['agentv.annotation.text']) ??\n stringValue(attributes['gen_ai.evaluation.explanation']) ??\n stringValue(attributes['gen_ai.evaluation.score.label']) ??\n stringValue(attributes['exception.message'])\n );\n}\n\nfunction passedFromEvent(attributes: Record<string, unknown> | undefined): boolean | undefined {\n if (!attributes) {\n return undefined;\n }\n return (\n boolValue(attributes.passed) ??\n boolValue(attributes['agentv.annotation.passed']) ??\n boolValue(attributes['agentv.grader.passed']) ??\n boolValue(attributes['gen_ai.evaluation.passed'])\n );\n}\n\nfunction eventId(\n spanId: string,\n index: number,\n attributes: Record<string, unknown> | undefined,\n): string {\n return (\n stringValue(attributes?.event_id) ??\n stringValue(attributes?.['agentv.event_id']) ??\n `${spanId}:event:${index}`\n );\n}\n\nfunction projectSpanEvent(\n spanId: string,\n event: unknown,\n index: number,\n): TraceSessionEvent | undefined {\n const record = asRecord(event);\n if (!record) {\n return undefined;\n }\n const name = stringValue(record.name);\n if (!name) {\n return undefined;\n }\n\n const attributes = asRecord(record.attributes);\n const safeAttributes = sanitizeAttributeMap(attributes);\n return dropUndefined({\n event_id: eventId(spanId, index, attributes),\n span_id: spanId,\n name,\n kind: eventKind(name, attributes),\n time_unix_nano: stringValue(record.time_unix_nano),\n timestamp: unixNanoToIso(stringValue(record.time_unix_nano)),\n score: scoreFromEvent(attributes),\n text: textFromEvent(attributes),\n passed: passedFromEvent(attributes),\n attributes: safeAttributes,\n });\n}\n\nfunction projectSpan(span: unknown, index: number): TraceSessionSpan | undefined {\n const record = asRecord(span);\n if (!record) {\n return undefined;\n }\n\n const spanId = stringValue(record.span_id) ?? `span-${index}`;\n const traceId = stringValue(record.trace_id);\n const parentSpanId = record.parent_span_id === null ? null : stringValue(record.parent_span_id);\n const attributes = asRecord(record.attributes);\n const safeAttributes = sanitizeAttributeMap(attributes);\n const startTimeUnixNano = stringValue(record.start_time_unix_nano);\n const endTimeUnixNano = stringValue(record.end_time_unix_nano);\n const events = asArray(record.events)\n .map((event, eventIndex) => projectSpanEvent(spanId, event, eventIndex))\n .filter((event): event is TraceSessionEvent => event !== undefined);\n\n return dropUndefined({\n id: spanId,\n trace_id: traceId,\n span_id: spanId,\n parent_span_id: parentSpanId,\n name: stringValue(record.name) ?? spanId,\n kind: stringValue(record.kind),\n status: spanStatusFromValue(record.status),\n start_time_unix_nano: startTimeUnixNano,\n end_time_unix_nano: endTimeUnixNano,\n start_time: unixNanoToIso(startTimeUnixNano),\n end_time: unixNanoToIso(endTimeUnixNano),\n duration_ms: durationMsFromNanos(startTimeUnixNano, endTimeUnixNano),\n token_usage: tokenUsageFromAttributes(attributes),\n resource_attributes: sanitizeAttributeMap(asRecord(record.resource_attributes)),\n attributes: safeAttributes,\n events: events.length > 0 ? events : undefined,\n });\n}\n\nfunction projectScores(scores: unknown): TraceSessionScore[] | undefined {\n const projected: TraceSessionScore[] = [];\n\n for (const score of asArray(scores)) {\n const record = asRecord(score);\n const name = stringValue(record?.name);\n const value = finiteNumber(record?.score);\n if (!record || !name || value === undefined) {\n continue;\n }\n projected.push(\n dropUndefined({\n name,\n type: stringValue(record.type),\n score: value,\n weight: finiteNumber(record.weight),\n verdict: stringValue(record.verdict),\n source: stringValue(record.source),\n evaluated_at: stringValue(record.evaluated_at),\n target_span_id: stringValue(record.target_span_id),\n evidence: asRecord(record.evidence),\n }) as TraceSessionScore,\n );\n }\n\n return projected.length > 0 ? projected : undefined;\n}\n\nconst EXTERNAL_TRACE_KEYS = [\n 'provider',\n 'source',\n 'endpoint',\n 'profile',\n 'project',\n 'project_id',\n 'session_id',\n 'session_node_id',\n 'trace_id',\n 'trace_node_id',\n 'span_id',\n 'span_node_id',\n 'traceparent',\n 'tracestate',\n 'ui_url',\n 'run_id',\n 'test_id',\n 'target',\n] as const;\n\nfunction sanitizeUrl(value: unknown): string | undefined {\n const raw = stringValue(value);\n if (!raw) {\n return undefined;\n }\n try {\n const url = new URL(raw);\n if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password) {\n return undefined;\n }\n url.search = '';\n url.hash = '';\n return url.toString();\n } catch {\n return undefined;\n }\n}\n\nfunction sanitizeExternalTrace(value: unknown): ExternalTraceMetadataWire | undefined {\n const record = asRecord(value);\n if (!record) {\n return undefined;\n }\n\n const sanitized = compactRecord({\n provider: stringValue(record.provider),\n source: stringValue(record.source),\n endpoint: sanitizeUrl(record.endpoint),\n profile: stringValue(record.profile),\n project: stringValue(record.project),\n project_id: stringValue(record.project_id) ?? stringValue(record.projectId),\n session_id: stringValue(record.session_id) ?? stringValue(record.session),\n session_node_id:\n stringValue(record.session_node_id) ??\n stringValue(record.session_node) ??\n stringValue(record.node_id),\n trace_id: stringValue(record.trace_id) ?? stringValue(record.trace),\n trace_node_id: stringValue(record.trace_node_id) ?? stringValue(record.trace_node),\n span_id: stringValue(record.span_id) ?? stringValue(record.span),\n span_node_id: stringValue(record.span_node_id) ?? stringValue(record.span_node),\n traceparent: stringValue(record.traceparent),\n tracestate: stringValue(record.tracestate),\n ui_url: sanitizeUrl(record.ui_url ?? record.url ?? record.href),\n run_id: stringValue(record.run_id),\n test_id: stringValue(record.test_id),\n target: stringValue(record.target),\n }) as ExternalTraceMetadataWire | undefined;\n\n return sanitized && EXTERNAL_TRACE_KEYS.some((key) => sanitized[key] !== undefined)\n ? sanitized\n : undefined;\n}\n\nfunction externalTraceFromFlatMetadata(\n metadata: Record<string, unknown> | undefined,\n): ExternalTraceMetadataWire | undefined {\n if (!metadata) {\n return undefined;\n }\n return sanitizeExternalTrace({\n provider: metadata.external_trace_provider ?? metadata['external_trace.provider'],\n source: metadata.external_trace_source ?? metadata['external_trace.source'],\n endpoint: metadata.external_trace_endpoint ?? metadata['external_trace.endpoint'],\n profile: metadata.external_trace_profile ?? metadata['external_trace.profile'],\n project: metadata.external_trace_project ?? metadata['external_trace.project'],\n project_id: metadata.external_trace_project_id ?? metadata['external_trace.project_id'],\n session_id:\n metadata.external_trace_session_id ??\n metadata.external_trace_session ??\n metadata['external_trace.session_id'] ??\n metadata['external_trace.session'],\n session_node_id:\n metadata.external_trace_session_node_id ??\n metadata.external_trace_node_id ??\n metadata['external_trace.session_node_id'] ??\n metadata['external_trace.node_id'],\n trace_id:\n metadata.external_trace_trace_id ??\n metadata.external_trace_trace ??\n metadata['external_trace.trace_id'] ??\n metadata['external_trace.trace'],\n trace_node_id:\n metadata.external_trace_trace_node_id ?? metadata['external_trace.trace_node_id'],\n span_id:\n metadata.external_trace_span_id ??\n metadata.external_trace_span ??\n metadata['external_trace.span_id'] ??\n metadata['external_trace.span'],\n span_node_id: metadata.external_trace_span_node_id ?? metadata['external_trace.span_node_id'],\n traceparent: metadata.external_trace_traceparent ?? metadata['external_trace.traceparent'],\n tracestate: metadata.external_trace_tracestate ?? metadata['external_trace.tracestate'],\n ui_url:\n metadata.external_trace_ui_url ??\n metadata.external_trace_url ??\n metadata['external_trace.ui_url'] ??\n metadata['external_trace.url'],\n run_id: metadata.external_trace_run_id ?? metadata['external_trace.run_id'],\n test_id: metadata.external_trace_test_id ?? metadata['external_trace.test_id'],\n target: metadata.external_trace_target ?? metadata['external_trace.target'],\n });\n}\n\nfunction sanitizeMetadataValue(value: unknown): unknown | undefined {\n if (Array.isArray(value)) {\n const sanitized = value\n .map(sanitizeMetadataValue)\n .filter((entry): entry is unknown => entry !== undefined);\n return sanitized.length > 0 ? sanitized : undefined;\n }\n if (isRecord(value)) {\n return sanitizeMetadata(value);\n }\n return value;\n}\n\nfunction sanitizeMetadata(\n value: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (!value) {\n return undefined;\n }\n const entries = Object.entries(value).flatMap(([key, entry]) => {\n if (isExternalTraceKey(key) || isCredentialLikeKey(key)) {\n return [];\n }\n const sanitized = sanitizeMetadataValue(entry);\n return sanitized !== undefined ? [[key, sanitized] as const] : [];\n });\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n}\n\nfunction sourceFromEnvelope(\n source: Record<string, unknown> | undefined,\n artifactPath: string | undefined,\n): TraceSessionSource | undefined {\n if (!source && !artifactPath) {\n return undefined;\n }\n return compactRecord({\n kind: stringValue(source?.kind),\n path: stringValue(source?.path),\n provider: stringValue(source?.provider),\n format: stringValue(source?.format),\n version: stringValue(source?.version),\n artifact_path: artifactPath,\n metadata: sanitizeMetadata(asRecord(source?.metadata)),\n }) as TraceSessionSource | undefined;\n}\n\nfunction safeArtifactPath(value: unknown): string | undefined {\n const raw = stringValue(value);\n if (!raw || raw.includes('\\0')) {\n return undefined;\n }\n\n const normalized = raw.replace(/\\\\/g, '/');\n if (normalized.startsWith('/') || normalized.startsWith('//')) {\n return undefined;\n }\n if (/^[a-z][a-z0-9+.-]*:/i.test(normalized)) {\n return undefined;\n }\n if (normalized.split('/').includes('..')) {\n return undefined;\n }\n return normalized;\n}\n\nfunction projectArtifactLinks(artifacts: unknown): TraceSessionArtifactLink[] | undefined {\n const record = asRecord(artifacts);\n if (!record) {\n return undefined;\n }\n\n const links = Object.entries(record)\n .flatMap(([name, value]) => {\n if (!stringValue(name) || isCredentialLikeKey(name)) {\n return [];\n }\n const artifactPath = safeArtifactPath(value);\n return artifactPath ? [{ name, path: artifactPath }] : [];\n })\n .sort((first, second) => first.name.localeCompare(second.name));\n\n return links.length > 0 ? links : undefined;\n}\n\nfunction projectSourceRef(value: unknown): TraceSessionSourceRef | undefined {\n const record = asRecord(value);\n if (!record) {\n return undefined;\n }\n return compactRecord({\n event_id: stringValue(record.event_id),\n message_id: stringValue(record.message_id),\n span_id: stringValue(record.span_id),\n trace_id: stringValue(record.trace_id),\n raw_kind: stringValue(record.raw_kind),\n path: safeArtifactPath(record.path),\n line: finiteInteger(record.line),\n metadata: sanitizeMetadata(asRecord(record.metadata)),\n }) as TraceSessionSourceRef | undefined;\n}\n\nfunction projectConversionWarnings(warnings: unknown): TraceSessionConversionWarning[] | undefined {\n const projected: TraceSessionConversionWarning[] = [];\n\n for (const warning of asArray(warnings)) {\n const record = asRecord(warning);\n const code = stringValue(record?.code);\n const message = stringValue(record?.message);\n if (!record || !code || !message) {\n continue;\n }\n projected.push(\n dropUndefined({\n code,\n severity: stringValue(record.severity),\n span_id: stringValue(record.span_id),\n source_ref: projectSourceRef(record.source_ref),\n message,\n details: sanitizeMetadata(asRecord(record.details)),\n }) as TraceSessionConversionWarning,\n );\n }\n\n return projected.length > 0 ? projected : undefined;\n}\n\nfunction externalTraceFromEnvelope(\n envelope: Record<string, unknown>,\n): ExternalTraceMetadataWire | undefined {\n const source = asRecord(envelope.source);\n const sourceMetadata = asRecord(source?.metadata);\n const trace = asRecord(envelope.trace);\n const rootSpanId = stringValue(trace?.root_span_id);\n const rootSpan = asArray(trace?.spans)\n .map(asRecord)\n .find((span) => stringValue(span?.span_id) === rootSpanId);\n const rootAttributes = asRecord(rootSpan?.attributes);\n\n return (\n sanitizeExternalTrace(envelope.external_trace) ??\n sanitizeExternalTrace(sourceMetadata?.external_trace) ??\n externalTraceFromFlatMetadata(sourceMetadata) ??\n externalTraceFromFlatMetadata(rootAttributes)\n );\n}\n\nexport function traceEnvelopeToTraceSessionResponse(\n input: unknown,\n options: TraceSessionProjectionOptions = {},\n): TraceSessionResponse {\n const envelope = asRecord(input) ?? {};\n const evaluation = asRecord(envelope.eval);\n const trace = asRecord(envelope.trace);\n const traceResource = asRecord(trace?.resource);\n const spans = asArray(trace?.spans)\n .map(projectSpan)\n .filter((span): span is TraceSessionSpan => span !== undefined);\n const events = spans.flatMap((span) => span.events ?? []);\n\n return dropUndefined({\n schema_version: TRACE_SESSION_SCHEMA_VERSION,\n artifact_id: stringValue(envelope.artifact_id),\n created_at: stringValue(envelope.created_at),\n run_id: options.runId ?? stringValue(evaluation?.run_id),\n test_id: stringValue(evaluation?.test_id),\n suite: stringValue(evaluation?.suite),\n target: stringValue(evaluation?.target),\n trace_id: stringValue(trace?.trace_id),\n root_span_id: stringValue(trace?.root_span_id),\n source: sourceFromEnvelope(asRecord(envelope.source), options.artifactPath),\n external_trace: externalTraceFromEnvelope(envelope),\n artifact_links: projectArtifactLinks(envelope.artifacts),\n resource_attributes: sanitizeAttributeMap(asRecord(traceResource?.attributes)),\n conversion_warnings: projectConversionWarnings(envelope.conversion_warnings),\n spans,\n events,\n scores: projectScores(envelope.scores),\n });\n}\n\nexport function buildTraceSpanTree(spans: readonly TraceSessionSpan[]): TraceSpanNode[] {\n const nodes: TraceSpanNode[] = [];\n const firstNodeBySpanId = new Map<string, TraceSpanNode>();\n const spanIdCounts = new Map<string, number>();\n\n spans.forEach((span, index) => {\n const rawSpanId = stringValue(span.span_id);\n const spanId = rawSpanId ?? `missing-span-${index}`;\n const occurrence = (spanIdCounts.get(spanId) ?? 0) + 1;\n spanIdCounts.set(spanId, occurrence);\n\n const node: TraceSpanNode = {\n id: occurrence === 1 ? spanId : `${spanId}#${occurrence}`,\n spanId,\n parentSpanId: span.parent_span_id,\n span,\n children: [],\n diagnostics: rawSpanId\n ? undefined\n : [\n {\n code: 'missing_span_id',\n message: 'Span was missing span_id and was assigned a stable node id.',\n node_id: spanId,\n },\n ],\n };\n\n if (occurrence > 1) {\n addNodeDiagnostic(node, {\n code: 'duplicate_span_id',\n message: 'Duplicate span_id was preserved with a collision-free node id.',\n span_id: spanId,\n node_id: node.id,\n });\n }\n if (!firstNodeBySpanId.has(spanId)) {\n firstNodeBySpanId.set(spanId, node);\n }\n nodes.push(node);\n });\n\n const parentByNodeId = new Map<string, TraceSpanNode>();\n for (const node of nodes) {\n const parentSpanId =\n typeof node.parentSpanId === 'string' && node.parentSpanId.length > 0\n ? node.parentSpanId\n : undefined;\n if (!parentSpanId) {\n continue;\n }\n if (parentSpanId === node.spanId) {\n addNodeDiagnostic(node, {\n code: 'self_parent',\n message: 'Span parent_span_id points to itself; span was promoted to a root.',\n span_id: node.spanId,\n node_id: node.id,\n parent_span_id: parentSpanId,\n });\n continue;\n }\n const parent = firstNodeBySpanId.get(parentSpanId);\n if (!parent) {\n addNodeDiagnostic(node, {\n code: 'missing_parent',\n message: 'Span parent_span_id was not present in this trace; span was promoted to a root.',\n span_id: node.spanId,\n node_id: node.id,\n parent_span_id: parentSpanId,\n });\n continue;\n }\n parentByNodeId.set(node.id, parent);\n }\n\n const cyclicNodes: TraceSpanNode[] = [];\n for (const node of nodes) {\n if (hasAncestorCycle(node, parentByNodeId)) {\n cyclicNodes.push(node);\n }\n }\n for (const node of cyclicNodes) {\n parentByNodeId.delete(node.id);\n addNodeDiagnostic(node, {\n code: 'cycle',\n message: 'Span parent chain contains a cycle; span was promoted to a root.',\n span_id: node.spanId,\n node_id: node.id,\n parent_span_id: typeof node.parentSpanId === 'string' ? node.parentSpanId : undefined,\n });\n }\n\n const roots: TraceSpanNode[] = [];\n for (const node of nodes) {\n const parent = parentByNodeId.get(node.id);\n if (parent) {\n parent.children.push(node);\n } else {\n roots.push(node);\n }\n }\n\n sortTraceSpanNodes(roots);\n return roots;\n}\n\nfunction addNodeDiagnostic(node: TraceSpanNode, diagnostic: TraceSpanTreeDiagnostic): void {\n node.diagnostics = [...(node.diagnostics ?? []), diagnostic];\n}\n\nfunction hasAncestorCycle(\n node: TraceSpanNode,\n parentByNodeId: ReadonlyMap<string, TraceSpanNode>,\n): boolean {\n const seen = new Set<string>();\n let cursor = parentByNodeId.get(node.id);\n while (cursor) {\n if (cursor.id === node.id || seen.has(cursor.id)) {\n return true;\n }\n seen.add(cursor.id);\n cursor = parentByNodeId.get(cursor.id);\n }\n return false;\n}\n\nfunction compareUnixNanoValue(first: string | undefined, second: string | undefined): number {\n if (first === second) {\n return 0;\n }\n if (!first) {\n return 1;\n }\n if (!second) {\n return -1;\n }\n try {\n const firstValue = BigInt(first);\n const secondValue = BigInt(second);\n return firstValue < secondValue ? -1 : firstValue > secondValue ? 1 : 0;\n } catch {\n return first.localeCompare(second);\n }\n}\n\nfunction compareTraceSpanNodes(first: TraceSpanNode, second: TraceSpanNode): number {\n const byStart = compareUnixNanoValue(\n first.span.start_time_unix_nano,\n second.span.start_time_unix_nano,\n );\n if (byStart !== 0) {\n return byStart;\n }\n if (first.spanId === second.parentSpanId) {\n return -1;\n }\n if (second.spanId === first.parentSpanId) {\n return 1;\n }\n const bySpanId = first.spanId.localeCompare(second.spanId);\n return bySpanId !== 0 ? bySpanId : first.id.localeCompare(second.id);\n}\n\nfunction sortTraceSpanNodes(nodes: TraceSpanNode[]): void {\n nodes.sort(compareTraceSpanNodes);\n for (const node of nodes) {\n node.children.sort(compareTraceSpanNodes);\n if (node.children.length > 0) {\n sortTraceSpanNodes(node.children);\n }\n node.diagnostics = nonEmptyArray(node.diagnostics) as TraceSpanTreeDiagnostic[] | undefined;\n }\n}\n","/**\n * Dashboard trace normalization.\n *\n * This module accepts raw trace artifacts that are already owned by AgentV\n * (`agentv.trace.v1`) or standards-shaped OTLP/OpenInference JSON, then projects\n * them into the shared Dashboard trace/session read model. It deliberately\n * avoids Phoenix-specific concepts; backend-specific mapping belongs in\n * adapters before or after this generic normalization boundary.\n */\n\nimport {\n type TraceSessionConversionWarning,\n type TraceSessionProjectionOptions,\n type TraceSessionResponse,\n traceEnvelopeToTraceSessionResponse,\n} from './dashboard-trace-read-model.js';\nimport { EXECUTION_TRACE_SCHEMA_VERSION } from './trace-envelope.js';\n\nconst TRACE_ENVELOPE_FORMAT = 'otlp_openinference_spans' as const;\n\nexport interface TraceArtifactNormalizationOptions extends TraceSessionProjectionOptions {\n runId?: string;\n testId?: string;\n suite?: string;\n target?: string;\n now?: () => Date;\n}\n\nexport type TraceArtifactNormalizationResult =\n | {\n status: 'ok';\n format: 'agentv_trace_v1' | 'otlp_json';\n traceSession: TraceSessionResponse;\n warnings?: readonly TraceSessionConversionWarning[];\n }\n | {\n status: 'unsupported';\n message: string;\n warnings?: readonly TraceSessionConversionWarning[];\n };\n\ntype WarningSink = TraceSessionConversionWarning[];\n\ninterface WarningContext {\n readonly rawKind?: string;\n readonly path?: string;\n readonly spanId?: string;\n readonly details?: Record<string, unknown>;\n}\n\ninterface NormalizedOtlpSpan {\n readonly trace_id?: string;\n readonly span_id: string;\n readonly parent_span_id?: string | null;\n readonly name: string;\n readonly kind?: string;\n readonly start_time_unix_nano?: string;\n readonly end_time_unix_nano?: string;\n readonly status?: {\n readonly code?: string;\n readonly message?: string;\n };\n readonly resource_attributes?: Record<string, unknown>;\n readonly attributes?: Record<string, unknown>;\n readonly events?: readonly {\n readonly name: string;\n readonly time_unix_nano?: string;\n readonly attributes?: Record<string, unknown>;\n }[];\n}\n\ninterface ParsedOtlpValue {\n readonly ok: boolean;\n readonly value?: unknown;\n}\n\nconst OTLP_ROOT_FIELDS = new Set(['resourceSpans']);\nconst OTLP_RESOURCE_SPAN_FIELDS = new Set(['resource', 'scopeSpans', 'schemaUrl']);\nconst OTLP_RESOURCE_FIELDS = new Set(['attributes', 'droppedAttributesCount']);\nconst OTLP_SCOPE_SPAN_FIELDS = new Set(['scope', 'spans', 'schemaUrl']);\nconst OTLP_SCOPE_FIELDS = new Set(['name', 'version', 'attributes', 'droppedAttributesCount']);\nconst OTLP_SPAN_FIELDS = new Set([\n 'traceId',\n 'spanId',\n 'parentSpanId',\n 'traceState',\n 'name',\n 'kind',\n 'startTimeUnixNano',\n 'endTimeUnixNano',\n 'attributes',\n 'droppedAttributesCount',\n 'events',\n 'droppedEventsCount',\n 'links',\n 'droppedLinksCount',\n 'status',\n]);\nconst OTLP_EVENT_FIELDS = new Set(['timeUnixNano', 'name', 'attributes', 'droppedAttributesCount']);\nconst OTLP_STATUS_FIELDS = new Set(['code', 'message']);\nconst OTLP_ATTRIBUTE_FIELDS = new Set(['key', 'value']);\nconst OTLP_ANY_VALUE_FIELDS = new Set([\n 'stringValue',\n 'boolValue',\n 'intValue',\n 'doubleValue',\n 'arrayValue',\n 'kvlistValue',\n 'bytesValue',\n]);\n\nexport function normalizeTraceArtifactToTraceSessionResponse(\n input: unknown,\n options: TraceArtifactNormalizationOptions = {},\n): TraceArtifactNormalizationResult {\n const artifact = asRecord(input);\n if (!artifact) {\n return {\n status: 'unsupported',\n message: 'Trace artifact is not a JSON object.',\n };\n }\n\n if (stringValue(artifact.schema_version) === EXECUTION_TRACE_SCHEMA_VERSION) {\n return normalizeAgentVTraceEnvelope(artifact, options);\n }\n\n if (Object.hasOwn(artifact, 'resourceSpans')) {\n return normalizeOtlpJson(artifact, options);\n }\n\n return {\n status: 'unsupported',\n message: 'Trace artifact is not an agentv.trace.v1 envelope or OTLP JSON resourceSpans body.',\n };\n}\n\nfunction normalizeAgentVTraceEnvelope(\n artifact: Record<string, unknown>,\n options: TraceArtifactNormalizationOptions,\n): TraceArtifactNormalizationResult {\n const trace = asRecord(artifact.trace);\n if (!Array.isArray(trace?.spans)) {\n return {\n status: 'unsupported',\n message: 'Trace artifact is not an agentv.trace.v1 envelope with trace.spans.',\n };\n }\n\n const traceSession = traceEnvelopeToTraceSessionResponse(artifact, options);\n return {\n status: 'ok',\n format: 'agentv_trace_v1',\n traceSession,\n warnings: traceSession.conversion_warnings,\n };\n}\n\nfunction normalizeOtlpJson(\n artifact: Record<string, unknown>,\n options: TraceArtifactNormalizationOptions,\n): TraceArtifactNormalizationResult {\n const warnings: WarningSink = [];\n warnUnknownFields(artifact, OTLP_ROOT_FIELDS, warnings, {\n rawKind: 'otlp_json',\n path: options.artifactPath,\n });\n\n const resourceSpans = Array.isArray(artifact.resourceSpans) ? artifact.resourceSpans : [];\n if (!Array.isArray(artifact.resourceSpans)) {\n addWarning(warnings, 'malformed_otlp_resource_spans', 'OTLP resourceSpans must be an array.', {\n rawKind: 'otlp_json',\n path: options.artifactPath,\n });\n }\n\n const spans: NormalizedOtlpSpan[] = [];\n const resourceAttributeSets: Record<string, unknown>[] = [];\n let scopeSpanCount = 0;\n let firstScope: { name?: string; version?: string } | undefined;\n\n resourceSpans.forEach((resourceSpan, resourceSpanIndex) => {\n const resourceRecord = asRecord(resourceSpan);\n if (!resourceRecord) {\n addWarning(\n warnings,\n 'malformed_otlp_resource_span',\n 'OTLP resourceSpans entry must be an object and was skipped.',\n {\n rawKind: 'otlp_resource_span',\n path: options.artifactPath,\n details: { resource_span_index: resourceSpanIndex },\n },\n );\n return;\n }\n\n warnUnknownFields(resourceRecord, OTLP_RESOURCE_SPAN_FIELDS, warnings, {\n rawKind: 'otlp_resource_span',\n path: options.artifactPath,\n details: { resource_span_index: resourceSpanIndex },\n });\n\n const resource = asRecord(resourceRecord.resource);\n if (resource) {\n warnUnknownFields(resource, OTLP_RESOURCE_FIELDS, warnings, {\n rawKind: 'otlp_resource',\n path: options.artifactPath,\n details: { resource_span_index: resourceSpanIndex },\n });\n }\n const resourceAttributes = parseOtlpAttributes(resource?.attributes, warnings, {\n rawKind: 'otlp_resource_attributes',\n path: options.artifactPath,\n details: { resource_span_index: resourceSpanIndex },\n });\n if (resourceAttributes && Object.keys(resourceAttributes).length > 0) {\n resourceAttributeSets.push(resourceAttributes);\n }\n\n const scopeSpans = Array.isArray(resourceRecord.scopeSpans) ? resourceRecord.scopeSpans : [];\n if (!Array.isArray(resourceRecord.scopeSpans)) {\n addWarning(\n warnings,\n 'malformed_otlp_scope_spans',\n 'OTLP resourceSpans.scopeSpans must be an array and was skipped.',\n {\n rawKind: 'otlp_resource_span',\n path: options.artifactPath,\n details: { resource_span_index: resourceSpanIndex },\n },\n );\n }\n\n scopeSpans.forEach((scopeSpan, scopeSpanIndex) => {\n const scopeSpanRecord = asRecord(scopeSpan);\n if (!scopeSpanRecord) {\n addWarning(\n warnings,\n 'malformed_otlp_scope_span',\n 'OTLP scopeSpans entry must be an object and was skipped.',\n {\n rawKind: 'otlp_scope_span',\n path: options.artifactPath,\n details: { resource_span_index: resourceSpanIndex, scope_span_index: scopeSpanIndex },\n },\n );\n return;\n }\n\n scopeSpanCount += 1;\n warnUnknownFields(scopeSpanRecord, OTLP_SCOPE_SPAN_FIELDS, warnings, {\n rawKind: 'otlp_scope_span',\n path: options.artifactPath,\n details: { resource_span_index: resourceSpanIndex, scope_span_index: scopeSpanIndex },\n });\n\n const scope = normalizeOtlpScope(scopeSpanRecord.scope, warnings, {\n rawKind: 'otlp_scope',\n path: options.artifactPath,\n details: { resource_span_index: resourceSpanIndex, scope_span_index: scopeSpanIndex },\n });\n firstScope ??= scope;\n\n const otlpSpans = Array.isArray(scopeSpanRecord.spans) ? scopeSpanRecord.spans : [];\n if (!Array.isArray(scopeSpanRecord.spans)) {\n addWarning(\n warnings,\n 'malformed_otlp_spans',\n 'OTLP scopeSpans.spans must be an array and was skipped.',\n {\n rawKind: 'otlp_scope_span',\n path: options.artifactPath,\n details: { resource_span_index: resourceSpanIndex, scope_span_index: scopeSpanIndex },\n },\n );\n }\n\n otlpSpans.forEach((span, spanIndex) => {\n const normalized = normalizeOtlpSpan(span, warnings, {\n resourceAttributes,\n path: options.artifactPath,\n resourceSpanIndex,\n scopeSpanIndex,\n spanIndex,\n });\n if (normalized) {\n spans.push(normalized);\n }\n });\n });\n });\n\n if (spans.length === 0) {\n addWarning(warnings, 'empty_otlp_trace', 'OTLP JSON did not contain any readable spans.', {\n rawKind: 'otlp_json',\n path: options.artifactPath,\n });\n }\n\n const traceId = firstString(spans.map((span) => span.trace_id));\n const rootSpanId = firstRootSpanId(spans);\n const resourceAttributes = singleDistinctRecord(resourceAttributeSets);\n const createdAt = (options.now?.() ?? new Date()).toISOString();\n const artifactPath = options.artifactPath;\n const envelope = dropUndefined({\n schema_version: EXECUTION_TRACE_SCHEMA_VERSION,\n artifact_id: `otlp-trace-${traceId ?? rootSpanId ?? 'unknown'}`,\n created_at: createdAt,\n eval: dropUndefined({\n run_id: options.runId,\n test_id: options.testId ?? traceId ?? 'otlp-trace',\n suite: options.suite,\n target: options.target ?? 'unknown',\n }),\n trace: dropUndefined({\n format: TRACE_ENVELOPE_FORMAT,\n trace_id: traceId,\n root_span_id: rootSpanId,\n resource: resourceAttributes ? { attributes: resourceAttributes } : undefined,\n scope: firstScope,\n spans,\n }),\n source: dropUndefined({\n kind: 'otlp',\n path: artifactPath,\n format: 'otlp_json',\n version: '1',\n metadata: dropUndefined({\n resource_spans_count: resourceSpans.length,\n scope_spans_count: scopeSpanCount,\n }),\n }),\n capture: {\n content: 'metadata',\n redaction_level: 'partial',\n },\n conversion_warnings: warnings.length > 0 ? warnings : undefined,\n artifacts: artifactPath ? { raw_trace_path: artifactPath } : undefined,\n });\n\n const traceSession = traceEnvelopeToTraceSessionResponse(envelope, options);\n return {\n status: 'ok',\n format: 'otlp_json',\n traceSession,\n warnings: traceSession.conversion_warnings,\n };\n}\n\nfunction normalizeOtlpScope(\n value: unknown,\n warnings: WarningSink,\n context: WarningContext,\n): { name?: string; version?: string } | undefined {\n if (value === undefined) {\n return undefined;\n }\n const scope = asRecord(value);\n if (!scope) {\n addWarning(warnings, 'malformed_otlp_scope', 'OTLP scope must be an object and was ignored.', {\n ...context,\n rawKind: context.rawKind ?? 'otlp_scope',\n });\n return undefined;\n }\n warnUnknownFields(scope, OTLP_SCOPE_FIELDS, warnings, context);\n const normalized = dropUndefined({\n name: stringValue(scope.name),\n version: stringValue(scope.version),\n });\n return Object.keys(normalized).length > 0 ? normalized : undefined;\n}\n\nfunction normalizeOtlpSpan(\n value: unknown,\n warnings: WarningSink,\n context: {\n readonly resourceAttributes?: Record<string, unknown>;\n readonly path?: string;\n readonly resourceSpanIndex: number;\n readonly scopeSpanIndex: number;\n readonly spanIndex: number;\n },\n): NormalizedOtlpSpan | undefined {\n const span = asRecord(value);\n const details = {\n resource_span_index: context.resourceSpanIndex,\n scope_span_index: context.scopeSpanIndex,\n span_index: context.spanIndex,\n };\n if (!span) {\n addWarning(warnings, 'malformed_otlp_span', 'OTLP span must be an object and was skipped.', {\n rawKind: 'otlp_span',\n path: context.path,\n details,\n });\n return undefined;\n }\n\n warnUnknownFields(span, OTLP_SPAN_FIELDS, warnings, {\n rawKind: 'otlp_span',\n path: context.path,\n details,\n });\n\n const spanId =\n stringValue(span.spanId) ??\n `missing-span-${context.resourceSpanIndex}-${context.scopeSpanIndex}-${context.spanIndex}`;\n if (!stringValue(span.spanId)) {\n addWarning(\n warnings,\n 'missing_span_id',\n 'OTLP span was missing spanId; a stable ID was assigned.',\n {\n rawKind: 'otlp_span',\n path: context.path,\n spanId,\n details,\n },\n );\n }\n\n const traceId = stringValue(span.traceId);\n if (!traceId) {\n addWarning(warnings, 'missing_trace_id', 'OTLP span was missing traceId.', {\n rawKind: 'otlp_span',\n path: context.path,\n spanId,\n details,\n });\n }\n\n const name = stringValue(span.name) ?? spanId;\n if (!stringValue(span.name)) {\n addWarning(warnings, 'missing_span_name', 'OTLP span was missing name; spanId was used.', {\n rawKind: 'otlp_span',\n path: context.path,\n spanId,\n details,\n });\n }\n\n const parentSpanId =\n span.parentSpanId === undefined || span.parentSpanId === null || span.parentSpanId === ''\n ? null\n : stringValue(span.parentSpanId);\n if (\n span.parentSpanId !== undefined &&\n span.parentSpanId !== null &&\n span.parentSpanId !== '' &&\n !parentSpanId\n ) {\n addWarning(\n warnings,\n 'malformed_parent_span_id',\n 'OTLP span parentSpanId was not a string and was ignored.',\n {\n rawKind: 'otlp_span',\n path: context.path,\n spanId,\n details,\n },\n );\n }\n\n const attributes = parseOtlpAttributes(span.attributes, warnings, {\n rawKind: 'otlp_span_attributes',\n path: context.path,\n spanId,\n details,\n });\n const events = normalizeOtlpEvents(span.events, warnings, {\n path: context.path,\n spanId,\n details,\n });\n\n return dropUndefined({\n trace_id: traceId,\n span_id: spanId,\n parent_span_id: parentSpanId,\n name,\n kind: normalizeOtlpSpanKind(span.kind, warnings, {\n rawKind: 'otlp_span',\n path: context.path,\n spanId,\n details,\n }),\n start_time_unix_nano: normalizeUnixNano(span.startTimeUnixNano, 'startTimeUnixNano', warnings, {\n rawKind: 'otlp_span',\n path: context.path,\n spanId,\n details,\n }),\n end_time_unix_nano: normalizeUnixNano(span.endTimeUnixNano, 'endTimeUnixNano', warnings, {\n rawKind: 'otlp_span',\n path: context.path,\n spanId,\n details,\n }),\n status: normalizeOtlpStatus(span.status, warnings, {\n rawKind: 'otlp_span_status',\n path: context.path,\n spanId,\n details,\n }),\n resource_attributes: context.resourceAttributes,\n attributes,\n events,\n });\n}\n\nfunction normalizeOtlpEvents(\n value: unknown,\n warnings: WarningSink,\n context: {\n readonly path?: string;\n readonly spanId: string;\n readonly details: Record<string, unknown>;\n },\n):\n | readonly {\n readonly name: string;\n readonly time_unix_nano?: string;\n readonly attributes?: Record<string, unknown>;\n }[]\n | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!Array.isArray(value)) {\n addWarning(warnings, 'malformed_otlp_events', 'OTLP span events must be an array.', {\n rawKind: 'otlp_span_events',\n path: context.path,\n spanId: context.spanId,\n details: context.details,\n });\n return undefined;\n }\n\n const events = value.flatMap((event, eventIndex) => {\n const eventRecord = asRecord(event);\n const details = { ...context.details, event_index: eventIndex };\n if (!eventRecord) {\n addWarning(\n warnings,\n 'malformed_otlp_event',\n 'OTLP span event must be an object and was skipped.',\n {\n rawKind: 'otlp_span_event',\n path: context.path,\n spanId: context.spanId,\n details,\n },\n );\n return [];\n }\n\n warnUnknownFields(eventRecord, OTLP_EVENT_FIELDS, warnings, {\n rawKind: 'otlp_span_event',\n path: context.path,\n spanId: context.spanId,\n details,\n });\n\n const name = stringValue(eventRecord.name) ?? `event-${eventIndex}`;\n if (!stringValue(eventRecord.name)) {\n addWarning(\n warnings,\n 'missing_event_name',\n 'OTLP span event was missing name; a stable name was assigned.',\n {\n rawKind: 'otlp_span_event',\n path: context.path,\n spanId: context.spanId,\n details,\n },\n );\n }\n\n return [\n dropUndefined({\n name,\n time_unix_nano: normalizeUnixNano(eventRecord.timeUnixNano, 'timeUnixNano', warnings, {\n rawKind: 'otlp_span_event',\n path: context.path,\n spanId: context.spanId,\n details,\n }),\n attributes: parseOtlpAttributes(eventRecord.attributes, warnings, {\n rawKind: 'otlp_event_attributes',\n path: context.path,\n spanId: context.spanId,\n details,\n }),\n }),\n ];\n });\n\n return events.length > 0 ? events : undefined;\n}\n\nfunction parseOtlpAttributes(\n value: unknown,\n warnings: WarningSink,\n context: WarningContext,\n): Record<string, unknown> | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (asRecord(value)) {\n addWarning(\n warnings,\n 'nonstandard_otlp_attribute_map',\n 'OTLP attributes were an object map; values were preserved as-is.',\n context,\n );\n return value as Record<string, unknown>;\n }\n if (!Array.isArray(value)) {\n addWarning(warnings, 'malformed_otlp_attributes', 'OTLP attributes must be an array.', context);\n return undefined;\n }\n\n const attributes: Record<string, unknown> = {};\n value.forEach((attribute, attributeIndex) => {\n const attributeRecord = asRecord(attribute);\n const details = { ...(context.details ?? {}), attribute_index: attributeIndex };\n if (!attributeRecord) {\n addWarning(\n warnings,\n 'malformed_otlp_attribute',\n 'OTLP attribute must be an object and was skipped.',\n { ...context, details },\n );\n return;\n }\n\n warnUnknownFields(attributeRecord, OTLP_ATTRIBUTE_FIELDS, warnings, {\n ...context,\n rawKind: context.rawKind ?? 'otlp_attribute',\n details,\n });\n\n const key = stringValue(attributeRecord.key);\n if (!key) {\n addWarning(\n warnings,\n 'malformed_otlp_attribute',\n 'OTLP attribute was missing key and was skipped.',\n {\n ...context,\n details,\n },\n );\n return;\n }\n\n if (Object.hasOwn(attributes, key)) {\n addWarning(\n warnings,\n 'duplicate_otlp_attribute',\n `OTLP attribute \"${key}\" appeared more than once; the last value was used.`,\n {\n ...context,\n details: { ...details, key },\n },\n );\n }\n\n const parsed = parseOtlpAnyValue(attributeRecord.value, warnings, {\n ...context,\n rawKind: 'otlp_attribute_value',\n details: { ...details, key },\n });\n if (parsed.ok) {\n attributes[key] = parsed.value;\n }\n });\n\n return Object.keys(attributes).length > 0 ? attributes : undefined;\n}\n\nfunction parseOtlpAnyValue(\n value: unknown,\n warnings: WarningSink,\n context: WarningContext,\n): ParsedOtlpValue {\n if (isPrimitive(value)) {\n addWarning(\n warnings,\n 'nonstandard_otlp_value',\n 'OTLP attribute value was primitive; value was preserved as-is.',\n context,\n );\n return { ok: true, value };\n }\n\n const record = asRecord(value);\n if (!record) {\n addWarning(\n warnings,\n 'malformed_otlp_value',\n 'OTLP attribute value must be an object.',\n context,\n );\n return { ok: false };\n }\n\n const presentFields = Object.keys(record).filter((key) => OTLP_ANY_VALUE_FIELDS.has(key));\n const unknownFields = Object.keys(record).filter((key) => !OTLP_ANY_VALUE_FIELDS.has(key));\n if (unknownFields.length > 0) {\n addWarning(\n warnings,\n 'unknown_otlp_value_field',\n `Unknown OTLP attribute value field(s) ignored: ${unknownFields.join(', ')}.`,\n { ...context, details: { ...(context.details ?? {}), fields: unknownFields } },\n );\n }\n if (presentFields.length > 1) {\n addWarning(\n warnings,\n 'ambiguous_otlp_value',\n `OTLP attribute value had multiple value fields; ${presentFields[0]} was used.`,\n { ...context, details: { ...(context.details ?? {}), fields: presentFields } },\n );\n }\n\n const field = presentFields[0];\n if (!field) {\n addWarning(\n warnings,\n 'malformed_otlp_value',\n 'OTLP attribute value did not contain a recognized value field; raw value was preserved.',\n context,\n );\n return { ok: true, value };\n }\n\n switch (field) {\n case 'stringValue':\n case 'bytesValue':\n return { ok: true, value: stringValue(record[field]) ?? String(record[field] ?? '') };\n case 'boolValue':\n return { ok: true, value: Boolean(record.boolValue) };\n case 'intValue':\n return { ok: true, value: integerOrString(record.intValue) };\n case 'doubleValue':\n return { ok: true, value: numberOrString(record.doubleValue) };\n case 'arrayValue':\n return parseOtlpArrayValue(record.arrayValue, warnings, context);\n case 'kvlistValue':\n return parseOtlpKeyValueList(record.kvlistValue, warnings, context);\n default:\n return { ok: true, value };\n }\n}\n\nfunction parseOtlpArrayValue(\n value: unknown,\n warnings: WarningSink,\n context: WarningContext,\n): ParsedOtlpValue {\n const arrayValue = asRecord(value);\n if (!arrayValue || !Array.isArray(arrayValue.values)) {\n addWarning(\n warnings,\n 'malformed_otlp_array_value',\n 'OTLP arrayValue.values must be an array.',\n context,\n );\n return { ok: false };\n }\n return {\n ok: true,\n value: arrayValue.values.map(\n (entry, index) =>\n parseOtlpAnyValue(entry, warnings, {\n ...context,\n details: { ...(context.details ?? {}), value_index: index },\n }).value,\n ),\n };\n}\n\nfunction parseOtlpKeyValueList(\n value: unknown,\n warnings: WarningSink,\n context: WarningContext,\n): ParsedOtlpValue {\n const kvlistValue = asRecord(value);\n if (!kvlistValue || !Array.isArray(kvlistValue.values)) {\n addWarning(\n warnings,\n 'malformed_otlp_kvlist_value',\n 'OTLP kvlistValue.values must be an array.',\n context,\n );\n return { ok: false };\n }\n return {\n ok: true,\n value: parseOtlpAttributes(kvlistValue.values, warnings, context) ?? {},\n };\n}\n\nfunction normalizeOtlpSpanKind(\n value: unknown,\n warnings: WarningSink,\n context: WarningContext,\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value === 'string' && value.length > 0) {\n return value.replace(/^SPAN_KIND_/, '');\n }\n if (typeof value !== 'number' || !Number.isInteger(value)) {\n addWarning(\n warnings,\n 'malformed_span_kind',\n 'OTLP span kind was not a string or integer.',\n context,\n );\n return undefined;\n }\n if (value === 0) return 'INTERNAL';\n if (value === 1) return 'SERVER';\n if (value === 2) return 'CLIENT';\n if (value === 3) return 'PRODUCER';\n if (value === 4 || value === 5) return 'CONSUMER';\n addWarning(\n warnings,\n 'unknown_span_kind',\n `Unknown OTLP span kind ${value} was preserved as a string.`,\n context,\n );\n return String(value);\n}\n\nfunction normalizeOtlpStatus(\n value: unknown,\n warnings: WarningSink,\n context: WarningContext,\n): { code?: string; message?: string } | undefined {\n if (value === undefined) {\n return undefined;\n }\n const status = asRecord(value);\n if (!status) {\n addWarning(warnings, 'malformed_otlp_status', 'OTLP span status must be an object.', context);\n return undefined;\n }\n warnUnknownFields(status, OTLP_STATUS_FIELDS, warnings, context);\n return dropUndefined({\n code: normalizeStatusCode(status.code, warnings, context),\n message: stringValue(status.message),\n });\n}\n\nfunction normalizeStatusCode(\n value: unknown,\n warnings: WarningSink,\n context: WarningContext,\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value === 'string' && value.length > 0) {\n return value.replace(/^STATUS_CODE_/, '');\n }\n if (typeof value === 'number' && Number.isInteger(value)) {\n if (value === 0) return 'UNSET';\n if (value === 1) return 'OK';\n if (value === 2) return 'ERROR';\n addWarning(\n warnings,\n 'unknown_status_code',\n `Unknown OTLP status code ${value} was preserved as a string.`,\n context,\n );\n return String(value);\n }\n addWarning(\n warnings,\n 'malformed_status_code',\n 'OTLP status code was not a string or integer.',\n context,\n );\n return undefined;\n}\n\nfunction normalizeUnixNano(\n value: unknown,\n field: string,\n warnings: WarningSink,\n context: WarningContext,\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value === 'string' && value.length > 0) {\n if (!/^\\d+$/.test(value)) {\n addWarning(\n warnings,\n 'malformed_unix_nano',\n `OTLP ${field} was not an unsigned integer string.`,\n context,\n );\n }\n return value;\n }\n if (typeof value === 'number' && Number.isFinite(value) && value >= 0) {\n return String(Math.trunc(value));\n }\n addWarning(warnings, 'malformed_unix_nano', `OTLP ${field} was not a string or number.`, context);\n return undefined;\n}\n\nfunction firstRootSpanId(spans: readonly NormalizedOtlpSpan[]): string | undefined {\n const spanIds = new Set(spans.map((span) => span.span_id));\n return (\n spans.find(\n (span) =>\n !span.parent_span_id ||\n (typeof span.parent_span_id === 'string' && !spanIds.has(span.parent_span_id)),\n )?.span_id ?? spans[0]?.span_id\n );\n}\n\nfunction singleDistinctRecord(\n records: readonly Record<string, unknown>[],\n): Record<string, unknown> | undefined {\n if (records.length === 0) {\n return undefined;\n }\n const unique = new Map(records.map((record) => [stableRecordKey(record), record]));\n return unique.size === 1 ? [...unique.values()][0] : undefined;\n}\n\nfunction stableRecordKey(record: Record<string, unknown>): string {\n return JSON.stringify(\n Object.keys(record)\n .sort()\n .map((key) => [key, record[key]]),\n );\n}\n\nfunction firstString(values: readonly (string | undefined)[]): string | undefined {\n return values.find((value): value is string => typeof value === 'string' && value.length > 0);\n}\n\nfunction integerOrString(value: unknown): number | string {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string') {\n const numberValue = Number(value);\n return Number.isSafeInteger(numberValue) ? numberValue : value;\n }\n return String(value ?? '');\n}\n\nfunction numberOrString(value: unknown): number | string {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string') {\n const numberValue = Number(value);\n return Number.isFinite(numberValue) ? numberValue : value;\n }\n return String(value ?? '');\n}\n\nfunction warnUnknownFields(\n record: Record<string, unknown>,\n allowed: ReadonlySet<string>,\n warnings: WarningSink,\n context: WarningContext,\n): void {\n const unknownFields = Object.keys(record).filter((key) => !allowed.has(key));\n for (const field of unknownFields) {\n addWarning(\n warnings,\n 'unknown_otlp_field',\n `Unknown OTLP ${context.rawKind ?? 'object'} field \"${field}\" was ignored.`,\n { ...context, details: { ...(context.details ?? {}), field } },\n );\n }\n}\n\nfunction addWarning(\n warnings: WarningSink,\n code: string,\n message: string,\n context: WarningContext = {},\n): void {\n warnings.push(\n dropUndefined({\n code,\n severity: 'warning',\n span_id: context.spanId,\n source_ref:\n context.path || context.rawKind\n ? dropUndefined({\n path: context.path,\n raw_kind: context.rawKind,\n span_id: context.spanId,\n })\n : undefined,\n message,\n details: context.details,\n }) as TraceSessionConversionWarning,\n );\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction isPrimitive(value: unknown): boolean {\n return (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null\n );\n}\n\nfunction dropUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined)) as T;\n}\n","/**\n * EVAL.yaml → evals.json transpiler.\n *\n * Converts an AgentV EVAL.yaml file into Agent Skills evals.json format\n * for consumption by the skill-creator pipeline.\n *\n * Handles both `assertions:` (current) and `assert:` (deprecated alias).\n */\n\nimport { readFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { parseYamlValue } from '../yaml-loader.js';\n\n// ---------------------------------------------------------------------------\n// evals.json output types\n// ---------------------------------------------------------------------------\n\nexport interface EvalsJsonCase {\n id: number;\n prompt: string;\n expected_output?: string;\n files?: string[];\n should_trigger?: boolean;\n assertions: string[];\n}\n\nexport interface EvalsJsonFile {\n skill_name: string;\n evals: EvalsJsonCase[];\n}\n\n// ---------------------------------------------------------------------------\n// Raw YAML input types (unvalidated)\n// ---------------------------------------------------------------------------\n\ntype RawContent =\n | string\n | Array<{ type?: string; value?: string; [key: string]: unknown }>\n | unknown;\n\ninterface RawMessage {\n role?: string;\n content?: RawContent;\n [key: string]: unknown;\n}\n\ninterface RawAssertEntry {\n type?: string;\n skill?: string;\n should_trigger?: boolean;\n criteria?: string;\n value?: string;\n name?: string;\n description?: string;\n command?: unknown;\n prompt?: string;\n rubrics?: unknown[];\n expected?: unknown[];\n fields?: unknown[];\n threshold?: number;\n budget?: number;\n [key: string]: unknown;\n}\n\ninterface RawTestCase {\n id?: string | number;\n criteria?: string;\n input?: string | RawMessage[] | { [key: string]: unknown };\n input_files?: string[];\n expected_output?: string | RawMessage[] | unknown;\n assertions?: RawAssertEntry[];\n /** @deprecated Use `assertions` instead */\n assert?: RawAssertEntry[];\n [key: string]: unknown;\n}\n\ninterface RawSuite {\n tests?: RawTestCase[];\n assertions?: RawAssertEntry[];\n /** @deprecated Use `assertions` instead */\n assert?: RawAssertEntry[];\n [key: string]: unknown;\n}\n\n// ---------------------------------------------------------------------------\n// Assertion → natural language conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Build an NL instruction string for a code grader that tells the grading agent\n * how to execute it via `agentv eval assert`.\n *\n * The `<agent_output>` and `<original_prompt>` placeholders are substituted\n * by the grading agent at evaluation time.\n */\nfunction codeGraderInstruction(graderName: string, description?: string): string {\n const desc = description ? ` This grader: ${description}.` : '';\n return `Run \\`agentv eval assert ${graderName} --agent-output <agent_output> --agent-input <original_prompt>\\` and check the result.${desc} The command accepts --agent-output (the agent's full response text) and --agent-input (the original user prompt). It returns JSON on stdout: {\"score\": 0-1, \"reasoning\": \"...\"}. A score >= 0.5 means pass (exit 0); below 0.5 means fail (exit 1).`;\n}\n\n/**\n * Derive a grader name from a command array by finding the first argument\n * with a recognised script extension (e.g. `['bun', 'run', '.agentv/graders/format-checker.ts']` → `'format-checker'`).\n */\nfunction deriveGraderNameFromCommand(command: unknown): string | undefined {\n if (!Array.isArray(command) || command.length === 0) return undefined;\n for (const arg of command) {\n if (typeof arg !== 'string') continue;\n const match = arg.match(/([^/]+)\\.(ts|js|mts|mjs)$/);\n if (match) return match[1] || undefined;\n }\n return undefined;\n}\n\nfunction assertionToNaturalLanguage(entry: RawAssertEntry): string | null {\n const type = entry.type;\n\n switch (type) {\n case 'skill-trigger':\n // Handled separately — not an NL assertion\n return null;\n\n case 'rubrics': {\n // criteria may be a string (NL) or array of rubric items\n if (typeof entry.criteria === 'string') {\n return entry.criteria;\n }\n return null;\n }\n\n case 'contains':\n return `Output contains '${entry.value}'`;\n\n case 'contains-any':\n case 'contains_any': {\n const values = Array.isArray(entry.value)\n ? (entry.value as string[]).join(\"', '\")\n : entry.value;\n return `Output contains any of: '${values}'`;\n }\n\n case 'contains-all':\n case 'contains_all': {\n const values = Array.isArray(entry.value)\n ? (entry.value as string[]).join(\"', '\")\n : entry.value;\n return `Output contains all of: '${values}'`;\n }\n\n case 'icontains':\n return `Output contains (case-insensitive) '${entry.value}'`;\n\n case 'regex':\n return `Output matches regex: ${entry.value}`;\n\n case 'equals':\n return `Output exactly equals: ${entry.value}`;\n\n case 'is-json':\n case 'is_json':\n return 'Output is valid JSON';\n\n case 'starts-with':\n case 'starts_with':\n return `Output starts with '${entry.value}'`;\n\n case 'ends-with':\n case 'ends_with':\n return `Output ends with '${entry.value}'`;\n\n case 'llm-grader':\n case 'llm_grader': {\n // Expand each rubric item to its own assertion string\n // Return the first one — callers handle arrays via assertionToNaturalLanguageList\n if (Array.isArray(entry.rubrics) && entry.rubrics.length > 0) {\n return null; // handled by list expansion below\n }\n return typeof entry.prompt === 'string' ? entry.prompt : null;\n }\n\n case 'tool-trajectory':\n case 'tool_trajectory': {\n const expectedArr = Array.isArray(entry.expected) ? entry.expected : [];\n const tools = (expectedArr as Array<{ tool?: string }>)\n .map((e) => e.tool)\n .filter(Boolean)\n .join(', ');\n return tools\n ? `Agent called tools in order: ${tools}`\n : 'Agent followed expected tool trajectory';\n }\n\n case 'code-grader':\n case 'code_grader': {\n const graderName = entry.name ?? deriveGraderNameFromCommand(entry.command) ?? 'code-grader';\n const desc = typeof entry.description === 'string' ? entry.description : undefined;\n return codeGraderInstruction(graderName, desc);\n }\n\n case 'field-accuracy':\n case 'field_accuracy': {\n const fieldPaths = Array.isArray(entry.fields)\n ? (entry.fields as Array<{ path?: string }>)\n .map((f) => f.path)\n .filter(Boolean)\n .join(', ')\n : '';\n return fieldPaths\n ? `Fields ${fieldPaths} match expected values`\n : 'Fields match expected values';\n }\n\n case 'latency':\n return typeof entry.threshold === 'number'\n ? `Response time under ${entry.threshold}ms`\n : 'Response time within threshold';\n\n case 'cost':\n return typeof entry.budget === 'number'\n ? `Cost under $${entry.budget}`\n : 'Cost within budget';\n\n case 'token-usage':\n case 'token_usage':\n return 'Token usage within limits';\n\n case 'execution-metrics':\n case 'execution_metrics':\n return 'Execution within metric bounds';\n\n default: {\n // Unknown type with a command → treat as code grader\n if (entry.command !== undefined && type) {\n return codeGraderInstruction(deriveGraderNameFromCommand(entry.command) ?? type);\n }\n // Fallback: try to produce something readable\n if (typeof entry.criteria === 'string') return entry.criteria;\n if (typeof entry.prompt === 'string') return entry.prompt;\n return type ? `${type} assertion` : null;\n }\n }\n}\n\n/**\n * Expand a single assertion entry into zero or more NL strings.\n * Most assertions produce exactly one string; llm-grader with rubrics expands to many.\n */\nfunction assertionToNaturalLanguageList(entry: RawAssertEntry): string[] {\n if (entry.type === 'llm-grader' || entry.type === 'llm_grader') {\n if (Array.isArray(entry.rubrics) && entry.rubrics.length > 0) {\n return (entry.rubrics as Array<{ outcome?: string; criteria?: string; id?: string }>)\n .map((r) => r.outcome ?? r.criteria ?? r.id)\n .filter((s): s is string => typeof s === 'string');\n }\n }\n const nl = assertionToNaturalLanguage(entry);\n return nl !== null ? [nl] : [];\n}\n\n/**\n * Extract skill-trigger entries from an assertion list.\n * Returns entries with type === 'skill-trigger'.\n */\nfunction extractTriggerAssertions(assertions: RawAssertEntry[]): RawAssertEntry[] {\n return assertions.filter((a) => a.type === 'skill-trigger');\n}\n\n/**\n * Collect all assertion entries for a test case, accepting both\n * `assertions` and deprecated `assert` key.\n */\nfunction resolveAssertions(rawCase: RawTestCase): RawAssertEntry[] {\n if (Array.isArray(rawCase.assertions)) return rawCase.assertions;\n if (Array.isArray(rawCase.assert)) return rawCase.assert;\n return [];\n}\n\n/**\n * Collect suite-level assertions (applied to every test).\n */\nfunction resolveSuiteAssertions(suite: RawSuite): RawAssertEntry[] {\n if (Array.isArray(suite.assertions)) return suite.assertions;\n if (Array.isArray(suite.assert)) return suite.assert;\n return [];\n}\n\n// ---------------------------------------------------------------------------\n// Input extraction\n// ---------------------------------------------------------------------------\n\ninterface ExtractedInput {\n prompt: string;\n files: string[];\n}\n\n/**\n * Extract prompt text and file paths from a test case input.\n *\n * Supports:\n * - String input → prompt, no files\n * - Message array with role: user and content blocks\n * - input_files shorthand (alongside string or message-array input)\n */\nfunction extractInput(rawCase: RawTestCase): ExtractedInput {\n const files: string[] = Array.isArray(rawCase.input_files)\n ? (rawCase.input_files as string[]).filter((f) => typeof f === 'string')\n : [];\n\n const input = rawCase.input;\n\n if (typeof input === 'string') {\n return { prompt: input, files };\n }\n\n if (Array.isArray(input)) {\n let prompt = '';\n for (const msg of input as RawMessage[]) {\n if (msg.role !== 'user') continue;\n if (typeof msg.content === 'string') {\n prompt = msg.content;\n } else if (Array.isArray(msg.content)) {\n for (const block of msg.content as Array<{ type?: string; value?: string }>) {\n if (block.type === 'text' && typeof block.value === 'string') prompt = block.value;\n else if (block.type === 'file' && typeof block.value === 'string')\n files.push(block.value);\n }\n }\n }\n return { prompt, files };\n }\n\n return { prompt: '', files };\n}\n\n/**\n * Flatten expected_output to a string.\n * Accepts string, message array (takes last assistant message content),\n * or any other value serialized to JSON.\n */\nfunction extractExpectedOutput(raw: unknown): string | undefined {\n if (raw === undefined || raw === null) return undefined;\n if (typeof raw === 'string') return raw;\n\n if (Array.isArray(raw)) {\n // Take the last assistant message content\n for (let i = raw.length - 1; i >= 0; i--) {\n const msg = raw[i] as RawMessage;\n if (typeof msg.content === 'string') return msg.content;\n }\n return undefined;\n }\n\n return JSON.stringify(raw);\n}\n\n// ---------------------------------------------------------------------------\n// Transpiler core\n// ---------------------------------------------------------------------------\n\n/**\n * Result of transpiling a single EVAL.yaml.\n * May produce multiple evals.json files (one per skill).\n */\nexport interface TranspileResult {\n /** Map from skill_name → EvalsJsonFile */\n files: Map<string, EvalsJsonFile>;\n /** Warning messages accumulated during transpilation */\n warnings: string[];\n}\n\n/**\n * Transpile a parsed EVAL.yaml object into one or more evals.json objects.\n *\n * @param suite Parsed YAML object (already loaded, no file I/O here)\n * @param source Source identifier for error messages (e.g. file path)\n */\nexport function transpileEvalYaml(suite: unknown, source = 'EVAL.yaml'): TranspileResult {\n const warnings: string[] = [];\n const files = new Map<string, EvalsJsonFile>();\n\n if (typeof suite !== 'object' || suite === null) {\n throw new Error(`Invalid EVAL.yaml: expected an object in '${source}'`);\n }\n\n const rawSuite = suite as RawSuite;\n\n if (!Array.isArray(rawSuite.tests)) {\n throw new Error(`Invalid EVAL.yaml: missing 'tests' array in '${source}'`);\n }\n\n if (rawSuite.assert !== undefined && rawSuite.assertions === undefined) {\n warnings.push(\"'assert' is deprecated at the suite level. Use 'assertions' instead.\");\n }\n\n const suiteAssertions = resolveSuiteAssertions(rawSuite);\n\n // Suite-level NL assertions (appended to every test)\n const suiteNlAssertions: string[] = suiteAssertions\n .filter((a) => a.type !== 'skill-trigger')\n .flatMap(assertionToNaturalLanguageList);\n\n /**\n * Helper: get or create the EvalsJsonFile for a skill.\n */\n function getSkillFile(skillName: string): EvalsJsonFile {\n const existing = files.get(skillName);\n if (existing) return existing;\n const created: EvalsJsonFile = { skill_name: skillName, evals: [] };\n files.set(skillName, created);\n return created;\n }\n\n const tests = rawSuite.tests as RawTestCase[];\n\n for (let idx = 0; idx < tests.length; idx++) {\n const rawCase = tests[idx];\n const caseAssertions = resolveAssertions(rawCase);\n\n if (rawCase.assert !== undefined && rawCase.assertions === undefined) {\n const caseId = rawCase.id ?? idx + 1;\n warnings.push(`Test '${caseId}': 'assert' is deprecated. Use 'assertions' instead.`);\n }\n\n // Collect NL assertions (not skill-trigger)\n const nlAssertions: string[] = [];\n\n // Prepend test-level criteria as NL assertion\n if (typeof rawCase.criteria === 'string' && rawCase.criteria.trim()) {\n nlAssertions.push(rawCase.criteria.trim());\n }\n\n for (const entry of caseAssertions) {\n if (entry.type !== 'skill-trigger') {\n nlAssertions.push(...assertionToNaturalLanguageList(entry));\n }\n }\n\n // Append suite-level NL assertions\n nlAssertions.push(...suiteNlAssertions);\n\n const triggerJudges = extractTriggerAssertions(caseAssertions);\n const { prompt, files: inputFiles } = extractInput(rawCase);\n const expectedOutput = extractExpectedOutput(rawCase.expected_output);\n\n // Build the numeric id (1-based index)\n const numericId = idx + 1;\n\n // Build the base case (without should_trigger — added per-skill below)\n const baseCase: Omit<EvalsJsonCase, 'should_trigger'> & { should_trigger?: boolean } = {\n id: numericId,\n prompt,\n ...(expectedOutput !== undefined && { expected_output: expectedOutput }),\n ...(inputFiles.length > 0 && { files: inputFiles }),\n assertions: nlAssertions,\n };\n\n if (triggerJudges.length === 0) {\n // No skill-trigger: place in dominant skill (or _no-skill)\n // Determine dominant skill by scanning all tests (first occurrence wins)\n // We defer this: record with a sentinel and resolve after all tests are processed.\n // For now, push to _no-skill; we'll re-assign at the end.\n const noSkillFile = getSkillFile('_no-skill');\n noSkillFile.evals.push({ ...baseCase });\n } else {\n // Place in each skill with the correct should_trigger value\n for (const tj of triggerJudges) {\n const skillName = typeof tj.skill === 'string' ? tj.skill : '_no-skill';\n const shouldTrigger = tj.should_trigger !== false; // default true\n const skillFile = getSkillFile(skillName);\n skillFile.evals.push({ ...baseCase, should_trigger: shouldTrigger });\n }\n }\n }\n\n // Re-assign _no-skill tests to the dominant skill (if one exists)\n const noSkillFile = files.get('_no-skill');\n if (noSkillFile && noSkillFile.evals.length > 0) {\n // Find the skill with the most tests (among real skills)\n let dominantSkill: string | null = null;\n let maxCount = 0;\n for (const [name, f] of files) {\n if (name !== '_no-skill' && f.evals.length > maxCount) {\n maxCount = f.evals.length;\n dominantSkill = name;\n }\n }\n\n if (dominantSkill) {\n const targetFile = getSkillFile(dominantSkill);\n for (const evalCase of noSkillFile.evals) {\n targetFile.evals.push(evalCase);\n }\n files.delete('_no-skill');\n }\n // else: keep _no-skill if there are no other skills\n }\n\n return { files, warnings };\n}\n\n// ---------------------------------------------------------------------------\n// File-level API\n// ---------------------------------------------------------------------------\n\n/**\n * Transpile an EVAL.yaml file into one or more evals.json objects.\n * Returns a map from output filename → JSON content.\n *\n * @param evalYamlPath Absolute path to the EVAL.yaml file\n */\nexport function transpileEvalYamlFile(evalYamlPath: string): TranspileResult {\n const content = readFileSync(evalYamlPath, 'utf8');\n const parsed = parseYamlValue(content);\n return transpileEvalYaml(parsed, path.basename(evalYamlPath));\n}\n\n/**\n * Determine the output filename(s) for a transpile result.\n * Single skill → \"evals.json\"\n * Multiple skills → \"<skill>.evals.json\"\n */\nexport function getOutputFilenames(result: TranspileResult): Map<string, string> {\n const names = new Map<string, string>();\n if (result.files.size === 1) {\n for (const [skill] of result.files) {\n names.set(skill, 'evals.json');\n }\n } else {\n for (const [skill] of result.files) {\n const safeName = skill.replace(/[^a-zA-Z0-9_-]/g, '_');\n names.set(skill, `${safeName}.evals.json`);\n }\n }\n return names;\n}\n","/**\n * Prepared workspace API for external attempts.\n *\n * `prepareEvalWorkspace` materializes exactly one eval case for one target and\n * stops immediately before provider execution. It is the core primitive behind\n * `agentv prepare` and future prepared-attempt grading: callers get a workspace\n * path, prompt inputs, setup-hook history, repo pins, and baseline metadata, but\n * no target provider or grader is invoked here.\n *\n * The returned object uses internal camelCase names. Any CLI manifest writer\n * should translate these fields to snake_case at the disk boundary.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport path from 'node:path';\nimport micromatch from 'micromatch';\n\nimport type { ResolvedTarget } from './providers/targets.js';\nimport type { ChatPrompt } from './providers/types.js';\nimport { AGENT_PROVIDER_KINDS } from './providers/types.js';\nimport type { EvalTest, RepoConfig, TargetHooksConfig } from './types.js';\nimport {\n type SharedWorkspaceSetup,\n type WorkspaceSetupCleanPolicy,\n type WorkspaceSetupHookExecution,\n type WorkspaceSetupMode,\n type WorkspaceSetupRetentionPolicy,\n prepareEvalCaseWorkspace,\n prepareSharedWorkspaceSetup,\n releaseSharedWorkspaceSetup,\n} from './workspace/setup.js';\nimport { type PromptInputs, buildPromptInputs, loadTests } from './yaml-parser.js';\n\nexport interface PrepareEvalWorkspaceOptions {\n readonly testFilePath: string;\n readonly repoRoot: URL | string;\n readonly target: ResolvedTarget;\n readonly targetHooks?: TargetHooksConfig;\n readonly evalCases?: readonly EvalTest[];\n /** Exact test id to prepare. */\n readonly testId?: string;\n /** Glob filter used when `testId` is not supplied. Must resolve to one case. */\n readonly filter?: string | readonly string[];\n readonly verbose?: boolean;\n readonly now?: () => Date;\n readonly maxConcurrency?: number;\n /** Legacy static workspace path override. */\n readonly workspace?: string;\n readonly workspaceMode?: WorkspaceSetupMode;\n readonly workspacePath?: string;\n readonly workspaceClean?: WorkspaceSetupCleanPolicy;\n readonly poolMaxSlots?: number;\n readonly keepWorkspaces?: boolean;\n readonly cleanupWorkspaces?: boolean;\n readonly retainOnSuccess?: WorkspaceSetupRetentionPolicy;\n readonly retainOnFailure?: WorkspaceSetupRetentionPolicy;\n}\n\nexport interface PreparedWorkspaceRepoPin {\n readonly path?: string;\n readonly repo?: string;\n readonly commit?: string;\n readonly baseCommit?: string;\n readonly ancestor?: number;\n readonly sparse?: readonly string[];\n}\n\nexport interface PreparedWorkspaceBaseline {\n readonly status: 'initialized' | 'unavailable';\n readonly commit?: string;\n}\n\nexport interface PreparedWorkspacePromptSource {\n readonly kind: 'eval_case';\n readonly formattingMode: 'agent' | 'lm';\n readonly question: string;\n readonly systemMessage?: string;\n readonly chatPrompt?: ChatPrompt;\n}\n\nexport interface PreparedWorkspaceCleanupPolicy {\n readonly mode: WorkspaceSetupMode;\n readonly retainOnSuccess: WorkspaceSetupRetentionPolicy;\n readonly retainOnFailure: WorkspaceSetupRetentionPolicy;\n readonly manualCleanup: boolean;\n}\n\nexport interface PreparedWorkspacePoolMetadata {\n readonly fingerprint: string;\n readonly slotIndex: number;\n readonly lockPath: string;\n}\n\nexport interface PreparedEvalWorkspace {\n readonly evalPath: string;\n readonly testId: string;\n readonly target: string;\n readonly evalRunId: string;\n readonly workspacePath: string;\n readonly workspaceFile?: string;\n readonly createdAt: string;\n readonly hookExecutions: readonly WorkspaceSetupHookExecution[];\n readonly repoPins: readonly PreparedWorkspaceRepoPin[];\n readonly baseline: PreparedWorkspaceBaseline;\n readonly promptSource: PreparedWorkspacePromptSource;\n readonly cleanupPolicy: PreparedWorkspaceCleanupPolicy;\n readonly sharedWorkspace: boolean;\n readonly pool?: PreparedWorkspacePoolMetadata;\n}\n\nfunction matchesFilter(id: string, filter: string | readonly string[]): boolean {\n return typeof filter === 'string'\n ? micromatch.isMatch(id, filter)\n : filter.some((pattern) => micromatch.isMatch(id, pattern));\n}\n\nfunction selectSingleCase(options: {\n readonly evalCases: readonly EvalTest[];\n readonly testId?: string;\n readonly filter?: string | readonly string[];\n readonly evalPath: string;\n}): EvalTest {\n const selected = options.testId\n ? options.evalCases.filter((evalCase) => evalCase.id === options.testId)\n : options.filter\n ? options.evalCases.filter((evalCase) => matchesFilter(evalCase.id, options.filter ?? ''))\n : options.evalCases;\n\n if (selected.length !== 1) {\n const selector = options.testId\n ? `test_id \"${options.testId}\"`\n : options.filter\n ? `filter \"${Array.isArray(options.filter) ? options.filter.join(',') : options.filter}\"`\n : 'the eval file';\n throw new Error(\n `prepareEvalWorkspace requires exactly one test, but ${selector} matched ${selected.length} in ${options.evalPath}.`,\n );\n }\n\n return selected[0];\n}\n\nfunction promptModeForTarget(target: ResolvedTarget): 'agent' | 'lm' {\n return AGENT_PROVIDER_KINDS.includes(target.kind) || target.kind === 'cli' ? 'agent' : 'lm';\n}\n\nfunction toRepoPins(repos: readonly RepoConfig[] | undefined): readonly PreparedWorkspaceRepoPin[] {\n return (repos ?? []).map((repo) => ({\n ...(repo.path !== undefined && { path: repo.path }),\n ...(repo.repo !== undefined && { repo: repo.repo }),\n ...(repo.commit !== undefined && { commit: repo.commit }),\n ...(repo.base_commit !== undefined && { baseCommit: repo.base_commit }),\n ...(repo.ancestor !== undefined && { ancestor: repo.ancestor }),\n ...(repo.sparse !== undefined && { sparse: repo.sparse }),\n }));\n}\n\nfunction poolMetadata(\n setup: SharedWorkspaceSetup,\n selectedSlotPath: string | undefined,\n): PreparedWorkspacePoolMetadata | undefined {\n const slot =\n setup.poolSlot ?? setup.poolSlots.find((candidate) => candidate.path === selectedSlotPath);\n if (!slot) {\n return undefined;\n }\n return {\n fingerprint: slot.fingerprint,\n slotIndex: slot.index,\n lockPath: slot.lockPath,\n };\n}\n\nasync function releaseUnselectedPoolSlots(\n setup: SharedWorkspaceSetup,\n selectedSlotPath: string | undefined,\n): Promise<void> {\n if (!setup.poolManager) {\n return;\n }\n for (const slot of setup.poolSlots) {\n if (slot.path !== selectedSlotPath) {\n await setup.poolManager.releaseSlot(slot).catch(() => {});\n }\n }\n}\n\nexport async function prepareEvalWorkspace(\n options: PrepareEvalWorkspaceOptions,\n): Promise<PreparedEvalWorkspace> {\n const evalPath = path.resolve(options.testFilePath);\n const evalRunId = randomUUID();\n const evalCases =\n options.evalCases ??\n (await loadTests(evalPath, options.repoRoot, {\n verbose: options.verbose,\n filter: options.testId ?? options.filter,\n }));\n const evalCase = selectSingleCase({\n evalCases,\n testId: options.testId,\n filter: options.filter,\n evalPath,\n });\n const evalDir = path.dirname(evalPath);\n const workers = options.maxConcurrency ?? 1;\n const retainOnSuccess = options.retainOnSuccess ?? (options.keepWorkspaces ? 'keep' : 'cleanup');\n const retainOnFailure =\n options.retainOnFailure ?? (options.cleanupWorkspaces ? 'cleanup' : 'keep');\n const formattingMode = promptModeForTarget(options.target);\n const promptInputs: PromptInputs = await buildPromptInputs(evalCase, formattingMode);\n\n let sharedSetup: SharedWorkspaceSetup | undefined;\n try {\n sharedSetup = await prepareSharedWorkspaceSetup({\n evalRunId,\n evalCases: [evalCase],\n targetHooks: options.targetHooks,\n evalDir,\n verbose: options.verbose,\n workers,\n poolMaxSlots: options.poolMaxSlots,\n workspacePath: options.workspacePath,\n legacyWorkspacePath: options.workspace,\n workspaceMode: options.workspaceMode,\n workspaceClean: options.workspaceClean,\n });\n\n const testPoolSlot =\n sharedSetup.availablePoolSlots.length > 0 ? sharedSetup.availablePoolSlots.pop() : undefined;\n const selectedWorkspacePath = testPoolSlot?.path ?? sharedSetup.sharedWorkspacePath;\n const selectedBaselineCommit = testPoolSlot\n ? sharedSetup.poolSlotBaselines.get(testPoolSlot.path)\n : sharedSetup.sharedBaselineCommit;\n\n const caseSetup = await prepareEvalCaseWorkspace({\n evalCase,\n targetName: options.target.name,\n evalRunId,\n sharedWorkspacePath: selectedWorkspacePath,\n sharedBaselineCommit: selectedBaselineCommit,\n suiteWorkspaceFile: sharedSetup.suiteWorkspaceFile,\n repoManager: sharedSetup.repoManager,\n evalDir,\n cleanupWorkspaces: options.cleanupWorkspaces,\n targetHooks: options.targetHooks,\n setupDebug: options.verbose,\n });\n\n if (!caseSetup.workspacePath) {\n throw new Error(\n `No workspace was materialized for test \"${evalCase.id}\". Add workspace.template, workspace.repos, or workspace.hooks before preparing an external attempt.`,\n );\n }\n\n await releaseUnselectedPoolSlots(sharedSetup, caseSetup.workspacePath);\n const pool = poolMetadata(sharedSetup, caseSetup.workspacePath);\n\n return {\n evalPath,\n testId: evalCase.id,\n target: options.target.name,\n evalRunId,\n workspacePath: caseSetup.workspacePath,\n ...(caseSetup.caseWorkspaceFile !== undefined && {\n workspaceFile: caseSetup.caseWorkspaceFile,\n }),\n createdAt: (options.now ?? (() => new Date()))().toISOString(),\n hookExecutions: [...sharedSetup.hookExecutions, ...caseSetup.hookExecutions],\n repoPins: toRepoPins(evalCase.workspace?.repos),\n baseline: caseSetup.baselineCommit\n ? { status: 'initialized', commit: caseSetup.baselineCommit }\n : { status: 'unavailable' },\n promptSource: {\n kind: 'eval_case',\n formattingMode,\n question: promptInputs.question,\n ...(promptInputs.systemMessage !== undefined && {\n systemMessage: promptInputs.systemMessage,\n }),\n ...(promptInputs.chatPrompt !== undefined && { chatPrompt: promptInputs.chatPrompt }),\n },\n cleanupPolicy: {\n mode: sharedSetup.configuredMode,\n retainOnSuccess,\n retainOnFailure,\n manualCleanup: true,\n },\n sharedWorkspace: caseSetup.isSharedWorkspace,\n ...(pool !== undefined && { pool }),\n };\n } catch (error) {\n if (sharedSetup) {\n await releaseSharedWorkspaceSetup(sharedSetup).catch(() => {});\n }\n throw error;\n }\n}\n","/**\n * Typed configuration file support for AgentV.\n *\n * Provides `defineConfig()` for use in `agentv.config.ts` files. Supports\n * auto-discovery, Zod validation, and IDE autocomplete.\n *\n * @example\n * ```typescript\n * // agentv.config.ts\n * import { defineConfig } from '@agentv/core';\n *\n * export default defineConfig({\n * execution: {\n * workers: 5,\n * maxRetries: 2,\n * agentTimeoutMs: 120_000,\n * },\n * output: {\n * dir: './results',\n * },\n * });\n * ```\n *\n * @module\n */\n\nimport { z } from 'zod';\n\n/**\n * Schema for AgentV project-level configuration.\n */\nconst AgentVConfigSchema = z.object({\n /** Default execution settings */\n execution: z\n .object({\n /** Number of parallel workers (default: 3) */\n workers: z.number().int().min(1).max(50).optional(),\n /** Maximum retries on failure (default: 2) */\n maxRetries: z.number().int().min(0).optional(),\n /** Agent timeout in milliseconds. No timeout if not set. */\n agentTimeoutMs: z.number().int().min(0).optional(),\n /** Enable verbose logging */\n verbose: z.boolean().optional(),\n /** Always keep temp workspaces after eval */\n keepWorkspaces: z.boolean().optional(),\n /** Write OTLP JSON trace to this path (supports {timestamp} placeholder) */\n otelFile: z.string().optional(),\n })\n .optional(),\n\n /** Output settings */\n output: z\n .object({\n /** Default eval run artifact directory */\n dir: z.string().optional(),\n })\n .strict()\n .optional(),\n\n /** Response caching */\n cache: z\n .object({\n /** Enable response caching */\n enabled: z.boolean().optional(),\n /** Response cache directory */\n path: z.string().optional(),\n })\n .optional(),\n\n /** Cost and duration limits */\n limits: z\n .object({\n /** Maximum cost per run in USD */\n maxCostUsd: z.number().min(0).optional(),\n /** Maximum duration per run in milliseconds */\n maxDurationMs: z.number().int().min(0).optional(),\n })\n .optional(),\n\n /** Lifecycle hooks */\n hooks: z\n .object({\n /**\n * Shell command to run once at agentv startup, before any command executes.\n * stdout is parsed for env var exports (`KEY=value` or `export KEY=\"value\"`)\n * and injected into process.env. Keys already set in the environment are\n * not overwritten — existing env always takes priority.\n * stderr is forwarded to the user. Non-zero exit aborts with an error.\n */\n beforeSession: z.string().optional(),\n })\n .optional(),\n});\n\n/**\n * AgentV project-level configuration type.\n * Inferred from the Zod schema for full type safety.\n */\nexport type AgentVConfig = z.infer<typeof AgentVConfigSchema>;\n\n/**\n * Define a typed AgentV configuration.\n *\n * Use this in `agentv.config.ts` at your project root. The configuration\n * is validated at load time and provides full IDE autocomplete.\n *\n * @param config - Configuration object\n * @returns Validated configuration\n *\n * @example\n * ```typescript\n * import { defineConfig } from '@agentv/core';\n *\n * export default defineConfig({\n * execution: { workers: 5 },\n * output: { dir: './results' },\n * limits: { maxCostUsd: 10.0 },\n * });\n * ```\n */\nexport function defineConfig(config: AgentVConfig): AgentVConfig {\n return AgentVConfigSchema.parse(config);\n}\n\n/**\n * Config file discovery order.\n * The first file found wins.\n */\nconst CONFIG_FILE_NAMES = [\n 'agentv.config.ts',\n 'agentv.config.js',\n 'agentv.config.mts',\n 'agentv.config.mjs',\n '.agentv/config.ts',\n '.agentv/config.js',\n] as const;\n\n/**\n * Discover and load an AgentV config file from the project root.\n *\n * Searches for config files in discovery order. Returns null if\n * no config file is found.\n *\n * @param projectRoot - Project root directory to search from\n * @returns Loaded and validated config, or null if not found\n */\nexport async function loadTsConfig(projectRoot: string): Promise<AgentVConfig | null> {\n const { existsSync } = await import('node:fs');\n const { pathToFileURL } = await import('node:url');\n const { join } = await import('node:path');\n\n for (const fileName of CONFIG_FILE_NAMES) {\n const filePath = join(projectRoot, fileName);\n if (!existsSync(filePath)) {\n continue;\n }\n\n try {\n const fileUrl = pathToFileURL(filePath).href;\n const mod = await import(fileUrl);\n const config = mod.default ?? mod;\n\n return AgentVConfigSchema.parse(config);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load config from ${filePath}: ${msg}`);\n }\n }\n\n return null;\n}\n","import { z } from 'zod';\n\nimport type { Provider } from '../providers/types.js';\nimport { extractLastAssistantContent } from '../providers/types.js';\nimport type { RubricItem } from '../types.js';\n\nconst rubricItemSchema = z.object({\n id: z.string().describe('Short identifier for this rubric (e.g., clarity, completeness)'),\n outcome: z.string().describe('Concrete expected outcome for this rubric item'),\n weight: z.number().default(1.0).describe('Relative importance (default 1.0)'),\n required: z.boolean().default(true).describe('Whether this is a mandatory requirement'),\n});\n\nconst rubricGenerationSchema = z.object({\n rubrics: z.array(rubricItemSchema).describe('List of evaluation rubrics'),\n});\n\nexport interface GenerateRubricsOptions {\n readonly criteria: string;\n readonly question?: string;\n readonly referenceAnswer?: string;\n readonly provider: Provider;\n}\n\n/**\n * Generate rubrics from expected outcome using an LLM.\n *\n * Calls the provider through `Provider.invoke()` — the LLM call itself is\n * a single non-streaming, non-tool-using completion. JSON output is parsed\n * with up to 3 retries to absorb model formatting variance.\n */\nexport async function generateRubrics(\n options: GenerateRubricsOptions,\n): Promise<readonly RubricItem[]> {\n const { criteria, question, referenceAnswer, provider } = options;\n\n const prompt = buildPrompt(criteria, question, referenceAnswer);\n\n const system = `You are an expert at creating evaluation rubrics.\nYou must return a valid JSON object matching this schema:\n{\n \"rubrics\": [\n {\n \"id\": \"string (short identifier)\",\n \"outcome\": \"string (concrete expected outcome for this rubric item)\",\n \"weight\": number (default 1.0),\n \"required\": boolean (default true)\n }\n ]\n}`;\n\n let result: z.infer<typeof rubricGenerationSchema> | undefined;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n const response = await provider.invoke({\n question: prompt,\n systemPrompt: system,\n });\n\n const text = extractLastAssistantContent(response.output);\n const cleaned = text.replace(/```json\\n?|```/g, '').trim();\n result = rubricGenerationSchema.parse(JSON.parse(cleaned));\n break;\n } catch (e: unknown) {\n lastError = e instanceof Error ? e : new Error(String(e));\n // Continue to next attempt\n }\n }\n\n if (!result) {\n throw new Error(`Failed to parse generated rubrics after 3 attempts: ${lastError?.message}`);\n }\n\n return result.rubrics;\n}\n\nfunction buildPrompt(criteria: string, question?: string, referenceAnswer?: string): string {\n const parts: string[] = [\n 'You are an expert at creating evaluation rubrics.',\n 'Given the expected outcome (and optionally the question and reference answer),',\n 'generate a list of specific, measurable rubric items to evaluate whether an answer meets the expected outcome.',\n '',\n 'Each rubric should:',\n '- Be specific and testable',\n '- Have a short, descriptive ID',\n '- Include a clear expected outcome statement (what a good answer must demonstrate for this rubric)',\n '- Indicate if it is required (mandatory) or optional',\n '- Have an appropriate weight (default 1.0, use higher values for more important aspects)',\n '',\n 'Generate 3-7 rubric items that comprehensively cover the expected outcome.',\n '',\n '[[ ## criteria ## ]]',\n criteria,\n '',\n ];\n\n if (question && question.trim().length > 0) {\n parts.push('[[ ## question ## ]]', question, '');\n }\n\n if (referenceAnswer && referenceAnswer.trim().length > 0) {\n parts.push('[[ ## reference_answer ## ]]', referenceAnswer, '');\n }\n\n return parts.join('\\n');\n}\n","/**\n * Lightweight scanner that extracts repo dependencies from eval YAML files\n * without performing full test/grader parsing.\n *\n * Used by `agentv workspace deps` to determine which repos CI needs to fetch\n * before running evals.\n *\n * How it works:\n * 1. Reads each eval YAML file and parses it\n * 2. Extracts `workspace.repos` at suite-level and per-test level\n * 3. Resolves external workspace file references (string -> file path)\n * 4. Deduplicates repos by (canonical repo identity, ref)\n * 5. Returns a flat list of unique repo dependencies\n */\nimport { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { interpolateEnv } from '../interpolation.js';\nimport type { RepoConfig } from '../types.js';\nimport { parseYamlValue } from '../yaml-loader.js';\nimport { getRepoCheckoutRef } from './repo-checkout.js';\nimport { parseRepoConfig } from './repo-config-parser.js';\nimport { normalizeRepoIdentity, resolveRepoCloneUrl } from './repo-identity.js';\n\n/** A single repo dependency discovered from eval files. */\nexport interface RepoDep {\n /** Git clone URL */\n readonly url: string;\n /** Checkout ref (branch, tag, SHA). undefined means HEAD. */\n readonly ref: string | undefined;\n /** Optional sparse-checkout paths. */\n readonly sparse: readonly string[] | undefined;\n /** Optional ancestor walk after checkout. */\n readonly ancestor: number | undefined;\n /** Eval files that reference this repo. */\n readonly usedBy: string[];\n}\n\n/** Full output of the deps scanner. */\nexport interface DepsScanResult {\n readonly repos: readonly RepoDep[];\n /** Files that failed to parse (non-fatal). */\n readonly errors: readonly { file: string; message: string }[];\n}\n\n/**\n * Scan eval YAML files and collect unique repo dependencies.\n * Non-YAML files and parse errors are collected in `errors` but don't stop scanning.\n */\nexport async function scanRepoDeps(evalFilePaths: readonly string[]): Promise<DepsScanResult> {\n const seen = new Map<string, RepoDep & { usedBy: string[] }>();\n const errors: { file: string; message: string }[] = [];\n\n for (const filePath of evalFilePaths) {\n try {\n const repos = await extractReposFromEvalFile(filePath);\n for (const repo of repos) {\n if (!repo.repo) continue;\n const checkoutRef = getRepoCheckoutRef(repo);\n const ref = checkoutRef === 'HEAD' ? undefined : checkoutRef;\n const key = `${normalizeRepoIdentity(repo.repo)}\\0${ref ?? ''}`;\n const existing = seen.get(key);\n if (existing) {\n existing.usedBy.push(filePath);\n } else {\n seen.set(key, {\n url: resolveRepoCloneUrl(repo.repo),\n ref,\n sparse: repo.sparse,\n ancestor: repo.ancestor,\n usedBy: [filePath],\n });\n }\n }\n } catch (err) {\n errors.push({\n file: filePath,\n message: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n return { repos: [...seen.values()], errors };\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers — lightweight YAML extraction, no full test parsing\n// ---------------------------------------------------------------------------\n\nasync function extractReposFromEvalFile(filePath: string): Promise<RepoConfig[]> {\n const content = await readFile(filePath, 'utf8');\n const parsed = interpolateEnv(parseYamlValue(content), process.env);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return [];\n const obj = parsed as Record<string, unknown>;\n const evalFileDir = path.dirname(path.resolve(filePath));\n\n const repos: RepoConfig[] = [];\n\n const suiteRepos = await extractReposFromWorkspaceRaw(obj.workspace, evalFileDir);\n repos.push(...suiteRepos);\n\n const tests = Array.isArray(obj.tests) ? obj.tests : [];\n for (const test of tests) {\n if (test && typeof test === 'object' && !Array.isArray(test)) {\n const testObj = test as Record<string, unknown>;\n const testRepos = await extractReposFromWorkspaceRaw(testObj.workspace, evalFileDir);\n repos.push(...testRepos);\n }\n }\n\n return repos;\n}\n\n/**\n * Extract repos from a raw workspace value.\n * Handles both inline objects and string references to external workspace files.\n */\nasync function extractReposFromWorkspaceRaw(\n raw: unknown,\n evalFileDir: string,\n): Promise<RepoConfig[]> {\n if (typeof raw === 'string') {\n const workspaceFilePath = path.resolve(evalFileDir, raw);\n const content = await readFile(workspaceFilePath, 'utf8');\n const parsed = interpolateEnv(parseYamlValue(content), process.env);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return [];\n return extractReposFromObject(parsed as Record<string, unknown>);\n }\n if (raw && typeof raw === 'object' && !Array.isArray(raw)) {\n return extractReposFromObject(raw as Record<string, unknown>);\n }\n return [];\n}\n\nfunction extractReposFromObject(obj: Record<string, unknown>): RepoConfig[] {\n const rawRepos = Array.isArray(obj.repos) ? obj.repos : [];\n const result: RepoConfig[] = [];\n for (const r of rawRepos) {\n const parsed = parseRepoConfig(r);\n if (parsed?.repo) {\n result.push(parsed);\n }\n }\n return result;\n}\n","import { execFile, spawn } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport {\n existsSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from 'node:fs';\nimport { cp, lstat, mkdtemp, readdir, rm, stat } from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { getAgentvDataDir } from '../paths.js';\nimport type { ResultPushConflictPolicy, ResultsConfig } from './loaders/config-loader.js';\nimport {\n AGENTV_RESULTS_ARTIFACTS_REF,\n AGENTV_RESULTS_PRIMARY_REF,\n} from './result-artifact-contract.js';\n\nexport type { ResultPushConflictPolicy } from './loaders/config-loader.js';\n\nconst execFileAsync = promisify(execFile);\n// Local working-tree run workspace inside the eval repo. Local commands\n// (`agentv eval` default --output, inspect/trend/export/combine/serve) read and\n// write runs here. This is NOT the on-branch layout — see RESULTS_REPO_RUNS_DIR.\nconst RESULTS_REPO_RESULTS_DIR = '.agentv/results';\n// On-branch / results-repo-clone storage layout. The results branch (e.g.\n// agentv/results/v1) already namespaces results, so runs are stored flat at\n// runs/<experiment>/<timestamp>/ and the editable tag overlays at\n// metadata/runs/<experiment>/<timestamp>/ — no redundant `.agentv/results/` prefix.\nconst RESULTS_REPO_RUNS_DIR = 'runs';\nconst RESULTS_REPO_METADATA_DIR = 'metadata';\n// Top-level directories AgentV owns on the results branch. The auto-sync\n// dirty-commit path stages only these so it never touches unrelated repo files.\nconst RESULTS_REPO_TRACKED_DIRS = [RESULTS_REPO_RUNS_DIR, RESULTS_REPO_METADATA_DIR] as const;\nconst FALLBACK_RESULTS_REPO_COMMIT_EMAIL = 'agentv@results-repo';\nconst FALLBACK_RESULTS_REPO_COMMIT_NAME = 'AgentV Results';\nconst GIT_COMMIT_IDENTITY_ENV_KEYS = [\n 'GIT_AUTHOR_NAME',\n 'GIT_AUTHOR_EMAIL',\n 'GIT_COMMITTER_NAME',\n 'GIT_COMMITTER_EMAIL',\n] as const;\nconst GIT_ENV_INHERIT_ALLOWLIST = new Set([\n 'GIT_ASKPASS',\n 'GIT_PASSWORD',\n 'GIT_SSH_COMMAND',\n 'GIT_TOKEN',\n 'GIT_USERNAME',\n]);\nexport const DEFAULT_RESULTS_BRANCH = AGENTV_RESULTS_PRIMARY_REF;\nconst MANAGED_RESULTS_REMOTE = 'agentv-results';\nconst GIT_EMPTY_TREE = '4b825dc642cb6eb9a060e54bf8d69288fbee4904';\n// The results branch is a self-rooted orphan whose first commit is a fixed,\n// byte-identical empty-tree genesis. Pinning the message, identity, and dates\n// through per-command env makes the root commit SHA deterministic across every\n// machine and clone, so all clients share\n// one genesis and fast-forward/append to a single ref instead of each minting a\n// divergent root. This identity is applied via per-command env only so AgentV\n// never overwrites the user's git config. See createOrphanResultsBranch.\nconst RESULTS_REPO_GENESIS_MESSAGE = 'chore(results): initialize AgentV results branch';\nconst RESULTS_REPO_GENESIS_DATE = '@0 +0000';\nconst RESULT_INDEX_FILENAME = 'index.jsonl';\n\nexport interface ResultsRepoLocalPaths {\n readonly rootDir: string;\n readonly repoDir: string;\n readonly statusFile: string;\n}\n\nexport type ResultsRepoSyncStatus =\n | 'clean'\n | 'unavailable'\n | 'behind'\n | 'ahead'\n | 'diverged'\n | 'dirty'\n | 'conflicted'\n | 'push_conflict'\n | 'syncing';\n\nexport interface ResultsRepoStatus {\n readonly configured: boolean;\n readonly available: boolean;\n readonly repo?: string;\n readonly repo_path?: string;\n readonly path?: string;\n readonly auto_push?: boolean;\n readonly require_push?: boolean;\n readonly push_conflict_policy?: ResultPushConflictPolicy;\n readonly branch_prefix?: string;\n readonly local_dir?: string;\n readonly last_synced_at?: string;\n readonly last_error?: string;\n readonly sync_status?: ResultsRepoSyncStatus;\n readonly branch?: string;\n readonly upstream?: string;\n readonly ahead?: number;\n readonly behind?: number;\n readonly dirty_paths?: readonly string[];\n readonly conflicted_paths?: readonly string[];\n readonly git_status?: string;\n readonly git_diff_summary?: string;\n readonly blocked?: boolean;\n readonly block_reason?: string;\n readonly pull_performed?: boolean;\n readonly push_performed?: boolean;\n readonly commit_created?: boolean;\n readonly target_branch?: string;\n readonly remote_commit?: string;\n readonly local_commit?: string;\n readonly backup_ref?: string;\n readonly backup_commit?: string;\n readonly previous_remote_commit?: string;\n readonly force_pushed_commit?: string;\n readonly lease_commit?: string;\n}\n\nexport interface NormalizedResultsConfig {\n readonly mode: 'github';\n readonly repo: string;\n readonly repo_url?: string;\n readonly repo_path?: string;\n readonly branch?: string;\n readonly remote: string;\n readonly path: string;\n readonly auto_push: boolean;\n readonly require_push: boolean;\n readonly push_conflict_policy: ResultPushConflictPolicy;\n readonly branch_prefix: string;\n /** @internal Runtime mode; not part of YAML wire format. */\n readonly storageBranchWorktree: boolean;\n}\n\ntype StorageBranchResultsConfig = NormalizedResultsConfig & { readonly branch: string };\n\nexport interface DirectPushResultsResult {\n readonly changed: boolean;\n readonly blocked?: boolean;\n readonly block_reason?: string;\n readonly sync_status?: ResultsRepoSyncStatus;\n readonly push_conflict_policy: ResultPushConflictPolicy;\n readonly target_branch?: string;\n readonly remote_commit?: string;\n readonly local_commit?: string;\n readonly backup_ref?: string;\n readonly backup_commit?: string;\n readonly previous_remote_commit?: string;\n readonly force_pushed_commit?: string;\n readonly lease_commit?: string;\n}\n\nexport interface CheckedOutResultsRepoBranch {\n readonly branchName: string;\n readonly baseBranch: string;\n readonly repoDir: string;\n}\n\nexport interface PreparedResultsRepoBranch extends CheckedOutResultsRepoBranch {\n readonly cleanup: () => Promise<void>;\n}\n\ntype PersistedStatus = {\n readonly last_synced_at?: string;\n readonly last_error?: string;\n};\n\ntype ResultsRepoGitInspection = {\n readonly syncStatus: ResultsRepoSyncStatus;\n readonly branch?: string;\n readonly upstream?: string;\n readonly ahead?: number;\n readonly behind?: number;\n readonly dirtyPaths: readonly string[];\n readonly conflictedPaths: readonly string[];\n readonly gitStatus?: string;\n readonly gitDiffSummary?: string;\n};\n\nconst activeResultsRepoSyncs = new Set<string>();\n\nfunction sanitizeRepoSlug(repo: string): string {\n return repo.trim().replace(/[^A-Za-z0-9._-]+/g, '-');\n}\n\nfunction withFriendlyGitHubAuthError(error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error);\n const lower = message.toLowerCase();\n if (\n lower.includes('authentication failed') ||\n lower.includes('could not read username') ||\n lower.includes('permission denied') ||\n lower.includes('not logged into any github hosts')\n ) {\n return new Error(`${message}. Run 'gh auth login' to authenticate.`);\n }\n return new Error(message);\n}\n\nfunction expandHome(p: string): string {\n if (p === '~' || p.startsWith('~/') || p.startsWith('~\\\\')) {\n return path.join(os.homedir(), p.slice(1));\n }\n return p;\n}\n\nfunction resolveLocalPath(p: string, baseDir: string): string {\n const expanded = expandHome(p);\n return path.isAbsolute(expanded) ? expanded : path.resolve(baseDir, expanded);\n}\n\nexport function normalizeResultsConfig(\n config: ResultsConfig,\n options?: { baseDir?: string },\n): NormalizedResultsConfig {\n const baseDir = options?.baseDir ?? process.cwd();\n const repoUrl = (config.repo_url ?? config.repo)?.trim();\n const repoPath = config.repo_path?.trim();\n const explicitClonePath = config.path?.trim();\n const repo = repoUrl ?? repoPath ?? '';\n const branch = config.branch?.trim() || (repoPath ? DEFAULT_RESULTS_BRANCH : undefined);\n const useStorageBranchWorktree = Boolean(repoPath || (repoUrl && explicitClonePath && branch));\n const remote =\n config.remote?.trim() ||\n (repoUrl && useStorageBranchWorktree ? MANAGED_RESULTS_REMOTE : 'origin');\n const autoPush = config.sync?.auto_push ?? config.auto_push === true;\n const requirePush = config.sync?.require_push === true;\n const pushConflictPolicy = config.sync?.push_conflict_policy ?? 'block';\n const resolvedRepoPath = repoPath ? resolveLocalPath(repoPath, baseDir) : undefined;\n const resolvedPath = explicitClonePath\n ? resolveLocalPath(explicitClonePath, baseDir)\n : repoUrl\n ? path.join(getAgentvDataDir(), 'results', sanitizeRepoSlug(repoUrl))\n : (resolvedRepoPath ?? path.join(getAgentvDataDir(), 'results', sanitizeRepoSlug(repo)));\n return {\n mode: 'github',\n repo,\n ...(repoUrl ? { repo_url: repoUrl } : {}),\n ...(resolvedRepoPath ? { repo_path: resolvedRepoPath } : {}),\n ...(branch ? { branch } : {}),\n remote,\n path: resolvedPath,\n auto_push: autoPush,\n require_push: requirePush,\n push_conflict_policy: pushConflictPolicy,\n branch_prefix: config.branch_prefix?.trim() || 'eval-results',\n storageBranchWorktree: useStorageBranchWorktree,\n };\n}\n\nexport function resolveResultsRepoUrl(repo: string): string {\n if (repo.includes('://') || repo.startsWith('git@')) {\n return repo;\n }\n return `https://github.com/${repo}.git`;\n}\n\nexport function getResultsRepoLocalPaths(repo: string): ResultsRepoLocalPaths {\n const rootDir = path.join(getAgentvDataDir(), 'cache', 'results-repo', sanitizeRepoSlug(repo));\n return {\n rootDir,\n repoDir: path.join(rootDir, 'repo'),\n statusFile: path.join(rootDir, 'status.json'),\n };\n}\n\nfunction usesStorageBranchWorktree(config: NormalizedResultsConfig): boolean {\n return config.storageBranchWorktree === true || Boolean(config.repo_path);\n}\n\nfunction readPersistedStatus(statusFile: string): PersistedStatus {\n if (!existsSync(statusFile)) {\n return {};\n }\n\n try {\n return JSON.parse(readFileSync(statusFile, 'utf8')) as PersistedStatus;\n } catch {\n return {};\n }\n}\n\nfunction writePersistedStatus(statusFile: string, status: PersistedStatus): void {\n mkdirSync(path.dirname(statusFile), { recursive: true });\n writeFileSync(statusFile, `${JSON.stringify(status, null, 2)}\\n`, 'utf8');\n}\n\nasync function runCommand(\n executable: string,\n args: readonly string[],\n options?: { cwd?: string; check?: boolean; env?: NodeJS.ProcessEnv },\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n try {\n const { stdout, stderr } = await execFileAsync(executable, [...args], {\n cwd: options?.cwd,\n env: options?.env ?? process.env,\n });\n return { stdout, stderr, exitCode: 0 };\n } catch (error) {\n if (options?.check === false && error && typeof error === 'object') {\n const execError = error as { code?: unknown; stdout?: string; stderr?: string };\n return {\n stdout: execError.stdout ?? '',\n stderr: execError.stderr ?? '',\n exitCode: typeof execError.code === 'number' ? execError.code : 1,\n };\n }\n throw withFriendlyGitHubAuthError(error);\n }\n}\n\nfunction getGitEnv(): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {};\n for (const [key, value] of Object.entries(process.env)) {\n if (value !== undefined && (!key.startsWith('GIT_') || GIT_ENV_INHERIT_ALLOWLIST.has(key))) {\n env[key] = value;\n }\n }\n env.GIT_TERMINAL_PROMPT = '0';\n return env;\n}\n\nasync function runGit(\n args: readonly string[],\n options?: { cwd?: string; check?: boolean; env?: NodeJS.ProcessEnv },\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n return runCommand('git', args, { ...options, env: { ...getGitEnv(), ...options?.env } });\n}\n\nasync function runGh(\n args: readonly string[],\n options?: { cwd?: string },\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n return runCommand('gh', args, options);\n}\n\nfunction gitErrorText(error: unknown): string {\n const parts: string[] = [];\n if (error && typeof error === 'object') {\n const record = error as { stdout?: unknown; stderr?: unknown; message?: unknown };\n if (typeof record.stdout === 'string') parts.push(record.stdout);\n if (typeof record.stderr === 'string') parts.push(record.stderr);\n if (typeof record.message === 'string') parts.push(record.message);\n } else if (typeof error === 'string') {\n parts.push(error);\n }\n return parts.join('\\n').toLowerCase();\n}\n\nfunction isMissingGitIdentityError(error: unknown): boolean {\n const text = gitErrorText(error);\n return (\n text.includes('author identity unknown') ||\n text.includes('committer identity unknown') ||\n text.includes('please tell me who you are') ||\n text.includes('unable to auto-detect email address') ||\n text.includes('empty ident name')\n );\n}\n\nfunction fallbackResultsRepoCommitEnv(): NodeJS.ProcessEnv {\n return {\n GIT_AUTHOR_NAME: FALLBACK_RESULTS_REPO_COMMIT_NAME,\n GIT_AUTHOR_EMAIL: FALLBACK_RESULTS_REPO_COMMIT_EMAIL,\n GIT_COMMITTER_NAME: FALLBACK_RESULTS_REPO_COMMIT_NAME,\n GIT_COMMITTER_EMAIL: FALLBACK_RESULTS_REPO_COMMIT_EMAIL,\n };\n}\n\nfunction configuredGitCommitIdentityEnv(): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {};\n for (const key of GIT_COMMIT_IDENTITY_ENV_KEYS) {\n const value = process.env[key];\n if (value !== undefined) {\n env[key] = value;\n }\n }\n return env;\n}\n\nasync function runGitWithFallbackCommitIdentity(\n args: readonly string[],\n options: { cwd: string; env?: NodeJS.ProcessEnv },\n): Promise<{ stdout: string; stderr: string }> {\n const env = {\n ...configuredGitCommitIdentityEnv(),\n ...options.env,\n };\n try {\n return await runGit(args, { ...options, env });\n } catch (error) {\n if (!isMissingGitIdentityError(error)) {\n throw error;\n }\n return runGit(args, {\n ...options,\n env: {\n ...env,\n ...fallbackResultsRepoCommitEnv(),\n },\n });\n }\n}\n\nasync function resolveDefaultBranch(repoDir: string): Promise<string> {\n try {\n const { stdout } = await runGit(['symbolic-ref', 'refs/remotes/origin/HEAD'], { cwd: repoDir });\n const ref = stdout.trim();\n const prefix = 'refs/remotes/origin/';\n if (ref.startsWith(prefix)) {\n return ref.slice(prefix.length);\n }\n } catch {\n // Fall through to main/master probing.\n }\n\n for (const candidate of ['main', 'master']) {\n try {\n await runGit(['rev-parse', '--verify', `origin/${candidate}`], { cwd: repoDir });\n return candidate;\n } catch {\n // Try next candidate.\n }\n }\n\n return 'main';\n}\n\nasync function fetchResultsRepo(\n repoDir: string,\n remote = 'origin',\n branch?: string,\n): Promise<void> {\n if (branch) {\n await fetchResultsBranchRef(repoDir, remote, branch);\n await runGit(['remote', 'prune', remote], { cwd: repoDir, check: false });\n return;\n }\n\n await runGit(['fetch', remote, '--prune'], { cwd: repoDir });\n}\n\nfunction isMissingRemoteBranchFetch(stderr: string): boolean {\n const lower = stderr.toLowerCase();\n return lower.includes(\"couldn't find remote ref\") || lower.includes('could not find remote ref');\n}\n\nasync function fetchResultsBranchRef(\n repoDir: string,\n remote: string,\n branch: string,\n): Promise<void> {\n const { exitCode, stderr } = await runGit(\n ['fetch', remote, `+refs/heads/${branch}:refs/remotes/${remote}/${branch}`],\n {\n cwd: repoDir,\n check: false,\n },\n );\n const fetchError = stderr.trim();\n if (exitCode !== 0 && !isMissingRemoteBranchFetch(fetchError)) {\n throw new Error(fetchError);\n }\n}\n\nasync function fetchResultsArtifactRef(\n repoDir: string,\n remote: string,\n branch: string,\n): Promise<void> {\n const refspec = `+refs/heads/${branch}:refs/remotes/${remote}/${branch}`;\n await runGit(['fetch', '--filter=blob:none', remote, refspec], {\n cwd: repoDir,\n check: false,\n });\n if (!(await gitRefExists(repoDir, `refs/remotes/${remote}/${branch}`))) {\n await fetchResultsBranchRef(repoDir, remote, branch);\n }\n}\n\nfunction remoteBranchRef(branch: string, remote = 'origin'): string {\n return `${remote}/${branch}`;\n}\n\nasync function gitRefExists(repoDir: string, ref: string): Promise<boolean> {\n const { stdout } = await runGit(['rev-parse', '--verify', `${ref}^{commit}`], {\n cwd: repoDir,\n check: false,\n });\n return stdout.trim().length > 0;\n}\n\nasync function configuredResultsBranchRef(\n repoDir: string,\n config: NormalizedResultsConfig,\n): Promise<string | undefined> {\n if (!config.branch) {\n return undefined;\n }\n const remoteRef = remoteBranchRef(config.branch, config.remote);\n if (await gitRefExists(repoDir, remoteRef)) {\n return remoteRef;\n }\n if (await gitRefExists(repoDir, config.branch)) {\n return config.branch;\n }\n return undefined;\n}\n\nasync function assertConfiguredResultsBranchExists(\n repoDir: string,\n config: NormalizedResultsConfig,\n): Promise<string | undefined> {\n return configuredResultsBranchRef(repoDir, config);\n}\n\nasync function localBranchExists(repoDir: string, branch: string): Promise<boolean> {\n const { stdout } = await runGit(['rev-parse', '--verify', `refs/heads/${branch}`], {\n cwd: repoDir,\n check: false,\n });\n return stdout.trim().length > 0;\n}\n\nasync function checkoutConfiguredResultsBranch(\n repoDir: string,\n config: NormalizedResultsConfig,\n): Promise<string | undefined> {\n const branch = config.branch;\n if (!branch) {\n return undefined;\n }\n const remoteRef = await assertConfiguredResultsBranchExists(repoDir, config);\n if (!remoteRef) {\n await createOrphanResultsBranch(repoDir, branch);\n await runGit(['checkout', branch], { cwd: repoDir });\n return undefined;\n }\n\n const currentBranch = await getCurrentBranch(repoDir);\n if (currentBranch !== branch) {\n if (await localBranchExists(repoDir, branch)) {\n await runGit(['checkout', branch], { cwd: repoDir });\n } else {\n await runGit(['checkout', '--track', '-b', branch, remoteRef], { cwd: repoDir });\n }\n }\n if (remoteRef === remoteBranchRef(branch, config.remote)) {\n await runGit(['branch', '--set-upstream-to', remoteRef, branch], {\n cwd: repoDir,\n check: false,\n });\n }\n\n return remoteRef;\n}\n\nasync function createOrphanResultsBranch(repoDir: string, branch: string): Promise<void> {\n await runGit(['update-ref', `refs/heads/${branch}`, await createResultsGenesisCommit(repoDir)], {\n cwd: repoDir,\n });\n}\n\n// Mint the deterministic empty-tree genesis commit (no parents). Tree, message,\n// identity, and author/committer dates are all fixed, so two inits at different\n// wall-clock times — on different machines — produce the identical root SHA.\nasync function createResultsGenesisCommit(repoDir: string): Promise<string> {\n const { stdout } = await runGit(\n ['commit-tree', GIT_EMPTY_TREE, '-m', RESULTS_REPO_GENESIS_MESSAGE],\n {\n cwd: repoDir,\n env: {\n ...fallbackResultsRepoCommitEnv(),\n GIT_AUTHOR_DATE: RESULTS_REPO_GENESIS_DATE,\n GIT_COMMITTER_DATE: RESULTS_REPO_GENESIS_DATE,\n },\n },\n );\n return stdout.trim();\n}\n\nasync function isGitRepository(repoDir: string): Promise<boolean> {\n try {\n const { stdout } = await runGit(['rev-parse', '--is-inside-work-tree'], { cwd: repoDir });\n return stdout.trim() === 'true';\n } catch {\n return false;\n }\n}\n\nasync function resolveGitTopLevel(repoDir: string): Promise<string> {\n const { stdout } = await runGit(['rev-parse', '--show-toplevel'], { cwd: repoDir });\n return stdout.trim() || repoDir;\n}\n\nasync function ensureResultsRepoRemote(\n repoDir: string,\n config: NormalizedResultsConfig,\n): Promise<void> {\n if (!config.repo_url) {\n return;\n }\n\n const remoteUrl = resolveResultsRepoUrl(config.repo_url);\n const { stdout } = await runGit(['remote', 'get-url', config.remote], {\n cwd: repoDir,\n check: false,\n });\n const existingUrl = stdout.trim();\n if (!existingUrl) {\n await runGit(['remote', 'add', config.remote, remoteUrl], { cwd: repoDir });\n return;\n }\n if (existingUrl !== remoteUrl) {\n await runGit(['remote', 'set-url', config.remote, remoteUrl], { cwd: repoDir });\n }\n}\n\nfunction updateStatusFile(\n config: ResultsConfig | NormalizedResultsConfig,\n patch: PersistedStatus,\n): void {\n const repo =\n typeof config.repo === 'string' ? config.repo : (config.repo_url ?? config.repo_path ?? '');\n const cachePaths = getResultsRepoLocalPaths(repo);\n const current = readPersistedStatus(cachePaths.statusFile);\n writePersistedStatus(cachePaths.statusFile, {\n ...current,\n ...patch,\n });\n}\n\nexport async function ensureResultsRepoClone(config: ResultsConfig): Promise<string> {\n const normalized = normalizeResultsConfig(config);\n if (normalized.repo_path) {\n if (!(await isGitRepository(normalized.repo_path))) {\n throw new Error(`Results repo_path is not a git repository: ${normalized.repo_path}`);\n }\n return resolveGitTopLevel(normalized.repo_path);\n }\n\n const cachePaths = getResultsRepoLocalPaths(normalized.repo);\n const cloneDir = normalized.path;\n mkdirSync(cachePaths.rootDir, { recursive: true });\n mkdirSync(path.dirname(cloneDir), { recursive: true });\n\n const cloneMissing = !existsSync(cloneDir);\n const gitDir = path.join(cloneDir, '.git');\n const cloneEmpty = !cloneMissing && !existsSync(gitDir) && (await readdir(cloneDir)).length === 0;\n\n if (cloneMissing || cloneEmpty) {\n try {\n await runGit([\n 'clone',\n '--filter=blob:none',\n resolveResultsRepoUrl(normalized.repo_url ?? normalized.repo),\n cloneDir,\n ]);\n await ensureResultsRepoRemote(cloneDir, normalized);\n return cloneDir;\n } catch (error) {\n updateStatusFile(normalized, { last_error: withFriendlyGitHubAuthError(error).message });\n throw withFriendlyGitHubAuthError(error);\n }\n }\n\n if (!existsSync(gitDir)) {\n throw new Error(`Results repo clone path is not a git repository: ${cloneDir}`);\n }\n\n await ensureResultsRepoRemote(cloneDir, normalized);\n return cloneDir;\n}\n\nexport function getResultsRepoStatus(config?: ResultsConfig): ResultsRepoStatus {\n if (!config) {\n return {\n configured: false,\n available: false,\n repo: '',\n local_dir: '',\n sync_status: 'unavailable',\n };\n }\n\n const normalized = normalizeResultsConfig(config);\n const localPaths = getResultsRepoLocalPaths(normalized.repo);\n const persisted = readPersistedStatus(localPaths.statusFile);\n\n return {\n configured: true,\n available: existsSync(normalized.path),\n repo: normalized.repo,\n ...(normalized.repo_path !== undefined && { repo_path: normalized.repo_path }),\n path: normalized.path,\n auto_push: normalized.auto_push,\n require_push: normalized.require_push,\n push_conflict_policy: normalized.push_conflict_policy,\n branch_prefix: normalized.branch_prefix,\n local_dir: normalized.path,\n last_synced_at: persisted.last_synced_at,\n last_error: persisted.last_error,\n sync_status: existsSync(normalized.path) ? 'clean' : 'unavailable',\n };\n}\n\nfunction parseGitPorcelainPaths(status: string): {\n dirtyPaths: string[];\n conflictedPaths: string[];\n} {\n const dirtyPaths = new Set<string>();\n const conflictedPaths = new Set<string>();\n const conflictCodes = new Set(['DD', 'AU', 'UD', 'UA', 'DU', 'AA', 'UU']);\n\n for (const line of status.split(/\\r?\\n/)) {\n if (!line.trim()) continue;\n const code = line.slice(0, 2);\n const rawPath = line.slice(3).trim();\n const paths = rawPath.includes(' -> ') ? rawPath.split(' -> ') : [rawPath];\n\n for (const p of paths.map((entry) => entry.trim()).filter(Boolean)) {\n dirtyPaths.add(p);\n if (conflictCodes.has(code)) {\n conflictedPaths.add(p);\n }\n }\n }\n\n return {\n dirtyPaths: [...dirtyPaths].sort(),\n conflictedPaths: [...conflictedPaths].sort(),\n };\n}\n\nasync function getCurrentBranch(repoDir: string): Promise<string | undefined> {\n const { stdout } = await runGit(['branch', '--show-current'], { cwd: repoDir, check: false });\n const branch = stdout.trim();\n if (branch) {\n return branch;\n }\n\n const { stdout: sha } = await runGit(['rev-parse', '--short', 'HEAD'], {\n cwd: repoDir,\n check: false,\n });\n return sha.trim() ? `HEAD@${sha.trim()}` : undefined;\n}\n\nasync function resolveComparisonRef(\n repoDir: string,\n config?: NormalizedResultsConfig,\n): Promise<string | undefined> {\n if (config?.branch) {\n return assertConfiguredResultsBranchExists(repoDir, config);\n }\n\n const { stdout: upstream } = await runGit(\n ['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{upstream}'],\n { cwd: repoDir, check: false },\n );\n const upstreamRef = upstream.trim();\n if (upstreamRef && !upstreamRef.includes('fatal:')) {\n return upstreamRef;\n }\n\n const baseBranch = await resolveDefaultBranch(repoDir);\n const fallback = `${config?.remote ?? 'origin'}/${baseBranch}`;\n const { stdout: fallbackSha } = await runGit(['rev-parse', '--verify', fallback], {\n cwd: repoDir,\n check: false,\n });\n return fallbackSha.trim() ? fallback : undefined;\n}\n\nasync function getAheadBehind(\n repoDir: string,\n upstream: string | undefined,\n): Promise<{ ahead?: number; behind?: number }> {\n if (!upstream) {\n return {};\n }\n\n const { stdout } = await runGit(['rev-list', '--left-right', '--count', `HEAD...${upstream}`], {\n cwd: repoDir,\n check: false,\n });\n const [aheadText, behindText] = stdout.trim().split(/\\s+/);\n const ahead = Number.parseInt(aheadText ?? '', 10);\n const behind = Number.parseInt(behindText ?? '', 10);\n\n return {\n ...(Number.isFinite(ahead) && { ahead }),\n ...(Number.isFinite(behind) && { behind }),\n };\n}\n\nasync function getAheadBehindForRefs(\n repoDir: string,\n leftRef: string,\n rightRef: string,\n): Promise<{ ahead?: number; behind?: number }> {\n const { stdout } = await runGit(\n ['rev-list', '--left-right', '--count', `${leftRef}...${rightRef}`],\n {\n cwd: repoDir,\n check: false,\n },\n );\n const [aheadText, behindText] = stdout.trim().split(/\\s+/);\n const ahead = Number.parseInt(aheadText ?? '', 10);\n const behind = Number.parseInt(behindText ?? '', 10);\n\n return {\n ...(Number.isFinite(ahead) && { ahead }),\n ...(Number.isFinite(behind) && { behind }),\n };\n}\n\nasync function readGitText(\n repoDir: string,\n ref: string | undefined,\n gitPath: string,\n): Promise<string | undefined> {\n if (!ref) {\n return undefined;\n }\n const { stdout } = await runGit(['show', `${ref}:${gitPath}`], {\n cwd: repoDir,\n check: false,\n });\n return stdout.length > 0 ? stdout : undefined;\n}\n\nasync function getStorageBranchWorktreeDirtyPaths(\n repoDir: string,\n config: NormalizedResultsConfig & { readonly branch: string },\n): Promise<{ dirtyPaths: string[]; conflictedPaths: string[] }> {\n const { stdout: porcelain } = await runGit(\n ['status', '--porcelain=v1', '--untracked-files=all'],\n {\n cwd: repoDir,\n check: false,\n },\n );\n const parsed = parseGitPorcelainPaths(porcelain);\n const safeDirtyPaths = parsed.dirtyPaths.filter(isSafeResultsRepoPath);\n const conflictedPaths = parsed.conflictedPaths.filter(isSafeResultsRepoPath);\n if (safeDirtyPaths.length === 0) {\n return { dirtyPaths: [], conflictedPaths };\n }\n\n const localRef = `refs/heads/${config.branch}`;\n const remoteRef = remoteBranchRef(config.branch, config.remote);\n const comparisonRef = (await gitRefExists(repoDir, localRef))\n ? localRef\n : (await gitRefExists(repoDir, remoteRef))\n ? remoteRef\n : undefined;\n const dirtyPaths: string[] = [];\n\n for (const gitPath of safeDirtyPaths) {\n const absolutePath = path.join(repoDir, ...gitPath.split('/'));\n if (!existsSync(absolutePath)) {\n if ((await readGitText(repoDir, comparisonRef, gitPath)) !== undefined) {\n dirtyPaths.push(gitPath);\n }\n continue;\n }\n\n const localContent = readFileSync(absolutePath, 'utf8');\n const branchContent = await readGitText(repoDir, comparisonRef, gitPath);\n if (branchContent === undefined || localContent !== branchContent) {\n dirtyPaths.push(gitPath);\n }\n }\n\n return { dirtyPaths: dirtyPaths.sort(), conflictedPaths };\n}\n\nasync function inspectResultsStorageBranchGit(\n repoDir: string,\n config: NormalizedResultsConfig,\n): Promise<ResultsRepoGitInspection> {\n if (!config.branch) {\n return {\n syncStatus: 'clean',\n dirtyPaths: [],\n conflictedPaths: [],\n };\n }\n const localRef = `refs/heads/${config.branch}`;\n const upstream = remoteBranchRef(config.branch, config.remote);\n const localExists = await gitRefExists(repoDir, localRef);\n const remoteExists = await gitRefExists(repoDir, upstream);\n const worktree = await getStorageBranchWorktreeDirtyPaths(repoDir, {\n ...config,\n branch: config.branch,\n });\n const { ahead = 0, behind = 0 } =\n localExists && remoteExists\n ? await getAheadBehindForRefs(repoDir, localRef, upstream)\n : {\n ahead: localExists && !remoteExists ? 1 : 0,\n behind: !localExists && remoteExists ? 1 : 0,\n };\n\n let syncStatus: ResultsRepoSyncStatus = 'clean';\n if (worktree.conflictedPaths.length > 0) {\n syncStatus = 'conflicted';\n } else if (worktree.dirtyPaths.length > 0) {\n syncStatus = 'dirty';\n } else if (ahead > 0 && behind > 0) {\n syncStatus = 'diverged';\n } else if (behind > 0) {\n syncStatus = 'behind';\n } else if (ahead > 0) {\n syncStatus = 'ahead';\n }\n\n return {\n syncStatus,\n branch: config.branch,\n ...(remoteExists && { upstream }),\n ahead,\n behind,\n dirtyPaths: worktree.dirtyPaths,\n conflictedPaths: worktree.conflictedPaths,\n };\n}\n\nasync function fastForwardStorageBranchRef(\n repoDir: string,\n normalized: StorageBranchResultsConfig,\n upstream: string,\n): Promise<void> {\n await assertValidResultsBranchName(repoDir, normalized.branch);\n await ensureResultsBranchNotCheckedOut(repoDir, normalized);\n\n const localRef = `refs/heads/${normalized.branch}`;\n const localExists = await gitRefExists(repoDir, localRef);\n const updateArgs = ['update-ref', localRef, upstream];\n if (localExists) {\n const { stdout: localSha } = await runGit(['rev-parse', localRef], { cwd: repoDir });\n updateArgs.push(localSha.trim());\n }\n await runGit(updateArgs, { cwd: repoDir });\n await runGit(['branch', '--set-upstream-to', upstream, normalized.branch], {\n cwd: repoDir,\n check: false,\n });\n}\n\nasync function getDirtyPathsChangedUpstream(\n repoDir: string,\n normalized: StorageBranchResultsConfig,\n dirtyPaths: readonly string[],\n upstream: string,\n): Promise<string[]> {\n const safeDirtyPaths = [...new Set(dirtyPaths.filter(isSafeResultsRepoPath))].sort();\n if (safeDirtyPaths.length === 0) {\n return [];\n }\n\n const localRef = `refs/heads/${normalized.branch}`;\n const localExists = await gitRefExists(repoDir, localRef);\n let changedPaths: string[];\n if (localExists) {\n const { stdout } = await runGit(['diff', '--name-only', `${localRef}..${upstream}`], {\n cwd: repoDir,\n check: false,\n });\n changedPaths = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .filter(isSafeResultsRepoPath)\n .sort();\n } else {\n changedPaths = [];\n for (const dirtyPath of safeDirtyPaths) {\n if ((await readGitText(repoDir, upstream, dirtyPath)) !== undefined) {\n changedPaths.push(dirtyPath);\n }\n }\n }\n\n const dirtySet = new Set(safeDirtyPaths);\n return [...new Set(changedPaths.filter((changedPath) => dirtySet.has(changedPath)))].sort();\n}\n\nasync function hasInProgressGitConflict(repoDir: string): Promise<boolean> {\n const markers = ['MERGE_HEAD', 'CHERRY_PICK_HEAD', 'REVERT_HEAD', 'REBASE_HEAD'];\n for (const marker of markers) {\n const { stdout } = await runGit(['rev-parse', '--git-path', marker], {\n cwd: repoDir,\n check: false,\n });\n const markerPath = stdout.trim();\n const resolvedMarkerPath = path.isAbsolute(markerPath)\n ? markerPath\n : path.join(repoDir, markerPath);\n if (markerPath && existsSync(resolvedMarkerPath)) {\n return true;\n }\n }\n return false;\n}\n\nasync function buildGitDiffSummary(\n repoDir: string,\n upstream: string | undefined,\n): Promise<string | undefined> {\n const summaries: string[] = [];\n for (const args of [\n ['diff', '--stat'],\n ['diff', '--cached', '--stat'],\n ...(upstream ? ([['diff', '--stat', `${upstream}..HEAD`]] as string[][]) : []),\n ]) {\n const { stdout } = await runGit(args, { cwd: repoDir, check: false });\n const summary = stdout.trim();\n if (summary) {\n summaries.push(summary);\n }\n }\n\n return summaries.length > 0 ? summaries.join('\\n') : undefined;\n}\n\nasync function inspectResultsRepoGit(\n repoDir: string,\n config?: NormalizedResultsConfig,\n): Promise<ResultsRepoGitInspection> {\n const branch = await getCurrentBranch(repoDir);\n const upstream = await resolveComparisonRef(repoDir, config);\n const { stdout: porcelain } = await runGit(\n ['status', '--porcelain=v1', '--untracked-files=all'],\n {\n cwd: repoDir,\n check: false,\n },\n );\n const { stdout: shortStatus } = await runGit(['status', '--short', '--branch'], {\n cwd: repoDir,\n check: false,\n });\n const { dirtyPaths: allDirtyPaths, conflictedPaths } = parseGitPorcelainPaths(porcelain);\n const dirtyPaths = allDirtyPaths.filter(isSafeResultsRepoPath);\n const { ahead = 0, behind = 0 } = await getAheadBehind(repoDir, upstream);\n const inProgressConflict = await hasInProgressGitConflict(repoDir);\n\n let syncStatus: ResultsRepoSyncStatus = 'clean';\n if (conflictedPaths.length > 0 || inProgressConflict) {\n syncStatus = 'conflicted';\n } else if (dirtyPaths.length > 0) {\n syncStatus = 'dirty';\n } else if (ahead > 0 && behind > 0) {\n syncStatus = 'diverged';\n } else if (behind > 0) {\n syncStatus = 'behind';\n } else if (ahead > 0) {\n syncStatus = 'ahead';\n }\n\n return {\n syncStatus,\n branch,\n upstream,\n ahead,\n behind,\n dirtyPaths,\n conflictedPaths,\n gitStatus: shortStatus.trim() || undefined,\n gitDiffSummary: await buildGitDiffSummary(repoDir, upstream),\n };\n}\n\nfunction withGitInspection(\n status: ResultsRepoStatus,\n inspection: ResultsRepoGitInspection,\n): ResultsRepoStatus {\n return {\n ...status,\n sync_status: inspection.syncStatus,\n branch: inspection.branch,\n upstream: inspection.upstream,\n ahead: inspection.ahead,\n behind: inspection.behind,\n dirty_paths: inspection.dirtyPaths,\n conflicted_paths: inspection.conflictedPaths,\n git_status: inspection.gitStatus,\n git_diff_summary: inspection.gitDiffSummary,\n last_error: lastErrorForGitInspection(status, inspection),\n };\n}\n\nfunction lastErrorForGitInspection(\n status: ResultsRepoStatus,\n inspection: ResultsRepoGitInspection,\n): string | undefined {\n if (inspection.syncStatus === 'conflicted') {\n return 'Results repo has unresolved git conflicts';\n }\n\n if (inspection.syncStatus === 'diverged') {\n return 'Results repo local and remote histories have diverged';\n }\n\n if (inspection.syncStatus === 'dirty') {\n if (status.auto_push === false) {\n return 'Results repo has uncommitted changes and auto_push is disabled';\n }\n }\n\n return undefined;\n}\n\ntype ResultsBranchPushDetails = {\n readonly pushConflictPolicy: ResultPushConflictPolicy;\n readonly targetBranch: string;\n readonly remoteCommit?: string;\n readonly localCommit?: string;\n readonly backupRef?: string;\n readonly backupCommit?: string;\n readonly previousRemoteCommit?: string;\n readonly forcePushedCommit?: string;\n readonly leaseCommit?: string;\n};\n\ntype ResultsBranchPushOutcome =\n | {\n readonly blocked: false;\n readonly details?: ResultsBranchPushDetails;\n }\n | {\n readonly blocked: true;\n readonly blockReason: string;\n readonly details: ResultsBranchPushDetails;\n };\n\nclass ResultsBranchPushConflictError extends Error {\n constructor(readonly result: DirectPushResultsResult) {\n super(result.block_reason ?? 'Results branch push conflict');\n this.name = 'ResultsBranchPushConflictError';\n }\n}\n\nfunction pushDetailsToWire(\n details?: ResultsBranchPushDetails,\n): Pick<\n ResultsRepoStatus,\n | 'push_conflict_policy'\n | 'target_branch'\n | 'remote_commit'\n | 'local_commit'\n | 'backup_ref'\n | 'backup_commit'\n | 'previous_remote_commit'\n | 'force_pushed_commit'\n | 'lease_commit'\n> {\n if (!details) {\n return {};\n }\n return {\n push_conflict_policy: details.pushConflictPolicy,\n target_branch: details.targetBranch,\n ...(details.remoteCommit !== undefined && { remote_commit: details.remoteCommit }),\n ...(details.localCommit !== undefined && { local_commit: details.localCommit }),\n ...(details.backupRef !== undefined && { backup_ref: details.backupRef }),\n ...(details.backupCommit !== undefined && { backup_commit: details.backupCommit }),\n ...(details.previousRemoteCommit !== undefined && {\n previous_remote_commit: details.previousRemoteCommit,\n }),\n ...(details.forcePushedCommit !== undefined && {\n force_pushed_commit: details.forcePushedCommit,\n }),\n ...(details.leaseCommit !== undefined && { lease_commit: details.leaseCommit }),\n };\n}\n\nfunction withBlockedStatus(\n status: ResultsRepoStatus,\n blockReason: string,\n flags?: {\n readonly pullPerformed?: boolean;\n readonly pushPerformed?: boolean;\n readonly commitCreated?: boolean;\n readonly pushDetails?: ResultsBranchPushDetails;\n },\n): ResultsRepoStatus {\n return {\n ...status,\n ...pushDetailsToWire(flags?.pushDetails),\n blocked: true,\n block_reason: blockReason,\n ...(flags?.pullPerformed !== undefined && { pull_performed: flags.pullPerformed }),\n ...(flags?.pushPerformed !== undefined && { push_performed: flags.pushPerformed }),\n ...(flags?.commitCreated !== undefined && { commit_created: flags.commitCreated }),\n };\n}\n\nfunction withPushConflictStatus(\n status: ResultsRepoStatus,\n blockReason: string,\n details: ResultsBranchPushDetails,\n flags: {\n readonly pullPerformed: boolean;\n readonly pushPerformed: boolean;\n readonly commitCreated: boolean;\n },\n): ResultsRepoStatus {\n return withBlockedStatus(\n {\n ...status,\n sync_status: 'push_conflict',\n },\n blockReason,\n {\n ...flags,\n pushDetails: details,\n },\n );\n}\n\nfunction withActionFlags(\n status: ResultsRepoStatus,\n flags: {\n readonly pullPerformed: boolean;\n readonly pushPerformed: boolean;\n readonly commitCreated: boolean;\n readonly pushDetails?: ResultsBranchPushDetails;\n },\n): ResultsRepoStatus {\n return {\n ...status,\n ...pushDetailsToWire(flags.pushDetails),\n blocked: false,\n pull_performed: flags.pullPerformed,\n push_performed: flags.pushPerformed,\n commit_created: flags.commitCreated,\n };\n}\n\nfunction isSafeResultsRepoPath(p: string): boolean {\n return RESULTS_REPO_TRACKED_DIRS.some((dir) => p === dir || p.startsWith(`${dir}/`));\n}\n\n// git errors on a pathspec that matches nothing, so when staging AgentV's result\n// trees we only pass the ones that currently exist on disk or in the index. A run\n// commit may have no tag overlays yet (no `metadata/`), and vice versa.\nasync function existingTrackedResultsDirs(repoDir: string): Promise<string[]> {\n const targets: string[] = [];\n for (const dir of RESULTS_REPO_TRACKED_DIRS) {\n if (existsSync(path.join(repoDir, dir))) {\n targets.push(dir);\n continue;\n }\n const { stdout } = await runGit(['ls-files', '--', dir], { cwd: repoDir, check: false });\n if (stdout.trim().length > 0) {\n targets.push(dir);\n }\n }\n return targets;\n}\n\nfunction areSafeResultsRepoPaths(paths: readonly string[]): boolean {\n return paths.length > 0 && paths.every(isSafeResultsRepoPath);\n}\n\nasync function getAheadPaths(\n repoDir: string,\n upstream: string | undefined,\n branch = 'HEAD',\n): Promise<readonly string[]> {\n if (!upstream) {\n return [];\n }\n const { stdout } = await runGit(['diff', '--name-only', `${upstream}..${branch}`], {\n cwd: repoDir,\n check: false,\n });\n return stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .sort();\n}\n\nfunction getPushTargetBranch(\n upstream: string | undefined,\n baseBranch: string,\n remote = 'origin',\n): string {\n const prefix = `${remote}/`;\n return upstream?.startsWith(prefix) ? upstream.slice(prefix.length) : baseBranch;\n}\n\nfunction timestampForBackupRef(date = new Date()): string {\n const pad = (value: number) => String(value).padStart(2, '0');\n return `${date.getUTCFullYear()}${pad(date.getUTCMonth() + 1)}${pad(date.getUTCDate())}T${pad(\n date.getUTCHours(),\n )}${pad(date.getUTCMinutes())}${pad(date.getUTCSeconds())}Z`;\n}\n\nfunction slugifyBackupTargetBranch(branch: string): string {\n return (\n branch\n .trim()\n .replace(/[^A-Za-z0-9._-]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'results'\n );\n}\n\nfunction buildResultsBackupRef(targetBranch: string, remoteCommit: string): string {\n return `agentv/backups/${timestampForBackupRef()}-${slugifyBackupTargetBranch(\n targetBranch,\n )}-${remoteCommit.slice(0, 7)}`;\n}\n\nasync function getCommitSha(repoDir: string, ref: string | undefined): Promise<string | undefined> {\n if (!ref) {\n return undefined;\n }\n const { stdout } = await runGit(['rev-parse', '--verify', `${ref}^{commit}`], {\n cwd: repoDir,\n check: false,\n });\n const sha = stdout.trim();\n return sha.length > 0 ? sha : undefined;\n}\n\nfunction isNonFastForwardPushError(error: unknown): boolean {\n const text = gitErrorText(error);\n return (\n text.includes('non-fast-forward') ||\n text.includes('fetch first') ||\n text.includes('tip is behind its remote') ||\n text.includes('note about fast-forwards') ||\n text.includes('stale info')\n );\n}\n\nfunction formatShortSha(sha: string | undefined): string {\n return sha ? sha.slice(0, 12) : 'unknown';\n}\n\nfunction buildBlockedPushConflictReason(details: ResultsBranchPushDetails): string {\n return `Results branch push conflict on ${details.targetBranch}: remote ${formatShortSha(\n details.remoteCommit,\n )}, local ${formatShortSha(details.localCommit)}. Configure results.sync.push_conflict_policy: backup_and_force_push to back up the remote ref before replacing it.`;\n}\n\nasync function resolveResultBranchPushConflict(params: {\n readonly normalized: StorageBranchResultsConfig;\n readonly repoDir: string;\n readonly targetBranch: string;\n readonly sourceRef: string;\n}): Promise<ResultsBranchPushOutcome> {\n await fetchResultsRepo(params.repoDir, params.normalized.remote, params.targetBranch);\n const remoteRef = remoteBranchRef(params.targetBranch, params.normalized.remote);\n const remoteCommit = await getCommitSha(params.repoDir, remoteRef);\n const localCommit = await getCommitSha(params.repoDir, params.sourceRef);\n const baseDetails: ResultsBranchPushDetails = {\n pushConflictPolicy: params.normalized.push_conflict_policy,\n targetBranch: params.targetBranch,\n ...(remoteCommit !== undefined && {\n remoteCommit,\n previousRemoteCommit: remoteCommit,\n leaseCommit: remoteCommit,\n }),\n ...(localCommit !== undefined && { localCommit }),\n };\n\n if (!remoteCommit) {\n return {\n blocked: true,\n blockReason: `Results branch push conflict on ${params.targetBranch}: remote commit could not be resolved after fetch`,\n details: baseDetails,\n };\n }\n\n if (params.normalized.push_conflict_policy === 'block') {\n return {\n blocked: true,\n blockReason: buildBlockedPushConflictReason(baseDetails),\n details: baseDetails,\n };\n }\n\n const backupRef = buildResultsBackupRef(params.targetBranch, remoteCommit);\n const backupDetails: ResultsBranchPushDetails = {\n ...baseDetails,\n backupRef,\n backupCommit: remoteCommit,\n };\n\n try {\n await assertValidResultsBranchName(params.repoDir, backupRef);\n await runGit(\n ['push', '--porcelain', params.normalized.remote, `${remoteCommit}:refs/heads/${backupRef}`],\n { cwd: params.repoDir },\n );\n } catch (error) {\n return {\n blocked: true,\n blockReason: `Results branch backup creation failed for ${params.targetBranch} at ${formatShortSha(\n remoteCommit,\n )}: ${getStatusMessage(error)}`,\n details: backupDetails,\n };\n }\n\n try {\n await runGit(\n [\n 'push',\n '--porcelain',\n `--force-with-lease=refs/heads/${params.targetBranch}:${remoteCommit}`,\n params.normalized.remote,\n `${params.sourceRef}:refs/heads/${params.targetBranch}`,\n ],\n { cwd: params.repoDir },\n );\n } catch (error) {\n return {\n blocked: true,\n blockReason: `Results branch force push lease failed for ${params.targetBranch}; remote changed after backup ${backupRef} was created with lease ${formatShortSha(\n remoteCommit,\n )}: ${getStatusMessage(error)}`,\n details: backupDetails,\n };\n }\n\n return {\n blocked: false,\n details: {\n ...backupDetails,\n ...(localCommit !== undefined && { forcePushedCommit: localCommit }),\n },\n };\n}\n\nasync function statusFromInspection(\n normalized: NormalizedResultsConfig,\n repoDir: string,\n): Promise<ResultsRepoStatus> {\n return withGitInspection(\n getResultsRepoStatus(normalized),\n await inspectResultsRepoGit(repoDir, normalized),\n );\n}\n\nexport async function getResultsRepoSyncStatus(config?: ResultsConfig): Promise<ResultsRepoStatus> {\n const baseStatus = getResultsRepoStatus(config);\n if (!config) {\n return baseStatus;\n }\n\n const normalized = normalizeResultsConfig(config);\n if (activeResultsRepoSyncs.has(normalized.path)) {\n return {\n ...baseStatus,\n sync_status: 'syncing',\n };\n }\n\n if (!existsSync(normalized.path) || !(await isGitRepository(normalized.path))) {\n return {\n ...baseStatus,\n sync_status: 'unavailable',\n };\n }\n\n try {\n await ensureResultsRepoRemote(normalized.path, normalized);\n if (usesStorageBranchWorktree(normalized)) {\n await fetchResultsRepo(normalized.path, normalized.remote, normalized.branch).catch(\n () => undefined,\n );\n return withGitInspection(\n baseStatus,\n await inspectResultsStorageBranchGit(normalized.path, normalized),\n );\n }\n if (normalized.branch) {\n await fetchResultsRepo(normalized.path, normalized.remote, normalized.branch).catch(\n () => undefined,\n );\n await checkoutConfiguredResultsBranch(normalized.path, normalized);\n }\n return withGitInspection(baseStatus, await inspectResultsRepoGit(normalized.path, normalized));\n } catch (error) {\n return {\n ...baseStatus,\n ...(normalized.branch ? { available: false } : {}),\n sync_status: 'unavailable',\n last_error: getStatusMessage(error),\n };\n }\n}\n\nexport async function syncResultsRepo(config: ResultsConfig): Promise<ResultsRepoStatus> {\n const normalized = normalizeResultsConfig(config);\n\n try {\n const repoDir = await ensureResultsRepoClone(normalized);\n await fetchResultsRepo(repoDir, normalized.remote, normalized.branch);\n if (!usesStorageBranchWorktree(normalized)) {\n await checkoutConfiguredResultsBranch(repoDir, normalized);\n }\n updateStatusFile(normalized, {\n last_synced_at: new Date().toISOString(),\n last_error: undefined,\n });\n } catch (error) {\n updateStatusFile(normalized, {\n last_error: withFriendlyGitHubAuthError(error).message,\n });\n throw withFriendlyGitHubAuthError(error);\n }\n\n return getResultsRepoStatus(normalized);\n}\n\nfunction getStatusMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nexport async function syncResultsRepoForProject(config: ResultsConfig): Promise<ResultsRepoStatus> {\n const normalized = normalizeResultsConfig(config);\n const syncKey = normalized.path;\n if (activeResultsRepoSyncs.has(syncKey)) {\n return {\n ...(await getResultsRepoSyncStatus(normalized)),\n sync_status: 'syncing',\n blocked: true,\n block_reason: 'Results repo sync is already in progress',\n };\n }\n\n activeResultsRepoSyncs.add(syncKey);\n let pullPerformed = false;\n let pushPerformed = false;\n let commitCreated = false;\n let pushDetails: ResultsBranchPushDetails | undefined;\n\n try {\n const repoDir = await ensureResultsRepoClone(normalized);\n if (usesStorageBranchWorktree(normalized)) {\n try {\n await fetchResultsRepo(repoDir, normalized.remote, normalized.branch);\n } catch (error) {\n if (normalized.require_push) {\n throw error;\n }\n }\n let inspection = await inspectResultsStorageBranchGit(repoDir, normalized);\n const fastForwardBehindStorageBranch = async (): Promise<ResultsRepoStatus | undefined> => {\n if ((inspection.behind ?? 0) <= 0 || (inspection.ahead ?? 0) > 0) {\n return undefined;\n }\n\n if (!inspection.upstream) {\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n updateStatusFile(normalized, {\n last_error: 'Results repo has no upstream branch to pull from',\n });\n return withBlockedStatus(status, 'Results repo has no upstream branch to pull from', {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n\n if (!normalized.branch) {\n return undefined;\n }\n\n try {\n await fastForwardStorageBranchRef(\n repoDir,\n { ...normalized, branch: normalized.branch },\n inspection.upstream,\n );\n pullPerformed = true;\n inspection = await inspectResultsStorageBranchGit(repoDir, normalized);\n return undefined;\n } catch (error) {\n inspection = await inspectResultsStorageBranchGit(repoDir, normalized);\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n const reason = `Results repo could not be fast-forwarded: ${getStatusMessage(error)}`;\n updateStatusFile(normalized, { last_error: reason });\n return withBlockedStatus(status, reason, {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n };\n\n if (inspection.syncStatus === 'conflicted') {\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n updateStatusFile(normalized, {\n last_error: 'Results repo has unresolved git conflicts',\n });\n return withBlockedStatus(status, 'Results repo has unresolved git conflicts', {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n\n if ((inspection.ahead ?? 0) > 0 && (inspection.behind ?? 0) > 0) {\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n if (!normalized.branch) {\n updateStatusFile(normalized, {\n last_error: 'Results repo local and remote histories have diverged',\n });\n return withBlockedStatus(\n status,\n 'Results repo local and remote histories have diverged',\n {\n pullPerformed,\n pushPerformed,\n commitCreated,\n },\n );\n }\n const localRef = `refs/heads/${normalized.branch}`;\n const aheadPaths = await getAheadPaths(repoDir, inspection.upstream, localRef);\n if (!inspection.upstream || !areSafeResultsRepoPaths(aheadPaths)) {\n const reason = !inspection.upstream\n ? 'Results repo has no upstream branch to push to'\n : 'Results repo has non-results committed changes';\n updateStatusFile(normalized, { last_error: reason });\n return withBlockedStatus(status, reason, {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n const outcome = await resolveResultBranchPushConflict({\n normalized: { ...normalized, branch: normalized.branch },\n repoDir,\n targetBranch: normalized.branch,\n sourceRef: localRef,\n });\n pushDetails = outcome.details;\n if (outcome.blocked) {\n updateStatusFile(normalized, { last_error: outcome.blockReason });\n return withPushConflictStatus(status, outcome.blockReason, outcome.details, {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n pushPerformed = true;\n await fetchResultsRepo(repoDir, normalized.remote, normalized.branch).catch(\n () => undefined,\n );\n inspection = await inspectResultsStorageBranchGit(repoDir, normalized);\n }\n\n if (inspection.syncStatus === 'dirty') {\n if (!normalized.auto_push && !normalized.require_push) {\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n updateStatusFile(normalized, {\n last_error: 'Results repo has uncommitted changes and auto_push is disabled',\n });\n return withBlockedStatus(\n status,\n 'Results repo has uncommitted changes and auto_push is disabled',\n {\n pullPerformed,\n pushPerformed,\n commitCreated,\n },\n );\n }\n\n if ((inspection.behind ?? 0) > 0) {\n if (inspection.upstream && normalized.branch) {\n const changedDirtyPaths = await getDirtyPathsChangedUpstream(\n repoDir,\n { ...normalized, branch: normalized.branch },\n inspection.dirtyPaths,\n inspection.upstream,\n );\n if (changedDirtyPaths.length > 0) {\n const conflictInspection: ResultsRepoGitInspection = {\n ...inspection,\n syncStatus: 'conflicted',\n conflictedPaths: [\n ...new Set([...inspection.conflictedPaths, ...changedDirtyPaths]),\n ].sort(),\n };\n const status = withGitInspection(\n getResultsRepoStatus(normalized),\n conflictInspection,\n );\n const reason = `Results repo local metadata changes conflict with upstream changes: ${changedDirtyPaths.join(', ')}`;\n updateStatusFile(normalized, { last_error: reason });\n return withBlockedStatus(status, reason, {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n }\n const blockedStatus = await fastForwardBehindStorageBranch();\n if (blockedStatus) {\n return blockedStatus;\n }\n }\n\n if (normalized.branch) {\n commitCreated = await commitStorageBranchWorktreePaths({\n normalized: { ...normalized, branch: normalized.branch },\n repoDir,\n paths: inspection.dirtyPaths,\n commitMessage: 'chore(results): sync local result metadata',\n });\n inspection = await inspectResultsStorageBranchGit(repoDir, normalized);\n }\n }\n\n if ((inspection.behind ?? 0) > 0 && (inspection.ahead ?? 0) === 0) {\n const blockedStatus = await fastForwardBehindStorageBranch();\n if (blockedStatus) {\n return blockedStatus;\n }\n }\n\n if (normalized.auto_push || normalized.require_push) {\n if (normalized.branch) {\n const localRef = `refs/heads/${normalized.branch}`;\n if (await gitRefExists(repoDir, localRef)) {\n try {\n await runGit(\n [\n 'push',\n '--porcelain',\n normalized.remote,\n `${localRef}:refs/heads/${normalized.branch}`,\n ],\n { cwd: repoDir },\n );\n pushPerformed = true;\n await fetchResultsRepo(repoDir, normalized.remote, normalized.branch).catch(\n () => undefined,\n );\n } catch (error) {\n if (isNonFastForwardPushError(error)) {\n const outcome = await resolveResultBranchPushConflict({\n normalized: { ...normalized, branch: normalized.branch },\n repoDir,\n targetBranch: normalized.branch,\n sourceRef: localRef,\n });\n pushDetails = outcome.details;\n if (!outcome.blocked) {\n pushPerformed = true;\n await fetchResultsRepo(repoDir, normalized.remote, normalized.branch).catch(\n () => undefined,\n );\n inspection = await inspectResultsStorageBranchGit(repoDir, normalized);\n } else {\n updateStatusFile(normalized, { last_error: outcome.blockReason });\n const status = withGitInspection(\n getResultsRepoStatus(normalized),\n await inspectResultsStorageBranchGit(repoDir, normalized),\n );\n return withPushConflictStatus(status, outcome.blockReason, outcome.details, {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n } else {\n updateStatusFile(normalized, { last_error: getStatusMessage(error) });\n if (normalized.require_push) {\n throw error;\n }\n const status = withGitInspection(\n getResultsRepoStatus(normalized),\n await inspectResultsStorageBranchGit(repoDir, normalized),\n );\n return withBlockedStatus(\n status,\n `Results repo push was rejected: ${getStatusMessage(error)}`,\n {\n pullPerformed,\n pushPerformed,\n commitCreated,\n },\n );\n }\n }\n }\n }\n }\n updateStatusFile(normalized, {\n last_synced_at: new Date().toISOString(),\n last_error: undefined,\n });\n const status = withGitInspection(\n getResultsRepoStatus(normalized),\n await inspectResultsStorageBranchGit(repoDir, normalized),\n );\n return withActionFlags(status, { pullPerformed, pushPerformed, commitCreated, pushDetails });\n }\n await fetchResultsRepo(repoDir, normalized.remote, normalized.branch);\n await checkoutConfiguredResultsBranch(repoDir, normalized);\n let inspection = await inspectResultsRepoGit(repoDir, normalized);\n\n if (inspection.syncStatus === 'conflicted') {\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n updateStatusFile(normalized, {\n last_error: 'Results repo has unresolved git conflicts',\n });\n return withBlockedStatus(status, 'Results repo has unresolved git conflicts', {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n\n if (inspection.syncStatus === 'dirty') {\n if (!normalized.auto_push) {\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n updateStatusFile(normalized, {\n last_error: 'Results repo has uncommitted changes and auto_push is disabled',\n });\n return withBlockedStatus(\n status,\n 'Results repo has uncommitted changes and auto_push is disabled',\n {\n pullPerformed,\n pushPerformed,\n commitCreated,\n },\n );\n }\n\n if ((inspection.behind ?? 0) > 0) {\n if (!inspection.upstream) {\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n updateStatusFile(normalized, {\n last_error: 'Results repo has no upstream branch to pull from',\n });\n return withBlockedStatus(status, 'Results repo has no upstream branch to pull from', {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n\n try {\n await runGit(['merge', '--ff-only', inspection.upstream], { cwd: repoDir });\n pullPerformed = true;\n inspection = await inspectResultsRepoGit(repoDir, normalized);\n } catch (error) {\n inspection = await inspectResultsRepoGit(repoDir, normalized);\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n const reason = `Results repo could not be fast-forwarded: ${getStatusMessage(error)}`;\n updateStatusFile(normalized, { last_error: reason });\n return withBlockedStatus(status, reason, {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n }\n\n if (inspection.syncStatus === 'dirty') {\n const trackedDirs = await existingTrackedResultsDirs(repoDir);\n await runGit(['add', '--all', '--', ...trackedDirs], { cwd: repoDir });\n await runGitWithFallbackCommitIdentity(\n ['commit', '-m', 'chore(results): sync local result metadata', '--', ...trackedDirs],\n {\n cwd: repoDir,\n },\n );\n commitCreated = true;\n inspection = await inspectResultsRepoGit(repoDir, normalized);\n }\n }\n\n if (inspection.syncStatus === 'diverged') {\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n const aheadPaths = await getAheadPaths(repoDir, inspection.upstream);\n if (!inspection.upstream || !areSafeResultsRepoPaths(aheadPaths)) {\n const reason = !inspection.upstream\n ? 'Results repo has no upstream branch to push to'\n : 'Results repo has non-results committed changes';\n updateStatusFile(normalized, { last_error: reason });\n return withBlockedStatus(status, reason, {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n const baseBranch = normalized.branch ?? (await resolveDefaultBranch(repoDir));\n const targetBranch = getPushTargetBranch(inspection.upstream, baseBranch, normalized.remote);\n const outcome = await resolveResultBranchPushConflict({\n normalized: { ...normalized, branch: targetBranch },\n repoDir,\n targetBranch,\n sourceRef: 'HEAD',\n });\n pushDetails = outcome.details;\n if (outcome.blocked) {\n updateStatusFile(normalized, { last_error: outcome.blockReason });\n return withPushConflictStatus(status, outcome.blockReason, outcome.details, {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n pushPerformed = true;\n await fetchResultsRepo(repoDir, normalized.remote, normalized.branch);\n inspection = await inspectResultsRepoGit(repoDir, normalized);\n }\n\n if ((inspection.behind ?? 0) > 0 && (inspection.ahead ?? 0) === 0) {\n if (!inspection.upstream) {\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n updateStatusFile(normalized, {\n last_error: 'Results repo has no upstream branch to pull from',\n });\n return withBlockedStatus(status, 'Results repo has no upstream branch to pull from', {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n\n try {\n await runGit(['merge', '--ff-only', inspection.upstream], { cwd: repoDir });\n pullPerformed = true;\n inspection = await inspectResultsRepoGit(repoDir, normalized);\n } catch (error) {\n inspection = await inspectResultsRepoGit(repoDir, normalized);\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n const reason = `Results repo could not be fast-forwarded: ${getStatusMessage(error)}`;\n updateStatusFile(normalized, { last_error: reason });\n return withBlockedStatus(status, reason, {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n }\n\n if ((inspection.ahead ?? 0) > 0) {\n if (!normalized.auto_push) {\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n return withActionFlags(status, {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n\n const aheadPaths = await getAheadPaths(repoDir, inspection.upstream);\n if (!inspection.upstream || !areSafeResultsRepoPaths(aheadPaths)) {\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n const reason = !inspection.upstream\n ? 'Results repo has no upstream branch to push to'\n : 'Results repo has non-results committed changes';\n updateStatusFile(normalized, { last_error: reason });\n return withBlockedStatus(status, reason, {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n\n const baseBranch = normalized.branch ?? (await resolveDefaultBranch(repoDir));\n const targetBranch = getPushTargetBranch(inspection.upstream, baseBranch, normalized.remote);\n try {\n await runGit(['push', normalized.remote, `HEAD:${targetBranch}`], { cwd: repoDir });\n pushPerformed = true;\n await fetchResultsRepo(repoDir, normalized.remote, normalized.branch);\n inspection = await inspectResultsRepoGit(repoDir, normalized);\n } catch (error) {\n if (isNonFastForwardPushError(error)) {\n const outcome = await resolveResultBranchPushConflict({\n normalized: { ...normalized, branch: targetBranch },\n repoDir,\n targetBranch,\n sourceRef: 'HEAD',\n });\n pushDetails = outcome.details;\n if (!outcome.blocked) {\n pushPerformed = true;\n await fetchResultsRepo(repoDir, normalized.remote, normalized.branch);\n inspection = await inspectResultsRepoGit(repoDir, normalized);\n } else {\n await fetchResultsRepo(repoDir, normalized.remote, normalized.branch).catch(\n () => undefined,\n );\n inspection = await inspectResultsRepoGit(repoDir, normalized);\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n updateStatusFile(normalized, { last_error: outcome.blockReason });\n return withPushConflictStatus(status, outcome.blockReason, outcome.details, {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n } else {\n await fetchResultsRepo(repoDir, normalized.remote, normalized.branch).catch(\n () => undefined,\n );\n inspection = await inspectResultsRepoGit(repoDir, normalized);\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n const reason = `Results repo push was rejected: ${getStatusMessage(error)}`;\n updateStatusFile(normalized, { last_error: reason });\n return withBlockedStatus(status, reason, {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n }\n }\n\n updateStatusFile(normalized, {\n last_synced_at: new Date().toISOString(),\n last_error: undefined,\n });\n\n return withActionFlags(await statusFromInspection(normalized, repoDir), {\n pullPerformed,\n pushPerformed,\n commitCreated,\n pushDetails,\n });\n } catch (error) {\n updateStatusFile(normalized, {\n last_error: withFriendlyGitHubAuthError(error).message,\n });\n throw withFriendlyGitHubAuthError(error);\n } finally {\n activeResultsRepoSyncs.delete(syncKey);\n }\n}\n\nexport async function checkoutResultsRepoBranch(\n config: ResultsConfig,\n branchName: string,\n): Promise<CheckedOutResultsRepoBranch> {\n const normalized = normalizeResultsConfig(config);\n const repoDir = await ensureResultsRepoClone(normalized);\n const baseBranch = await resolveDefaultBranch(repoDir);\n await fetchResultsRepo(repoDir, normalized.remote);\n await runGit(['checkout', '-B', branchName, `${normalized.remote}/${baseBranch}`], {\n cwd: repoDir,\n });\n updateStatusFile(normalized, { last_error: undefined });\n return {\n branchName,\n baseBranch,\n repoDir,\n };\n}\n\nexport async function prepareResultsRepoBranch(\n config: ResultsConfig,\n branchName: string,\n): Promise<PreparedResultsRepoBranch> {\n const normalized = normalizeResultsConfig(config);\n const cloneDir = await ensureResultsRepoClone(normalized);\n const baseBranch = await resolveDefaultBranch(cloneDir);\n await fetchResultsRepo(cloneDir, normalized.remote);\n\n const worktreeRoot = await mkdtemp(path.join(os.tmpdir(), 'agentv-results-repo-'));\n const worktreeDir = path.join(worktreeRoot, 'repo');\n await runGit(\n ['worktree', 'add', '-B', branchName, worktreeDir, `${normalized.remote}/${baseBranch}`],\n {\n cwd: cloneDir,\n },\n );\n\n return {\n branchName,\n baseBranch,\n repoDir: worktreeDir,\n cleanup: async () => {\n try {\n await runGit(['worktree', 'remove', '--force', worktreeDir], { cwd: cloneDir });\n } finally {\n await rm(worktreeRoot, { recursive: true, force: true }).catch(() => undefined);\n }\n },\n };\n}\n\nexport async function stageResultsArtifacts(params: {\n readonly repoDir: string;\n readonly sourceDir: string;\n readonly destinationDir: string;\n}): Promise<void> {\n rmSync(params.destinationDir, { recursive: true, force: true });\n mkdirSync(path.dirname(params.destinationDir), { recursive: true });\n await cp(params.sourceDir, params.destinationDir, { recursive: true });\n}\n\nexport function resolveResultsRepoRunsDir(config: ResultsConfig): string {\n const normalized = normalizeResultsConfig(config);\n return path.join(normalized.path, RESULTS_REPO_RESULTS_DIR);\n}\n\nexport async function directorySizeBytes(targetPath: string): Promise<number> {\n const entry = await stat(targetPath);\n if (entry.isFile()) {\n return entry.size;\n }\n\n let total = 0;\n for (const child of await readdir(targetPath, { withFileTypes: true })) {\n total += await directorySizeBytes(path.join(targetPath, child.name));\n }\n return total;\n}\n\nexport async function commitAndPushResultsBranch(params: {\n readonly repoDir: string;\n readonly branchName: string;\n readonly commitMessage: string;\n}): Promise<boolean> {\n await runGit(['add', '--all'], { cwd: params.repoDir });\n\n const { stdout: diffStdout } = await runGit(['status', '--porcelain'], {\n cwd: params.repoDir,\n check: false,\n });\n if (diffStdout.trim().length === 0) {\n return false;\n }\n\n await runGitWithFallbackCommitIdentity(['commit', '-m', params.commitMessage], {\n cwd: params.repoDir,\n });\n await runGit(['push', '-u', 'origin', params.branchName], { cwd: params.repoDir });\n return true;\n}\n\nexport async function pushResultsRepoBranch(\n config: ResultsConfig,\n branchName: string,\n cwd?: string,\n): Promise<void> {\n const normalized = normalizeResultsConfig(config);\n await runGit(['push', '-u', normalized.remote, branchName], {\n cwd: cwd ?? normalized.path,\n });\n updateStatusFile(normalized, {\n last_synced_at: new Date().toISOString(),\n last_error: undefined,\n });\n}\n\nexport async function createDraftResultsPr(params: {\n readonly repo: string;\n readonly repoDir: string;\n readonly baseBranch: string;\n readonly branchName: string;\n readonly title: string;\n readonly body: string;\n}): Promise<string> {\n const { stdout } = await runGh(\n [\n 'pr',\n 'create',\n '--draft',\n '--repo',\n params.repo,\n '--base',\n params.baseBranch,\n '--head',\n params.branchName,\n '--title',\n params.title,\n '--body',\n params.body,\n ],\n { cwd: params.repoDir },\n );\n return stdout.trim();\n}\n\nasync function hasUnpushedCommits(\n repoDir: string,\n upstreamRef: string,\n branch: string,\n): Promise<boolean> {\n const { stdout } = await runGit(['rev-list', '--count', `${upstreamRef}..refs/heads/${branch}`], {\n cwd: repoDir,\n check: false,\n });\n return Number.parseInt(stdout.trim(), 10) > 0;\n}\n\nasync function assertValidResultsBranchName(repoDir: string, branch: string): Promise<void> {\n if (\n branch.length === 0 ||\n branch.includes('..') ||\n branch.startsWith('/') ||\n branch.endsWith('/') ||\n branch.endsWith('.lock') ||\n [...branch].some((char) => {\n const code = char.charCodeAt(0);\n return code <= 31 || code === 127;\n })\n ) {\n throw new Error(`Invalid results branch name: ${branch}`);\n }\n await runGit(['check-ref-format', '--branch', branch], { cwd: repoDir });\n}\n\nfunction normalizeDestinationPath(destinationPath: string): string {\n const normalized = destinationPath.split(path.sep).join('/');\n const segments = normalized.split('/').filter(Boolean);\n if (\n segments.length === 0 ||\n normalized.startsWith('/') ||\n segments.some((segment) => segment === '..') ||\n normalized.split('').some((char) => {\n const code = char.charCodeAt(0);\n return code <= 31 || code === 127;\n })\n ) {\n throw new Error(`Invalid results destination path: ${destinationPath}`);\n }\n return segments.join('/');\n}\n\nasync function listSourceFiles(sourceDir: string): Promise<string[]> {\n const entries: string[] = [];\n async function visit(dir: string): Promise<void> {\n for (const entry of await readdir(dir, { withFileTypes: true })) {\n const absolutePath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n await visit(absolutePath);\n } else if (entry.isFile() || entry.isSymbolicLink()) {\n entries.push(absolutePath);\n }\n }\n }\n await visit(sourceDir);\n entries.sort();\n return entries;\n}\n\ntype ArtifactSidecarPointer = {\n readonly path: string;\n readonly sha256?: string;\n readonly objectVersion?: string;\n};\n\ntype PreparedArtifactSidecar = {\n readonly sourceDir: string;\n readonly cleanup: () => Promise<void>;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction artifactSidecarPointers(record: unknown): ArtifactSidecarPointer[] {\n if (!isRecord(record) || !isRecord(record.artifact_pointers)) {\n return [];\n }\n\n const pointers: ArtifactSidecarPointer[] = [];\n for (const pointer of Object.values(record.artifact_pointers)) {\n if (!isRecord(pointer)) {\n continue;\n }\n if (pointer.ref !== AGENTV_RESULTS_ARTIFACTS_REF || typeof pointer.path !== 'string') {\n continue;\n }\n pointers.push({\n path: pointer.path,\n ...(typeof pointer.sha256 === 'string' ? { sha256: pointer.sha256 } : {}),\n ...(typeof pointer.object_version === 'string'\n ? { objectVersion: pointer.object_version }\n : {}),\n });\n }\n return pointers;\n}\n\nfunction artifactSidecarKey(destinationPath: string, pointerPath: string): string {\n return path.posix.join(\n RESULTS_REPO_RUNS_DIR,\n normalizeDestinationPath(destinationPath),\n normalizeDestinationPath(pointerPath),\n );\n}\n\nfunction collectArtifactSidecarPointers(sourceDir: string): ArtifactSidecarPointer[] {\n const indexPath = path.join(sourceDir, RESULT_INDEX_FILENAME);\n if (!existsSync(indexPath)) {\n return [];\n }\n\n const pointers: ArtifactSidecarPointer[] = [];\n for (const line of readFileSync(indexPath, 'utf8').split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed) {\n continue;\n }\n try {\n pointers.push(...artifactSidecarPointers(JSON.parse(trimmed)));\n } catch {}\n }\n return pointers;\n}\n\nfunction resolveArtifactPointerSourcePath(sourceDir: string, pointerPath: string): string {\n const normalizedPointerPath = normalizeDestinationPath(pointerPath);\n const sourceRoot = path.resolve(sourceDir);\n const sourcePath = path.resolve(sourceRoot, ...normalizedPointerPath.split('/'));\n const relative = path.relative(sourceRoot, sourcePath);\n if (relative.startsWith('..') || path.isAbsolute(relative)) {\n throw new Error(`Artifact pointer path escapes run directory: ${pointerPath}`);\n }\n return sourcePath;\n}\n\nfunction verifyArtifactPointerChecksum(pointer: ArtifactSidecarPointer, content: Buffer): void {\n const sha256 = createHash('sha256').update(content).digest('hex');\n if (pointer.sha256 && pointer.sha256 !== sha256) {\n throw new Error(`Artifact pointer checksum mismatch for ${pointer.path}`);\n }\n if (pointer.objectVersion && pointer.objectVersion !== `sha256:${sha256}`) {\n throw new Error(`Artifact pointer object_version mismatch for ${pointer.path}`);\n }\n}\n\nasync function prepareArtifactSidecar(params: {\n readonly sourceDir: string;\n readonly pointers: readonly ArtifactSidecarPointer[];\n}): Promise<PreparedArtifactSidecar | undefined> {\n if (params.pointers.length === 0) {\n return undefined;\n }\n\n const sidecarRoot = await mkdtemp(path.join(os.tmpdir(), 'agentv-artifact-sidecar-'));\n const copied = new Set<string>();\n const contentByPath = new Map<string, Buffer>();\n\n try {\n for (const pointer of params.pointers) {\n const relativePointerPath = normalizeDestinationPath(pointer.path);\n let content = contentByPath.get(relativePointerPath);\n if (!content) {\n const sourcePath = resolveArtifactPointerSourcePath(params.sourceDir, relativePointerPath);\n content = readFileSync(sourcePath);\n contentByPath.set(relativePointerPath, content);\n }\n verifyArtifactPointerChecksum(pointer, content);\n if (copied.has(relativePointerPath)) {\n continue;\n }\n const destinationPath = path.join(sidecarRoot, ...relativePointerPath.split('/'));\n mkdirSync(path.dirname(destinationPath), { recursive: true });\n writeFileSync(destinationPath, content);\n copied.add(relativePointerPath);\n }\n } catch (error) {\n await rm(sidecarRoot, { recursive: true, force: true }).catch(() => undefined);\n throw error;\n }\n\n if (copied.size === 0) {\n await rm(sidecarRoot, { recursive: true, force: true }).catch(() => undefined);\n return undefined;\n }\n\n return {\n sourceDir: sidecarRoot,\n cleanup: () => rm(sidecarRoot, { recursive: true, force: true }),\n };\n}\n\nfunction rewritePublishedIndexLine(line: string, destinationPath: string): string {\n if (!line.trim()) {\n return line;\n }\n\n let record: unknown;\n try {\n record = JSON.parse(line);\n } catch {\n return line;\n }\n\n if (!isRecord(record) || !isRecord(record.artifact_pointers)) {\n return line;\n }\n\n let changed = false;\n for (const pointer of Object.values(record.artifact_pointers)) {\n if (!isRecord(pointer)) {\n continue;\n }\n if (pointer.ref !== AGENTV_RESULTS_ARTIFACTS_REF || typeof pointer.path !== 'string') {\n continue;\n }\n const key = artifactSidecarKey(destinationPath, pointer.path);\n if (pointer.key !== key) {\n pointer.key = key;\n changed = true;\n }\n }\n\n return changed ? JSON.stringify(record) : line;\n}\n\nasync function preparePublishedResultsSource(params: {\n readonly sourceDir: string;\n readonly destinationPath: string;\n readonly pointers: readonly ArtifactSidecarPointer[];\n}): Promise<PreparedArtifactSidecar | undefined> {\n if (params.pointers.length === 0) {\n return undefined;\n }\n\n const publishedRoot = await mkdtemp(path.join(os.tmpdir(), 'agentv-results-published-'));\n const omittedPaths = new Set(\n params.pointers.map((pointer) => normalizeDestinationPath(pointer.path)),\n );\n\n try {\n const sourceFiles = await listSourceFiles(params.sourceDir);\n for (const sourceFile of sourceFiles) {\n const relativeFile = path.relative(params.sourceDir, sourceFile).split(path.sep).join('/');\n const destinationFile = path.join(publishedRoot, ...relativeFile.split('/'));\n if (relativeFile === RESULT_INDEX_FILENAME) {\n const original = readFileSync(sourceFile, 'utf8');\n const rewritten = original\n .split(/\\r?\\n/)\n .map((line) => rewritePublishedIndexLine(line, params.destinationPath))\n .join('\\n');\n mkdirSync(path.dirname(destinationFile), { recursive: true });\n writeFileSync(destinationFile, rewritten);\n continue;\n }\n if (omittedPaths.has(relativeFile)) {\n continue;\n }\n mkdirSync(path.dirname(destinationFile), { recursive: true });\n await cp(sourceFile, destinationFile, { dereference: false });\n }\n } catch (error) {\n await rm(publishedRoot, { recursive: true, force: true }).catch(() => undefined);\n throw error;\n }\n\n return {\n sourceDir: publishedRoot,\n cleanup: () => rm(publishedRoot, { recursive: true, force: true }),\n };\n}\n\nasync function getExistingRunTreePaths(\n repoDir: string,\n ref: string | undefined,\n destinationTreePath: string,\n): Promise<string[]> {\n if (!ref) {\n return [];\n }\n const { stdout } = await runGit(['ls-tree', '-r', '--name-only', ref, destinationTreePath], {\n cwd: repoDir,\n check: false,\n });\n return stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n}\n\nasync function resolveStorageBranchBase(params: {\n readonly repoDir: string;\n readonly normalized: StorageBranchResultsConfig;\n readonly preferRemote?: boolean;\n}): Promise<{\n readonly baseRef?: string;\n readonly baseCommit?: string;\n readonly baseTree?: string;\n readonly localRef: string;\n readonly localExists: boolean;\n readonly remoteRef: string;\n readonly remoteExists: boolean;\n}> {\n const localRef = `refs/heads/${params.normalized.branch}`;\n const remoteRef = `refs/remotes/${params.normalized.remote}/${params.normalized.branch}`;\n const localExists = await gitRefExists(params.repoDir, localRef);\n const remoteExists = await gitRefExists(params.repoDir, remoteRef);\n const baseRef = params.preferRemote\n ? remoteExists\n ? remoteRef\n : localExists\n ? localRef\n : undefined\n : localExists\n ? localRef\n : remoteExists\n ? remoteRef\n : undefined;\n const baseCommit = baseRef\n ? (\n await runGit(['rev-parse', `${baseRef}^{commit}`], {\n cwd: params.repoDir,\n })\n ).stdout.trim()\n : undefined;\n const baseTree = baseRef\n ? (\n await runGit(['rev-parse', `${baseRef}^{tree}`], {\n cwd: params.repoDir,\n })\n ).stdout.trim()\n : undefined;\n return { baseRef, baseCommit, baseTree, localRef, localExists, remoteRef, remoteExists };\n}\n\nasync function ensureResultsBranchNotCheckedOut(\n repoDir: string,\n normalized: StorageBranchResultsConfig,\n): Promise<void> {\n const currentBranch = await getCurrentBranch(repoDir);\n if (currentBranch !== normalized.branch) {\n return;\n }\n if (usesStorageBranchWorktree(normalized)) {\n throw new Error(\n `Refusing to publish results while '${normalized.branch}' is checked out in ${repoDir}`,\n );\n }\n await runGit(['checkout', '--detach'], { cwd: repoDir });\n}\n\nasync function commitStorageBranchWorktreePaths(params: {\n readonly normalized: StorageBranchResultsConfig;\n readonly repoDir: string;\n readonly paths: readonly string[];\n readonly commitMessage: string;\n}): Promise<boolean> {\n const { normalized } = params;\n const paths = [...new Set(params.paths.filter(isSafeResultsRepoPath))].sort();\n if (paths.length === 0) {\n return false;\n }\n\n await assertValidResultsBranchName(params.repoDir, normalized.branch);\n await ensureResultsBranchNotCheckedOut(params.repoDir, normalized);\n\n let base = await resolveStorageBranchBase({\n repoDir: params.repoDir,\n normalized,\n });\n if (!base.baseRef) {\n await createOrphanResultsBranch(params.repoDir, normalized.branch);\n base = await resolveStorageBranchBase({\n repoDir: params.repoDir,\n normalized,\n });\n }\n\n const indexRoot = await mkdtemp(path.join(os.tmpdir(), 'agentv-results-index-'));\n const indexFile = path.join(indexRoot, 'index');\n const indexEnv = { GIT_INDEX_FILE: indexFile };\n\n try {\n if (base.baseRef) {\n await runGit(['read-tree', base.baseRef], { cwd: params.repoDir, env: indexEnv });\n } else {\n await runGit(['read-tree', '--empty'], { cwd: params.repoDir, env: indexEnv });\n }\n\n for (const gitPath of paths) {\n const sourcePath = path.join(params.repoDir, ...gitPath.split('/'));\n if (!existsSync(sourcePath)) {\n await runGit(['update-index', '--force-remove', '--', gitPath], {\n cwd: params.repoDir,\n env: indexEnv,\n check: false,\n });\n continue;\n }\n\n const fileStat = await lstat(sourcePath);\n let mode = fileStat.mode & 0o111 ? '100755' : '100644';\n if (fileStat.isSymbolicLink()) {\n mode = '120000';\n }\n const { stdout: blob } = await runGit(['hash-object', '-w', '--no-filters', sourcePath], {\n cwd: params.repoDir,\n });\n await runGit(['update-index', '--add', '--cacheinfo', `${mode},${blob.trim()},${gitPath}`], {\n cwd: params.repoDir,\n env: indexEnv,\n });\n }\n\n const { stdout: newTreeStdout } = await runGit(['write-tree'], {\n cwd: params.repoDir,\n env: indexEnv,\n });\n const newTree = newTreeStdout.trim();\n if (base.baseTree && newTree === base.baseTree) {\n return false;\n }\n\n const commitArgs = [\n 'commit-tree',\n newTree,\n ...(base.baseCommit ? ['-p', base.baseCommit] : []),\n '-m',\n params.commitMessage,\n ];\n const { stdout: commitStdout } = await runGitWithFallbackCommitIdentity(commitArgs, {\n cwd: params.repoDir,\n });\n const commitSha = commitStdout.trim();\n await runGit(\n [\n 'update-ref',\n `refs/heads/${normalized.branch}`,\n commitSha,\n ...(base.localExists ? [base.baseCommit ?? ''] : []),\n ].filter(Boolean),\n { cwd: params.repoDir },\n );\n\n if (base.remoteExists) {\n await runGit(['branch', '--set-upstream-to', base.remoteRef, normalized.branch], {\n cwd: params.repoDir,\n check: false,\n });\n }\n\n return true;\n } finally {\n await rm(indexRoot, { recursive: true, force: true }).catch(() => undefined);\n }\n}\n\nasync function commitResultsRunWithTemporaryIndex(params: {\n readonly normalized: StorageBranchResultsConfig;\n readonly repoDir: string;\n readonly sourceDir: string;\n readonly destinationPath: string;\n readonly commitMessage: string;\n readonly targetRunId: string;\n readonly preferRemoteBase?: boolean;\n}): Promise<{\n readonly commitCreated: boolean;\n readonly branchUpdated: boolean;\n readonly upstreamRef?: string;\n}> {\n const { normalized } = params;\n await assertValidResultsBranchName(params.repoDir, normalized.branch);\n await ensureResultsBranchNotCheckedOut(params.repoDir, normalized);\n\n const destinationRunPath = normalizeDestinationPath(params.destinationPath);\n const destinationTreePath = path.posix.join(RESULTS_REPO_RUNS_DIR, destinationRunPath);\n let base = await resolveStorageBranchBase({\n repoDir: params.repoDir,\n normalized,\n preferRemote: params.preferRemoteBase,\n });\n\n // No local or remote tip exists yet (after fetching the branch by name): this\n // is the branch's very first commit. Root it at the deterministic empty-tree\n // genesis and parent the run commit on it, rather than letting the run commit\n // itself be the parentless root. This keeps the root SHA byte-identical across\n // clients, so independent first-inits converge on one genesis and reconcile by\n // fast-forward instead of producing divergent orphans.\n if (!base.baseRef) {\n await createOrphanResultsBranch(params.repoDir, normalized.branch);\n base = await resolveStorageBranchBase({\n repoDir: params.repoDir,\n normalized,\n preferRemote: params.preferRemoteBase,\n });\n }\n\n const indexRoot = await mkdtemp(path.join(os.tmpdir(), 'agentv-results-index-'));\n const indexFile = path.join(indexRoot, 'index');\n const indexEnv = { GIT_INDEX_FILE: indexFile };\n\n try {\n if (base.baseRef) {\n await runGit(['read-tree', base.baseRef], { cwd: params.repoDir, env: indexEnv });\n } else {\n await runGit(['read-tree', '--empty'], { cwd: params.repoDir, env: indexEnv });\n }\n\n const existingPaths = await getExistingRunTreePaths(\n params.repoDir,\n base.baseRef,\n destinationTreePath,\n );\n for (const existingPath of existingPaths) {\n await runGit(['update-index', '--force-remove', '--', existingPath], {\n cwd: params.repoDir,\n env: indexEnv,\n check: false,\n });\n }\n\n const sourceFiles = await listSourceFiles(params.sourceDir);\n for (const sourceFile of sourceFiles) {\n const relativeFile = path.relative(params.sourceDir, sourceFile).split(path.sep).join('/');\n const destinationFile = path.posix.join(destinationTreePath, relativeFile);\n const fileStat = await lstat(sourceFile);\n let mode = fileStat.mode & 0o111 ? '100755' : '100644';\n let hashInputPath = sourceFile;\n if (fileStat.isSymbolicLink()) {\n mode = '120000';\n hashInputPath = sourceFile;\n }\n const { stdout: blob } = await runGit(['hash-object', '-w', '--no-filters', hashInputPath], {\n cwd: params.repoDir,\n });\n await runGit(\n ['update-index', '--add', '--cacheinfo', `${mode},${blob.trim()},${destinationFile}`],\n {\n cwd: params.repoDir,\n env: indexEnv,\n },\n );\n }\n\n const { stdout: newTreeStdout } = await runGit(['write-tree'], {\n cwd: params.repoDir,\n env: indexEnv,\n });\n const newTree = newTreeStdout.trim();\n if (base.baseTree && newTree === base.baseTree) {\n return {\n commitCreated: false,\n branchUpdated: false,\n upstreamRef: base.remoteExists ? base.remoteRef : undefined,\n };\n }\n\n const commitArgs = [\n 'commit-tree',\n newTree,\n ...(base.baseCommit ? ['-p', base.baseCommit] : []),\n '-m',\n params.commitMessage,\n '-m',\n `AgentV-Run: ${params.targetRunId}`,\n ];\n const { stdout: commitStdout } = await runGitWithFallbackCommitIdentity(commitArgs, {\n cwd: params.repoDir,\n });\n const commitSha = commitStdout.trim();\n await runGit(\n [\n 'update-ref',\n `refs/heads/${normalized.branch}`,\n commitSha,\n ...(base.localExists && !params.preferRemoteBase ? [base.baseCommit ?? ''] : []),\n ].filter(Boolean),\n { cwd: params.repoDir },\n );\n\n if (base.remoteExists) {\n await runGit(['branch', '--set-upstream-to', base.remoteRef, normalized.branch], {\n cwd: params.repoDir,\n check: false,\n });\n }\n\n return {\n commitCreated: true,\n branchUpdated: true,\n upstreamRef: base.remoteExists ? base.remoteRef : undefined,\n };\n } finally {\n await rm(indexRoot, { recursive: true, force: true }).catch(() => undefined);\n }\n}\n\nfunction buildDirectPushResult(\n normalized: NormalizedResultsConfig,\n changed: boolean,\n outcome?: ResultsBranchPushOutcome,\n): DirectPushResultsResult {\n const details = outcome?.details;\n return {\n changed,\n push_conflict_policy: normalized.push_conflict_policy,\n ...(outcome?.blocked === true && {\n blocked: true,\n block_reason: outcome.blockReason,\n sync_status: 'push_conflict' as const,\n }),\n ...pushDetailsToWire(details),\n };\n}\n\nfunction mergeDirectPushResults(\n normalized: NormalizedResultsConfig,\n results: readonly DirectPushResultsResult[],\n): DirectPushResultsResult {\n const blocked = results.find((result) => result.blocked);\n if (blocked) {\n return blocked;\n }\n const detailed = [...results].reverse().find((result) => result.backup_ref !== undefined);\n return {\n changed: results.some((result) => result.changed),\n push_conflict_policy: normalized.push_conflict_policy,\n ...(detailed?.backup_ref !== undefined && {\n backup_ref: detailed.backup_ref,\n }),\n ...(detailed?.target_branch !== undefined && { target_branch: detailed.target_branch }),\n ...(detailed?.remote_commit !== undefined && { remote_commit: detailed.remote_commit }),\n ...(detailed?.local_commit !== undefined && { local_commit: detailed.local_commit }),\n ...(detailed?.backup_commit !== undefined && { backup_commit: detailed.backup_commit }),\n ...(detailed?.previous_remote_commit !== undefined && {\n previous_remote_commit: detailed.previous_remote_commit,\n }),\n ...(detailed?.force_pushed_commit !== undefined && {\n force_pushed_commit: detailed.force_pushed_commit,\n }),\n ...(detailed?.lease_commit !== undefined && { lease_commit: detailed.lease_commit }),\n };\n}\n\nasync function pushDirectResultsToStorageBranch(params: {\n readonly normalized: StorageBranchResultsConfig;\n readonly repoDir: string;\n readonly storageBranch: string;\n}): Promise<ResultsBranchPushOutcome | undefined> {\n try {\n await runGit(\n [\n 'push',\n '--porcelain',\n params.normalized.remote,\n `refs/heads/${params.storageBranch}:refs/heads/${params.storageBranch}`,\n ],\n { cwd: params.repoDir },\n );\n updateStatusFile(params.normalized, {\n last_synced_at: new Date().toISOString(),\n last_error: undefined,\n });\n await fetchResultsRepo(params.repoDir, params.normalized.remote, params.storageBranch).catch(\n () => undefined,\n );\n return undefined;\n } catch (error) {\n if (!isNonFastForwardPushError(error)) {\n throw error;\n }\n const outcome = await resolveResultBranchPushConflict({\n normalized: params.normalized,\n repoDir: params.repoDir,\n targetBranch: params.storageBranch,\n sourceRef: `refs/heads/${params.storageBranch}`,\n });\n if (outcome.blocked) {\n updateStatusFile(params.normalized, { last_error: outcome.blockReason });\n return outcome;\n }\n updateStatusFile(params.normalized, {\n last_synced_at: new Date().toISOString(),\n last_error: undefined,\n });\n await fetchResultsRepo(params.repoDir, params.normalized.remote, params.storageBranch).catch(\n () => undefined,\n );\n return outcome;\n }\n}\n\nasync function commitAndMaybePushRunTree(params: {\n readonly normalized: StorageBranchResultsConfig;\n readonly repoDir: string;\n readonly sourceDir: string;\n readonly destinationPath: string;\n readonly commitMessage: string;\n readonly targetRunId: string;\n readonly shouldPush: boolean;\n}): Promise<DirectPushResultsResult> {\n const result = await commitResultsRunWithTemporaryIndex({\n normalized: params.normalized,\n repoDir: params.repoDir,\n sourceDir: params.sourceDir,\n destinationPath: params.destinationPath,\n commitMessage: params.commitMessage,\n targetRunId: params.targetRunId,\n });\n\n if (!params.shouldPush) {\n updateStatusFile(params.normalized, { last_error: undefined });\n return buildDirectPushResult(params.normalized, result.commitCreated);\n }\n\n if (!result.commitCreated) {\n const localBranchExists = await gitRefExists(\n params.repoDir,\n `refs/heads/${params.normalized.branch}`,\n );\n const hasUnpushed = result.upstreamRef\n ? localBranchExists\n ? await hasUnpushedCommits(params.repoDir, result.upstreamRef, params.normalized.branch)\n : false\n : localBranchExists;\n if (!hasUnpushed) {\n return buildDirectPushResult(params.normalized, false);\n }\n\n const aheadPaths = result.upstreamRef\n ? await getAheadPaths(\n params.repoDir,\n result.upstreamRef,\n `refs/heads/${params.normalized.branch}`,\n )\n : [];\n if (result.upstreamRef && !areSafeResultsRepoPaths(aheadPaths)) {\n const error = new Error('Results repo has non-results committed changes');\n updateStatusFile(params.normalized, { last_error: error.message });\n throw error;\n }\n const outcome = await pushDirectResultsToStorageBranch({\n normalized: params.normalized,\n repoDir: params.repoDir,\n storageBranch: params.normalized.branch,\n });\n return buildDirectPushResult(params.normalized, !outcome?.blocked, outcome);\n }\n\n const outcome = await pushDirectResultsToStorageBranch({\n normalized: params.normalized,\n repoDir: params.repoDir,\n storageBranch: params.normalized.branch,\n });\n return buildDirectPushResult(params.normalized, !outcome?.blocked, outcome);\n}\n\n/**\n * Push results directly to the configured storage branch of the results repo.\n * Handles non-fast-forward conflicts with the configured push conflict policy.\n * Returns true if artifacts were pushed, false if no changes were detected.\n */\nexport async function directPushResults(params: {\n readonly config: ResultsConfig;\n readonly sourceDir: string;\n readonly destinationPath: string;\n readonly commitMessage: string;\n}): Promise<boolean> {\n const result = await directPushResultsWithDetails(params);\n if (result.blocked) {\n throw new ResultsBranchPushConflictError(result);\n }\n return result.changed;\n}\n\nexport async function directPushResultsWithDetails(params: {\n readonly config: ResultsConfig;\n readonly sourceDir: string;\n readonly destinationPath: string;\n readonly commitMessage: string;\n}): Promise<DirectPushResultsResult> {\n const normalized = normalizeResultsConfig(params.config);\n const repoDir = await ensureResultsRepoClone(normalized);\n await fetchResultsRepo(repoDir, normalized.remote, normalized.branch).catch((error) => {\n if (normalized.require_push) {\n throw error;\n }\n });\n const storageBranch = normalized.branch ?? (await resolveDefaultBranch(repoDir));\n const storageConfig: StorageBranchResultsConfig = {\n ...normalized,\n branch: storageBranch,\n };\n const targetRunId = buildGitRunId(params.destinationPath);\n const shouldPush = normalized.auto_push || normalized.require_push;\n const sidecarPointers = collectArtifactSidecarPointers(params.sourceDir);\n const sidecar = await prepareArtifactSidecar({\n sourceDir: params.sourceDir,\n pointers: sidecarPointers,\n });\n let publishedResultsSource: PreparedArtifactSidecar | undefined;\n\n try {\n publishedResultsSource = await preparePublishedResultsSource({\n sourceDir: params.sourceDir,\n destinationPath: params.destinationPath,\n pointers: sidecarPointers,\n });\n\n const pushResults: DirectPushResultsResult[] = [];\n if (sidecar) {\n await fetchResultsRepo(repoDir, normalized.remote, AGENTV_RESULTS_ARTIFACTS_REF).catch(\n (error) => {\n if (normalized.require_push) {\n throw error;\n }\n },\n );\n const sidecarResult = await commitAndMaybePushRunTree({\n normalized: {\n ...normalized,\n branch: AGENTV_RESULTS_ARTIFACTS_REF,\n },\n repoDir,\n sourceDir: sidecar.sourceDir,\n destinationPath: params.destinationPath,\n commitMessage: `chore(results): publish artifact sidecars for ${targetRunId}`,\n targetRunId,\n shouldPush,\n });\n pushResults.push(sidecarResult);\n if (sidecarResult.blocked) {\n return sidecarResult;\n }\n }\n\n pushResults.push(\n await commitAndMaybePushRunTree({\n normalized: storageConfig,\n repoDir,\n sourceDir: publishedResultsSource?.sourceDir ?? params.sourceDir,\n destinationPath: params.destinationPath,\n commitMessage: params.commitMessage,\n targetRunId,\n shouldPush,\n }),\n );\n return mergeDirectPushResults(normalized, pushResults);\n } finally {\n await publishedResultsSource?.cleanup().catch(() => undefined);\n await sidecar?.cleanup().catch(() => undefined);\n }\n}\n\nexport interface GitListedRun {\n run_id: string;\n experiment: string;\n timestamp: string;\n pass_rate?: number;\n target?: string;\n manifest_path: string;\n benchmark_path: string;\n display_name: string;\n test_count: number;\n avg_score: number;\n size_bytes: number;\n}\n\ntype GitBatchBlob = {\n readonly size: number;\n readonly content: Buffer;\n};\n\ntype GitRunBenchmark = {\n readonly metadata?: {\n readonly display_name?: string;\n readonly timestamp?: string;\n readonly experiment?: string;\n readonly targets?: readonly string[];\n readonly tests_run?: readonly string[];\n };\n readonly run_summary?: Record<\n string,\n {\n readonly pass_rate?: { readonly mean?: number };\n }\n >;\n};\n\nfunction buildGitRunId(relativeRunPath: string): string {\n const normalized = relativeRunPath.split(path.sep).join('/');\n const segments = normalized.split('/').filter(Boolean);\n if (segments.length >= 2) {\n const experiment = segments.slice(0, -1).join('/');\n const timestamp = segments.at(-1);\n if (experiment === 'default') {\n return timestamp ?? normalized;\n }\n return `${experiment}::${timestamp}`;\n }\n return segments[0] ?? relativeRunPath;\n}\n\nfunction getRunExperiment(runId: string, benchmark: GitRunBenchmark): string {\n const experiment = benchmark.metadata?.experiment?.trim();\n if (experiment) {\n return experiment;\n }\n\n const separatorIndex = runId.lastIndexOf('::');\n return separatorIndex === -1 ? 'default' : runId.slice(0, separatorIndex);\n}\n\nfunction computeAveragePassRate(runSummary: GitRunBenchmark['run_summary']): number | undefined {\n if (!runSummary) {\n return undefined;\n }\n\n const passRates = Object.values(runSummary)\n .map((summary) => summary.pass_rate?.mean)\n .filter((value): value is number => typeof value === 'number' && Number.isFinite(value));\n\n if (passRates.length === 0) {\n return undefined;\n }\n\n return passRates.reduce((sum, value) => sum + value, 0) / passRates.length;\n}\n\nasync function runGitBatch(repoDir: string, input: string): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const child = spawn('git', ['cat-file', '--batch'], {\n cwd: repoDir,\n env: getGitEnv(),\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n\n child.stdout.on('data', (chunk: Buffer | string) => {\n stdoutChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n child.stderr.on('data', (chunk: Buffer | string) => {\n stderrChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n child.on('error', (error) => reject(withFriendlyGitHubAuthError(error)));\n child.on('close', (code) => {\n if (code === 0) {\n resolve(Buffer.concat(stdoutChunks));\n return;\n }\n\n const stderr = Buffer.concat(stderrChunks).toString('utf8').trim();\n reject(\n withFriendlyGitHubAuthError(\n stderr.length > 0 ? new Error(stderr) : new Error('git cat-file failed'),\n ),\n );\n });\n\n child.stdin.end(input);\n });\n}\n\nfunction parseGitBatchBlobs(output: Buffer): GitBatchBlob[] {\n const blobs: GitBatchBlob[] = [];\n let offset = 0;\n\n while (offset < output.length) {\n const headerEnd = output.indexOf(0x0a, offset);\n if (headerEnd === -1) {\n throw new Error('Malformed git cat-file output: missing header terminator');\n }\n\n const header = output.subarray(offset, headerEnd).toString('utf8');\n offset = headerEnd + 1;\n\n if (header.length === 0) {\n continue;\n }\n\n const missingMatch = /^(.*) missing$/.exec(header);\n if (missingMatch) {\n continue;\n }\n\n const headerMatch = /^(.*) (\\w+) (\\d+)$/.exec(header);\n if (!headerMatch) {\n throw new Error(`Malformed git cat-file header: ${header}`);\n }\n\n const [, objectRef, objectType, sizeText] = headerMatch;\n if (objectType !== 'blob') {\n throw new Error(`Unsupported git object type for ${objectRef}: ${objectType}`);\n }\n\n const size = Number.parseInt(sizeText, 10);\n const contentEnd = offset + size;\n if (contentEnd > output.length) {\n throw new Error(`Malformed git cat-file output for ${objectRef}: truncated blob content`);\n }\n\n blobs.push({\n size,\n content: output.subarray(offset, contentEnd),\n });\n offset = contentEnd;\n\n if (offset < output.length && output[offset] === 0x0a) {\n offset += 1;\n }\n }\n\n return blobs;\n}\n\nexport interface GitResultArtifactReadParams {\n readonly repoDir: string;\n readonly key: string;\n readonly ref?: string;\n readonly remote?: string;\n readonly sha256?: string;\n readonly objectVersion?: string;\n}\n\nexport async function readGitResultArtifact(\n params: GitResultArtifactReadParams,\n): Promise<Buffer | undefined> {\n const artifactRef = params.ref ?? AGENTV_RESULTS_ARTIFACTS_REF;\n const normalizedKey = normalizeDestinationPath(params.key);\n const remote = params.remote ?? 'origin';\n if (!artifactRef.startsWith('refs/')) {\n await fetchResultsArtifactRef(params.repoDir, remote, artifactRef).catch(() => undefined);\n }\n\n const candidateRefs = [\n `refs/remotes/${remote}/${artifactRef}`,\n `refs/heads/${artifactRef}`,\n artifactRef,\n ].filter((candidate, index, all) => all.indexOf(candidate) === index);\n\n for (const candidateRef of candidateRefs) {\n const blobs = parseGitBatchBlobs(\n await runGitBatch(params.repoDir, `${candidateRef}:${normalizedKey}\\n`),\n );\n const blob = blobs[0];\n if (!blob) {\n continue;\n }\n verifyArtifactPointerChecksum(\n {\n path: normalizedKey,\n ...(params.sha256 ? { sha256: params.sha256 } : {}),\n ...(params.objectVersion ? { objectVersion: params.objectVersion } : {}),\n },\n blob.content,\n );\n return Buffer.from(blob.content);\n }\n\n return undefined;\n}\n\n// ── WIP (work-in-progress) branch helpers ─────────────────────────────────\n//\n// Periodic best-effort checkpoints push the partial run output to a unique\n// non-default branch (`agentv/wip/<hostname>/<run-dir-basename>`) every ~30s.\n// The branch is force-pushed (single-writer) to avoid conflict handling and\n// noisy history. On successful run completion the branch is deleted.\n//\n// Manual recovery: if a pod is lost mid-run, an operator can clone the results\n// repo, checkout `agentv/wip/<hostname>/<run-dir>`, and resume with:\n// cp -r runs/<run-dir> <local-workspace>\n// agentv eval <eval-file> --output <local-workspace>/<run-dir> --resume\n\nexport function buildWipBranchName(runDir: string): string {\n const hostname = os\n .hostname()\n .replace(/[^A-Za-z0-9._-]+/g, '-')\n .slice(0, 40);\n const runBasename = path\n .basename(runDir)\n .replace(/[^A-Za-z0-9._-]+/g, '-')\n .slice(0, 60);\n return `agentv/wip/${hostname}/${runBasename}`;\n}\n\nexport interface WipWorktreeHandle {\n readonly wipBranch: string;\n readonly worktreeDir: string;\n readonly cloneDir: string;\n readonly remote: string;\n readonly cleanup: () => Promise<void>;\n}\n\nexport async function setupWipWorktree(params: {\n readonly config: ResultsConfig;\n readonly wipBranch: string;\n}): Promise<WipWorktreeHandle> {\n const normalized = normalizeResultsConfig(params.config);\n const cloneDir = await ensureResultsRepoClone(normalized);\n await fetchResultsRepo(cloneDir, normalized.remote, normalized.branch).catch((error) => {\n if (normalized.require_push) {\n throw error;\n }\n });\n let baseRef = normalized.branch\n ? await configuredResultsBranchRef(cloneDir, normalized)\n : remoteBranchRef(await resolveDefaultBranch(cloneDir), normalized.remote);\n if (!baseRef && normalized.branch) {\n await createOrphanResultsBranch(cloneDir, normalized.branch);\n baseRef = normalized.branch;\n }\n if (!baseRef) {\n throw new Error('Could not resolve a base ref for the WIP results branch');\n }\n const worktreeRoot = await mkdtemp(path.join(os.tmpdir(), 'agentv-wip-'));\n const worktreeDir = path.join(worktreeRoot, 'repo');\n await runGit(['worktree', 'add', '-B', params.wipBranch, worktreeDir, baseRef], {\n cwd: cloneDir,\n });\n return {\n wipBranch: params.wipBranch,\n worktreeDir,\n cloneDir,\n remote: normalized.remote,\n cleanup: async () => {\n try {\n await runGit(['worktree', 'remove', '--force', worktreeDir], { cwd: cloneDir });\n } finally {\n await rm(worktreeRoot, { recursive: true, force: true }).catch(() => undefined);\n }\n },\n };\n}\n\n/**\n * Snapshot the current run output into the WIP worktree and force-push to the\n * remote WIP branch. Returns true if a push was performed, false if nothing changed.\n *\n * Uses `--amend` on the base-branch tip so the remote WIP branch always holds\n * exactly one snapshot commit (no noisy history accumulation).\n */\nexport async function pushWipCheckpoint(params: {\n readonly handle: WipWorktreeHandle;\n readonly sourceDir: string;\n readonly destinationPath: string;\n}): Promise<boolean> {\n const destinationDir = path.join(\n params.handle.worktreeDir,\n RESULTS_REPO_RUNS_DIR,\n params.destinationPath,\n );\n await stageResultsArtifacts({\n repoDir: params.handle.worktreeDir,\n sourceDir: params.sourceDir,\n destinationDir,\n });\n const trackedDirs = await existingTrackedResultsDirs(params.handle.worktreeDir);\n await runGit(['add', '--all', '--', ...trackedDirs], {\n cwd: params.handle.worktreeDir,\n });\n const { stdout: status } = await runGit(['status', '--porcelain'], {\n cwd: params.handle.worktreeDir,\n check: false,\n });\n if (!status.trim()) {\n return false;\n }\n const timestamp = new Date().toISOString();\n await runGitWithFallbackCommitIdentity(\n ['commit', '--amend', '-m', `wip(results): checkpoint ${params.handle.wipBranch} ${timestamp}`],\n { cwd: params.handle.worktreeDir },\n );\n await runGit(['push', '--force', params.handle.remote, params.handle.wipBranch], {\n cwd: params.handle.worktreeDir,\n });\n return true;\n}\n\nexport async function deleteWipBranch(params: {\n readonly config: ResultsConfig;\n readonly wipBranch: string;\n}): Promise<void> {\n const normalized = normalizeResultsConfig(params.config);\n const cloneDir = await ensureResultsRepoClone(normalized);\n await runGit(['push', normalized.remote, '--delete', params.wipBranch], { cwd: cloneDir });\n}\n\n// git exits non-zero with one of these messages when the requested ref/object\n// does not exist yet — e.g. a configured results branch that has never been\n// pushed. We treat that as \"no remote runs\" rather than a hard failure.\nfunction isMissingGitRefError(error: unknown): boolean {\n const parts: string[] = [];\n if (error && typeof error === 'object') {\n const e = error as { stderr?: unknown; message?: unknown };\n if (typeof e.stderr === 'string') parts.push(e.stderr);\n if (typeof e.message === 'string') parts.push(e.message);\n } else if (typeof error === 'string') {\n parts.push(error);\n }\n const haystack = parts.join('\\n').toLowerCase();\n return (\n haystack.includes('not a valid object name') ||\n haystack.includes('unknown revision or path') ||\n haystack.includes('bad revision') ||\n haystack.includes('does not exist')\n );\n}\n\nexport async function listGitRuns(repoDir: string, ref = 'origin/main'): Promise<GitListedRun[]> {\n let treeOut: string;\n try {\n ({ stdout: treeOut } = await runGit(\n ['ls-tree', '-r', '--name-only', ref, RESULTS_REPO_RUNS_DIR],\n {\n cwd: repoDir,\n },\n ));\n } catch (error) {\n // A not-yet-created results branch is an empty result, not an error. This\n // keeps the Dashboard's remote-results poll quiet before the first push.\n if (isMissingGitRefError(error)) {\n return [];\n }\n throw error;\n }\n\n const benchmarkPaths = treeOut\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.endsWith('/benchmark.json'));\n if (benchmarkPaths.length === 0) {\n return [];\n }\n\n const batchInput = `${benchmarkPaths.map((benchmarkPath) => `${ref}:${benchmarkPath}`).join('\\n')}\\n`;\n const blobs = parseGitBatchBlobs(await runGitBatch(repoDir, batchInput));\n if (blobs.length !== benchmarkPaths.length) {\n throw new Error(\n `Expected ${benchmarkPaths.length} git blobs but received ${blobs.length} while listing results runs`,\n );\n }\n\n const runs = blobs.flatMap((blob, index): GitListedRun[] => {\n const benchmarkPath = benchmarkPaths[index];\n const benchmark = JSON.parse(blob.content.toString('utf8')) as GitRunBenchmark;\n const runDir = path.posix.dirname(benchmarkPath);\n const relativeRunPath = path.posix.relative(RESULTS_REPO_RUNS_DIR, runDir);\n const runId = buildGitRunId(relativeRunPath);\n const timestamp = benchmark.metadata?.timestamp?.trim() || path.posix.basename(runDir);\n const displayName = benchmark.metadata?.display_name?.trim() || path.posix.basename(runDir);\n const targets = benchmark.metadata?.targets ?? [];\n const passRate = computeAveragePassRate(benchmark.run_summary);\n\n return [\n {\n run_id: runId,\n experiment: getRunExperiment(runId, benchmark),\n timestamp,\n ...(passRate !== undefined && { pass_rate: passRate }),\n ...(targets.length === 1 && targets[0] ? { target: targets[0] } : {}),\n manifest_path: path.posix.join(runDir, 'index.jsonl'),\n benchmark_path: benchmarkPath,\n display_name: displayName,\n test_count: benchmark.metadata?.tests_run?.length ?? 0,\n avg_score: 0,\n size_bytes: blob.size,\n },\n ];\n });\n\n runs.sort((a, b) => b.timestamp.localeCompare(a.timestamp));\n return runs;\n}\n\nexport async function materializeGitRun(\n repoDir: string,\n relativeRunPath: string,\n ref = 'origin/main',\n): Promise<void> {\n const normalizedRunPath = relativeRunPath.split(path.sep).join('/');\n const runTreePath = path.posix.join(RESULTS_REPO_RUNS_DIR, normalizedRunPath);\n const targetRunDir = path.join(repoDir, ...runTreePath.split('/'));\n const { stdout: treeOut } = await runGit(['ls-tree', '-r', '--name-only', ref, runTreePath], {\n cwd: repoDir,\n });\n\n const filePaths = treeOut\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (filePaths.length === 0) {\n return;\n }\n\n const batchInput = `${filePaths.map((filePath) => `${ref}:${filePath}`).join('\\n')}\\n`;\n const blobs = parseGitBatchBlobs(await runGitBatch(repoDir, batchInput));\n if (blobs.length !== filePaths.length) {\n throw new Error(\n `Expected ${filePaths.length} git blobs but received ${blobs.length} while materializing results run`,\n );\n }\n\n const tempRoot = mkdtempSync(path.join(repoDir, '.agentv-run-'));\n const tempRunDir = path.join(tempRoot, 'run');\n\n try {\n for (const [index, filePath] of filePaths.entries()) {\n const relativeFilePath = path.posix.relative(runTreePath, filePath);\n const absolutePath = path.join(tempRunDir, ...relativeFilePath.split('/'));\n mkdirSync(path.dirname(absolutePath), { recursive: true });\n writeFileSync(absolutePath, blobs[index].content);\n }\n\n mkdirSync(path.dirname(targetRunDir), { recursive: true });\n try {\n renameSync(tempRunDir, targetRunDir);\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? error.code : undefined;\n if ((code === 'EEXIST' || code === 'ENOTEMPTY') && existsSync(targetRunDir)) {\n return;\n }\n throw error;\n }\n } finally {\n rmSync(tempRoot, { recursive: true, force: true });\n }\n}\n","/**\n * Project sync — pulls remote Git repos to the local path declared in the\n * project registry before Dashboard/eval startup.\n *\n * Sync is oneshot only, triggered by the Dashboard UI \"Sync\" button or the\n * `agentv project sync` CLI command. There is no daemon or continuous mode.\n *\n * First run — git clone --depth 1 --filter=blob:none --branch <ref> <repoUrl> <path>\n * Subsequent — git pull --ff-only (when <path>/.git already exists)\n *\n * Usage:\n * import { syncProjects } from './project-sync.js';\n * await syncProjects(registry.projects);\n */\n\nimport * as childProcess from 'node:child_process';\nimport { existsSync } from 'node:fs';\n\nimport type { ProjectEntry } from './projects.js';\n\n/**\n * Clone or pull a single project entry from its declared repo URL.\n * - No .git present: shallow clone into entry.path.\n * - .git present: git pull --ff-only to update in place.\n * Throws on git error or missing repoUrl/ref.\n */\nexport async function syncProject(entry: ProjectEntry): Promise<void> {\n if (!entry.repoUrl) {\n throw new Error(`Project '${entry.id}' has no repo.url defined`);\n }\n if (!entry.ref) {\n throw new Error(`Project '${entry.id}' has no repo.branch defined`);\n }\n const dest = entry.path;\n\n if (existsSync(`${dest}/.git`)) {\n childProcess.execFileSync('git', ['-C', dest, 'pull', '--ff-only'], { stdio: 'inherit' });\n } else {\n childProcess.execFileSync(\n 'git',\n ['clone', '--depth', '1', '--filter=blob:none', '--branch', entry.ref, entry.repoUrl, dest],\n { stdio: 'inherit' },\n );\n }\n}\n\n/**\n * Iterate project entries and sync any that have a repo URL declared.\n * Entries without repoUrl are skipped silently.\n */\nexport async function syncProjects(entries: ProjectEntry[]): Promise<void> {\n for (const entry of entries) {\n if (!entry.repoUrl) continue;\n console.log(`Syncing project '${entry.id}' from ${entry.repoUrl}...`);\n await syncProject(entry);\n console.log(`Project '${entry.id}' synced.`);\n }\n}\n","import type { EvaluationResult, GraderResult } from './types.js';\n\n/**\n * Top-level fields to strip from baseline results.\n * Uses a denylist approach: new fields are auto-preserved.\n */\nconst STRIPPED_TOP_LEVEL_FIELDS = new Set([\n 'requests',\n 'trace',\n 'workspacePath',\n 'output',\n 'beforeAllOutput',\n 'beforeEachOutput',\n 'afterAllOutput',\n 'afterEachOutput',\n 'fileChanges',\n // Promoted execution metrics (debug, not needed for regression comparison)\n 'tokenUsage',\n 'costUsd',\n 'durationMs',\n 'startTime',\n 'endTime',\n]);\n\n/**\n * Fields to strip from grader results.\n */\nconst STRIPPED_EVALUATOR_FIELDS = new Set(['rawRequest', 'input']);\n\n/**\n * Trims an evaluator result for baseline storage.\n * Strips debug/audit fields while preserving scoring data.\n * Recursively trims nested grader results (for composites).\n */\nfunction trimEvaluatorResult(result: GraderResult): GraderResult {\n const trimmed: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(result)) {\n if (STRIPPED_EVALUATOR_FIELDS.has(key)) continue;\n if (key === 'scores' && Array.isArray(value)) {\n trimmed[key] = (value as GraderResult[]).map(trimEvaluatorResult);\n } else {\n trimmed[key] = value;\n }\n }\n return trimmed as unknown as GraderResult;\n}\n\n/**\n * Trims an EvaluationResult for baseline storage.\n * Strips large debug/audit fields (denylist approach) while preserving\n * all fields needed for regression comparison (scores, assertions, etc.).\n *\n * Returns a new object — the input is not mutated.\n */\nexport function trimBaselineResult(result: EvaluationResult): EvaluationResult {\n const trimmed: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(result)) {\n if (STRIPPED_TOP_LEVEL_FIELDS.has(key)) continue;\n if (key === 'scores' && Array.isArray(value)) {\n trimmed[key] = (value as GraderResult[]).map(trimEvaluatorResult);\n } else {\n trimmed[key] = value;\n }\n }\n return trimmed as unknown as EvaluationResult;\n}\n","/** Default category for eval files without subdirectory structure. */\nexport const DEFAULT_CATEGORY = 'Uncategorized';\n\n/**\n * Derive a human-readable category from an eval file's relative path.\n *\n * Strips the filename and any `evals` directory segments, then joins\n * remaining directories with `/`. Returns {@link DEFAULT_CATEGORY} for files\n * at the root level.\n */\nexport function deriveCategory(relativePath: string): string {\n const parts = relativePath.split(/[/\\\\]/);\n if (parts.length <= 1) {\n return DEFAULT_CATEGORY;\n }\n const dirs = parts.slice(0, -1).filter((d) => d !== 'evals');\n return dirs.length > 0 ? dirs.join('/') : DEFAULT_CATEGORY;\n}\n","import type {\n Message,\n ProviderStreamCallbacks,\n ProviderTokenUsage,\n} from '../evaluation/providers/types.js';\nimport type { EvaluationResult } from '../evaluation/types.js';\nimport type { OtelExportOptions } from './types.js';\n\nexport type { OtelExportOptions };\n\n// ---------------------------------------------------------------------------\n// OTel type aliases (resolved dynamically at init)\n// ---------------------------------------------------------------------------\n\n// biome-ignore lint/suspicious/noExplicitAny: OTel types loaded dynamically\ntype OtelApi = any;\n// biome-ignore lint/suspicious/noExplicitAny: OTel types loaded dynamically\ntype NodeTracerProvider = any;\n// biome-ignore lint/suspicious/noExplicitAny: OTel types loaded dynamically\ntype Tracer = any;\n\n// ---------------------------------------------------------------------------\n// Exporter\n// ---------------------------------------------------------------------------\n\nexport class OtelTraceExporter {\n private provider: NodeTracerProvider | null = null;\n private tracer: Tracer | null = null;\n private api: OtelApi | null = null;\n // biome-ignore lint/suspicious/noExplicitAny: OTel types loaded dynamically\n private W3CPropagator: any = null;\n\n constructor(private readonly options: OtelExportOptions) {}\n\n /** Initialize the OTel SDK. Returns false if OTel packages are not available. */\n async init(): Promise<boolean> {\n try {\n const [sdkTraceNode, resourcesMod, semconvMod, api, coreMod] = await Promise.all([\n import('@opentelemetry/sdk-trace-node'),\n import('@opentelemetry/resources'),\n import('@opentelemetry/semantic-conventions'),\n import('@opentelemetry/api'),\n import('@opentelemetry/core').catch(() => null),\n ]);\n\n const { NodeTracerProvider: Provider, SimpleSpanProcessor } = sdkTraceNode;\n const { resourceFromAttributes } = resourcesMod;\n const { ATTR_SERVICE_NAME } = semconvMod;\n\n const resourceAttributes = {\n [ATTR_SERVICE_NAME]: this.options.serviceName ?? 'agentv',\n ...this.options.resourceAttributes,\n };\n const resource = resourceFromAttributes(resourceAttributes);\n\n // biome-ignore lint/suspicious/noExplicitAny: OTel processor types loaded dynamically\n const processors: any[] = [];\n\n // Remote OTLP exporter (only when endpoint is configured)\n if (this.options.endpoint) {\n const otlpHttp = await import('@opentelemetry/exporter-trace-otlp-http');\n const { OTLPTraceExporter } = otlpHttp;\n const exporter = new OTLPTraceExporter({\n url: this.options.endpoint,\n headers: this.options.headers,\n });\n processors.push(new SimpleSpanProcessor(exporter));\n }\n\n // OTLP JSON file exporter\n if (this.options.otlpFilePath) {\n const { OtlpJsonFileExporter } = await import('./otlp-json-file-exporter.js');\n processors.push(\n new SimpleSpanProcessor(\n new OtlpJsonFileExporter(this.options.otlpFilePath, resourceAttributes),\n ),\n );\n }\n\n if (processors.length === 0) {\n return false;\n }\n\n this.provider = new Provider({\n resource,\n spanProcessors: processors,\n });\n this.provider.register();\n this.api = api;\n this.tracer = api.trace.getTracer('agentv', '1.0.0');\n this.W3CPropagator = coreMod?.W3CTraceContextPropagator ?? null;\n return true;\n } catch {\n return false;\n }\n }\n\n /** Export a single evaluation result as an OTel trace. */\n async exportResult(result: EvaluationResult): Promise<void> {\n if (!this.tracer || !this.api) return;\n\n const api = this.api;\n const tracer = this.tracer;\n const captureContent = this.options.captureContent ?? false;\n\n // Determine timing\n const startHr = toHrTime(result.startTime ?? result.timestamp);\n const endHr = toHrTime(result.endTime ?? result.timestamp);\n\n // Support trace composition via W3C traceparent propagation\n let parentCtx = api.ROOT_CONTEXT;\n const traceparent = process.env.TRACEPARENT;\n if (traceparent && this.W3CPropagator) {\n try {\n const propagator = new this.W3CPropagator();\n parentCtx = propagator.extract(\n api.ROOT_CONTEXT,\n { traceparent, tracestate: process.env.TRACESTATE ?? '' },\n {\n get: (carrier: Record<string, string>, key: string) => carrier[key],\n keys: (carrier: Record<string, string>) => Object.keys(carrier),\n },\n );\n } catch {\n // Malformed TRACEPARENT — fall back to standalone trace\n }\n }\n\n tracer.startActiveSpan(\n 'agentv.eval',\n { startTime: startHr },\n parentCtx,\n (rootSpan: {\n setAttribute: (...args: unknown[]) => void;\n addEvent: (...args: unknown[]) => void;\n setStatus: (...args: unknown[]) => void;\n end: (...args: unknown[]) => void;\n }) => {\n // GenAI semantic convention attributes\n rootSpan.setAttribute('gen_ai.operation.name', 'evaluate');\n rootSpan.setAttribute('gen_ai.system', 'agentv');\n\n // Core attributes\n rootSpan.setAttribute('agentv.test_id', result.testId);\n rootSpan.setAttribute('agentv.target', result.target);\n if (result.suite) rootSpan.setAttribute('agentv.suite', result.suite);\n rootSpan.setAttribute('agentv.score', result.score);\n if (captureContent && result.output.length > 0) {\n rootSpan.setAttribute('agentv.output_text', result.output);\n }\n\n // Flat execution metrics\n if (result.durationMs != null)\n rootSpan.setAttribute('agentv.trace.duration_ms', result.durationMs);\n if (result.costUsd != null) rootSpan.setAttribute('agentv.trace.cost_usd', result.costUsd);\n if (result.tokenUsage) {\n if (result.tokenUsage.input != null) {\n rootSpan.setAttribute('agentv.trace.token_input', result.tokenUsage.input);\n }\n if (result.tokenUsage.output != null) {\n rootSpan.setAttribute('agentv.trace.token_output', result.tokenUsage.output);\n }\n if (result.tokenUsage.cached != null) {\n rootSpan.setAttribute('agentv.trace.token_cached', result.tokenUsage.cached);\n }\n }\n\n // Trace summary attributes (tool-specific)\n if (result.trace) {\n const t = result.trace;\n rootSpan.setAttribute('agentv.trace.event_count', t.eventCount);\n rootSpan.setAttribute(\n 'agentv.trace.tool_names',\n Object.keys(t.toolCalls).sort().join(','),\n );\n if (t.llmCallCount != null)\n rootSpan.setAttribute('agentv.trace.llm_call_count', t.llmCallCount);\n }\n\n // Child spans from result-local trace messages. The execution trace\n // sidecar owns the canonical span graph for export/import work.\n // Some callers may still export older result artifacts while migrating,\n // so tolerate a missing trace instead of crashing the exporter.\n const traceMessages = result.trace?.messages ?? [];\n if (traceMessages.length > 0) {\n const parentCtx = api.trace.setSpan(api.context.active(), rootSpan);\n\n if (this.options.groupTurns) {\n const turns = groupMessagesIntoTurns(traceMessages);\n if (turns.length > 1) {\n for (const [i, turn] of turns.entries()) {\n api.context.with(parentCtx, () => {\n tracer.startActiveSpan(\n `agentv.turn.${i + 1}`,\n {},\n (turnSpan: {\n end: (...args: unknown[]) => void;\n }) => {\n const turnCtx = api.trace.setSpan(api.context.active(), turnSpan);\n for (const msg of turn.messages) {\n this.exportMessage(tracer, api, turnCtx, msg, captureContent);\n }\n turnSpan.end();\n },\n );\n });\n }\n } else {\n for (const msg of traceMessages) {\n this.exportMessage(tracer, api, parentCtx, msg, captureContent);\n }\n }\n } else {\n for (const msg of traceMessages) {\n this.exportMessage(tracer, api, parentCtx, msg, captureContent);\n }\n }\n }\n\n // Grader scores as span events\n if (result.scores) {\n for (const score of result.scores) {\n rootSpan.addEvent(`agentv.grader.${score.name}`, {\n 'agentv.grader.score': score.score,\n 'agentv.grader.type': score.type,\n ...(score.verdict ? { 'agentv.grader.verdict': score.verdict } : {}),\n });\n }\n }\n\n // Status\n if (result.error) {\n rootSpan.setStatus({ code: api.SpanStatusCode.ERROR, message: result.error });\n } else {\n rootSpan.setStatus({ code: api.SpanStatusCode.OK });\n }\n\n rootSpan.end(endHr);\n },\n );\n }\n\n /** Flush pending spans and shut down. */\n async shutdown(): Promise<void> {\n await this.provider?.shutdown();\n }\n\n /** Create a streaming observer for real-time span export */\n createStreamingObserver(): OtelStreamingObserver | null {\n if (!this.tracer || !this.api) return null;\n // Extract TRACEPARENT for trace composition\n let parentCtx: unknown;\n const traceparent = process.env.TRACEPARENT;\n if (traceparent && this.W3CPropagator) {\n try {\n const propagator = new this.W3CPropagator();\n parentCtx = propagator.extract(\n this.api.ROOT_CONTEXT,\n { traceparent, tracestate: process.env.TRACESTATE ?? '' },\n {\n get: (carrier: Record<string, string>, key: string) => carrier[key],\n keys: (carrier: Record<string, string>) => Object.keys(carrier),\n },\n );\n } catch {\n // Malformed TRACEPARENT — ignore\n }\n }\n return new OtelStreamingObserver(\n this.tracer,\n this.api,\n this.options.captureContent ?? false,\n parentCtx,\n );\n }\n\n // -----------------------------------------------------------------------\n // Private helpers\n // -----------------------------------------------------------------------\n\n private exportMessage(\n tracer: Tracer,\n api: OtelApi,\n parentCtx: unknown,\n msg: Message,\n captureContent: boolean,\n ): void {\n const isAssistant = msg.role === 'assistant';\n const model = msg.metadata?.model ? String(msg.metadata.model) : undefined;\n const spanName = isAssistant ? `chat ${model ?? 'unknown'}` : `gen_ai.message.${msg.role}`;\n\n const startHr = toHrTime(msg.startTime);\n const endHr = toHrTime(msg.endTime);\n\n api.context.with(parentCtx, () => {\n tracer.startActiveSpan(\n spanName,\n { startTime: startHr },\n parentCtx,\n (span: {\n setAttribute: (...args: unknown[]) => void;\n end: (...args: unknown[]) => void;\n }) => {\n if (isAssistant) {\n span.setAttribute('gen_ai.operation.name', 'chat');\n }\n if (model) {\n span.setAttribute('gen_ai.request.model', model);\n span.setAttribute('gen_ai.response.model', model);\n }\n\n // Per-span token usage (GenAI conventions)\n if (msg.tokenUsage) {\n if (msg.tokenUsage.input != null) {\n span.setAttribute('gen_ai.usage.input_tokens', msg.tokenUsage.input);\n }\n if (msg.tokenUsage.output != null) {\n span.setAttribute('gen_ai.usage.output_tokens', msg.tokenUsage.output);\n }\n if (msg.tokenUsage.cached != null) {\n span.setAttribute('gen_ai.usage.cache_read.input_tokens', msg.tokenUsage.cached);\n }\n }\n\n if (captureContent && msg.content != null) {\n span.setAttribute(\n 'gen_ai.output.messages',\n typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content),\n );\n }\n\n // Tool call child spans\n if (msg.toolCalls) {\n const msgCtx = api.trace.setSpan(api.context.active(), span);\n for (const tc of msg.toolCalls) {\n api.context.with(msgCtx, () => {\n tracer.startActiveSpan(\n `execute_tool ${tc.tool}`,\n {},\n msgCtx,\n (toolSpan: {\n setAttribute: (...args: unknown[]) => void;\n end: (...args: unknown[]) => void;\n }) => {\n toolSpan.setAttribute('gen_ai.tool.name', tc.tool);\n if (tc.id) toolSpan.setAttribute('gen_ai.tool.call.id', tc.id);\n\n if (captureContent) {\n if (tc.input != null) {\n toolSpan.setAttribute(\n 'gen_ai.tool.call.arguments',\n typeof tc.input === 'string' ? tc.input : JSON.stringify(tc.input),\n );\n }\n if (tc.output != null) {\n toolSpan.setAttribute(\n 'gen_ai.tool.call.result',\n typeof tc.output === 'string' ? tc.output : JSON.stringify(tc.output),\n );\n }\n }\n\n toolSpan.end();\n },\n );\n });\n }\n }\n\n span.end(endHr);\n },\n );\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Streaming observer\n// ---------------------------------------------------------------------------\n\n/**\n * Streaming observer that creates OTel spans in real-time during eval execution.\n * Spans are exported immediately via SimpleSpanProcessor as each tool call / LLM response completes.\n */\nexport class OtelStreamingObserver {\n // biome-ignore lint/suspicious/noExplicitAny: OTel span type loaded dynamically\n private rootSpan: any = null;\n // biome-ignore lint/suspicious/noExplicitAny: OTel context loaded dynamically\n private rootCtx: any = null;\n private observedChildSpans = false;\n private pendingMetrics: {\n durationMs?: number;\n costUsd?: number;\n tokenUsage?: ProviderTokenUsage;\n trace?: {\n eventCount: number;\n toolCalls: Record<string, number>;\n llmCallCount?: number;\n };\n } | null = null;\n\n constructor(\n private readonly tracer: Tracer,\n private readonly api: OtelApi,\n private readonly captureContent: boolean,\n // biome-ignore lint/suspicious/noExplicitAny: OTel context loaded dynamically\n private readonly parentCtx?: any,\n ) {}\n\n /** Create root eval span immediately (visible in backend right away) */\n startEvalCase(testId: string, target: string, evalSet?: string): void {\n this.pendingMetrics = null;\n this.observedChildSpans = false;\n const ctx = this.parentCtx ?? this.api.context.active();\n this.rootSpan = this.tracer.startSpan('agentv.eval', undefined, ctx);\n this.rootSpan.setAttribute('gen_ai.operation.name', 'evaluate');\n this.rootSpan.setAttribute('gen_ai.system', 'agentv');\n this.rootSpan.setAttribute('agentv.test_id', testId);\n this.rootSpan.setAttribute('agentv.target', target);\n if (evalSet) this.rootSpan.setAttribute('agentv.suite', evalSet);\n this.rootCtx = this.api.trace.setSpan(this.api.context.active(), this.rootSpan);\n }\n\n /** Create and immediately export a tool span */\n onToolCall(\n name: string,\n input: unknown,\n output: unknown,\n _durationMs: number,\n toolCallId?: string,\n ): void {\n if (!this.rootCtx) return;\n this.observedChildSpans = true;\n this.api.context.with(this.rootCtx, () => {\n const span = this.tracer.startSpan(`execute_tool ${name}`, undefined, this.rootCtx);\n span.setAttribute('gen_ai.tool.name', name);\n if (toolCallId) span.setAttribute('gen_ai.tool.call.id', toolCallId);\n if (this.captureContent) {\n if (input != null)\n span.setAttribute(\n 'gen_ai.tool.call.arguments',\n typeof input === 'string' ? input : JSON.stringify(input),\n );\n if (output != null)\n span.setAttribute(\n 'gen_ai.tool.call.result',\n typeof output === 'string' ? output : JSON.stringify(output),\n );\n }\n span.end();\n });\n }\n\n /** Create and immediately export an LLM span */\n onLlmCall(model: string, tokenUsage?: ProviderTokenUsage): void {\n if (!this.rootCtx) return;\n this.observedChildSpans = true;\n this.api.context.with(this.rootCtx, () => {\n const span = this.tracer.startSpan(`chat ${model}`, undefined, this.rootCtx);\n span.setAttribute('gen_ai.operation.name', 'chat');\n span.setAttribute('gen_ai.request.model', model);\n span.setAttribute('gen_ai.response.model', model);\n if (tokenUsage) {\n if (tokenUsage.input != null)\n span.setAttribute('gen_ai.usage.input_tokens', tokenUsage.input);\n if (tokenUsage.output != null)\n span.setAttribute('gen_ai.usage.output_tokens', tokenUsage.output);\n if (tokenUsage.cached != null)\n span.setAttribute('gen_ai.usage.cache_read.input_tokens', tokenUsage.cached);\n }\n span.end();\n });\n }\n\n /** Record final execution metrics before the root span is finalized. */\n recordEvalMetrics(result: {\n durationMs?: number;\n costUsd?: number;\n tokenUsage?: ProviderTokenUsage;\n trace?: {\n eventCount: number;\n toolCalls: Record<string, number>;\n llmCallCount?: number;\n };\n }): void {\n this.pendingMetrics = result;\n }\n\n /** Finalize root span with score/verdict after evaluation completes */\n finalizeEvalCase(score: number, error?: string): void {\n if (!this.rootSpan) return;\n this.rootSpan.setAttribute('agentv.score', score);\n if (this.pendingMetrics?.durationMs != null) {\n this.rootSpan.setAttribute('agentv.trace.duration_ms', this.pendingMetrics.durationMs);\n }\n if (this.pendingMetrics?.costUsd != null) {\n this.rootSpan.setAttribute('agentv.trace.cost_usd', this.pendingMetrics.costUsd);\n }\n if (this.pendingMetrics?.tokenUsage) {\n if (this.pendingMetrics.tokenUsage.input != null) {\n this.rootSpan.setAttribute(\n 'agentv.trace.token_input',\n this.pendingMetrics.tokenUsage.input,\n );\n }\n if (this.pendingMetrics.tokenUsage.output != null) {\n this.rootSpan.setAttribute(\n 'agentv.trace.token_output',\n this.pendingMetrics.tokenUsage.output,\n );\n }\n if (this.pendingMetrics.tokenUsage.cached != null) {\n this.rootSpan.setAttribute(\n 'agentv.trace.token_cached',\n this.pendingMetrics.tokenUsage.cached,\n );\n }\n }\n if (this.pendingMetrics?.trace) {\n this.rootSpan.setAttribute('agentv.trace.event_count', this.pendingMetrics.trace.eventCount);\n this.rootSpan.setAttribute(\n 'agentv.trace.tool_names',\n Object.keys(this.pendingMetrics.trace.toolCalls).sort().join(','),\n );\n if (this.pendingMetrics.trace.llmCallCount != null) {\n this.rootSpan.setAttribute(\n 'agentv.trace.llm_call_count',\n this.pendingMetrics.trace.llmCallCount,\n );\n }\n }\n if (error) {\n this.rootSpan.setStatus({ code: this.api.SpanStatusCode.ERROR, message: error });\n } else {\n this.rootSpan.setStatus({ code: this.api.SpanStatusCode.OK });\n }\n this.rootSpan.end();\n this.rootSpan = null;\n this.rootCtx = null;\n this.observedChildSpans = false;\n this.pendingMetrics = null;\n }\n\n /** Backfill child spans from the completed result when the provider emitted no live callbacks. */\n completeFromResult(result: EvaluationResult): void {\n this.recordEvalMetrics({\n durationMs: result.durationMs,\n costUsd: result.costUsd,\n tokenUsage: result.tokenUsage,\n trace: result.trace,\n });\n\n if (this.observedChildSpans || !this.rootCtx) {\n return;\n }\n\n const model =\n result.trace.messages.find((msg) => msg.role === 'assistant')?.metadata?.model ??\n result.target ??\n 'unknown';\n\n this.onLlmCall(String(model), result.tokenUsage);\n\n for (const message of result.trace.messages) {\n for (const toolCall of message.toolCalls ?? []) {\n this.onToolCall(\n toolCall.tool,\n toolCall.input,\n toolCall.output,\n toolCall.durationMs ?? 0,\n toolCall.id,\n );\n }\n }\n }\n\n /** Return the active eval span's trace ID and span ID for Braintrust trace bridging */\n getActiveSpanIds(): { parentSpanId: string; rootSpanId: string } | null {\n if (!this.rootSpan) return null;\n try {\n const spanCtx = this.rootSpan.spanContext?.() ?? this.rootSpan._spanContext;\n if (!spanCtx?.traceId || !spanCtx?.spanId) return null;\n return { parentSpanId: spanCtx.spanId, rootSpanId: spanCtx.traceId };\n } catch {\n return null;\n }\n }\n\n /** Get ProviderStreamCallbacks for passing to providers */\n getStreamCallbacks(): ProviderStreamCallbacks {\n return {\n onToolCallEnd: (name, input, output, durationMs, toolCallId) =>\n this.onToolCall(name, input, output, durationMs, toolCallId),\n onLlmCallEnd: (model, tokenUsage) => this.onLlmCall(model, tokenUsage),\n getActiveSpanIds: () => this.getActiveSpanIds(),\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Turn grouping\n// ---------------------------------------------------------------------------\n\ninterface Turn {\n messages: Message[];\n}\n\nfunction groupMessagesIntoTurns(messages: readonly Message[]): Turn[] {\n const turns: Turn[] = [];\n let current: Message[] = [];\n for (const msg of messages) {\n if (msg.role === 'user' && current.length > 0) {\n turns.push({ messages: current });\n current = [];\n }\n current.push(msg);\n }\n if (current.length > 0) turns.push({ messages: current });\n return turns;\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\n/** Convert an optional ISO timestamp to an HrTime-compatible value (milliseconds). */\nfunction toHrTime(iso?: string): number | undefined {\n if (!iso) return undefined;\n return new Date(iso).getTime();\n}\n","/**\n * Tracks cumulative cost across all eval files in a single CLI run.\n *\n * The per-suite budget (`execution.budget_usd` in YAML) is enforced by the orchestrator\n * and caps spend within one eval file. This tracker provides a **run-level** cap that\n * spans all files in a single `agentv run` invocation.\n *\n * Usage:\n * 1. Instantiate with the cap from `--budget-usd`.\n * 2. Share the tracker with each orchestrator running in the invocation.\n * 3. After each completed case, call `add()` with that case's total cost.\n * 4. Before dispatching the next case or file, check `isExceeded()`.\n *\n * Thread-safety note: AgentV mutates this tracker from async orchestration code, but all\n * updates occur on the JavaScript event loop. There is no shared-memory mutation across\n * threads, so simple cumulative accounting is sufficient here.\n */\nexport class RunBudgetTracker {\n private cumulative = 0;\n\n constructor(private readonly capUsd: number) {}\n\n /** Accumulate cost from a completed test or file. */\n add(costUsd: number): void {\n this.cumulative += costUsd;\n }\n\n /** True when cumulative cost meets or exceeds the cap. */\n isExceeded(): boolean {\n return this.cumulative >= this.capUsd;\n }\n\n /** Current accumulated cost. */\n get currentCostUsd(): number {\n return this.cumulative;\n }\n\n /** The configured cap. */\n get budgetCapUsd(): number {\n return this.capUsd;\n }\n}\n","/**\n * Session hook execution for AgentV.\n *\n * Runs a shell command once at agentv startup and injects exported environment\n * variables into the current process. This lets projects fetch secrets at\n * runtime (e.g. from a vault) without needing a wrapper script.\n *\n * ## How it works\n *\n * 1. The command is run via `sh -c` (or `cmd /c` on Windows).\n * 2. stdout is captured and parsed for env var exports.\n * 3. stderr is forwarded to the process stderr so the user sees output.\n * 4. Non-zero exit aborts with a clear error.\n * 5. Parsed keys are injected into `process.env` — only for keys not already\n * set, so existing env always wins.\n *\n * ## Supported output formats\n *\n * Both shell-export and dotenv formats are accepted:\n * export KEY=\"value\" (shell export — quotes optional)\n * KEY=value (dotenv — no export prefix)\n *\n * Lines that don't match either pattern are silently ignored.\n *\n * @module\n */\n\nimport { spawnSync } from 'node:child_process';\n\n/**\n * Parse env var lines from hook stdout.\n *\n * Accepts:\n * export KEY=\"value\" → { KEY: \"value\" }\n * export KEY=value → { KEY: \"value\" }\n * KEY=value → { KEY: \"value\" }\n *\n * Strips surrounding single or double quotes from values.\n * Skips lines with empty keys or values that look like shell syntax.\n */\nexport function parseEnvOutput(stdout: string): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const line of stdout.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n // Match: [export ]KEY=value\n const match = trimmed.match(/^(?:export\\s+)?([A-Za-z_][A-Za-z0-9_]*)=(.*)$/);\n if (!match) continue;\n\n const key = match[1];\n let value = match[2];\n\n // Strip surrounding quotes (single or double)\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n if (key) {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Run the before_session hook command and inject exported env vars into process.env.\n *\n * - Runs via shell (`sh -c` on POSIX, `cmd /c` on Windows)\n * - Captured stdout is parsed for env vars; stderr is forwarded to process.stderr\n * - Non-zero exit throws an Error with the command and exit code\n * - Keys already set in process.env are NOT overwritten\n *\n * @param command Shell command string to execute\n */\nexport function runBeforeSessionHook(command: string): void {\n const isWindows = process.platform === 'win32';\n const shell = isWindows ? 'cmd' : 'sh';\n const shellFlag = isWindows ? '/c' : '-c';\n\n console.log(`Running before_session hook: ${command}`);\n\n const result = spawnSync(shell, [shellFlag, command], {\n encoding: 'utf8',\n // Do not inherit stdio — capture stdout for parsing, forward stderr manually\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n // Forward stderr so the user can see hook output (warnings, progress, etc.)\n if (result.stderr) {\n process.stderr.write(result.stderr);\n }\n\n if (result.error) {\n throw new Error(`before_session hook failed to start: ${result.error.message}`);\n }\n\n if (result.status !== 0) {\n throw new Error(\n `before_session hook exited with code ${result.status ?? 'unknown'}: ${command}`,\n );\n }\n\n const vars = parseEnvOutput(result.stdout ?? '');\n let injected = 0;\n\n for (const [key, value] of Object.entries(vars)) {\n if (process.env[key] === undefined) {\n process.env[key] = value;\n injected++;\n }\n }\n\n if (injected > 0) {\n console.log(`before_session hook injected ${injected} environment variable(s).`);\n }\n}\n","/**\n * Claude Code session JSONL parser.\n *\n * Reads a Claude Code session transcript (~/.claude/projects/<encoded-path>/<uuid>.jsonl)\n * and converts it to AgentV's Message[] format.\n *\n * Each line is a JSON object with:\n * { type, message: { role, content }, sessionId, timestamp, uuid, requestId, ... }\n *\n * Supported event types:\n * user → Message { role: 'user' } (also contains tool_result blocks)\n * assistant → Message { role: 'assistant', toolCalls from tool_use content blocks }\n *\n * Skipped event types: progress, system, file-history-snapshot\n *\n * Key behaviors:\n * - tool_use blocks in assistant events → ToolCall (pending output)\n * - tool_result blocks in user events → matched to pending tool_use by tool_use_id\n * - Usage is cumulative per requestId; only the last value per requestId is used\n * - Streaming assistant events with the same requestId are deduplicated (keep latest)\n * - Subagent events (isSidechain: true) are filtered out in v1\n * - Duration is from first↔last event timestamp (including skipped types)\n * - cost_usd is null (Claude Code does not report per-session cost)\n */\n\nimport { normalizeToolCall } from '../evaluation/providers/normalize-tool-call.js';\nimport type { Message, ToolCall } from '../evaluation/providers/types.js';\nimport type { TranscriptEntry, TranscriptSource } from './types.js';\n\ninterface ClaudeEvent {\n readonly type: string;\n readonly requestId?: string;\n readonly isSidechain?: boolean;\n readonly message?: {\n readonly role?: string;\n readonly content?: string | readonly ClaudeContentBlock[];\n readonly usage?: ClaudeUsage;\n readonly model?: string;\n };\n readonly sessionId?: string;\n readonly timestamp?: string;\n readonly uuid?: string;\n readonly cwd?: string;\n}\n\ninterface ClaudeContentBlock {\n readonly type: string;\n readonly text?: string;\n readonly thinking?: string;\n readonly name?: string;\n readonly input?: unknown;\n readonly id?: string;\n readonly tool_use_id?: string;\n readonly content?: string | readonly { readonly type: string; readonly text?: string }[];\n}\n\ninterface ClaudeUsage {\n readonly input_tokens?: number;\n readonly output_tokens?: number;\n readonly cache_read_input_tokens?: number;\n}\n\nconst SKIPPED_TYPES = new Set(['progress', 'system', 'file-history-snapshot']);\n\nexport function parseClaudeSession(jsonl: string): TranscriptEntry {\n const messages: Message[] = [];\n let sessionId = '';\n let projectPath: string | undefined;\n let model: string | undefined;\n let startTimestamp: string | undefined;\n let endTimestamp: string | undefined;\n\n // Track usage per requestId — values are cumulative, so we only keep the last\n const usageByRequestId = new Map<string, ClaudeUsage>();\n\n // Track the last assistant message per requestId to deduplicate streaming updates\n let lastAssistantRequestId: string | undefined;\n let lastAssistantIdx = -1;\n\n // Track pending tool_use IDs for pairing with tool_result in user events\n const pendingToolCalls = new Map<string, { msgIdx: number; toolIdx: number }>();\n\n const lines = jsonl.split('\\n').filter((l) => l.trim().length > 0);\n\n for (const line of lines) {\n let event: ClaudeEvent;\n try {\n event = JSON.parse(line) as ClaudeEvent;\n } catch {\n continue;\n }\n\n if (!event.type) continue;\n\n // Track timestamps from ALL events (including skipped types) for accurate duration\n if (event.timestamp) {\n if (!startTimestamp) startTimestamp = event.timestamp;\n endTimestamp = event.timestamp;\n }\n\n // Skip non-message event types\n if (SKIPPED_TYPES.has(event.type)) continue;\n\n // Skip subagent events (v1: only process main conversation)\n if (event.isSidechain) continue;\n\n // Capture session metadata from first event\n if (!sessionId && event.sessionId) {\n sessionId = event.sessionId;\n }\n if (!projectPath && event.cwd) {\n projectPath = event.cwd;\n }\n\n switch (event.type) {\n case 'user': {\n const msg = event.message;\n if (!msg) break;\n\n const contentArr = msg.content;\n\n // User events can contain both tool_result blocks (responses to tool_use)\n // and text blocks. Process tool_results first, then extract text.\n if (Array.isArray(contentArr)) {\n for (const block of contentArr as readonly ClaudeContentBlock[]) {\n if (block.type === 'tool_result' && block.tool_use_id) {\n const pending = pendingToolCalls.get(block.tool_use_id);\n if (pending) {\n const existingMsg = messages[pending.msgIdx];\n const existingCalls = [...(existingMsg.toolCalls ?? [])];\n existingCalls[pending.toolIdx] = {\n ...existingCalls[pending.toolIdx],\n output: extractToolResultContent(block.content),\n };\n messages[pending.msgIdx] = { ...existingMsg, toolCalls: existingCalls };\n pendingToolCalls.delete(block.tool_use_id);\n }\n }\n }\n }\n\n // Extract text content for the user message\n const text = extractTextContent(contentArr);\n if (text !== undefined) {\n messages.push({ role: 'user', content: text });\n }\n break;\n }\n\n case 'assistant': {\n const msg = event.message;\n if (!msg) break;\n\n // Capture model from first assistant message\n if (!model && msg.model) {\n model = msg.model;\n }\n\n // Track usage (cumulative per requestId — last value wins)\n if (msg.usage && event.requestId) {\n usageByRequestId.set(event.requestId, msg.usage);\n }\n\n // Parse content array for text and tool_use blocks\n const { text, toolCalls } = extractAssistantContent(msg.content);\n\n // Deduplicate streaming assistant events with the same requestId\n if (\n event.requestId &&\n event.requestId === lastAssistantRequestId &&\n lastAssistantIdx >= 0\n ) {\n // Replace the previous partial message\n messages[lastAssistantIdx] = {\n role: 'assistant',\n content: text || undefined,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n };\n // Re-register tool calls for pairing\n registerPendingToolCalls(toolCalls, lastAssistantIdx, pendingToolCalls);\n } else {\n // Only push if there's actual content or tool calls\n if (text || toolCalls.length > 0) {\n lastAssistantIdx = messages.length;\n messages.push({\n role: 'assistant',\n content: text || undefined,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n });\n registerPendingToolCalls(toolCalls, lastAssistantIdx, pendingToolCalls);\n }\n }\n lastAssistantRequestId = event.requestId;\n break;\n }\n }\n }\n\n // Compute final usage from last-seen value per requestId\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n for (const usage of usageByRequestId.values()) {\n totalInputTokens += Number(usage.input_tokens ?? 0);\n totalOutputTokens += Number(usage.output_tokens ?? 0);\n }\n const hasUsage = usageByRequestId.size > 0;\n\n let durationMs: number | undefined;\n if (startTimestamp && endTimestamp) {\n durationMs = new Date(endTimestamp).getTime() - new Date(startTimestamp).getTime();\n }\n\n const source: TranscriptSource = {\n provider: 'claude',\n sessionId,\n projectPath,\n startedAt: startTimestamp,\n model,\n };\n\n return {\n messages,\n source,\n tokenUsage: hasUsage ? { input: totalInputTokens, output: totalOutputTokens } : undefined,\n durationMs,\n costUsd: null,\n };\n}\n\n/**\n * Register tool_use IDs from an assistant message for later pairing with tool_result.\n */\nfunction registerPendingToolCalls(\n toolCalls: ToolCall[],\n msgIdx: number,\n pending: Map<string, { msgIdx: number; toolIdx: number }>,\n): void {\n for (let i = 0; i < toolCalls.length; i++) {\n const id = toolCalls[i].id;\n if (id) {\n pending.set(id, { msgIdx, toolIdx: i });\n }\n }\n}\n\n/**\n * Extract text content from a message's content field.\n */\nfunction extractTextContent(\n content: string | readonly ClaudeContentBlock[] | undefined,\n): string | undefined {\n if (content === undefined || content === null) return undefined;\n if (typeof content === 'string') return content;\n\n const textParts: string[] = [];\n for (const block of content) {\n if (block.type === 'text' && block.text) {\n textParts.push(block.text);\n }\n }\n return textParts.length > 0 ? textParts.join('') : undefined;\n}\n\n/**\n * Extract text and tool_use calls from an assistant message's content array.\n * Note: tool_result blocks appear in user events, not here.\n */\nfunction extractAssistantContent(content: string | readonly ClaudeContentBlock[] | undefined): {\n text: string | undefined;\n toolCalls: ToolCall[];\n} {\n if (content === undefined || content === null) {\n return { text: undefined, toolCalls: [] };\n }\n if (typeof content === 'string') {\n return { text: content, toolCalls: [] };\n }\n\n const textParts: string[] = [];\n const toolCalls: ToolCall[] = [];\n\n for (const block of content) {\n switch (block.type) {\n case 'text':\n if (block.text) textParts.push(block.text);\n break;\n\n case 'tool_use':\n if (block.name) {\n toolCalls.push(\n normalizeToolCall('claude', {\n tool: block.name,\n input: block.input,\n id: block.id,\n }),\n );\n }\n break;\n\n // Skip thinking blocks and other types\n }\n }\n\n return {\n text: textParts.length > 0 ? textParts.join('') : undefined,\n toolCalls,\n };\n}\n\n/**\n * Extract text from a tool_result content field.\n */\nfunction extractToolResultContent(\n content: string | readonly { readonly type: string; readonly text?: string }[] | undefined,\n): string | undefined {\n if (content === undefined || content === null) return undefined;\n if (typeof content === 'string') return content;\n\n const parts: string[] = [];\n for (const block of content) {\n if (block.type === 'text' && block.text) {\n parts.push(block.text);\n }\n }\n return parts.length > 0 ? parts.join('') : undefined;\n}\n","/**\n * Codex CLI session JSONL parser.\n *\n * Reads a Codex CLI rollout transcript\n * (~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl) and converts it to AgentV's\n * Message[] format.\n *\n * Each line is a JSON object with one of these top-level types:\n * session_meta → session metadata (id, cwd, cli_version, model)\n * turn_context → per-turn context (model, cwd, turn_id)\n * event_msg → events: task_started, task_complete, user_message,\n * agent_message, token_count\n * response_item → conversation items: message, function_call,\n * function_call_output, reasoning, custom_tool_call,\n * custom_tool_call_output\n *\n * Key behaviors:\n * - response_item with type=message and role=user → user Message\n * - response_item with type=message and role=assistant → assistant Message\n * - response_item with type=function_call → ToolCall (pending output)\n * - response_item with type=function_call_output → matched to pending call by call_id\n * - response_item with type=reasoning → skipped (thinking tokens)\n * - response_item with role=developer → skipped (system prompt)\n * - session_meta → source metadata (session_id, cwd, version, model)\n * - turn_context → model name extraction\n * - Duration is from first↔last event timestamp\n * - cost_usd is null (Codex CLI does not report per-session cost)\n * - Token usage not available from rollout format (rate limit info only)\n *\n * To add a new response_item type: add a case to the switch in parseCodexSession().\n */\n\nimport { normalizeToolCall } from '../evaluation/providers/normalize-tool-call.js';\nimport type { Message, ToolCall } from '../evaluation/providers/types.js';\nimport type { TranscriptEntry, TranscriptSource } from './types.js';\n\ninterface CodexLine {\n readonly timestamp?: string;\n readonly type: string;\n readonly payload: Record<string, unknown>;\n}\n\nexport function parseCodexSession(jsonl: string): TranscriptEntry {\n const messages: Message[] = [];\n let sessionId = '';\n let cwd: string | undefined;\n let model: string | undefined;\n let version: string | undefined;\n let startTimestamp: string | undefined;\n let endTimestamp: string | undefined;\n\n // Track pending function calls by call_id\n const pendingCalls = new Map<string, { msgIdx: number; toolIdx: number }>();\n\n const lines = jsonl.split('\\n').filter((l) => l.trim().length > 0);\n\n for (const line of lines) {\n let entry: CodexLine;\n try {\n entry = JSON.parse(line) as CodexLine;\n } catch {\n continue;\n }\n\n if (!entry.type) continue;\n\n // Track timestamps for duration\n if (entry.timestamp) {\n if (!startTimestamp) startTimestamp = entry.timestamp;\n endTimestamp = entry.timestamp;\n }\n\n const payload = entry.payload ?? {};\n\n switch (entry.type) {\n case 'session_meta': {\n sessionId = String(payload.id ?? '');\n cwd = payload.cwd ? String(payload.cwd) : undefined;\n version = payload.cli_version ? String(payload.cli_version) : undefined;\n if (payload.model && !model) {\n model = String(payload.model);\n }\n break;\n }\n\n case 'turn_context': {\n if (payload.model && !model) {\n model = String(payload.model);\n }\n if (payload.cwd && !cwd) {\n cwd = String(payload.cwd);\n }\n break;\n }\n\n case 'response_item': {\n const itemType = String(payload.type ?? '');\n const role = String(payload.role ?? '');\n\n switch (itemType) {\n case 'message': {\n // Skip developer (system prompt) messages\n if (role === 'developer') break;\n\n const content = extractResponseItemContent(payload.content);\n if (role === 'user' && content) {\n messages.push({ role: 'user', content });\n } else if (role === 'assistant' && content) {\n messages.push({ role: 'assistant', content });\n }\n break;\n }\n\n case 'function_call': {\n const toolName = String(payload.name ?? '');\n const callId = String(payload.call_id ?? '');\n let input: unknown;\n if (typeof payload.arguments === 'string') {\n try {\n input = JSON.parse(payload.arguments);\n } catch {\n input = payload.arguments;\n }\n } else {\n input = payload.arguments;\n }\n\n const toolCall: ToolCall = normalizeToolCall('codex', {\n tool: toolName,\n input,\n id: callId,\n });\n const msgIdx = messages.length;\n messages.push({\n role: 'assistant',\n toolCalls: [toolCall],\n });\n\n if (callId) {\n pendingCalls.set(callId, { msgIdx, toolIdx: 0 });\n }\n break;\n }\n\n case 'custom_tool_call': {\n const toolName = String(payload.name ?? '');\n const callId = String(payload.call_id ?? '');\n let input: unknown;\n if (typeof payload.arguments === 'string') {\n try {\n input = JSON.parse(payload.arguments);\n } catch {\n input = payload.arguments;\n }\n } else {\n input = payload.arguments;\n }\n\n const toolCall: ToolCall = normalizeToolCall('codex', {\n tool: toolName,\n input,\n id: callId,\n });\n const msgIdx = messages.length;\n messages.push({\n role: 'assistant',\n toolCalls: [toolCall],\n });\n\n if (callId) {\n pendingCalls.set(callId, { msgIdx, toolIdx: 0 });\n }\n break;\n }\n\n case 'function_call_output':\n case 'custom_tool_call_output': {\n const callId = String(payload.call_id ?? '');\n const pending = pendingCalls.get(callId);\n if (pending) {\n const existingMsg = messages[pending.msgIdx];\n const existingCalls = [...(existingMsg.toolCalls ?? [])];\n existingCalls[pending.toolIdx] = {\n ...existingCalls[pending.toolIdx],\n output: payload.output,\n };\n messages[pending.msgIdx] = { ...existingMsg, toolCalls: existingCalls };\n pendingCalls.delete(callId);\n }\n break;\n }\n\n // Skip reasoning blocks (thinking tokens)\n case 'reasoning':\n break;\n }\n break;\n }\n\n // Skip event_msg types (task_started, task_complete, token_count, etc.)\n // They don't contain conversation content\n }\n }\n\n let durationMs: number | undefined;\n if (startTimestamp && endTimestamp) {\n durationMs = new Date(endTimestamp).getTime() - new Date(startTimestamp).getTime();\n }\n\n const source: TranscriptSource = {\n provider: 'codex',\n sessionId,\n cwd,\n startedAt: startTimestamp,\n model,\n version,\n };\n\n return {\n messages,\n source,\n // Codex rollout files don't include token counts (only rate limit info)\n tokenUsage: undefined,\n durationMs,\n costUsd: null,\n };\n}\n\n/**\n * Extract text content from a Codex response_item content array.\n * Content is typically: [{ type: \"input_text\"|\"output_text\", text: \"...\" }]\n */\nfunction extractResponseItemContent(content: unknown): string | undefined {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return undefined;\n\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === 'object' && block !== null) {\n const b = block as Record<string, unknown>;\n if (typeof b.text === 'string') {\n parts.push(b.text);\n }\n }\n }\n return parts.length > 0 ? parts.join('') : undefined;\n}\n","/**\n * Codex CLI session discovery.\n *\n * Scans ~/.codex/sessions/ for rollout JSONL files. Codex CLI stores sessions at:\n * ~/.codex/sessions/YYYY/MM/DD/rollout-<timestamp>-<uuid>.jsonl\n *\n * Sessions are returned sorted by modification time (most recent first).\n */\n\nimport { readdir, stat } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\n\nexport interface CodexSession {\n /** UUID from the filename */\n readonly sessionId: string;\n /** Full path to the JSONL file */\n readonly filePath: string;\n /** Filename (e.g., rollout-2026-03-29T14-22-01-<uuid>.jsonl) */\n readonly filename: string;\n /** Last modification time */\n readonly updatedAt: Date;\n}\n\nexport interface CodexDiscoverOptions {\n /** Filter by date string (YYYY-MM-DD). */\n readonly date?: string;\n /** Maximum number of sessions to return (default: 10). */\n readonly limit?: number;\n /** Override the default ~/.codex/sessions directory. */\n readonly sessionsDir?: string;\n /** Return only the most recent session. */\n readonly latest?: boolean;\n}\n\nconst DEFAULT_SESSIONS_DIR = () => path.join(homedir(), '.codex', 'sessions');\n\nexport async function discoverCodexSessions(opts?: CodexDiscoverOptions): Promise<CodexSession[]> {\n const sessionsDir = opts?.sessionsDir ?? DEFAULT_SESSIONS_DIR();\n const limit = opts?.latest ? 1 : (opts?.limit ?? 10);\n\n const sessions: CodexSession[] = [];\n\n // Walk YYYY/MM/DD directory structure\n let yearDirs: string[];\n try {\n yearDirs = await readdir(sessionsDir);\n } catch {\n return [];\n }\n\n for (const year of yearDirs) {\n const yearPath = path.join(sessionsDir, year);\n let monthDirs: string[];\n try {\n monthDirs = await readdir(yearPath);\n } catch {\n continue;\n }\n\n for (const month of monthDirs) {\n const monthPath = path.join(yearPath, month);\n let dayDirs: string[];\n try {\n dayDirs = await readdir(monthPath);\n } catch {\n continue;\n }\n\n for (const day of dayDirs) {\n // Filter by date if specified\n if (opts?.date) {\n const dirDate = `${year}-${month}-${day}`;\n if (dirDate !== opts.date) continue;\n }\n\n const dayPath = path.join(monthPath, day);\n let files: string[];\n try {\n files = await readdir(dayPath);\n } catch {\n continue;\n }\n\n for (const file of files) {\n if (!file.startsWith('rollout-') || !file.endsWith('.jsonl')) continue;\n\n const filePath = path.join(dayPath, file);\n\n // Extract UUID from filename: rollout-<timestamp>-<uuid>.jsonl\n // UUID is the last segment before .jsonl\n const nameWithoutExt = file.replace(/\\.jsonl$/, '');\n const parts = nameWithoutExt.split('-');\n // UUID is typically the last 5 hyphen-separated segments (standard UUID format)\n const sessionId = parts.length >= 6 ? parts.slice(-5).join('-') : nameWithoutExt;\n\n let updatedAt: Date;\n try {\n const fileStat = await stat(filePath);\n updatedAt = fileStat.mtime;\n } catch {\n updatedAt = new Date(0);\n }\n\n sessions.push({ sessionId, filePath, filename: file, updatedAt });\n }\n }\n }\n }\n\n sessions.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n return sessions.slice(0, limit);\n}\n","/**\n * Claude Code session discovery.\n *\n * Scans ~/.claude/projects/ for session JSONL files. Claude Code stores\n * sessions at:\n * ~/.claude/projects/<encoded-project-path>/<uuid>.jsonl\n *\n * Where <encoded-project-path> is the absolute project path with `/` replaced\n * by `-` and prefixed with `-` (e.g., `-home-user-myproject`).\n *\n * Sessions are returned sorted by modification time (most recent first).\n */\n\nimport { readdir, stat } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\n\nexport interface ClaudeSession {\n /** UUID of the session */\n readonly sessionId: string;\n /** Full path to the JSONL file */\n readonly filePath: string;\n /** Encoded project directory name */\n readonly projectDir: string;\n /** Last modification time */\n readonly updatedAt: Date;\n}\n\nexport interface ClaudeDiscoverOptions {\n /** Filter by session UUID (exact match). */\n readonly sessionId?: string;\n /** Filter by project path (substring match against encoded dir name). */\n readonly projectPath?: string;\n /** Maximum number of sessions to return (default: 10). */\n readonly limit?: number;\n /** Override the default ~/.claude/projects directory. */\n readonly projectsDir?: string;\n /** Return only the most recent session. */\n readonly latest?: boolean;\n}\n\nconst DEFAULT_PROJECTS_DIR = () => path.join(homedir(), '.claude', 'projects');\n\n/**\n * Encode a filesystem path to Claude Code's project directory format.\n * `/home/user/myproject` → `-home-user-myproject`\n */\nfunction encodeProjectPath(projectPath: string): string {\n return projectPath.replace(/\\//g, '-');\n}\n\nexport async function discoverClaudeSessions(\n opts?: ClaudeDiscoverOptions,\n): Promise<ClaudeSession[]> {\n const projectsDir = opts?.projectsDir ?? DEFAULT_PROJECTS_DIR();\n const limit = opts?.latest ? 1 : (opts?.limit ?? 10);\n\n let projectDirs: string[];\n try {\n projectDirs = await readdir(projectsDir);\n } catch {\n return [];\n }\n\n // Filter project directories if projectPath is specified\n if (opts?.projectPath) {\n const encoded = encodeProjectPath(opts.projectPath);\n projectDirs = projectDirs.filter((dir) => dir === encoded || dir.includes(encoded));\n }\n\n const sessions: ClaudeSession[] = [];\n\n for (const projectDir of projectDirs) {\n const dirPath = path.join(projectsDir, projectDir);\n\n let entries: string[];\n try {\n entries = await readdir(dirPath);\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n if (!entry.endsWith('.jsonl')) continue;\n\n const sessionId = entry.replace(/\\.jsonl$/, '');\n\n // Filter by session ID if specified\n if (opts?.sessionId && sessionId !== opts.sessionId) continue;\n\n const filePath = path.join(dirPath, entry);\n\n let updatedAt: Date;\n try {\n const fileStat = await stat(filePath);\n updatedAt = fileStat.mtime;\n } catch {\n updatedAt = new Date(0);\n }\n\n sessions.push({\n sessionId,\n filePath,\n projectDir,\n updatedAt,\n });\n }\n }\n\n // Sort by modification time, most recent first\n sessions.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n\n return sessions.slice(0, limit);\n}\n","/**\n * Transcript provider — replays pre-recorded session transcripts through the\n * evaluation pipeline without invoking any live agent.\n *\n * Used by `agentv eval --transcript <file>` to grade imported sessions.\n *\n * How it works:\n * 1. Reads a transcript JSONL file (produced by `agentv import`)\n * 2. Each invocation pops the next line from the transcript\n * 3. Returns a ProviderResponse with pre-populated output, token usage, etc.\n * 4. Graders run identically to live eval — they see the same ProviderResponse\n *\n * The provider name in results is set to the source provider from the transcript\n * (e.g., \"claude\", \"codex\", \"copilot\").\n */\n\nimport type { Provider, ProviderRequest, ProviderResponse } from '../evaluation/providers/types.js';\nimport type { TranscriptReplayEntry } from './types.js';\nimport { groupTranscriptJsonLines, readTranscriptJsonl } from './types.js';\n\nexport class TranscriptProvider implements Provider {\n readonly id: string;\n readonly kind = 'transcript' as const;\n readonly targetName: string;\n\n private entries: TranscriptReplayEntry[];\n private cursor = 0;\n\n constructor(targetName: string, entries: TranscriptReplayEntry[]) {\n this.targetName = targetName;\n this.id = `transcript:${targetName}`;\n this.entries = entries;\n }\n\n /**\n * Create a TranscriptProvider from a JSONL file path.\n */\n static async fromFile(filePath: string): Promise<TranscriptProvider> {\n const lines = await readTranscriptJsonl(filePath);\n if (lines.length === 0) {\n throw new Error(`Transcript file is empty: ${filePath}`);\n }\n const entries = groupTranscriptJsonLines(lines);\n const providerName = entries[0]?.source.provider ?? 'transcript';\n return new TranscriptProvider(providerName, entries);\n }\n\n get lineCount(): number {\n return this.entries.length;\n }\n\n async invoke(_request: ProviderRequest): Promise<ProviderResponse> {\n if (this.cursor >= this.entries.length) {\n throw new Error(\n `Transcript exhausted: ${this.entries.length} entr${this.entries.length === 1 ? 'y' : 'ies'} available but ` +\n `${this.cursor + 1} invocations attempted. Each transcript entry maps to one test case.`,\n );\n }\n\n const entry = this.entries[this.cursor++];\n\n return {\n output: entry.messages,\n tokenUsage: entry.tokenUsage\n ? {\n input: entry.tokenUsage.input,\n output: entry.tokenUsage.output,\n cached: entry.tokenUsage.cached,\n reasoning: entry.tokenUsage.reasoning,\n }\n : undefined,\n durationMs: entry.durationMs,\n costUsd: entry.costUsd ?? undefined,\n startTime: entry.source.startedAt,\n };\n }\n}\n","export * from './evaluation/content.js';\nexport * from './evaluation/types.js';\nexport * from './evaluation/trace.js';\nexport * from './evaluation/trace-envelope.js';\nexport * from './evaluation/metrics.js';\nexport * from './evaluation/dashboard-trace-read-model.js';\nexport * from './evaluation/trace-normalization.js';\nexport * from './evaluation/external-trace.js';\nexport * from './evaluation/projection-identity.js';\nexport * from './evaluation/replay-fixtures.js';\nexport * from './evaluation/replay-trace-envelopes.js';\nexport {\n ResultRowSchemaError,\n normalizeResultRow,\n} from './evaluation/result-row-schema.js';\nexport * from './evaluation/result-artifact-contract.js';\nexport { parseYamlValue } from './evaluation/yaml-loader.js';\nexport * from './evaluation/yaml-parser.js';\nexport {\n isAgentSkillsFormat,\n parseAgentSkillsEvals,\n} from './evaluation/loaders/agent-skills-parser.js';\nexport {\n loadConfig,\n resolveResultsConfigForProject,\n type AgentVConfig as AgentVYamlConfig,\n type ResultsConfig,\n} from './evaluation/loaders/config-loader.js';\nexport {\n loadTsEvalFile,\n type TsEvalResult,\n} from './evaluation/loaders/ts-eval-loader.js';\nexport {\n transpileEvalYaml,\n transpileEvalYamlFile,\n getOutputFilenames,\n} from './evaluation/loaders/eval-yaml-transpiler.js';\nexport type {\n EvalsJsonCase,\n EvalsJsonFile,\n TranspileResult,\n} from './evaluation/loaders/eval-yaml-transpiler.js';\nexport * from './evaluation/file-utils.js';\nexport * from './evaluation/providers/index.js';\nexport * from './evaluation/graders.js';\nexport * from './evaluation/orchestrator.js';\nexport * from './evaluation/prepared-workspace.js';\nexport {\n evaluate,\n type AssertEntry,\n type ConversationTurnInput,\n type EvalConfig,\n type EvalRunArtifacts,\n type EvalTestInput,\n type EvalAssertionInput,\n type EvalRunResult,\n type EvalSummary,\n} from './evaluation/evaluate.js';\nexport {\n RESULT_INDEX_FILENAME,\n aggregateRunDir,\n buildAggregateGradingArtifact,\n buildBenchmarkArtifact,\n buildGradingArtifact,\n buildIndexArtifactEntry,\n buildResultIndexArtifact,\n buildTestTargetKey,\n buildTimingArtifact,\n deduplicateByTestIdTarget,\n parseJsonlResults,\n writeArtifacts,\n writeArtifactsFromResults,\n writeInitialBenchmarkArtifact,\n writePerTestArtifacts,\n type AdditionalResultArtifactsContext,\n type AdditionalResultArtifactsWriter,\n type AdditionalResultIndexFields,\n type AggregateGradingArtifact,\n type BenchmarkArtifact,\n type GradingArtifact,\n type IndexArtifactEntry,\n type ResultIndexArtifact,\n type TimingArtifact,\n} from './evaluation/run-artifacts.js';\nexport type {\n AssertContext,\n AssertFn,\n AssertResult,\n} from './evaluation/assertions.js';\nexport {\n defineConfig,\n loadTsConfig,\n type AgentVConfig as AgentVTsConfig,\n} from './evaluation/config.js';\nexport * from './evaluation/generators/index.js';\nexport * from './evaluation/workspace/index.js';\nexport {\n ResponseCache,\n shouldEnableCache,\n shouldSkipCacheForTemperature,\n} from './evaluation/cache/response-cache.js';\nexport { toSnakeCaseDeep, toCamelCaseDeep } from './evaluation/case-conversion.js';\nexport {\n ensureResultsRepoClone,\n syncResultsRepo,\n syncResultsRepoForProject,\n getResultsRepoLocalPaths,\n getResultsRepoStatus,\n getResultsRepoSyncStatus,\n normalizeResultsConfig,\n resolveResultsRepoRunsDir,\n resolveResultsRepoUrl,\n prepareResultsRepoBranch,\n checkoutResultsRepoBranch,\n stageResultsArtifacts,\n directorySizeBytes,\n commitAndPushResultsBranch,\n pushResultsRepoBranch,\n createDraftResultsPr,\n directPushResults,\n directPushResultsWithDetails,\n buildWipBranchName,\n setupWipWorktree,\n pushWipCheckpoint,\n deleteWipBranch,\n listGitRuns,\n materializeGitRun,\n readGitResultArtifact,\n type CheckedOutResultsRepoBranch,\n type DirectPushResultsResult,\n type GitResultArtifactReadParams,\n type GitListedRun,\n type NormalizedResultsConfig,\n type PreparedResultsRepoBranch,\n type ResultPushConflictPolicy,\n type ResultsRepoLocalPaths,\n type ResultsRepoSyncStatus,\n type ResultsRepoStatus,\n type WipWorktreeHandle,\n} from './evaluation/results-repo.js';\nexport {\n getAgentvConfigDir,\n getAgentvHome,\n getAgentvDataDir,\n getWorkspacesRoot,\n getSubagentsRoot,\n getTraceStateRoot,\n getWorkspacePoolRoot,\n} from './paths.js';\nexport {\n type ProjectEntry,\n type ProjectRegistry,\n loadProjectRegistry,\n saveProjectRegistry,\n addProject,\n removeProject,\n getProject,\n getProjectForPath,\n touchProject,\n discoverProjects,\n deriveProjectId,\n getProjectsRegistryPath,\n} from './projects.js';\nexport { syncProject, syncProjects } from './project-sync.js';\nexport { trimBaselineResult } from './evaluation/baseline.js';\nexport { DEFAULT_CATEGORY, deriveCategory } from './evaluation/category.js';\nexport * from './observability/index.js';\n\n// Registry exports\nexport {\n GraderRegistry,\n DeterministicAssertionGrader,\n} from './evaluation/registry/grader-registry.js';\nexport type {\n GraderDispatchContext,\n GraderFactoryFn,\n} from './evaluation/registry/grader-registry.js';\nexport { createBuiltinRegistry } from './evaluation/registry/builtin-graders.js';\nexport { discoverAssertions } from './evaluation/registry/assertion-discovery.js';\nexport {\n runContainsAssertion,\n runContainsAnyAssertion,\n runContainsAllAssertion,\n runIcontainsAssertion,\n runIcontainsAnyAssertion,\n runIcontainsAllAssertion,\n runStartsWithAssertion,\n runEndsWithAssertion,\n runRegexAssertion,\n runIsJsonAssertion,\n runEqualsAssertion,\n type AssertionResult,\n} from './evaluation/graders/assertions.js';\nexport { discoverGraders } from './evaluation/registry/grader-discovery.js';\nexport { RunBudgetTracker } from './evaluation/run-budget-tracker.js';\nexport { runBeforeSessionHook, parseEnvOutput } from './evaluation/hooks.js';\nexport {\n trackChild,\n killAllTrackedChildren,\n trackedChildCount,\n} from './runtime/child-tracker.js';\n\n// Import pipeline\nexport * from './import/index.js';\n\nexport type AgentKernel = {\n status: string;\n};\n\nexport function createAgentKernel(): AgentKernel {\n return { status: 'stub' };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AESA,SAAS,oBAAoB;AAC7B,OAAO,UAAU;ACGjB,SAAS,kBAAkB;AAC3B,OAAOA,WAAU;AACjB,OAAO,gBAAgB;AGDvB,SAAS,gBAAgB;AACzB,OAAOC,WAAU;ACfjB,SAAS,UAAU,aAAa;AAChC,SAAS,kBAAkB;AAC3B;EACE;EACA;EACA;EACA,gBAAAC;EACA;EACA;EACA;OACK;AACP,SAAS,IAAI,OAAO,SAAS,SAAS,IAAI,YAAY;AACtD,OAAO,QAAQ;AACf,OAAOD,WAAU;AACjB,SAAS,iBAAiB;ACC1B,YAAY,kBAAkB;AAC9B,SAAS,cAAAE,mBAAkB;AKW3B,SAAS,iBAAiB;AGlB1B,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAC9B,SAAS,eAAe;AACxB,OAAOJ,WAAU;ACEjB,SAAS,WAAAG,UAAS,QAAAC,aAAY;AAC9B,SAAS,WAAAC,gBAAe;AACxB,OAAOL,WAAU;AjB+GV,IAAM,+BAA+B;AA+B5C,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,SAAS,OAAqD;AACrE,SAAO,SAAS,KAAK,IAAI,QAAQ;AACnC;AAEA,SAAS,QAAQ,OAA2B;AAC1C,SAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AACzC;AAEA,SAAS,YAAY,OAAoC;AACvD,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AAEA,SAAS,aAAa,OAAoC;AACxD,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ;AACvE;AAEA,SAAS,cAAc,OAAoC;AACzD,SAAO,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,KAAK,SAAS,IAAI,QAAQ;AACtF;AAEA,SAAS,UAAU,OAAqC;AACtD,SAAO,OAAO,UAAU,YAAY,QAAQ;AAC9C;AAEA,SAAS,cAAiD,OAAa;AACrE,SAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS,CAAC;AAC5F;AAEA,SAAS,cAAc,OAAqE;AAC1F,QAAM,YAAY,cAAc,KAAK;AACrC,SAAO,OAAO,KAAK,SAAS,EAAE,SAAS,IAAI,YAAY;AACzD;AAEA,SAAS,cAAiB,OAA2D;AACnF,SAAO,SAAS,MAAM,SAAS,IAAI,QAAQ;AAC7C;AAEA,SAAS,cAAc,OAA+C;AACpE,MAAI,CAAC,OAAO;AACV,WAAO;EACT;AACA,MAAI;AACF,WAAO,IAAI,KAAK,OAAO,OAAO,KAAK,IAAI,QAAU,CAAC,EAAE,YAAY;EAClE,QAAQ;AACN,WAAO;EACT;AACF;AAEA,SAAS,oBACP,OACA,KACoB;AACpB,MAAI,CAAC,SAAS,CAAC,KAAK;AAClB,WAAO;EACT;AACA,MAAI;AACF,UAAM,aAAa,OAAO,KAAK;AAC/B,UAAM,WAAW,OAAO,GAAG;AAC3B,QAAI,WAAW,YAAY;AACzB,aAAO;IACT;AACA,WAAO,OAAO,WAAW,UAAU,IAAI;EACzC,QAAQ;AACN,WAAO;EACT;AACF;AAEA,SAAS,qBACP,YACA,MACoB;AACpB,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,aAAa,WAAW,GAAG,CAAC;AAC1C,QAAI,UAAU,QAAW;AACvB,aAAO;IACT;EACF;AACA,SAAO;AACT;AAEA,SAAS,yBACP,YACoC;AACpC,MAAI,CAAC,YAAY;AACf,WAAO;EACT;AAEA,QAAM,SAAS,SAAS,WAAW,WAAW;AAC9C,QAAM,QAAQ,cAAc;IAC1B,OACE,aAAa,QAAQ,KAAK,KAC1B,qBAAqB,YAAY;MAC/B;MACA;MACA;IACF,CAAC;IACH,QACE,aAAa,QAAQ,MAAM,KAC3B,qBAAqB,YAAY;MAC/B;MACA;MACA;IACF,CAAC;IACH,WACE,aAAa,QAAQ,SAAS,KAC9B,qBAAqB,YAAY;MAC/B;MACA;IACF,CAAC;IACH,QACE,aAAa,QAAQ,MAAM,KAC3B,qBAAqB,YAAY,CAAC,wCAAwC,eAAe,CAAC;IAC5F,OAAO,aAAa,QAAQ,KAAK,KAAK,qBAAqB,YAAY,CAAC,cAAc,CAAC;EACzF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,mBAAmB,KAAsB;AAChD,SACE,QAAQ,oBACR,IAAI,WAAW,iBAAiB,KAChC,IAAI,WAAW,iBAAiB;AAEpC;AAEA,SAAS,oBAAoB,KAAsB;AACjD,QAAM,aAAa,IAAI,YAAY;AACnC,MACE,eAAe,iBACf,WAAW,SAAS,SAAS,KAC7B,WAAW,SAAS,SAAS,KAC7B,WAAW,SAAS,QAAQ,GAC5B;AACA,WAAO;EACT;AACA,SAAO,wMAAwM;IAC7M;EACF;AACF;AAEA,SAAS,qBACP,OACqC;AACrC,MAAI,CAAC,OAAO;AACV,WAAO;EACT;AACA,QAAM,UAAU,OAAO,QAAQ,KAAK,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC9D,QAAI,mBAAmB,GAAG,KAAK,oBAAoB,GAAG,GAAG;AACvD,aAAO,CAAC;IACV;AACA,QAAI,SAAS,KAAK,GAAG;AACnB,YAAM,SAAS,qBAAqB,KAAK;AACzC,aAAO,SAAS,CAAC,CAAC,KAAK,MAAM,CAAU,IAAI,CAAC;IAC9C;AACA,WAAO,CAAC,CAAC,KAAK,KAAK,CAAU;EAC/B,CAAC;AACD,SAAO,QAAQ,SAAS,IAAI,OAAO,YAAY,OAAO,IAAI;AAC5D;AAEA,SAAS,oBAAoB,OAA4C;AACvE,QAAM,SAAS,SAAS,KAAK;AAC7B,MAAI,CAAC,QAAQ;AACX,WAAO;EACT;AACA,SAAO,cAAc;IACnB,MACE,YAAY,OAAO,IAAI,MACtB,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO,IAAI,IAAI;IAC3D,SAAS,YAAY,OAAO,OAAO;EACrC,CAAC;AACH;AAEA,SAAS,UACP,MACA,YACuB;AACvB,QAAM,YAAY,KAAK,YAAY;AACnC,MACE,UAAU,SAAS,OAAO,KAC1B,qBAAqB,cAAc,CAAC,GAAG;IACrC;IACA;IACA;IACA;IACA;EACF,CAAC,MAAM,QACP;AACA,WAAO;EACT;AACA,MACE,UAAU,SAAS,YAAY,KAC/B,YAAY,YAAY,IAAI,MAAM,UAClC,YAAY,YAAY,UAAU,MAAM,UACxC,YAAY,aAAa,wBAAwB,CAAC,MAAM,QACxD;AACA,WAAO;EACT;AACA,MAAI,cAAc,aAAa;AAC7B,WAAO;EACT;AACA,SAAO;AACT;AAEA,SAAS,eAAe,YAAqE;AAC3F,MAAI,CAAC,YAAY;AACf,WAAO;EACT;AACA,SACE,aAAa,WAAW,KAAK,KAC7B,aAAa,WAAW,cAAc,CAAC,KACvC,aAAa,WAAW,qBAAqB,CAAC,KAC9C,aAAa,WAAW,+BAA+B,CAAC,KACxD,aAAa,WAAW,gCAAgC,CAAC;AAE7D;AAEA,SAAS,cAAc,YAAqE;AAC1F,MAAI,CAAC,YAAY;AACf,WAAO;EACT;AACA,SACE,YAAY,WAAW,IAAI,KAC3B,YAAY,WAAW,UAAU,KACjC,YAAY,WAAW,wBAAwB,CAAC,KAChD,YAAY,WAAW,+BAA+B,CAAC,KACvD,YAAY,WAAW,+BAA+B,CAAC,KACvD,YAAY,WAAW,mBAAmB,CAAC;AAE/C;AAEA,SAAS,gBAAgB,YAAsE;AAC7F,MAAI,CAAC,YAAY;AACf,WAAO;EACT;AACA,SACE,UAAU,WAAW,MAAM,KAC3B,UAAU,WAAW,0BAA0B,CAAC,KAChD,UAAU,WAAW,sBAAsB,CAAC,KAC5C,UAAU,WAAW,0BAA0B,CAAC;AAEpD;AAEA,SAAS,QACP,QACA,OACA,YACQ;AACR,SACE,YAAY,YAAY,QAAQ,KAChC,YAAY,aAAa,iBAAiB,CAAC,KAC3C,GAAG,MAAM,UAAU,KAAK;AAE5B;AAEA,SAAS,iBACP,QACA,OACA,OAC+B;AAC/B,QAAM,SAAS,SAAS,KAAK;AAC7B,MAAI,CAAC,QAAQ;AACX,WAAO;EACT;AACA,QAAM,OAAO,YAAY,OAAO,IAAI;AACpC,MAAI,CAAC,MAAM;AACT,WAAO;EACT;AAEA,QAAM,aAAa,SAAS,OAAO,UAAU;AAC7C,QAAM,iBAAiB,qBAAqB,UAAU;AACtD,SAAO,cAAc;IACnB,UAAU,QAAQ,QAAQ,OAAO,UAAU;IAC3C,SAAS;IACT;IACA,MAAM,UAAU,MAAM,UAAU;IAChC,gBAAgB,YAAY,OAAO,cAAc;IACjD,WAAW,cAAc,YAAY,OAAO,cAAc,CAAC;IAC3D,OAAO,eAAe,UAAU;IAChC,MAAM,cAAc,UAAU;IAC9B,QAAQ,gBAAgB,UAAU;IAClC,YAAY;EACd,CAAC;AACH;AAEA,SAAS,YAAY,MAAe,OAA6C;AAC/E,QAAM,SAAS,SAAS,IAAI;AAC5B,MAAI,CAAC,QAAQ;AACX,WAAO;EACT;AAEA,QAAM,SAAS,YAAY,OAAO,OAAO,KAAK,QAAQ,KAAK;AAC3D,QAAM,UAAU,YAAY,OAAO,QAAQ;AAC3C,QAAM,eAAe,OAAO,mBAAmB,OAAO,OAAO,YAAY,OAAO,cAAc;AAC9F,QAAM,aAAa,SAAS,OAAO,UAAU;AAC7C,QAAM,iBAAiB,qBAAqB,UAAU;AACtD,QAAM,oBAAoB,YAAY,OAAO,oBAAoB;AACjE,QAAM,kBAAkB,YAAY,OAAO,kBAAkB;AAC7D,QAAM,SAAS,QAAQ,OAAO,MAAM,EACjC,IAAI,CAAC,OAAO,eAAe,iBAAiB,QAAQ,OAAO,UAAU,CAAC,EACtE,OAAO,CAAC,UAAsC,UAAU,MAAS;AAEpE,SAAO,cAAc;IACnB,IAAI;IACJ,UAAU;IACV,SAAS;IACT,gBAAgB;IAChB,MAAM,YAAY,OAAO,IAAI,KAAK;IAClC,MAAM,YAAY,OAAO,IAAI;IAC7B,QAAQ,oBAAoB,OAAO,MAAM;IACzC,sBAAsB;IACtB,oBAAoB;IACpB,YAAY,cAAc,iBAAiB;IAC3C,UAAU,cAAc,eAAe;IACvC,aAAa,oBAAoB,mBAAmB,eAAe;IACnE,aAAa,yBAAyB,UAAU;IAChD,qBAAqB,qBAAqB,SAAS,OAAO,mBAAmB,CAAC;IAC9E,YAAY;IACZ,QAAQ,OAAO,SAAS,IAAI,SAAS;EACvC,CAAC;AACH;AAEA,SAAS,cAAc,QAAkD;AACvE,QAAM,YAAiC,CAAC;AAExC,aAAW,SAAS,QAAQ,MAAM,GAAG;AACnC,UAAM,SAAS,SAAS,KAAK;AAC7B,UAAM,OAAO,YAAY,QAAQ,IAAI;AACrC,UAAM,QAAQ,aAAa,QAAQ,KAAK;AACxC,QAAI,CAAC,UAAU,CAAC,QAAQ,UAAU,QAAW;AAC3C;IACF;AACA,cAAU;MACR,cAAc;QACZ;QACA,MAAM,YAAY,OAAO,IAAI;QAC7B,OAAO;QACP,QAAQ,aAAa,OAAO,MAAM;QAClC,SAAS,YAAY,OAAO,OAAO;QACnC,QAAQ,YAAY,OAAO,MAAM;QACjC,cAAc,YAAY,OAAO,YAAY;QAC7C,gBAAgB,YAAY,OAAO,cAAc;QACjD,UAAU,SAAS,OAAO,QAAQ;MACpC,CAAC;IACH;EACF;AAEA,SAAO,UAAU,SAAS,IAAI,YAAY;AAC5C;AAEA,IAAM,sBAAsB;EAC1B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF;AAEA,SAAS,YAAY,OAAoC;AACvD,QAAM,MAAM,YAAY,KAAK;AAC7B,MAAI,CAAC,KAAK;AACR,WAAO;EACT;AACA,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,GAAG;AACvB,QAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,IAAI,QAAQ,KAAK,IAAI,YAAY,IAAI,UAAU;AAC/E,aAAO;IACT;AACA,QAAI,SAAS;AACb,QAAI,OAAO;AACX,WAAO,IAAI,SAAS;EACtB,QAAQ;AACN,WAAO;EACT;AACF;AAEA,SAAS,sBAAsB,OAAuD;AACpF,QAAM,SAAS,SAAS,KAAK;AAC7B,MAAI,CAAC,QAAQ;AACX,WAAO;EACT;AAEA,QAAM,YAAY,cAAc;IAC9B,UAAU,YAAY,OAAO,QAAQ;IACrC,QAAQ,YAAY,OAAO,MAAM;IACjC,UAAU,YAAY,OAAO,QAAQ;IACrC,SAAS,YAAY,OAAO,OAAO;IACnC,SAAS,YAAY,OAAO,OAAO;IACnC,YAAY,YAAY,OAAO,UAAU,KAAK,YAAY,OAAO,SAAS;IAC1E,YAAY,YAAY,OAAO,UAAU,KAAK,YAAY,OAAO,OAAO;IACxE,iBACE,YAAY,OAAO,eAAe,KAClC,YAAY,OAAO,YAAY,KAC/B,YAAY,OAAO,OAAO;IAC5B,UAAU,YAAY,OAAO,QAAQ,KAAK,YAAY,OAAO,KAAK;IAClE,eAAe,YAAY,OAAO,aAAa,KAAK,YAAY,OAAO,UAAU;IACjF,SAAS,YAAY,OAAO,OAAO,KAAK,YAAY,OAAO,IAAI;IAC/D,cAAc,YAAY,OAAO,YAAY,KAAK,YAAY,OAAO,SAAS;IAC9E,aAAa,YAAY,OAAO,WAAW;IAC3C,YAAY,YAAY,OAAO,UAAU;IACzC,QAAQ,YAAY,OAAO,UAAU,OAAO,OAAO,OAAO,IAAI;IAC9D,QAAQ,YAAY,OAAO,MAAM;IACjC,SAAS,YAAY,OAAO,OAAO;IACnC,QAAQ,YAAY,OAAO,MAAM;EACnC,CAAC;AAED,SAAO,aAAa,oBAAoB,KAAK,CAAC,QAAQ,UAAU,GAAG,MAAM,MAAS,IAC9E,YACA;AACN;AAEA,SAAS,8BACP,UACuC;AACvC,MAAI,CAAC,UAAU;AACb,WAAO;EACT;AACA,SAAO,sBAAsB;IAC3B,UAAU,SAAS,2BAA2B,SAAS,yBAAyB;IAChF,QAAQ,SAAS,yBAAyB,SAAS,uBAAuB;IAC1E,UAAU,SAAS,2BAA2B,SAAS,yBAAyB;IAChF,SAAS,SAAS,0BAA0B,SAAS,wBAAwB;IAC7E,SAAS,SAAS,0BAA0B,SAAS,wBAAwB;IAC7E,YAAY,SAAS,6BAA6B,SAAS,2BAA2B;IACtF,YACE,SAAS,6BACT,SAAS,0BACT,SAAS,2BAA2B,KACpC,SAAS,wBAAwB;IACnC,iBACE,SAAS,kCACT,SAAS,0BACT,SAAS,gCAAgC,KACzC,SAAS,wBAAwB;IACnC,UACE,SAAS,2BACT,SAAS,wBACT,SAAS,yBAAyB,KAClC,SAAS,sBAAsB;IACjC,eACE,SAAS,gCAAgC,SAAS,8BAA8B;IAClF,SACE,SAAS,0BACT,SAAS,uBACT,SAAS,wBAAwB,KACjC,SAAS,qBAAqB;IAChC,cAAc,SAAS,+BAA+B,SAAS,6BAA6B;IAC5F,aAAa,SAAS,8BAA8B,SAAS,4BAA4B;IACzF,YAAY,SAAS,6BAA6B,SAAS,2BAA2B;IACtF,QACE,SAAS,yBACT,SAAS,sBACT,SAAS,uBAAuB,KAChC,SAAS,oBAAoB;IAC/B,QAAQ,SAAS,yBAAyB,SAAS,uBAAuB;IAC1E,SAAS,SAAS,0BAA0B,SAAS,wBAAwB;IAC7E,QAAQ,SAAS,yBAAyB,SAAS,uBAAuB;EAC5E,CAAC;AACH;AAEA,SAAS,sBAAsB,OAAqC;AAClE,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,YAAY,MACf,IAAI,qBAAqB,EACzB,OAAO,CAAC,UAA4B,UAAU,MAAS;AAC1D,WAAO,UAAU,SAAS,IAAI,YAAY;EAC5C;AACA,MAAI,SAAS,KAAK,GAAG;AACnB,WAAO,iBAAiB,KAAK;EAC/B;AACA,SAAO;AACT;AAEA,SAAS,iBACP,OACqC;AACrC,MAAI,CAAC,OAAO;AACV,WAAO;EACT;AACA,QAAM,UAAU,OAAO,QAAQ,KAAK,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC9D,QAAI,mBAAmB,GAAG,KAAK,oBAAoB,GAAG,GAAG;AACvD,aAAO,CAAC;IACV;AACA,UAAM,YAAY,sBAAsB,KAAK;AAC7C,WAAO,cAAc,SAAY,CAAC,CAAC,KAAK,SAAS,CAAU,IAAI,CAAC;EAClE,CAAC;AACD,SAAO,QAAQ,SAAS,IAAI,OAAO,YAAY,OAAO,IAAI;AAC5D;AAEA,SAAS,mBACP,QACA,cACgC;AAChC,MAAI,CAAC,UAAU,CAAC,cAAc;AAC5B,WAAO;EACT;AACA,SAAO,cAAc;IACnB,MAAM,YAAY,QAAQ,IAAI;IAC9B,MAAM,YAAY,QAAQ,IAAI;IAC9B,UAAU,YAAY,QAAQ,QAAQ;IACtC,QAAQ,YAAY,QAAQ,MAAM;IAClC,SAAS,YAAY,QAAQ,OAAO;IACpC,eAAe;IACf,UAAU,iBAAiB,SAAS,QAAQ,QAAQ,CAAC;EACvD,CAAC;AACH;AAEA,SAAS,iBAAiB,OAAoC;AAC5D,QAAM,MAAM,YAAY,KAAK;AAC7B,MAAI,CAAC,OAAO,IAAI,SAAS,IAAI,GAAG;AAC9B,WAAO;EACT;AAEA,QAAM,aAAa,IAAI,QAAQ,OAAO,GAAG;AACzC,MAAI,WAAW,WAAW,GAAG,KAAK,WAAW,WAAW,IAAI,GAAG;AAC7D,WAAO;EACT;AACA,MAAI,uBAAuB,KAAK,UAAU,GAAG;AAC3C,WAAO;EACT;AACA,MAAI,WAAW,MAAM,GAAG,EAAE,SAAS,IAAI,GAAG;AACxC,WAAO;EACT;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,WAA4D;AACxF,QAAM,SAAS,SAAS,SAAS;AACjC,MAAI,CAAC,QAAQ;AACX,WAAO;EACT;AAEA,QAAM,QAAQ,OAAO,QAAQ,MAAM,EAChC,QAAQ,CAAC,CAAC,MAAM,KAAK,MAAM;AAC1B,QAAI,CAAC,YAAY,IAAI,KAAK,oBAAoB,IAAI,GAAG;AACnD,aAAO,CAAC;IACV;AACA,UAAM,eAAe,iBAAiB,KAAK;AAC3C,WAAO,eAAe,CAAC,EAAE,MAAM,MAAM,aAAa,CAAC,IAAI,CAAC;EAC1D,CAAC,EACA,KAAK,CAAC,OAAO,WAAW,MAAM,KAAK,cAAc,OAAO,IAAI,CAAC;AAEhE,SAAO,MAAM,SAAS,IAAI,QAAQ;AACpC;AAEA,SAAS,iBAAiB,OAAmD;AAC3E,QAAM,SAAS,SAAS,KAAK;AAC7B,MAAI,CAAC,QAAQ;AACX,WAAO;EACT;AACA,SAAO,cAAc;IACnB,UAAU,YAAY,OAAO,QAAQ;IACrC,YAAY,YAAY,OAAO,UAAU;IACzC,SAAS,YAAY,OAAO,OAAO;IACnC,UAAU,YAAY,OAAO,QAAQ;IACrC,UAAU,YAAY,OAAO,QAAQ;IACrC,MAAM,iBAAiB,OAAO,IAAI;IAClC,MAAM,cAAc,OAAO,IAAI;IAC/B,UAAU,iBAAiB,SAAS,OAAO,QAAQ,CAAC;EACtD,CAAC;AACH;AAEA,SAAS,0BAA0B,UAAgE;AACjG,QAAM,YAA6C,CAAC;AAEpD,aAAW,WAAW,QAAQ,QAAQ,GAAG;AACvC,UAAM,SAAS,SAAS,OAAO;AAC/B,UAAM,OAAO,YAAY,QAAQ,IAAI;AACrC,UAAM,UAAU,YAAY,QAAQ,OAAO;AAC3C,QAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS;AAChC;IACF;AACA,cAAU;MACR,cAAc;QACZ;QACA,UAAU,YAAY,OAAO,QAAQ;QACrC,SAAS,YAAY,OAAO,OAAO;QACnC,YAAY,iBAAiB,OAAO,UAAU;QAC9C;QACA,SAAS,iBAAiB,SAAS,OAAO,OAAO,CAAC;MACpD,CAAC;IACH;EACF;AAEA,SAAO,UAAU,SAAS,IAAI,YAAY;AAC5C;AAEA,SAAS,0BACP,UACuC;AACvC,QAAM,SAAS,SAAS,SAAS,MAAM;AACvC,QAAM,iBAAiB,SAAS,QAAQ,QAAQ;AAChD,QAAM,QAAQ,SAAS,SAAS,KAAK;AACrC,QAAM,aAAa,YAAY,OAAO,YAAY;AAClD,QAAM,WAAW,QAAQ,OAAO,KAAK,EAClC,IAAI,QAAQ,EACZ,KAAK,CAAC,SAAS,YAAY,MAAM,OAAO,MAAM,UAAU;AAC3D,QAAM,iBAAiB,SAAS,UAAU,UAAU;AAEpD,SACE,sBAAsB,SAAS,cAAc,KAC7C,sBAAsB,gBAAgB,cAAc,KACpD,8BAA8B,cAAc,KAC5C,8BAA8B,cAAc;AAEhD;AAEO,SAAS,oCACd,OACA,UAAyC,CAAC,GACpB;AACtB,QAAM,WAAW,SAAS,KAAK,KAAK,CAAC;AACrC,QAAM,aAAa,SAAS,SAAS,IAAI;AACzC,QAAM,QAAQ,SAAS,SAAS,KAAK;AACrC,QAAM,gBAAgB,SAAS,OAAO,QAAQ;AAC9C,QAAM,QAAQ,QAAQ,OAAO,KAAK,EAC/B,IAAI,WAAW,EACf,OAAO,CAAC,SAAmC,SAAS,MAAS;AAChE,QAAM,SAAS,MAAM,QAAQ,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC;AAExD,SAAO,cAAc;IACnB,gBAAgB;IAChB,aAAa,YAAY,SAAS,WAAW;IAC7C,YAAY,YAAY,SAAS,UAAU;IAC3C,QAAQ,QAAQ,SAAS,YAAY,YAAY,MAAM;IACvD,SAAS,YAAY,YAAY,OAAO;IACxC,OAAO,YAAY,YAAY,KAAK;IACpC,QAAQ,YAAY,YAAY,MAAM;IACtC,UAAU,YAAY,OAAO,QAAQ;IACrC,cAAc,YAAY,OAAO,YAAY;IAC7C,QAAQ,mBAAmB,SAAS,SAAS,MAAM,GAAG,QAAQ,YAAY;IAC1E,gBAAgB,0BAA0B,QAAQ;IAClD,gBAAgB,qBAAqB,SAAS,SAAS;IACvD,qBAAqB,qBAAqB,SAAS,eAAe,UAAU,CAAC;IAC7E,qBAAqB,0BAA0B,SAAS,mBAAmB;IAC3E;IACA;IACA,QAAQ,cAAc,SAAS,MAAM;EACvC,CAAC;AACH;AAEO,SAAS,mBAAmB,OAAqD;AACtF,QAAM,QAAyB,CAAC;AAChC,QAAM,oBAAoB,oBAAI,IAA2B;AACzD,QAAM,eAAe,oBAAI,IAAoB;AAE7C,QAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,UAAM,YAAY,YAAY,KAAK,OAAO;AAC1C,UAAM,SAAS,aAAa,gBAAgB,KAAK;AACjD,UAAM,cAAc,aAAa,IAAI,MAAM,KAAK,KAAK;AACrD,iBAAa,IAAI,QAAQ,UAAU;AAEnC,UAAM,OAAsB;MAC1B,IAAI,eAAe,IAAI,SAAS,GAAG,MAAM,IAAI,UAAU;MACvD;MACA,cAAc,KAAK;MACnB;MACA,UAAU,CAAC;MACX,aAAa,YACT,SACA;QACE;UACE,MAAM;UACN,SAAS;UACT,SAAS;QACX;MACF;IACN;AAEA,QAAI,aAAa,GAAG;AAClB,wBAAkB,MAAM;QACtB,MAAM;QACN,SAAS;QACT,SAAS;QACT,SAAS,KAAK;MAChB,CAAC;IACH;AACA,QAAI,CAAC,kBAAkB,IAAI,MAAM,GAAG;AAClC,wBAAkB,IAAI,QAAQ,IAAI;IACpC;AACA,UAAM,KAAK,IAAI;EACjB,CAAC;AAED,QAAM,iBAAiB,oBAAI,IAA2B;AACtD,aAAW,QAAQ,OAAO;AACxB,UAAM,eACJ,OAAO,KAAK,iBAAiB,YAAY,KAAK,aAAa,SAAS,IAChE,KAAK,eACL;AACN,QAAI,CAAC,cAAc;AACjB;IACF;AACA,QAAI,iBAAiB,KAAK,QAAQ;AAChC,wBAAkB,MAAM;QACtB,MAAM;QACN,SAAS;QACT,SAAS,KAAK;QACd,SAAS,KAAK;QACd,gBAAgB;MAClB,CAAC;AACD;IACF;AACA,UAAM,SAAS,kBAAkB,IAAI,YAAY;AACjD,QAAI,CAAC,QAAQ;AACX,wBAAkB,MAAM;QACtB,MAAM;QACN,SAAS;QACT,SAAS,KAAK;QACd,SAAS,KAAK;QACd,gBAAgB;MAClB,CAAC;AACD;IACF;AACA,mBAAe,IAAI,KAAK,IAAI,MAAM;EACpC;AAEA,QAAM,cAA+B,CAAC;AACtC,aAAW,QAAQ,OAAO;AACxB,QAAI,iBAAiB,MAAM,cAAc,GAAG;AAC1C,kBAAY,KAAK,IAAI;IACvB;EACF;AACA,aAAW,QAAQ,aAAa;AAC9B,mBAAe,OAAO,KAAK,EAAE;AAC7B,sBAAkB,MAAM;MACtB,MAAM;MACN,SAAS;MACT,SAAS,KAAK;MACd,SAAS,KAAK;MACd,gBAAgB,OAAO,KAAK,iBAAiB,WAAW,KAAK,eAAe;IAC9E,CAAC;EACH;AAEA,QAAM,QAAyB,CAAC;AAChC,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,eAAe,IAAI,KAAK,EAAE;AACzC,QAAI,QAAQ;AACV,aAAO,SAAS,KAAK,IAAI;IAC3B,OAAO;AACL,YAAM,KAAK,IAAI;IACjB;EACF;AAEA,qBAAmB,KAAK;AACxB,SAAO;AACT;AAEA,SAAS,kBAAkB,MAAqB,YAA2C;AACzF,OAAK,cAAc,CAAC,GAAI,KAAK,eAAe,CAAC,GAAI,UAAU;AAC7D;AAEA,SAAS,iBACP,MACA,gBACS;AACT,QAAM,OAAO,oBAAI,IAAY;AAC7B,MAAI,SAAS,eAAe,IAAI,KAAK,EAAE;AACvC,SAAO,QAAQ;AACb,QAAI,OAAO,OAAO,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,GAAG;AAChD,aAAO;IACT;AACA,SAAK,IAAI,OAAO,EAAE;AAClB,aAAS,eAAe,IAAI,OAAO,EAAE;EACvC;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,OAA2B,QAAoC;AAC3F,MAAI,UAAU,QAAQ;AACpB,WAAO;EACT;AACA,MAAI,CAAC,OAAO;AACV,WAAO;EACT;AACA,MAAI,CAAC,QAAQ;AACX,WAAO;EACT;AACA,MAAI;AACF,UAAM,aAAa,OAAO,KAAK;AAC/B,UAAM,cAAc,OAAO,MAAM;AACjC,WAAO,aAAa,cAAc,KAAK,aAAa,cAAc,IAAI;EACxE,QAAQ;AACN,WAAO,MAAM,cAAc,MAAM;EACnC;AACF;AAEA,SAAS,sBAAsB,OAAsB,QAA+B;AAClF,QAAM,UAAU;IACd,MAAM,KAAK;IACX,OAAO,KAAK;EACd;AACA,MAAI,YAAY,GAAG;AACjB,WAAO;EACT;AACA,MAAI,MAAM,WAAW,OAAO,cAAc;AACxC,WAAO;EACT;AACA,MAAI,OAAO,WAAW,MAAM,cAAc;AACxC,WAAO;EACT;AACA,QAAM,WAAW,MAAM,OAAO,cAAc,OAAO,MAAM;AACzD,SAAO,aAAa,IAAI,WAAW,MAAM,GAAG,cAAc,OAAO,EAAE;AACrE;AAEA,SAAS,mBAAmB,OAA8B;AACxD,QAAM,KAAK,qBAAqB;AAChC,aAAW,QAAQ,OAAO;AACxB,SAAK,SAAS,KAAK,qBAAqB;AACxC,QAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,yBAAmB,KAAK,QAAQ;IAClC;AACA,SAAK,cAAc,cAAc,KAAK,WAAW;EACnD;AACF;ACz8BA,IAAM,wBAAwB;AA0D9B,IAAM,mBAAmB,oBAAI,IAAI,CAAC,eAAe,CAAC;AAClD,IAAM,4BAA4B,oBAAI,IAAI,CAAC,YAAY,cAAc,WAAW,CAAC;AACjF,IAAM,uBAAuB,oBAAI,IAAI,CAAC,cAAc,wBAAwB,CAAC;AAC7E,IAAM,yBAAyB,oBAAI,IAAI,CAAC,SAAS,SAAS,WAAW,CAAC;AACtE,IAAM,oBAAoB,oBAAI,IAAI,CAAC,QAAQ,WAAW,cAAc,wBAAwB,CAAC;AAC7F,IAAM,mBAAmB,oBAAI,IAAI;EAC/B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AACD,IAAM,oBAAoB,oBAAI,IAAI,CAAC,gBAAgB,QAAQ,cAAc,wBAAwB,CAAC;AAClG,IAAM,qBAAqB,oBAAI,IAAI,CAAC,QAAQ,SAAS,CAAC;AACtD,IAAM,wBAAwB,oBAAI,IAAI,CAAC,OAAO,OAAO,CAAC;AACtD,IAAM,wBAAwB,oBAAI,IAAI;EACpC;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAEM,SAAS,6CACd,OACA,UAA6C,CAAC,GACZ;AAClC,QAAM,WAAWM,UAAS,KAAK;AAC/B,MAAI,CAAC,UAAU;AACb,WAAO;MACL,QAAQ;MACR,SAAS;IACX;EACF;AAEA,MAAIC,aAAY,SAAS,cAAc,MAAM,gCAAgC;AAC3E,WAAO,6BAA6B,UAAU,OAAO;EACvD;AAEA,MAAI,OAAO,OAAO,UAAU,eAAe,GAAG;AAC5C,WAAO,kBAAkB,UAAU,OAAO;EAC5C;AAEA,SAAO;IACL,QAAQ;IACR,SAAS;EACX;AACF;AAEA,SAAS,6BACP,UACA,SACkC;AAClC,QAAM,QAAQD,UAAS,SAAS,KAAK;AACrC,MAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,GAAG;AAChC,WAAO;MACL,QAAQ;MACR,SAAS;IACX;EACF;AAEA,QAAM,eAAe,oCAAoC,UAAU,OAAO;AAC1E,SAAO;IACL,QAAQ;IACR,QAAQ;IACR;IACA,UAAU,aAAa;EACzB;AACF;AAEA,SAAS,kBACP,UACA,SACkC;AAClC,QAAM,WAAwB,CAAC;AAC/B,oBAAkB,UAAU,kBAAkB,UAAU;IACtD,SAAS;IACT,MAAM,QAAQ;EAChB,CAAC;AAED,QAAM,gBAAgB,MAAM,QAAQ,SAAS,aAAa,IAAI,SAAS,gBAAgB,CAAC;AACxF,MAAI,CAAC,MAAM,QAAQ,SAAS,aAAa,GAAG;AAC1C,eAAW,UAAU,iCAAiC,wCAAwC;MAC5F,SAAS;MACT,MAAM,QAAQ;IAChB,CAAC;EACH;AAEA,QAAM,QAA8B,CAAC;AACrC,QAAM,wBAAmD,CAAC;AAC1D,MAAI,iBAAiB;AACrB,MAAI;AAEJ,gBAAc,QAAQ,CAAC,cAAc,sBAAsB;AACzD,UAAM,iBAAiBA,UAAS,YAAY;AAC5C,QAAI,CAAC,gBAAgB;AACnB;QACE;QACA;QACA;QACA;UACE,SAAS;UACT,MAAM,QAAQ;UACd,SAAS,EAAE,qBAAqB,kBAAkB;QACpD;MACF;AACA;IACF;AAEA,sBAAkB,gBAAgB,2BAA2B,UAAU;MACrE,SAAS;MACT,MAAM,QAAQ;MACd,SAAS,EAAE,qBAAqB,kBAAkB;IACpD,CAAC;AAED,UAAM,WAAWA,UAAS,eAAe,QAAQ;AACjD,QAAI,UAAU;AACZ,wBAAkB,UAAU,sBAAsB,UAAU;QAC1D,SAAS;QACT,MAAM,QAAQ;QACd,SAAS,EAAE,qBAAqB,kBAAkB;MACpD,CAAC;IACH;AACA,UAAME,sBAAqB,oBAAoB,UAAU,YAAY,UAAU;MAC7E,SAAS;MACT,MAAM,QAAQ;MACd,SAAS,EAAE,qBAAqB,kBAAkB;IACpD,CAAC;AACD,QAAIA,uBAAsB,OAAO,KAAKA,mBAAkB,EAAE,SAAS,GAAG;AACpE,4BAAsB,KAAKA,mBAAkB;IAC/C;AAEA,UAAM,aAAa,MAAM,QAAQ,eAAe,UAAU,IAAI,eAAe,aAAa,CAAC;AAC3F,QAAI,CAAC,MAAM,QAAQ,eAAe,UAAU,GAAG;AAC7C;QACE;QACA;QACA;QACA;UACE,SAAS;UACT,MAAM,QAAQ;UACd,SAAS,EAAE,qBAAqB,kBAAkB;QACpD;MACF;IACF;AAEA,eAAW,QAAQ,CAAC,WAAW,mBAAmB;AAChD,YAAM,kBAAkBF,UAAS,SAAS;AAC1C,UAAI,CAAC,iBAAiB;AACpB;UACE;UACA;UACA;UACA;YACE,SAAS;YACT,MAAM,QAAQ;YACd,SAAS,EAAE,qBAAqB,mBAAmB,kBAAkB,eAAe;UACtF;QACF;AACA;MACF;AAEA,wBAAkB;AAClB,wBAAkB,iBAAiB,wBAAwB,UAAU;QACnE,SAAS;QACT,MAAM,QAAQ;QACd,SAAS,EAAE,qBAAqB,mBAAmB,kBAAkB,eAAe;MACtF,CAAC;AAED,YAAM,QAAQ,mBAAmB,gBAAgB,OAAO,UAAU;QAChE,SAAS;QACT,MAAM,QAAQ;QACd,SAAS,EAAE,qBAAqB,mBAAmB,kBAAkB,eAAe;MACtF,CAAC;AACD,qBAAe;AAEf,YAAM,YAAY,MAAM,QAAQ,gBAAgB,KAAK,IAAI,gBAAgB,QAAQ,CAAC;AAClF,UAAI,CAAC,MAAM,QAAQ,gBAAgB,KAAK,GAAG;AACzC;UACE;UACA;UACA;UACA;YACE,SAAS;YACT,MAAM,QAAQ;YACd,SAAS,EAAE,qBAAqB,mBAAmB,kBAAkB,eAAe;UACtF;QACF;MACF;AAEA,gBAAU,QAAQ,CAAC,MAAM,cAAc;AACrC,cAAM,aAAa,kBAAkB,MAAM,UAAU;UACnD,oBAAAE;UACA,MAAM,QAAQ;UACd;UACA;UACA;QACF,CAAC;AACD,YAAI,YAAY;AACd,gBAAM,KAAK,UAAU;QACvB;MACF,CAAC;IACH,CAAC;EACH,CAAC;AAED,MAAI,MAAM,WAAW,GAAG;AACtB,eAAW,UAAU,oBAAoB,iDAAiD;MACxF,SAAS;MACT,MAAM,QAAQ;IAChB,CAAC;EACH;AAEA,QAAM,UAAU,YAAY,MAAM,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC;AAC9D,QAAM,aAAa,gBAAgB,KAAK;AACxC,QAAM,qBAAqB,qBAAqB,qBAAqB;AACrE,QAAM,aAAa,QAAQ,MAAM,KAAK,oBAAI,KAAK,GAAG,YAAY;AAC9D,QAAM,eAAe,QAAQ;AAC7B,QAAM,WAAWC,eAAc;IAC7B,gBAAgB;IAChB,aAAa,cAAc,WAAW,cAAc,SAAS;IAC7D,YAAY;IACZ,MAAMA,eAAc;MAClB,QAAQ,QAAQ;MAChB,SAAS,QAAQ,UAAU,WAAW;MACtC,OAAO,QAAQ;MACf,QAAQ,QAAQ,UAAU;IAC5B,CAAC;IACD,OAAOA,eAAc;MACnB,QAAQ;MACR,UAAU;MACV,cAAc;MACd,UAAU,qBAAqB,EAAE,YAAY,mBAAmB,IAAI;MACpE,OAAO;MACP;IACF,CAAC;IACD,QAAQA,eAAc;MACpB,MAAM;MACN,MAAM;MACN,QAAQ;MACR,SAAS;MACT,UAAUA,eAAc;QACtB,sBAAsB,cAAc;QACpC,mBAAmB;MACrB,CAAC;IACH,CAAC;IACD,SAAS;MACP,SAAS;MACT,iBAAiB;IACnB;IACA,qBAAqB,SAAS,SAAS,IAAI,WAAW;IACtD,WAAW,eAAe,EAAE,gBAAgB,aAAa,IAAI;EAC/D,CAAC;AAED,QAAM,eAAe,oCAAoC,UAAU,OAAO;AAC1E,SAAO;IACL,QAAQ;IACR,QAAQ;IACR;IACA,UAAU,aAAa;EACzB;AACF;AAEA,SAAS,mBACP,OACA,UACA,SACiD;AACjD,MAAI,UAAU,QAAW;AACvB,WAAO;EACT;AACA,QAAM,QAAQH,UAAS,KAAK;AAC5B,MAAI,CAAC,OAAO;AACV,eAAW,UAAU,wBAAwB,iDAAiD;MAC5F,GAAG;MACH,SAAS,QAAQ,WAAW;IAC9B,CAAC;AACD,WAAO;EACT;AACA,oBAAkB,OAAO,mBAAmB,UAAU,OAAO;AAC7D,QAAM,aAAaG,eAAc;IAC/B,MAAMF,aAAY,MAAM,IAAI;IAC5B,SAASA,aAAY,MAAM,OAAO;EACpC,CAAC;AACD,SAAO,OAAO,KAAK,UAAU,EAAE,SAAS,IAAI,aAAa;AAC3D;AAEA,SAAS,kBACP,OACA,UACA,SAOgC;AAChC,QAAM,OAAOD,UAAS,KAAK;AAC3B,QAAM,UAAU;IACd,qBAAqB,QAAQ;IAC7B,kBAAkB,QAAQ;IAC1B,YAAY,QAAQ;EACtB;AACA,MAAI,CAAC,MAAM;AACT,eAAW,UAAU,uBAAuB,gDAAgD;MAC1F,SAAS;MACT,MAAM,QAAQ;MACd;IACF,CAAC;AACD,WAAO;EACT;AAEA,oBAAkB,MAAM,kBAAkB,UAAU;IAClD,SAAS;IACT,MAAM,QAAQ;IACd;EACF,CAAC;AAED,QAAM,SACJC,aAAY,KAAK,MAAM,KACvB,gBAAgB,QAAQ,iBAAiB,IAAI,QAAQ,cAAc,IAAI,QAAQ,SAAS;AAC1F,MAAI,CAACA,aAAY,KAAK,MAAM,GAAG;AAC7B;MACE;MACA;MACA;MACA;QACE,SAAS;QACT,MAAM,QAAQ;QACd;QACA;MACF;IACF;EACF;AAEA,QAAM,UAAUA,aAAY,KAAK,OAAO;AACxC,MAAI,CAAC,SAAS;AACZ,eAAW,UAAU,oBAAoB,kCAAkC;MACzE,SAAS;MACT,MAAM,QAAQ;MACd;MACA;IACF,CAAC;EACH;AAEA,QAAM,OAAOA,aAAY,KAAK,IAAI,KAAK;AACvC,MAAI,CAACA,aAAY,KAAK,IAAI,GAAG;AAC3B,eAAW,UAAU,qBAAqB,gDAAgD;MACxF,SAAS;MACT,MAAM,QAAQ;MACd;MACA;IACF,CAAC;EACH;AAEA,QAAM,eACJ,KAAK,iBAAiB,UAAa,KAAK,iBAAiB,QAAQ,KAAK,iBAAiB,KACnF,OACAA,aAAY,KAAK,YAAY;AACnC,MACE,KAAK,iBAAiB,UACtB,KAAK,iBAAiB,QACtB,KAAK,iBAAiB,MACtB,CAAC,cACD;AACA;MACE;MACA;MACA;MACA;QACE,SAAS;QACT,MAAM,QAAQ;QACd;QACA;MACF;IACF;EACF;AAEA,QAAM,aAAa,oBAAoB,KAAK,YAAY,UAAU;IAChE,SAAS;IACT,MAAM,QAAQ;IACd;IACA;EACF,CAAC;AACD,QAAM,SAAS,oBAAoB,KAAK,QAAQ,UAAU;IACxD,MAAM,QAAQ;IACd;IACA;EACF,CAAC;AAED,SAAOE,eAAc;IACnB,UAAU;IACV,SAAS;IACT,gBAAgB;IAChB;IACA,MAAM,sBAAsB,KAAK,MAAM,UAAU;MAC/C,SAAS;MACT,MAAM,QAAQ;MACd;MACA;IACF,CAAC;IACD,sBAAsB,kBAAkB,KAAK,mBAAmB,qBAAqB,UAAU;MAC7F,SAAS;MACT,MAAM,QAAQ;MACd;MACA;IACF,CAAC;IACD,oBAAoB,kBAAkB,KAAK,iBAAiB,mBAAmB,UAAU;MACvF,SAAS;MACT,MAAM,QAAQ;MACd;MACA;IACF,CAAC;IACD,QAAQ,oBAAoB,KAAK,QAAQ,UAAU;MACjD,SAAS;MACT,MAAM,QAAQ;MACd;MACA;IACF,CAAC;IACD,qBAAqB,QAAQ;IAC7B;IACA;EACF,CAAC;AACH;AAEA,SAAS,oBACP,OACA,UACA,SAWY;AACZ,MAAI,UAAU,QAAW;AACvB,WAAO;EACT;AACA,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,eAAW,UAAU,yBAAyB,sCAAsC;MAClF,SAAS;MACT,MAAM,QAAQ;MACd,QAAQ,QAAQ;MAChB,SAAS,QAAQ;IACnB,CAAC;AACD,WAAO;EACT;AAEA,QAAM,SAAS,MAAM,QAAQ,CAAC,OAAO,eAAe;AAClD,UAAM,cAAcH,UAAS,KAAK;AAClC,UAAM,UAAU,EAAE,GAAG,QAAQ,SAAS,aAAa,WAAW;AAC9D,QAAI,CAAC,aAAa;AAChB;QACE;QACA;QACA;QACA;UACE,SAAS;UACT,MAAM,QAAQ;UACd,QAAQ,QAAQ;UAChB;QACF;MACF;AACA,aAAO,CAAC;IACV;AAEA,sBAAkB,aAAa,mBAAmB,UAAU;MAC1D,SAAS;MACT,MAAM,QAAQ;MACd,QAAQ,QAAQ;MAChB;IACF,CAAC;AAED,UAAM,OAAOC,aAAY,YAAY,IAAI,KAAK,SAAS,UAAU;AACjE,QAAI,CAACA,aAAY,YAAY,IAAI,GAAG;AAClC;QACE;QACA;QACA;QACA;UACE,SAAS;UACT,MAAM,QAAQ;UACd,QAAQ,QAAQ;UAChB;QACF;MACF;IACF;AAEA,WAAO;MACLE,eAAc;QACZ;QACA,gBAAgB,kBAAkB,YAAY,cAAc,gBAAgB,UAAU;UACpF,SAAS;UACT,MAAM,QAAQ;UACd,QAAQ,QAAQ;UAChB;QACF,CAAC;QACD,YAAY,oBAAoB,YAAY,YAAY,UAAU;UAChE,SAAS;UACT,MAAM,QAAQ;UACd,QAAQ,QAAQ;UAChB;QACF,CAAC;MACH,CAAC;IACH;EACF,CAAC;AAED,SAAO,OAAO,SAAS,IAAI,SAAS;AACtC;AAEA,SAAS,oBACP,OACA,UACA,SACqC;AACrC,MAAI,UAAU,QAAW;AACvB,WAAO;EACT;AACA,MAAIH,UAAS,KAAK,GAAG;AACnB;MACE;MACA;MACA;MACA;IACF;AACA,WAAO;EACT;AACA,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,eAAW,UAAU,6BAA6B,qCAAqC,OAAO;AAC9F,WAAO;EACT;AAEA,QAAM,aAAsC,CAAC;AAC7C,QAAM,QAAQ,CAAC,WAAW,mBAAmB;AAC3C,UAAM,kBAAkBA,UAAS,SAAS;AAC1C,UAAM,UAAU,EAAE,GAAI,QAAQ,WAAW,CAAC,GAAI,iBAAiB,eAAe;AAC9E,QAAI,CAAC,iBAAiB;AACpB;QACE;QACA;QACA;QACA,EAAE,GAAG,SAAS,QAAQ;MACxB;AACA;IACF;AAEA,sBAAkB,iBAAiB,uBAAuB,UAAU;MAClE,GAAG;MACH,SAAS,QAAQ,WAAW;MAC5B;IACF,CAAC;AAED,UAAM,MAAMC,aAAY,gBAAgB,GAAG;AAC3C,QAAI,CAAC,KAAK;AACR;QACE;QACA;QACA;QACA;UACE,GAAG;UACH;QACF;MACF;AACA;IACF;AAEA,QAAI,OAAO,OAAO,YAAY,GAAG,GAAG;AAClC;QACE;QACA;QACA,mBAAmB,GAAG;QACtB;UACE,GAAG;UACH,SAAS,EAAE,GAAG,SAAS,IAAI;QAC7B;MACF;IACF;AAEA,UAAM,SAAS,kBAAkB,gBAAgB,OAAO,UAAU;MAChE,GAAG;MACH,SAAS;MACT,SAAS,EAAE,GAAG,SAAS,IAAI;IAC7B,CAAC;AACD,QAAI,OAAO,IAAI;AACb,iBAAW,GAAG,IAAI,OAAO;IAC3B;EACF,CAAC;AAED,SAAO,OAAO,KAAK,UAAU,EAAE,SAAS,IAAI,aAAa;AAC3D;AAEA,SAAS,kBACP,OACA,UACA,SACiB;AACjB,MAAI,YAAY,KAAK,GAAG;AACtB;MACE;MACA;MACA;MACA;IACF;AACA,WAAO,EAAE,IAAI,MAAM,MAAM;EAC3B;AAEA,QAAM,SAASD,UAAS,KAAK;AAC7B,MAAI,CAAC,QAAQ;AACX;MACE;MACA;MACA;MACA;IACF;AACA,WAAO,EAAE,IAAI,MAAM;EACrB;AAEA,QAAM,gBAAgB,OAAO,KAAK,MAAM,EAAE,OAAO,CAAC,QAAQ,sBAAsB,IAAI,GAAG,CAAC;AACxF,QAAM,gBAAgB,OAAO,KAAK,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,sBAAsB,IAAI,GAAG,CAAC;AACzF,MAAI,cAAc,SAAS,GAAG;AAC5B;MACE;MACA;MACA,kDAAkD,cAAc,KAAK,IAAI,CAAC;MAC1E,EAAE,GAAG,SAAS,SAAS,EAAE,GAAI,QAAQ,WAAW,CAAC,GAAI,QAAQ,cAAc,EAAE;IAC/E;EACF;AACA,MAAI,cAAc,SAAS,GAAG;AAC5B;MACE;MACA;MACA,mDAAmD,cAAc,CAAC,CAAC;MACnE,EAAE,GAAG,SAAS,SAAS,EAAE,GAAI,QAAQ,WAAW,CAAC,GAAI,QAAQ,cAAc,EAAE;IAC/E;EACF;AAEA,QAAM,QAAQ,cAAc,CAAC;AAC7B,MAAI,CAAC,OAAO;AACV;MACE;MACA;MACA;MACA;IACF;AACA,WAAO,EAAE,IAAI,MAAM,MAAM;EAC3B;AAEA,UAAQ,OAAO;IACb,KAAK;IACL,KAAK;AACH,aAAO,EAAE,IAAI,MAAM,OAAOC,aAAY,OAAO,KAAK,CAAC,KAAK,OAAO,OAAO,KAAK,KAAK,EAAE,EAAE;IACtF,KAAK;AACH,aAAO,EAAE,IAAI,MAAM,OAAO,QAAQ,OAAO,SAAS,EAAE;IACtD,KAAK;AACH,aAAO,EAAE,IAAI,MAAM,OAAO,gBAAgB,OAAO,QAAQ,EAAE;IAC7D,KAAK;AACH,aAAO,EAAE,IAAI,MAAM,OAAO,eAAe,OAAO,WAAW,EAAE;IAC/D,KAAK;AACH,aAAO,oBAAoB,OAAO,YAAY,UAAU,OAAO;IACjE,KAAK;AACH,aAAO,sBAAsB,OAAO,aAAa,UAAU,OAAO;IACpE;AACE,aAAO,EAAE,IAAI,MAAM,MAAM;EAC7B;AACF;AAEA,SAAS,oBACP,OACA,UACA,SACiB;AACjB,QAAM,aAAaD,UAAS,KAAK;AACjC,MAAI,CAAC,cAAc,CAAC,MAAM,QAAQ,WAAW,MAAM,GAAG;AACpD;MACE;MACA;MACA;MACA;IACF;AACA,WAAO,EAAE,IAAI,MAAM;EACrB;AACA,SAAO;IACL,IAAI;IACJ,OAAO,WAAW,OAAO;MACvB,CAAC,OAAO,UACN,kBAAkB,OAAO,UAAU;QACjC,GAAG;QACH,SAAS,EAAE,GAAI,QAAQ,WAAW,CAAC,GAAI,aAAa,MAAM;MAC5D,CAAC,EAAE;IACP;EACF;AACF;AAEA,SAAS,sBACP,OACA,UACA,SACiB;AACjB,QAAM,cAAcA,UAAS,KAAK;AAClC,MAAI,CAAC,eAAe,CAAC,MAAM,QAAQ,YAAY,MAAM,GAAG;AACtD;MACE;MACA;MACA;MACA;IACF;AACA,WAAO,EAAE,IAAI,MAAM;EACrB;AACA,SAAO;IACL,IAAI;IACJ,OAAO,oBAAoB,YAAY,QAAQ,UAAU,OAAO,KAAK,CAAC;EACxE;AACF;AAEA,SAAS,sBACP,OACA,UACA,SACoB;AACpB,MAAI,UAAU,QAAW;AACvB,WAAO;EACT;AACA,MAAI,OAAO,UAAU,YAAY,MAAM,SAAS,GAAG;AACjD,WAAO,MAAM,QAAQ,eAAe,EAAE;EACxC;AACA,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,UAAU,KAAK,GAAG;AACzD;MACE;MACA;MACA;MACA;IACF;AACA,WAAO;EACT;AACA,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,UAAU,KAAK,UAAU,EAAG,QAAO;AACvC;IACE;IACA;IACA,0BAA0B,KAAK;IAC/B;EACF;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,oBACP,OACA,UACA,SACiD;AACjD,MAAI,UAAU,QAAW;AACvB,WAAO;EACT;AACA,QAAM,SAASA,UAAS,KAAK;AAC7B,MAAI,CAAC,QAAQ;AACX,eAAW,UAAU,yBAAyB,uCAAuC,OAAO;AAC5F,WAAO;EACT;AACA,oBAAkB,QAAQ,oBAAoB,UAAU,OAAO;AAC/D,SAAOG,eAAc;IACnB,MAAM,oBAAoB,OAAO,MAAM,UAAU,OAAO;IACxD,SAASF,aAAY,OAAO,OAAO;EACrC,CAAC;AACH;AAEA,SAAS,oBACP,OACA,UACA,SACoB;AACpB,MAAI,UAAU,QAAW;AACvB,WAAO;EACT;AACA,MAAI,OAAO,UAAU,YAAY,MAAM,SAAS,GAAG;AACjD,WAAO,MAAM,QAAQ,iBAAiB,EAAE;EAC1C;AACA,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,GAAG;AACxD,QAAI,UAAU,EAAG,QAAO;AACxB,QAAI,UAAU,EAAG,QAAO;AACxB,QAAI,UAAU,EAAG,QAAO;AACxB;MACE;MACA;MACA,4BAA4B,KAAK;MACjC;IACF;AACA,WAAO,OAAO,KAAK;EACrB;AACA;IACE;IACA;IACA;IACA;EACF;AACA,SAAO;AACT;AAEA,SAAS,kBACP,OACA,OACA,UACA,SACoB;AACpB,MAAI,UAAU,QAAW;AACvB,WAAO;EACT;AACA,MAAI,OAAO,UAAU,YAAY,MAAM,SAAS,GAAG;AACjD,QAAI,CAAC,QAAQ,KAAK,KAAK,GAAG;AACxB;QACE;QACA;QACA,QAAQ,KAAK;QACb;MACF;IACF;AACA,WAAO;EACT;AACA,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG;AACrE,WAAO,OAAO,KAAK,MAAM,KAAK,CAAC;EACjC;AACA,aAAW,UAAU,uBAAuB,QAAQ,KAAK,gCAAgC,OAAO;AAChG,SAAO;AACT;AAEA,SAAS,gBAAgB,OAA0D;AACjF,QAAM,UAAU,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC;AACzD,SACE,MAAM;IACJ,CAAC,SACC,CAAC,KAAK,kBACL,OAAO,KAAK,mBAAmB,YAAY,CAAC,QAAQ,IAAI,KAAK,cAAc;EAChF,GAAG,WAAW,MAAM,CAAC,GAAG;AAE5B;AAEA,SAAS,qBACP,SACqC;AACrC,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;EACT;AACA,QAAM,SAAS,IAAI,IAAI,QAAQ,IAAI,CAAC,WAAW,CAAC,gBAAgB,MAAM,GAAG,MAAM,CAAC,CAAC;AACjF,SAAO,OAAO,SAAS,IAAI,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE,CAAC,IAAI;AACvD;AAEA,SAAS,gBAAgB,QAAyC;AAChE,SAAO,KAAK;IACV,OAAO,KAAK,MAAM,EACf,KAAK,EACL,IAAI,CAAC,QAAQ,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC;EACpC;AACF;AAEA,SAAS,YAAY,QAA6D;AAChF,SAAO,OAAO,KAAK,CAAC,UAA2B,OAAO,UAAU,YAAY,MAAM,SAAS,CAAC;AAC9F;AAEA,SAAS,gBAAgB,OAAiC;AACxD,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO;EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,cAAc,OAAO,KAAK;AAChC,WAAO,OAAO,cAAc,WAAW,IAAI,cAAc;EAC3D;AACA,SAAO,OAAO,SAAS,EAAE;AAC3B;AAEA,SAAS,eAAe,OAAiC;AACvD,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO;EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,cAAc,OAAO,KAAK;AAChC,WAAO,OAAO,SAAS,WAAW,IAAI,cAAc;EACtD;AACA,SAAO,OAAO,SAAS,EAAE;AAC3B;AAEA,SAAS,kBACP,QACA,SACA,UACA,SACM;AACN,QAAM,gBAAgB,OAAO,KAAK,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,IAAI,GAAG,CAAC;AAC3E,aAAW,SAAS,eAAe;AACjC;MACE;MACA;MACA,gBAAgB,QAAQ,WAAW,QAAQ,WAAW,KAAK;MAC3D,EAAE,GAAG,SAAS,SAAS,EAAE,GAAI,QAAQ,WAAW,CAAC,GAAI,MAAM,EAAE;IAC/D;EACF;AACF;AAEA,SAAS,WACP,UACA,MACA,SACA,UAA0B,CAAC,GACrB;AACN,WAAS;IACPE,eAAc;MACZ;MACA,UAAU;MACV,SAAS,QAAQ;MACjB,YACE,QAAQ,QAAQ,QAAQ,UACpBA,eAAc;QACZ,MAAM,QAAQ;QACd,UAAU,QAAQ;QAClB,SAAS,QAAQ;MACnB,CAAC,IACD;MACN;MACA,SAAS,QAAQ;IACnB,CAAC;EACH;AACF;AAEA,SAASH,UAAS,OAAqD;AACrE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,IACrE,QACD;AACN;AAEA,SAASC,aAAY,OAAoC;AACvD,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AAEA,SAAS,YAAY,OAAyB;AAC5C,SACE,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,aACjB,UAAU;AAEd;AAEA,SAASE,eAAiD,OAAa;AACrE,SAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS,CAAC;AAC5F;AC96BA,SAAS,sBAAsB,YAAoB,aAA8B;AAC/E,QAAM,OAAO,cAAc,iBAAiB,WAAW,MAAM;AAC7D,SAAO,4BAA4B,UAAU,yFAAyF,IAAI;AAC5I;AAMA,SAAS,4BAA4B,SAAsC;AACzE,MAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,EAAG,QAAO;AAC5D,aAAW,OAAO,SAAS;AACzB,QAAI,OAAO,QAAQ,SAAU;AAC7B,UAAM,QAAQ,IAAI,MAAM,2BAA2B;AACnD,QAAI,MAAO,QAAO,MAAM,CAAC,KAAK;EAChC;AACA,SAAO;AACT;AAEA,SAAS,2BAA2B,OAAsC;AACxE,QAAM,OAAO,MAAM;AAEnB,UAAQ,MAAM;IACZ,KAAK;AAEH,aAAO;IAET,KAAK,WAAW;AAEd,UAAI,OAAO,MAAM,aAAa,UAAU;AACtC,eAAO,MAAM;MACf;AACA,aAAO;IACT;IAEA,KAAK;AACH,aAAO,oBAAoB,MAAM,KAAK;IAExC,KAAK;IACL,KAAK,gBAAgB;AACnB,YAAM,SAAS,MAAM,QAAQ,MAAM,KAAK,IACnC,MAAM,MAAmB,KAAK,MAAM,IACrC,MAAM;AACV,aAAO,4BAA4B,MAAM;IAC3C;IAEA,KAAK;IACL,KAAK,gBAAgB;AACnB,YAAM,SAAS,MAAM,QAAQ,MAAM,KAAK,IACnC,MAAM,MAAmB,KAAK,MAAM,IACrC,MAAM;AACV,aAAO,4BAA4B,MAAM;IAC3C;IAEA,KAAK;AACH,aAAO,uCAAuC,MAAM,KAAK;IAE3D,KAAK;AACH,aAAO,yBAAyB,MAAM,KAAK;IAE7C,KAAK;AACH,aAAO,0BAA0B,MAAM,KAAK;IAE9C,KAAK;IACL,KAAK;AACH,aAAO;IAET,KAAK;IACL,KAAK;AACH,aAAO,uBAAuB,MAAM,KAAK;IAE3C,KAAK;IACL,KAAK;AACH,aAAO,qBAAqB,MAAM,KAAK;IAEzC,KAAK;IACL,KAAK,cAAc;AAGjB,UAAI,MAAM,QAAQ,MAAM,OAAO,KAAK,MAAM,QAAQ,SAAS,GAAG;AAC5D,eAAO;MACT;AACA,aAAO,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;IAC3D;IAEA,KAAK;IACL,KAAK,mBAAmB;AACtB,YAAM,cAAc,MAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,WAAW,CAAC;AACtE,YAAM,QAAS,YACZ,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,OAAO,OAAO,EACd,KAAK,IAAI;AACZ,aAAO,QACH,gCAAgC,KAAK,KACrC;IACN;IAEA,KAAK;IACL,KAAK,eAAe;AAClB,YAAM,aAAa,MAAM,QAAQ,4BAA4B,MAAM,OAAO,KAAK;AAC/E,YAAM,OAAO,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc;AACzE,aAAO,sBAAsB,YAAY,IAAI;IAC/C;IAEA,KAAK;IACL,KAAK,kBAAkB;AACrB,YAAM,aAAa,MAAM,QAAQ,MAAM,MAAM,IACxC,MAAM,OACJ,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,OAAO,OAAO,EACd,KAAK,IAAI,IACZ;AACJ,aAAO,aACH,UAAU,UAAU,2BACpB;IACN;IAEA,KAAK;AACH,aAAO,OAAO,MAAM,cAAc,WAC9B,uBAAuB,MAAM,SAAS,OACtC;IAEN,KAAK;AACH,aAAO,OAAO,MAAM,WAAW,WAC3B,eAAe,MAAM,MAAM,KAC3B;IAEN,KAAK;IACL,KAAK;AACH,aAAO;IAET,KAAK;IACL,KAAK;AACH,aAAO;IAET,SAAS;AAEP,UAAI,MAAM,YAAY,UAAa,MAAM;AACvC,eAAO,sBAAsB,4BAA4B,MAAM,OAAO,KAAK,IAAI;MACjF;AAEA,UAAI,OAAO,MAAM,aAAa,SAAU,QAAO,MAAM;AACrD,UAAI,OAAO,MAAM,WAAW,SAAU,QAAO,MAAM;AACnD,aAAO,OAAO,GAAG,IAAI,eAAe;IACtC;EACF;AACF;AAMA,SAAS,+BAA+B,OAAiC;AACvE,MAAI,MAAM,SAAS,gBAAgB,MAAM,SAAS,cAAc;AAC9D,QAAI,MAAM,QAAQ,MAAM,OAAO,KAAK,MAAM,QAAQ,SAAS,GAAG;AAC5D,aAAQ,MAAM,QACX,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,EAC1C,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ;IACrD;EACF;AACA,QAAM,KAAK,2BAA2B,KAAK;AAC3C,SAAO,OAAO,OAAO,CAAC,EAAE,IAAI,CAAC;AAC/B;AAMA,SAAS,yBAAyB,YAAgD;AAChF,SAAO,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,eAAe;AAC5D;AAMA,SAAS,kBAAkB,SAAwC;AACjE,MAAI,MAAM,QAAQ,QAAQ,UAAU,EAAG,QAAO,QAAQ;AACtD,MAAI,MAAM,QAAQ,QAAQ,MAAM,EAAG,QAAO,QAAQ;AAClD,SAAO,CAAC;AACV;AAKA,SAAS,uBAAuB,OAAmC;AACjE,MAAI,MAAM,QAAQ,MAAM,UAAU,EAAG,QAAO,MAAM;AAClD,MAAI,MAAM,QAAQ,MAAM,MAAM,EAAG,QAAO,MAAM;AAC9C,SAAO,CAAC;AACV;AAmBA,SAAS,aAAa,SAAsC;AAC1D,QAAM,QAAkB,MAAM,QAAQ,QAAQ,WAAW,IACpD,QAAQ,YAAyB,OAAO,CAAC,MAAM,OAAO,MAAM,QAAQ,IACrE,CAAC;AAEL,QAAM,QAAQ,QAAQ;AAEtB,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,EAAE,QAAQ,OAAO,MAAM;EAChC;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,QAAI,SAAS;AACb,eAAW,OAAO,OAAuB;AACvC,UAAI,IAAI,SAAS,OAAQ;AACzB,UAAI,OAAO,IAAI,YAAY,UAAU;AACnC,iBAAS,IAAI;MACf,WAAW,MAAM,QAAQ,IAAI,OAAO,GAAG;AACrC,mBAAW,SAAS,IAAI,SAAqD;AAC3E,cAAI,MAAM,SAAS,UAAU,OAAO,MAAM,UAAU,SAAU,UAAS,MAAM;mBACpE,MAAM,SAAS,UAAU,OAAO,MAAM,UAAU;AACvD,kBAAM,KAAK,MAAM,KAAK;QAC1B;MACF;IACF;AACA,WAAO,EAAE,QAAQ,MAAM;EACzB;AAEA,SAAO,EAAE,QAAQ,IAAI,MAAM;AAC7B;AAOA,SAAS,sBAAsB,KAAkC;AAC/D,MAAI,QAAQ,UAAa,QAAQ,KAAM,QAAO;AAC9C,MAAI,OAAO,QAAQ,SAAU,QAAO;AAEpC,MAAI,MAAM,QAAQ,GAAG,GAAG;AAEtB,aAAS,IAAI,IAAI,SAAS,GAAG,KAAK,GAAG,KAAK;AACxC,YAAM,MAAM,IAAI,CAAC;AACjB,UAAI,OAAO,IAAI,YAAY,SAAU,QAAO,IAAI;IAClD;AACA,WAAO;EACT;AAEA,SAAO,KAAK,UAAU,GAAG;AAC3B;AAuBO,SAAS,kBAAkB,OAAgB,SAAS,aAA8B;AACvF,QAAM,WAAqB,CAAC;AAC5B,QAAM,QAAQ,oBAAI,IAA2B;AAE7C,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,UAAM,IAAI,MAAM,6CAA6C,MAAM,GAAG;EACxE;AAEA,QAAM,WAAW;AAEjB,MAAI,CAAC,MAAM,QAAQ,SAAS,KAAK,GAAG;AAClC,UAAM,IAAI,MAAM,gDAAgD,MAAM,GAAG;EAC3E;AAEA,MAAI,SAAS,WAAW,UAAa,SAAS,eAAe,QAAW;AACtE,aAAS,KAAK,sEAAsE;EACtF;AAEA,QAAM,kBAAkB,uBAAuB,QAAQ;AAGvD,QAAM,oBAA8B,gBACjC,OAAO,CAAC,MAAM,EAAE,SAAS,eAAe,EACxC,QAAQ,8BAA8B;AAKzC,WAAS,aAAa,WAAkC;AACtD,UAAM,WAAW,MAAM,IAAI,SAAS;AACpC,QAAI,SAAU,QAAO;AACrB,UAAM,UAAyB,EAAE,YAAY,WAAW,OAAO,CAAC,EAAE;AAClE,UAAM,IAAI,WAAW,OAAO;AAC5B,WAAO;EACT;AAEA,QAAM,QAAQ,SAAS;AAEvB,WAAS,MAAM,GAAG,MAAM,MAAM,QAAQ,OAAO;AAC3C,UAAM,UAAU,MAAM,GAAG;AACzB,UAAM,iBAAiB,kBAAkB,OAAO;AAEhD,QAAI,QAAQ,WAAW,UAAa,QAAQ,eAAe,QAAW;AACpE,YAAM,SAAS,QAAQ,MAAM,MAAM;AACnC,eAAS,KAAK,SAAS,MAAM,sDAAsD;IACrF;AAGA,UAAM,eAAyB,CAAC;AAGhC,QAAI,OAAO,QAAQ,aAAa,YAAY,QAAQ,SAAS,KAAK,GAAG;AACnE,mBAAa,KAAK,QAAQ,SAAS,KAAK,CAAC;IAC3C;AAEA,eAAW,SAAS,gBAAgB;AAClC,UAAI,MAAM,SAAS,iBAAiB;AAClC,qBAAa,KAAK,GAAG,+BAA+B,KAAK,CAAC;MAC5D;IACF;AAGA,iBAAa,KAAK,GAAG,iBAAiB;AAEtC,UAAM,gBAAgB,yBAAyB,cAAc;AAC7D,UAAM,EAAE,QAAQ,OAAO,WAAW,IAAI,aAAa,OAAO;AAC1D,UAAM,iBAAiB,sBAAsB,QAAQ,eAAe;AAGpE,UAAM,YAAY,MAAM;AAGxB,UAAM,WAAiF;MACrF,IAAI;MACJ;MACA,GAAI,mBAAmB,UAAa,EAAE,iBAAiB,eAAe;MACtE,GAAI,WAAW,SAAS,KAAK,EAAE,OAAO,WAAW;MACjD,YAAY;IACd;AAEA,QAAI,cAAc,WAAW,GAAG;AAK9B,YAAMC,eAAc,aAAa,WAAW;AAC5CA,mBAAY,MAAM,KAAK,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO;AAEL,iBAAW,MAAM,eAAe;AAC9B,cAAM,YAAY,OAAO,GAAG,UAAU,WAAW,GAAG,QAAQ;AAC5D,cAAM,gBAAgB,GAAG,mBAAmB;AAC5C,cAAM,YAAY,aAAa,SAAS;AACxC,kBAAU,MAAM,KAAK,EAAE,GAAG,UAAU,gBAAgB,cAAc,CAAC;MACrE;IACF;EACF;AAGA,QAAM,cAAc,MAAM,IAAI,WAAW;AACzC,MAAI,eAAe,YAAY,MAAM,SAAS,GAAG;AAE/C,QAAI,gBAA+B;AACnC,QAAI,WAAW;AACf,eAAW,CAAC,MAAM,CAAC,KAAK,OAAO;AAC7B,UAAI,SAAS,eAAe,EAAE,MAAM,SAAS,UAAU;AACrD,mBAAW,EAAE,MAAM;AACnB,wBAAgB;MAClB;IACF;AAEA,QAAI,eAAe;AACjB,YAAM,aAAa,aAAa,aAAa;AAC7C,iBAAW,YAAY,YAAY,OAAO;AACxC,mBAAW,MAAM,KAAK,QAAQ;MAChC;AACA,YAAM,OAAO,WAAW;IAC1B;EAEF;AAEA,SAAO,EAAE,OAAO,SAAS;AAC3B;AAYO,SAAS,sBAAsB,cAAuC;AAC3E,QAAM,UAAU,aAAa,cAAc,MAAM;AACjD,QAAM,SAAS,eAAe,OAAO;AACrC,SAAO,kBAAkB,QAAQ,KAAK,SAAS,YAAY,CAAC;AAC9D;AAOO,SAAS,mBAAmB,QAA8C;AAC/E,QAAM,QAAQ,oBAAI,IAAoB;AACtC,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,eAAW,CAAC,KAAK,KAAK,OAAO,OAAO;AAClC,YAAM,IAAI,OAAO,YAAY;IAC/B;EACF,OAAO;AACL,eAAW,CAAC,KAAK,KAAK,OAAO,OAAO;AAClC,YAAM,WAAW,MAAM,QAAQ,mBAAmB,GAAG;AACrD,YAAM,IAAI,OAAO,GAAG,QAAQ,aAAa;IAC3C;EACF;AACA,SAAO;AACT;ACzaA,SAAS,cAAc,IAAY,QAA6C;AAC9E,SAAO,OAAO,WAAW,WACrB,WAAW,QAAQ,IAAI,MAAM,IAC7B,OAAO,KAAK,CAAC,YAAY,WAAW,QAAQ,IAAI,OAAO,CAAC;AAC9D;AAEA,SAAS,iBAAiB,SAKb;AACX,QAAM,WAAW,QAAQ,SACrB,QAAQ,UAAU,OAAO,CAAC,aAAa,SAAS,OAAO,QAAQ,MAAM,IACrE,QAAQ,SACN,QAAQ,UAAU,OAAO,CAAC,aAAa,cAAc,SAAS,IAAI,QAAQ,UAAU,EAAE,CAAC,IACvF,QAAQ;AAEd,MAAI,SAAS,WAAW,GAAG;AACzB,UAAM,WAAW,QAAQ,SACrB,YAAY,QAAQ,MAAM,MAC1B,QAAQ,SACN,WAAW,MAAM,QAAQ,QAAQ,MAAM,IAAI,QAAQ,OAAO,KAAK,GAAG,IAAI,QAAQ,MAAM,MACpF;AACN,UAAM,IAAI;MACR,uDAAuD,QAAQ,YAAY,SAAS,MAAM,OAAO,QAAQ,QAAQ;IACnH;EACF;AAEA,SAAO,SAAS,CAAC;AACnB;AAEA,SAAS,oBAAoB,QAAwC;AACnE,SAAO,qBAAqB,SAAS,OAAO,IAAI,KAAK,OAAO,SAAS,QAAQ,UAAU;AACzF;AAEA,SAAS,WAAW,OAA+E;AACjG,UAAQ,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU;IAClC,GAAI,KAAK,SAAS,UAAa,EAAE,MAAM,KAAK,KAAK;IACjD,GAAI,KAAK,SAAS,UAAa,EAAE,MAAM,KAAK,KAAK;IACjD,GAAI,KAAK,WAAW,UAAa,EAAE,QAAQ,KAAK,OAAO;IACvD,GAAI,KAAK,gBAAgB,UAAa,EAAE,YAAY,KAAK,YAAY;IACrE,GAAI,KAAK,aAAa,UAAa,EAAE,UAAU,KAAK,SAAS;IAC7D,GAAI,KAAK,WAAW,UAAa,EAAE,QAAQ,KAAK,OAAO;EACzD,EAAE;AACJ;AAEA,SAAS,aACP,OACA,kBAC2C;AAC3C,QAAM,OACJ,MAAM,YAAY,MAAM,UAAU,KAAK,CAAC,cAAc,UAAU,SAAS,gBAAgB;AAC3F,MAAI,CAAC,MAAM;AACT,WAAO;EACT;AACA,SAAO;IACL,aAAa,KAAK;IAClB,WAAW,KAAK;IAChB,UAAU,KAAK;EACjB;AACF;AAEA,eAAe,2BACb,OACA,kBACe;AACf,MAAI,CAAC,MAAM,aAAa;AACtB;EACF;AACA,aAAW,QAAQ,MAAM,WAAW;AAClC,QAAI,KAAK,SAAS,kBAAkB;AAClC,YAAM,MAAM,YAAY,YAAY,IAAI,EAAE,MAAM,MAAM;MAAC,CAAC;IAC1D;EACF;AACF;AAEA,eAAsB,qBACpB,SACgC;AAChC,QAAM,WAAWV,MAAK,QAAQ,QAAQ,YAAY;AAClD,QAAM,YAAY,WAAW;AAC7B,QAAM,YACJ,QAAQ,aACP,MAAM,UAAU,UAAU,QAAQ,UAAU;IAC3C,SAAS,QAAQ;IACjB,QAAQ,QAAQ,UAAU,QAAQ;EACpC,CAAC;AACH,QAAM,WAAW,iBAAiB;IAChC;IACA,QAAQ,QAAQ;IAChB,QAAQ,QAAQ;IAChB;EACF,CAAC;AACD,QAAM,UAAUA,MAAK,QAAQ,QAAQ;AACrC,QAAM,UAAU,QAAQ,kBAAkB;AAC1C,QAAM,kBAAkB,QAAQ,oBAAoB,QAAQ,iBAAiB,SAAS;AACtF,QAAM,kBACJ,QAAQ,oBAAoB,QAAQ,oBAAoB,YAAY;AACtE,QAAM,iBAAiB,oBAAoB,QAAQ,MAAM;AACzD,QAAM,eAA6B,MAAM,kBAAkB,UAAU,cAAc;AAEnF,MAAI;AACJ,MAAI;AACF,kBAAc,MAAM,4BAA4B;MAC9C;MACA,WAAW,CAAC,QAAQ;MACpB,aAAa,QAAQ;MACrB;MACA,SAAS,QAAQ;MACjB;MACA,cAAc,QAAQ;MACtB,eAAe,QAAQ;MACvB,qBAAqB,QAAQ;MAC7B,eAAe,QAAQ;MACvB,gBAAgB,QAAQ;IAC1B,CAAC;AAED,UAAM,eACJ,YAAY,mBAAmB,SAAS,IAAI,YAAY,mBAAmB,IAAI,IAAI;AACrF,UAAM,wBAAwB,cAAc,QAAQ,YAAY;AAChE,UAAM,yBAAyB,eAC3B,YAAY,kBAAkB,IAAI,aAAa,IAAI,IACnD,YAAY;AAEhB,UAAM,YAAY,MAAM,yBAAyB;MAC/C;MACA,YAAY,QAAQ,OAAO;MAC3B;MACA,qBAAqB;MACrB,sBAAsB;MACtB,oBAAoB,YAAY;MAChC,aAAa,YAAY;MACzB;MACA,mBAAmB,QAAQ;MAC3B,aAAa,QAAQ;MACrB,YAAY,QAAQ;IACtB,CAAC;AAED,QAAI,CAAC,UAAU,eAAe;AAC5B,YAAM,IAAI;QACR,2CAA2C,SAAS,EAAE;MACxD;IACF;AAEA,UAAM,2BAA2B,aAAa,UAAU,aAAa;AACrE,UAAM,OAAO,aAAa,aAAa,UAAU,aAAa;AAE9D,WAAO;MACL;MACA,QAAQ,SAAS;MACjB,QAAQ,QAAQ,OAAO;MACvB;MACA,eAAe,UAAU;MACzB,GAAI,UAAU,sBAAsB,UAAa;QAC/C,eAAe,UAAU;MAC3B;MACA,YAAY,QAAQ,QAAQ,MAAM,oBAAI,KAAK,IAAI,EAAE,YAAY;MAC7D,gBAAgB,CAAC,GAAG,YAAY,gBAAgB,GAAG,UAAU,cAAc;MAC3E,UAAU,WAAW,SAAS,WAAW,KAAK;MAC9C,UAAU,UAAU,iBAChB,EAAE,QAAQ,eAAe,QAAQ,UAAU,eAAe,IAC1D,EAAE,QAAQ,cAAc;MAC5B,cAAc;QACZ,MAAM;QACN;QACA,UAAU,aAAa;QACvB,GAAI,aAAa,kBAAkB,UAAa;UAC9C,eAAe,aAAa;QAC9B;QACA,GAAI,aAAa,eAAe,UAAa,EAAE,YAAY,aAAa,WAAW;MACrF;MACA,eAAe;QACb,MAAM,YAAY;QAClB;QACA;QACA,eAAe;MACjB;MACA,iBAAiB,UAAU;MAC3B,GAAI,SAAS,UAAa,EAAE,KAAK;IACnC;EACF,SAAS,OAAO;AACd,QAAI,aAAa;AACf,YAAM,4BAA4B,WAAW,EAAE,MAAM,MAAM;MAAC,CAAC;IAC/D;AACA,UAAM;EACR;AACF;AC1QA,IAAM,qBAAqB,iBAAE,OAAO;;EAElC,WAAW,iBACR,OAAO;;IAEN,SAAS,iBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS;;IAElD,YAAY,iBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;;IAE7C,gBAAgB,iBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;;IAEjD,SAAS,iBAAE,QAAQ,EAAE,SAAS;;IAE9B,gBAAgB,iBAAE,QAAQ,EAAE,SAAS;;IAErC,UAAU,iBAAE,OAAO,EAAE,SAAS;EAChC,CAAC,EACA,SAAS;;EAGZ,QAAQ,iBACL,OAAO;;IAEN,KAAK,iBAAE,OAAO,EAAE,SAAS;EAC3B,CAAC,EACA,OAAO,EACP,SAAS;;EAGZ,OAAO,iBACJ,OAAO;;IAEN,SAAS,iBAAE,QAAQ,EAAE,SAAS;;IAE9B,MAAM,iBAAE,OAAO,EAAE,SAAS;EAC5B,CAAC,EACA,SAAS;;EAGZ,QAAQ,iBACL,OAAO;;IAEN,YAAY,iBAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;;IAEvC,eAAe,iBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;EAClD,CAAC,EACA,SAAS;;EAGZ,OAAO,iBACJ,OAAO;;;;;;;;IAQN,eAAe,iBAAE,OAAO,EAAE,SAAS;EACrC,CAAC,EACA,SAAS;AACd,CAAC;AA4BM,SAAS,aAAa,QAAoC;AAC/D,SAAO,mBAAmB,MAAM,MAAM;AACxC;AAMA,IAAM,oBAAoB;EACxB;EACA;EACA;EACA;EACA;EACA;AACF;AAWA,eAAsB,aAAa,aAAmD;AACpF,QAAM,EAAE,YAAAE,YAAW,IAAI,MAAM,OAAO,SAAS;AAC7C,QAAM,EAAE,cAAc,IAAI,MAAM,OAAO,UAAU;AACjD,QAAM,EAAE,KAAK,IAAI,MAAM,OAAO,WAAW;AAEzC,aAAW,YAAY,mBAAmB;AACxC,UAAM,WAAW,KAAK,aAAa,QAAQ;AAC3C,QAAI,CAACA,YAAW,QAAQ,GAAG;AACzB;IACF;AAEA,QAAI;AACF,YAAM,UAAU,cAAc,QAAQ,EAAE;AACxC,YAAM,MAAM,MAAM,OAAO;AACzB,YAAM,SAAS,IAAI,WAAW;AAE9B,aAAO,mBAAmB,MAAM,MAAM;IACxC,SAAS,OAAO;AACd,YAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACjE,YAAM,IAAI,MAAM,8BAA8B,QAAQ,KAAK,GAAG,EAAE;IAClE;EACF;AAEA,SAAO;AACT;ACpKA,IAAM,mBAAmBS,iBAAE,OAAO;EAChC,IAAIA,iBAAE,OAAO,EAAE,SAAS,gEAAgE;EACxF,SAASA,iBAAE,OAAO,EAAE,SAAS,gDAAgD;EAC7E,QAAQA,iBAAE,OAAO,EAAE,QAAQ,CAAG,EAAE,SAAS,mCAAmC;EAC5E,UAAUA,iBAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,yCAAyC;AACxF,CAAC;AAED,IAAM,yBAAyBA,iBAAE,OAAO;EACtC,SAASA,iBAAE,MAAM,gBAAgB,EAAE,SAAS,4BAA4B;AAC1E,CAAC;AAgBD,eAAsB,gBACpB,SACgC;AAChC,QAAM,EAAE,UAAU,UAAU,iBAAiB,SAAS,IAAI;AAE1D,QAAM,SAAS,YAAY,UAAU,UAAU,eAAe;AAE9D,QAAM,SAAS;;;;;;;;;;;;AAaf,MAAI;AACJ,MAAI;AAEJ,WAAS,UAAU,GAAG,WAAW,GAAG,WAAW;AAC7C,QAAI;AACF,YAAM,WAAW,MAAM,SAAS,OAAO;QACrC,UAAU;QACV,cAAc;MAChB,CAAC;AAED,YAAM,OAAO,4BAA4B,SAAS,MAAM;AACxD,YAAM,UAAU,KAAK,QAAQ,mBAAmB,EAAE,EAAE,KAAK;AACzD,eAAS,uBAAuB,MAAM,KAAK,MAAM,OAAO,CAAC;AACzD;IACF,SAAS,GAAY;AACnB,kBAAY,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;IAE1D;EACF;AAEA,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,uDAAuD,WAAW,OAAO,EAAE;EAC7F;AAEA,SAAO,OAAO;AAChB;AAEA,SAAS,YAAY,UAAkB,UAAmB,iBAAkC;AAC1F,QAAM,QAAkB;IACtB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACF;AAEA,MAAI,YAAY,SAAS,KAAK,EAAE,SAAS,GAAG;AAC1C,UAAM,KAAK,wBAAwB,UAAU,EAAE;EACjD;AAEA,MAAI,mBAAmB,gBAAgB,KAAK,EAAE,SAAS,GAAG;AACxD,UAAM,KAAK,gCAAgC,iBAAiB,EAAE;EAChE;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AC1DA,eAAsB,aAAa,eAA2D;AAC5F,QAAM,OAAO,oBAAI,IAA4C;AAC7D,QAAM,SAA8C,CAAC;AAErD,aAAW,YAAY,eAAe;AACpC,QAAI;AACF,YAAM,QAAQ,MAAM,yBAAyB,QAAQ;AACrD,iBAAW,QAAQ,OAAO;AACxB,YAAI,CAAC,KAAK,KAAM;AAChB,cAAM,cAAc,mBAAmB,IAAI;AAC3C,cAAM,MAAM,gBAAgB,SAAS,SAAY;AACjD,cAAM,MAAM,GAAG,sBAAsB,KAAK,IAAI,CAAC,KAAK,OAAO,EAAE;AAC7D,cAAM,WAAW,KAAK,IAAI,GAAG;AAC7B,YAAI,UAAU;AACZ,mBAAS,OAAO,KAAK,QAAQ;QAC/B,OAAO;AACL,eAAK,IAAI,KAAK;YACZ,KAAK,oBAAoB,KAAK,IAAI;YAClC;YACA,QAAQ,KAAK;YACb,UAAU,KAAK;YACf,QAAQ,CAAC,QAAQ;UACnB,CAAC;QACH;MACF;IACF,SAAS,KAAK;AACZ,aAAO,KAAK;QACV,MAAM;QACN,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;MAC1D,CAAC;IACH;EACF;AAEA,SAAO,EAAE,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,OAAO;AAC7C;AAMA,eAAe,yBAAyB,UAAyC;AAC/E,QAAM,UAAU,MAAM,SAAS,UAAU,MAAM;AAC/C,QAAM,SAAS,eAAe,eAAe,OAAO,GAAG,QAAQ,GAAG;AAClE,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,EAAG,QAAO,CAAC;AAC5E,QAAM,MAAM;AACZ,QAAM,cAAcX,MAAK,QAAQA,MAAK,QAAQ,QAAQ,CAAC;AAEvD,QAAM,QAAsB,CAAC;AAE7B,QAAM,aAAa,MAAM,6BAA6B,IAAI,WAAW,WAAW;AAChF,QAAM,KAAK,GAAG,UAAU;AAExB,QAAM,QAAQ,MAAM,QAAQ,IAAI,KAAK,IAAI,IAAI,QAAQ,CAAC;AACtD,aAAW,QAAQ,OAAO;AACxB,QAAI,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,GAAG;AAC5D,YAAM,UAAU;AAChB,YAAM,YAAY,MAAM,6BAA6B,QAAQ,WAAW,WAAW;AACnF,YAAM,KAAK,GAAG,SAAS;IACzB;EACF;AAEA,SAAO;AACT;AAMA,eAAe,6BACb,KACA,aACuB;AACvB,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,oBAAoBA,MAAK,QAAQ,aAAa,GAAG;AACvD,UAAM,UAAU,MAAM,SAAS,mBAAmB,MAAM;AACxD,UAAM,SAAS,eAAe,eAAe,OAAO,GAAG,QAAQ,GAAG;AAClE,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,EAAG,QAAO,CAAC;AAC5E,WAAO,uBAAuB,MAAiC;EACjE;AACA,MAAI,OAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,GAAG,GAAG;AACzD,WAAO,uBAAuB,GAA8B;EAC9D;AACA,SAAO,CAAC;AACV;AAEA,SAAS,uBAAuB,KAA4C;AAC1E,QAAM,WAAW,MAAM,QAAQ,IAAI,KAAK,IAAI,IAAI,QAAQ,CAAC;AACzD,QAAM,SAAuB,CAAC;AAC9B,aAAW,KAAK,UAAU;AACxB,UAAM,SAAS,gBAAgB,CAAC;AAChC,QAAI,QAAQ,MAAM;AAChB,aAAO,KAAK,MAAM;IACpB;EACF;AACA,SAAO;AACT;ACvHA,IAAM,gBAAgB,UAAU,QAAQ;AAIxC,IAAM,2BAA2B;AAKjC,IAAM,wBAAwB;AAC9B,IAAM,4BAA4B;AAGlC,IAAM,4BAA4B,CAAC,uBAAuB,yBAAyB;AACnF,IAAM,qCAAqC;AAC3C,IAAM,oCAAoC;AAC1C,IAAM,+BAA+B;EACnC;EACA;EACA;EACA;AACF;AACA,IAAM,4BAA4B,oBAAI,IAAI;EACxC;EACA;EACA;EACA;EACA;AACF,CAAC;AACM,IAAM,yBAAyB;AACtC,IAAM,yBAAyB;AAC/B,IAAM,iBAAiB;AAQvB,IAAM,+BAA+B;AACrC,IAAM,4BAA4B;AAClC,IAAMY,yBAAwB;AAqH9B,IAAM,yBAAyB,oBAAI,IAAY;AAE/C,SAAS,iBAAiB,MAAsB;AAC9C,SAAO,KAAK,KAAK,EAAE,QAAQ,qBAAqB,GAAG;AACrD;AAEA,SAAS,4BAA4B,OAAuB;AAC1D,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,QAAM,QAAQ,QAAQ,YAAY;AAClC,MACE,MAAM,SAAS,uBAAuB,KACtC,MAAM,SAAS,yBAAyB,KACxC,MAAM,SAAS,mBAAmB,KAClC,MAAM,SAAS,kCAAkC,GACjD;AACA,WAAO,IAAI,MAAM,GAAG,OAAO,wCAAwC;EACrE;AACA,SAAO,IAAI,MAAM,OAAO;AAC1B;AAEA,SAAS,WAAW,GAAmB;AACrC,MAAI,MAAM,OAAO,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,KAAK,GAAG;AAC1D,WAAOZ,MAAK,KAAK,GAAG,QAAQ,GAAG,EAAE,MAAM,CAAC,CAAC;EAC3C;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,GAAW,SAAyB;AAC5D,QAAM,WAAW,WAAW,CAAC;AAC7B,SAAOA,MAAK,WAAW,QAAQ,IAAI,WAAWA,MAAK,QAAQ,SAAS,QAAQ;AAC9E;AAEO,SAAS,uBACd,QACA,SACyB;AACzB,QAAM,UAAU,SAAS,WAAW,QAAQ,IAAI;AAChD,QAAM,WAAW,OAAO,YAAY,OAAO,OAAO,KAAK;AACvD,QAAM,WAAW,OAAO,WAAW,KAAK;AACxC,QAAM,oBAAoB,OAAO,MAAM,KAAK;AAC5C,QAAM,OAAO,WAAW,YAAY;AACpC,QAAM,SAAS,OAAO,QAAQ,KAAK,MAAM,WAAW,yBAAyB;AAC7E,QAAM,2BAA2B,QAAQ,YAAa,WAAW,qBAAqB,MAAO;AAC7F,QAAM,SACJ,OAAO,QAAQ,KAAK,MACnB,WAAW,2BAA2B,yBAAyB;AAClE,QAAM,WAAW,OAAO,MAAM,aAAa,OAAO,cAAc;AAChE,QAAM,cAAc,OAAO,MAAM,iBAAiB;AAClD,QAAM,qBAAqB,OAAO,MAAM,wBAAwB;AAChE,QAAM,mBAAmB,WAAW,iBAAiB,UAAU,OAAO,IAAI;AAC1E,QAAM,eAAe,oBACjB,iBAAiB,mBAAmB,OAAO,IAC3C,UACEA,MAAK,KAAK,iBAAiB,GAAG,WAAW,iBAAiB,OAAO,CAAC,IACjE,oBAAoBA,MAAK,KAAK,iBAAiB,GAAG,WAAW,iBAAiB,IAAI,CAAC;AAC1F,SAAO;IACL,MAAM;IACN;IACA,GAAI,UAAU,EAAE,UAAU,QAAQ,IAAI,CAAC;IACvC,GAAI,mBAAmB,EAAE,WAAW,iBAAiB,IAAI,CAAC;IAC1D,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;IAC3B;IACA,MAAM;IACN,WAAW;IACX,cAAc;IACd,sBAAsB;IACtB,eAAe,OAAO,eAAe,KAAK,KAAK;IAC/C,uBAAuB;EACzB;AACF;AAEO,SAAS,sBAAsB,MAAsB;AAC1D,MAAI,KAAK,SAAS,KAAK,KAAK,KAAK,WAAW,MAAM,GAAG;AACnD,WAAO;EACT;AACA,SAAO,sBAAsB,IAAI;AACnC;AAEO,SAAS,yBAAyB,MAAqC;AAC5E,QAAM,UAAUA,MAAK,KAAK,iBAAiB,GAAG,SAAS,gBAAgB,iBAAiB,IAAI,CAAC;AAC7F,SAAO;IACL;IACA,SAASA,MAAK,KAAK,SAAS,MAAM;IAClC,YAAYA,MAAK,KAAK,SAAS,aAAa;EAC9C;AACF;AAEA,SAAS,0BAA0B,QAA0C;AAC3E,SAAO,OAAO,0BAA0B,QAAQ,QAAQ,OAAO,SAAS;AAC1E;AAEA,SAAS,oBAAoB,YAAqC;AAChE,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,WAAO,CAAC;EACV;AAEA,MAAI;AACF,WAAO,KAAK,MAAMC,cAAa,YAAY,MAAM,CAAC;EACpD,QAAQ;AACN,WAAO,CAAC;EACV;AACF;AAEA,SAAS,qBAAqB,YAAoB,QAA+B;AAC/E,YAAUD,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,gBAAc,YAAY,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;GAAM,MAAM;AAC1E;AAEA,eAAe,WACb,YACA,MACA,SAC+D;AAC/D,MAAI;AACF,UAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,cAAc,YAAY,CAAC,GAAG,IAAI,GAAG;MACpE,KAAK,SAAS;MACd,KAAK,SAAS,OAAO,QAAQ;IAC/B,CAAC;AACD,WAAO,EAAE,QAAQ,QAAQ,UAAU,EAAE;EACvC,SAAS,OAAO;AACd,QAAI,SAAS,UAAU,SAAS,SAAS,OAAO,UAAU,UAAU;AAClE,YAAM,YAAY;AAClB,aAAO;QACL,QAAQ,UAAU,UAAU;QAC5B,QAAQ,UAAU,UAAU;QAC5B,UAAU,OAAO,UAAU,SAAS,WAAW,UAAU,OAAO;MAClE;IACF;AACA,UAAM,4BAA4B,KAAK;EACzC;AACF;AAEA,SAAS,YAA+B;AACtC,QAAM,MAAyB,CAAC;AAChC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG,GAAG;AACtD,QAAI,UAAU,WAAc,CAAC,IAAI,WAAW,MAAM,KAAK,0BAA0B,IAAI,GAAG,IAAI;AAC1F,UAAI,GAAG,IAAI;IACb;EACF;AACA,MAAI,sBAAsB;AAC1B,SAAO;AACT;AAEA,eAAe,OACb,MACA,SAC+D;AAC/D,SAAO,WAAW,OAAO,MAAM,EAAE,GAAG,SAAS,KAAK,EAAE,GAAG,UAAU,GAAG,GAAG,SAAS,IAAI,EAAE,CAAC;AACzF;AAEA,eAAe,MACb,MACA,SAC+D;AAC/D,SAAO,WAAW,MAAM,MAAM,OAAO;AACvC;AAEA,SAAS,aAAa,OAAwB;AAC5C,QAAM,QAAkB,CAAC;AACzB,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,SAAS;AACf,QAAI,OAAO,OAAO,WAAW,SAAU,OAAM,KAAK,OAAO,MAAM;AAC/D,QAAI,OAAO,OAAO,WAAW,SAAU,OAAM,KAAK,OAAO,MAAM;AAC/D,QAAI,OAAO,OAAO,YAAY,SAAU,OAAM,KAAK,OAAO,OAAO;EACnE,WAAW,OAAO,UAAU,UAAU;AACpC,UAAM,KAAK,KAAK;EAClB;AACA,SAAO,MAAM,KAAK,IAAI,EAAE,YAAY;AACtC;AAEA,SAAS,0BAA0B,OAAyB;AAC1D,QAAM,OAAO,aAAa,KAAK;AAC/B,SACE,KAAK,SAAS,yBAAyB,KACvC,KAAK,SAAS,4BAA4B,KAC1C,KAAK,SAAS,4BAA4B,KAC1C,KAAK,SAAS,qCAAqC,KACnD,KAAK,SAAS,kBAAkB;AAEpC;AAEA,SAAS,+BAAkD;AACzD,SAAO;IACL,iBAAiB;IACjB,kBAAkB;IAClB,oBAAoB;IACpB,qBAAqB;EACvB;AACF;AAEA,SAAS,iCAAoD;AAC3D,QAAM,MAAyB,CAAC;AAChC,aAAW,OAAO,8BAA8B;AAC9C,UAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,QAAI,UAAU,QAAW;AACvB,UAAI,GAAG,IAAI;IACb;EACF;AACA,SAAO;AACT;AAEA,eAAe,iCACb,MACA,SAC6C;AAC7C,QAAM,MAAM;IACV,GAAG,+BAA+B;IAClC,GAAG,QAAQ;EACb;AACA,MAAI;AACF,WAAO,MAAM,OAAO,MAAM,EAAE,GAAG,SAAS,IAAI,CAAC;EAC/C,SAAS,OAAO;AACd,QAAI,CAAC,0BAA0B,KAAK,GAAG;AACrC,YAAM;IACR;AACA,WAAO,OAAO,MAAM;MAClB,GAAG;MACH,KAAK;QACH,GAAG;QACH,GAAG,6BAA6B;MAClC;IACF,CAAC;EACH;AACF;AAEA,eAAe,qBAAqB,SAAkC;AACpE,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,CAAC,gBAAgB,0BAA0B,GAAG,EAAE,KAAK,QAAQ,CAAC;AAC9F,UAAM,MAAM,OAAO,KAAK;AACxB,UAAM,SAAS;AACf,QAAI,IAAI,WAAW,MAAM,GAAG;AAC1B,aAAO,IAAI,MAAM,OAAO,MAAM;IAChC;EACF,QAAQ;EAER;AAEA,aAAW,aAAa,CAAC,QAAQ,QAAQ,GAAG;AAC1C,QAAI;AACF,YAAM,OAAO,CAAC,aAAa,YAAY,UAAU,SAAS,EAAE,GAAG,EAAE,KAAK,QAAQ,CAAC;AAC/E,aAAO;IACT,QAAQ;IAER;EACF;AAEA,SAAO;AACT;AAEA,eAAe,iBACb,SACA,SAAS,UACT,QACe;AACf,MAAI,QAAQ;AACV,UAAM,sBAAsB,SAAS,QAAQ,MAAM;AACnD,UAAM,OAAO,CAAC,UAAU,SAAS,MAAM,GAAG,EAAE,KAAK,SAAS,OAAO,MAAM,CAAC;AACxE;EACF;AAEA,QAAM,OAAO,CAAC,SAAS,QAAQ,SAAS,GAAG,EAAE,KAAK,QAAQ,CAAC;AAC7D;AAEA,SAAS,2BAA2B,QAAyB;AAC3D,QAAM,QAAQ,OAAO,YAAY;AACjC,SAAO,MAAM,SAAS,0BAA0B,KAAK,MAAM,SAAS,2BAA2B;AACjG;AAEA,eAAe,sBACb,SACA,QACA,QACe;AACf,QAAM,EAAE,UAAU,OAAO,IAAI,MAAM;IACjC,CAAC,SAAS,QAAQ,eAAe,MAAM,iBAAiB,MAAM,IAAI,MAAM,EAAE;IAC1E;MACE,KAAK;MACL,OAAO;IACT;EACF;AACA,QAAM,aAAa,OAAO,KAAK;AAC/B,MAAI,aAAa,KAAK,CAAC,2BAA2B,UAAU,GAAG;AAC7D,UAAM,IAAI,MAAM,UAAU;EAC5B;AACF;AAEA,eAAe,wBACb,SACA,QACA,QACe;AACf,QAAM,UAAU,eAAe,MAAM,iBAAiB,MAAM,IAAI,MAAM;AACtE,QAAM,OAAO,CAAC,SAAS,sBAAsB,QAAQ,OAAO,GAAG;IAC7D,KAAK;IACL,OAAO;EACT,CAAC;AACD,MAAI,CAAE,MAAM,aAAa,SAAS,gBAAgB,MAAM,IAAI,MAAM,EAAE,GAAI;AACtE,UAAM,sBAAsB,SAAS,QAAQ,MAAM;EACrD;AACF;AAEA,SAAS,gBAAgB,QAAgB,SAAS,UAAkB;AAClE,SAAO,GAAG,MAAM,IAAI,MAAM;AAC5B;AAEA,eAAe,aAAa,SAAiB,KAA+B;AAC1E,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,CAAC,aAAa,YAAY,GAAG,GAAG,WAAW,GAAG;IAC5E,KAAK;IACL,OAAO;EACT,CAAC;AACD,SAAO,OAAO,KAAK,EAAE,SAAS;AAChC;AAEA,eAAe,2BACb,SACA,QAC6B;AAC7B,MAAI,CAAC,OAAO,QAAQ;AAClB,WAAO;EACT;AACA,QAAM,YAAY,gBAAgB,OAAO,QAAQ,OAAO,MAAM;AAC9D,MAAI,MAAM,aAAa,SAAS,SAAS,GAAG;AAC1C,WAAO;EACT;AACA,MAAI,MAAM,aAAa,SAAS,OAAO,MAAM,GAAG;AAC9C,WAAO,OAAO;EAChB;AACA,SAAO;AACT;AAEA,eAAe,oCACb,SACA,QAC6B;AAC7B,SAAO,2BAA2B,SAAS,MAAM;AACnD;AAEA,eAAe,kBAAkB,SAAiB,QAAkC;AAClF,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,CAAC,aAAa,YAAY,cAAc,MAAM,EAAE,GAAG;IACjF,KAAK;IACL,OAAO;EACT,CAAC;AACD,SAAO,OAAO,KAAK,EAAE,SAAS;AAChC;AAEA,eAAe,gCACb,SACA,QAC6B;AAC7B,QAAM,SAAS,OAAO;AACtB,MAAI,CAAC,QAAQ;AACX,WAAO;EACT;AACA,QAAM,YAAY,MAAM,oCAAoC,SAAS,MAAM;AAC3E,MAAI,CAAC,WAAW;AACd,UAAM,0BAA0B,SAAS,MAAM;AAC/C,UAAM,OAAO,CAAC,YAAY,MAAM,GAAG,EAAE,KAAK,QAAQ,CAAC;AACnD,WAAO;EACT;AAEA,QAAM,gBAAgB,MAAM,iBAAiB,OAAO;AACpD,MAAI,kBAAkB,QAAQ;AAC5B,QAAI,MAAM,kBAAkB,SAAS,MAAM,GAAG;AAC5C,YAAM,OAAO,CAAC,YAAY,MAAM,GAAG,EAAE,KAAK,QAAQ,CAAC;IACrD,OAAO;AACL,YAAM,OAAO,CAAC,YAAY,WAAW,MAAM,QAAQ,SAAS,GAAG,EAAE,KAAK,QAAQ,CAAC;IACjF;EACF;AACA,MAAI,cAAc,gBAAgB,QAAQ,OAAO,MAAM,GAAG;AACxD,UAAM,OAAO,CAAC,UAAU,qBAAqB,WAAW,MAAM,GAAG;MAC/D,KAAK;MACL,OAAO;IACT,CAAC;EACH;AAEA,SAAO;AACT;AAEA,eAAe,0BAA0B,SAAiB,QAA+B;AACvF,QAAM,OAAO,CAAC,cAAc,cAAc,MAAM,IAAI,MAAM,2BAA2B,OAAO,CAAC,GAAG;IAC9F,KAAK;EACP,CAAC;AACH;AAKA,eAAe,2BAA2B,SAAkC;AAC1E,QAAM,EAAE,OAAO,IAAI,MAAM;IACvB,CAAC,eAAe,gBAAgB,MAAM,4BAA4B;IAClE;MACE,KAAK;MACL,KAAK;QACH,GAAG,6BAA6B;QAChC,iBAAiB;QACjB,oBAAoB;MACtB;IACF;EACF;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,eAAe,gBAAgB,SAAmC;AAChE,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,CAAC,aAAa,uBAAuB,GAAG,EAAE,KAAK,QAAQ,CAAC;AACxF,WAAO,OAAO,KAAK,MAAM;EAC3B,QAAQ;AACN,WAAO;EACT;AACF;AAEA,eAAe,mBAAmB,SAAkC;AAClE,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,CAAC,aAAa,iBAAiB,GAAG,EAAE,KAAK,QAAQ,CAAC;AAClF,SAAO,OAAO,KAAK,KAAK;AAC1B;AAEA,eAAe,wBACb,SACA,QACe;AACf,MAAI,CAAC,OAAO,UAAU;AACpB;EACF;AAEA,QAAM,YAAY,sBAAsB,OAAO,QAAQ;AACvD,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,CAAC,UAAU,WAAW,OAAO,MAAM,GAAG;IACpE,KAAK;IACL,OAAO;EACT,CAAC;AACD,QAAM,cAAc,OAAO,KAAK;AAChC,MAAI,CAAC,aAAa;AAChB,UAAM,OAAO,CAAC,UAAU,OAAO,OAAO,QAAQ,SAAS,GAAG,EAAE,KAAK,QAAQ,CAAC;AAC1E;EACF;AACA,MAAI,gBAAgB,WAAW;AAC7B,UAAM,OAAO,CAAC,UAAU,WAAW,OAAO,QAAQ,SAAS,GAAG,EAAE,KAAK,QAAQ,CAAC;EAChF;AACF;AAEA,SAAS,iBACP,QACA,OACM;AACN,QAAM,OACJ,OAAO,OAAO,SAAS,WAAW,OAAO,OAAQ,OAAO,YAAY,OAAO,aAAa;AAC1F,QAAM,aAAa,yBAAyB,IAAI;AAChD,QAAM,UAAU,oBAAoB,WAAW,UAAU;AACzD,uBAAqB,WAAW,YAAY;IAC1C,GAAG;IACH,GAAG;EACL,CAAC;AACH;AAEA,eAAsB,uBAAuB,QAAwC;AACnF,QAAM,aAAa,uBAAuB,MAAM;AAChD,MAAI,WAAW,WAAW;AACxB,QAAI,CAAE,MAAM,gBAAgB,WAAW,SAAS,GAAI;AAClD,YAAM,IAAI,MAAM,8CAA8C,WAAW,SAAS,EAAE;IACtF;AACA,WAAO,mBAAmB,WAAW,SAAS;EAChD;AAEA,QAAM,aAAa,yBAAyB,WAAW,IAAI;AAC3D,QAAM,WAAW,WAAW;AAC5B,YAAU,WAAW,SAAS,EAAE,WAAW,KAAK,CAAC;AACjD,YAAUA,MAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAErD,QAAM,eAAe,CAAC,WAAW,QAAQ;AACzC,QAAM,SAASA,MAAK,KAAK,UAAU,MAAM;AACzC,QAAM,aAAa,CAAC,gBAAgB,CAAC,WAAW,MAAM,MAAM,MAAM,QAAQ,QAAQ,GAAG,WAAW;AAEhG,MAAI,gBAAgB,YAAY;AAC9B,QAAI;AACF,YAAM,OAAO;QACX;QACA;QACA,sBAAsB,WAAW,YAAY,WAAW,IAAI;QAC5D;MACF,CAAC;AACD,YAAM,wBAAwB,UAAU,UAAU;AAClD,aAAO;IACT,SAAS,OAAO;AACd,uBAAiB,YAAY,EAAE,YAAY,4BAA4B,KAAK,EAAE,QAAQ,CAAC;AACvF,YAAM,4BAA4B,KAAK;IACzC;EACF;AAEA,MAAI,CAAC,WAAW,MAAM,GAAG;AACvB,UAAM,IAAI,MAAM,oDAAoD,QAAQ,EAAE;EAChF;AAEA,QAAM,wBAAwB,UAAU,UAAU;AAClD,SAAO;AACT;AAEO,SAAS,qBAAqB,QAA2C;AAC9E,MAAI,CAAC,QAAQ;AACX,WAAO;MACL,YAAY;MACZ,WAAW;MACX,MAAM;MACN,WAAW;MACX,aAAa;IACf;EACF;AAEA,QAAM,aAAa,uBAAuB,MAAM;AAChD,QAAM,aAAa,yBAAyB,WAAW,IAAI;AAC3D,QAAM,YAAY,oBAAoB,WAAW,UAAU;AAE3D,SAAO;IACL,YAAY;IACZ,WAAW,WAAW,WAAW,IAAI;IACrC,MAAM,WAAW;IACjB,GAAI,WAAW,cAAc,UAAa,EAAE,WAAW,WAAW,UAAU;IAC5E,MAAM,WAAW;IACjB,WAAW,WAAW;IACtB,cAAc,WAAW;IACzB,sBAAsB,WAAW;IACjC,eAAe,WAAW;IAC1B,WAAW,WAAW;IACtB,gBAAgB,UAAU;IAC1B,YAAY,UAAU;IACtB,aAAa,WAAW,WAAW,IAAI,IAAI,UAAU;EACvD;AACF;AAEA,SAAS,uBAAuB,QAG9B;AACA,QAAM,aAAa,oBAAI,IAAY;AACnC,QAAM,kBAAkB,oBAAI,IAAY;AACxC,QAAM,gBAAgB,oBAAI,IAAI,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI,CAAC;AAExE,aAAW,QAAQ,OAAO,MAAM,OAAO,GAAG;AACxC,QAAI,CAAC,KAAK,KAAK,EAAG;AAClB,UAAM,OAAO,KAAK,MAAM,GAAG,CAAC;AAC5B,UAAM,UAAU,KAAK,MAAM,CAAC,EAAE,KAAK;AACnC,UAAM,QAAQ,QAAQ,SAAS,MAAM,IAAI,QAAQ,MAAM,MAAM,IAAI,CAAC,OAAO;AAEzE,eAAW,KAAK,MAAM,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,OAAO,OAAO,GAAG;AAClE,iBAAW,IAAI,CAAC;AAChB,UAAI,cAAc,IAAI,IAAI,GAAG;AAC3B,wBAAgB,IAAI,CAAC;MACvB;IACF;EACF;AAEA,SAAO;IACL,YAAY,CAAC,GAAG,UAAU,EAAE,KAAK;IACjC,iBAAiB,CAAC,GAAG,eAAe,EAAE,KAAK;EAC7C;AACF;AAEA,eAAe,iBAAiB,SAA8C;AAC5E,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,CAAC,UAAU,gBAAgB,GAAG,EAAE,KAAK,SAAS,OAAO,MAAM,CAAC;AAC5F,QAAM,SAAS,OAAO,KAAK;AAC3B,MAAI,QAAQ;AACV,WAAO;EACT;AAEA,QAAM,EAAE,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,aAAa,WAAW,MAAM,GAAG;IACrE,KAAK;IACL,OAAO;EACT,CAAC;AACD,SAAO,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,CAAC,KAAK;AAC7C;AAEA,eAAe,qBACb,SACA,QAC6B;AAC7B,MAAI,QAAQ,QAAQ;AAClB,WAAO,oCAAoC,SAAS,MAAM;EAC5D;AAEA,QAAM,EAAE,QAAQ,SAAS,IAAI,MAAM;IACjC,CAAC,aAAa,gBAAgB,wBAAwB,aAAa;IACnE,EAAE,KAAK,SAAS,OAAO,MAAM;EAC/B;AACA,QAAM,cAAc,SAAS,KAAK;AAClC,MAAI,eAAe,CAAC,YAAY,SAAS,QAAQ,GAAG;AAClD,WAAO;EACT;AAEA,QAAM,aAAa,MAAM,qBAAqB,OAAO;AACrD,QAAM,WAAW,GAAG,QAAQ,UAAU,QAAQ,IAAI,UAAU;AAC5D,QAAM,EAAE,QAAQ,YAAY,IAAI,MAAM,OAAO,CAAC,aAAa,YAAY,QAAQ,GAAG;IAChF,KAAK;IACL,OAAO;EACT,CAAC;AACD,SAAO,YAAY,KAAK,IAAI,WAAW;AACzC;AAEA,eAAe,eACb,SACA,UAC8C;AAC9C,MAAI,CAAC,UAAU;AACb,WAAO,CAAC;EACV;AAEA,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,CAAC,YAAY,gBAAgB,WAAW,UAAU,QAAQ,EAAE,GAAG;IAC7F,KAAK;IACL,OAAO;EACT,CAAC;AACD,QAAM,CAAC,WAAW,UAAU,IAAI,OAAO,KAAK,EAAE,MAAM,KAAK;AACzD,QAAM,QAAQ,OAAO,SAAS,aAAa,IAAI,EAAE;AACjD,QAAM,SAAS,OAAO,SAAS,cAAc,IAAI,EAAE;AAEnD,SAAO;IACL,GAAI,OAAO,SAAS,KAAK,KAAK,EAAE,MAAM;IACtC,GAAI,OAAO,SAAS,MAAM,KAAK,EAAE,OAAO;EAC1C;AACF;AAEA,eAAe,sBACb,SACA,SACA,UAC8C;AAC9C,QAAM,EAAE,OAAO,IAAI,MAAM;IACvB,CAAC,YAAY,gBAAgB,WAAW,GAAG,OAAO,MAAM,QAAQ,EAAE;IAClE;MACE,KAAK;MACL,OAAO;IACT;EACF;AACA,QAAM,CAAC,WAAW,UAAU,IAAI,OAAO,KAAK,EAAE,MAAM,KAAK;AACzD,QAAM,QAAQ,OAAO,SAAS,aAAa,IAAI,EAAE;AACjD,QAAM,SAAS,OAAO,SAAS,cAAc,IAAI,EAAE;AAEnD,SAAO;IACL,GAAI,OAAO,SAAS,KAAK,KAAK,EAAE,MAAM;IACtC,GAAI,OAAO,SAAS,MAAM,KAAK,EAAE,OAAO;EAC1C;AACF;AAEA,eAAe,YACb,SACA,KACA,SAC6B;AAC7B,MAAI,CAAC,KAAK;AACR,WAAO;EACT;AACA,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,CAAC,QAAQ,GAAG,GAAG,IAAI,OAAO,EAAE,GAAG;IAC7D,KAAK;IACL,OAAO;EACT,CAAC;AACD,SAAO,OAAO,SAAS,IAAI,SAAS;AACtC;AAEA,eAAe,mCACb,SACA,QAC8D;AAC9D,QAAM,EAAE,QAAQ,UAAU,IAAI,MAAM;IAClC,CAAC,UAAU,kBAAkB,uBAAuB;IACpD;MACE,KAAK;MACL,OAAO;IACT;EACF;AACA,QAAM,SAAS,uBAAuB,SAAS;AAC/C,QAAM,iBAAiB,OAAO,WAAW,OAAO,qBAAqB;AACrE,QAAM,kBAAkB,OAAO,gBAAgB,OAAO,qBAAqB;AAC3E,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO,EAAE,YAAY,CAAC,GAAG,gBAAgB;EAC3C;AAEA,QAAM,WAAW,cAAc,OAAO,MAAM;AAC5C,QAAM,YAAY,gBAAgB,OAAO,QAAQ,OAAO,MAAM;AAC9D,QAAM,gBAAiB,MAAM,aAAa,SAAS,QAAQ,IACvD,WACC,MAAM,aAAa,SAAS,SAAS,IACpC,YACA;AACN,QAAM,aAAuB,CAAC;AAE9B,aAAW,WAAW,gBAAgB;AACpC,UAAM,eAAeA,MAAK,KAAK,SAAS,GAAG,QAAQ,MAAM,GAAG,CAAC;AAC7D,QAAI,CAAC,WAAW,YAAY,GAAG;AAC7B,UAAK,MAAM,YAAY,SAAS,eAAe,OAAO,MAAO,QAAW;AACtE,mBAAW,KAAK,OAAO;MACzB;AACA;IACF;AAEA,UAAM,eAAeC,cAAa,cAAc,MAAM;AACtD,UAAM,gBAAgB,MAAM,YAAY,SAAS,eAAe,OAAO;AACvE,QAAI,kBAAkB,UAAa,iBAAiB,eAAe;AACjE,iBAAW,KAAK,OAAO;IACzB;EACF;AAEA,SAAO,EAAE,YAAY,WAAW,KAAK,GAAG,gBAAgB;AAC1D;AAEA,eAAe,+BACb,SACA,QACmC;AACnC,MAAI,CAAC,OAAO,QAAQ;AAClB,WAAO;MACL,YAAY;MACZ,YAAY,CAAC;MACb,iBAAiB,CAAC;IACpB;EACF;AACA,QAAM,WAAW,cAAc,OAAO,MAAM;AAC5C,QAAM,WAAW,gBAAgB,OAAO,QAAQ,OAAO,MAAM;AAC7D,QAAM,cAAc,MAAM,aAAa,SAAS,QAAQ;AACxD,QAAM,eAAe,MAAM,aAAa,SAAS,QAAQ;AACzD,QAAM,WAAW,MAAM,mCAAmC,SAAS;IACjE,GAAG;IACH,QAAQ,OAAO;EACjB,CAAC;AACD,QAAM,EAAE,QAAQ,GAAG,SAAS,EAAE,IAC5B,eAAe,eACX,MAAM,sBAAsB,SAAS,UAAU,QAAQ,IACvD;IACE,OAAO,eAAe,CAAC,eAAe,IAAI;IAC1C,QAAQ,CAAC,eAAe,eAAe,IAAI;EAC7C;AAEN,MAAI,aAAoC;AACxC,MAAI,SAAS,gBAAgB,SAAS,GAAG;AACvC,iBAAa;EACf,WAAW,SAAS,WAAW,SAAS,GAAG;AACzC,iBAAa;EACf,WAAW,QAAQ,KAAK,SAAS,GAAG;AAClC,iBAAa;EACf,WAAW,SAAS,GAAG;AACrB,iBAAa;EACf,WAAW,QAAQ,GAAG;AACpB,iBAAa;EACf;AAEA,SAAO;IACL;IACA,QAAQ,OAAO;IACf,GAAI,gBAAgB,EAAE,SAAS;IAC/B;IACA;IACA,YAAY,SAAS;IACrB,iBAAiB,SAAS;EAC5B;AACF;AAEA,eAAe,4BACb,SACA,YACA,UACe;AACf,QAAM,6BAA6B,SAAS,WAAW,MAAM;AAC7D,QAAM,iCAAiC,SAAS,UAAU;AAE1D,QAAM,WAAW,cAAc,WAAW,MAAM;AAChD,QAAM,cAAc,MAAM,aAAa,SAAS,QAAQ;AACxD,QAAM,aAAa,CAAC,cAAc,UAAU,QAAQ;AACpD,MAAI,aAAa;AACf,UAAM,EAAE,QAAQ,SAAS,IAAI,MAAM,OAAO,CAAC,aAAa,QAAQ,GAAG,EAAE,KAAK,QAAQ,CAAC;AACnF,eAAW,KAAK,SAAS,KAAK,CAAC;EACjC;AACA,QAAM,OAAO,YAAY,EAAE,KAAK,QAAQ,CAAC;AACzC,QAAM,OAAO,CAAC,UAAU,qBAAqB,UAAU,WAAW,MAAM,GAAG;IACzE,KAAK;IACL,OAAO;EACT,CAAC;AACH;AAEA,eAAe,6BACb,SACA,YACA,YACA,UACmB;AACnB,QAAM,iBAAiB,CAAC,GAAG,IAAI,IAAI,WAAW,OAAO,qBAAqB,CAAC,CAAC,EAAE,KAAK;AACnF,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO,CAAC;EACV;AAEA,QAAM,WAAW,cAAc,WAAW,MAAM;AAChD,QAAM,cAAc,MAAM,aAAa,SAAS,QAAQ;AACxD,MAAI;AACJ,MAAI,aAAa;AACf,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,CAAC,QAAQ,eAAe,GAAG,QAAQ,KAAK,QAAQ,EAAE,GAAG;MACnF,KAAK;MACL,OAAO;IACT,CAAC;AACD,mBAAe,OACZ,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO,EACd,OAAO,qBAAqB,EAC5B,KAAK;EACV,OAAO;AACL,mBAAe,CAAC;AAChB,eAAW,aAAa,gBAAgB;AACtC,UAAK,MAAM,YAAY,SAAS,UAAU,SAAS,MAAO,QAAW;AACnE,qBAAa,KAAK,SAAS;MAC7B;IACF;EACF;AAEA,QAAM,WAAW,IAAI,IAAI,cAAc;AACvC,SAAO,CAAC,GAAG,IAAI,IAAI,aAAa,OAAO,CAAC,gBAAgB,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK;AAC5F;AAEA,eAAe,yBAAyB,SAAmC;AACzE,QAAM,UAAU,CAAC,cAAc,oBAAoB,eAAe,aAAa;AAC/E,aAAW,UAAU,SAAS;AAC5B,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,CAAC,aAAa,cAAc,MAAM,GAAG;MACnE,KAAK;MACL,OAAO;IACT,CAAC;AACD,UAAM,aAAa,OAAO,KAAK;AAC/B,UAAM,qBAAqBD,MAAK,WAAW,UAAU,IACjD,aACAA,MAAK,KAAK,SAAS,UAAU;AACjC,QAAI,cAAc,WAAW,kBAAkB,GAAG;AAChD,aAAO;IACT;EACF;AACA,SAAO;AACT;AAEA,eAAe,oBACb,SACA,UAC6B;AAC7B,QAAM,YAAsB,CAAC;AAC7B,aAAW,QAAQ;IACjB,CAAC,QAAQ,QAAQ;IACjB,CAAC,QAAQ,YAAY,QAAQ;IAC7B,GAAI,WAAY,CAAC,CAAC,QAAQ,UAAU,GAAG,QAAQ,QAAQ,CAAC,IAAmB,CAAC;EAC9E,GAAG;AACD,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,MAAM,EAAE,KAAK,SAAS,OAAO,MAAM,CAAC;AACpE,UAAM,UAAU,OAAO,KAAK;AAC5B,QAAI,SAAS;AACX,gBAAU,KAAK,OAAO;IACxB;EACF;AAEA,SAAO,UAAU,SAAS,IAAI,UAAU,KAAK,IAAI,IAAI;AACvD;AAEA,eAAe,sBACb,SACA,QACmC;AACnC,QAAM,SAAS,MAAM,iBAAiB,OAAO;AAC7C,QAAM,WAAW,MAAM,qBAAqB,SAAS,MAAM;AAC3D,QAAM,EAAE,QAAQ,UAAU,IAAI,MAAM;IAClC,CAAC,UAAU,kBAAkB,uBAAuB;IACpD;MACE,KAAK;MACL,OAAO;IACT;EACF;AACA,QAAM,EAAE,QAAQ,YAAY,IAAI,MAAM,OAAO,CAAC,UAAU,WAAW,UAAU,GAAG;IAC9E,KAAK;IACL,OAAO;EACT,CAAC;AACD,QAAM,EAAE,YAAY,eAAe,gBAAgB,IAAI,uBAAuB,SAAS;AACvF,QAAM,aAAa,cAAc,OAAO,qBAAqB;AAC7D,QAAM,EAAE,QAAQ,GAAG,SAAS,EAAE,IAAI,MAAM,eAAe,SAAS,QAAQ;AACxE,QAAM,qBAAqB,MAAM,yBAAyB,OAAO;AAEjE,MAAI,aAAoC;AACxC,MAAI,gBAAgB,SAAS,KAAK,oBAAoB;AACpD,iBAAa;EACf,WAAW,WAAW,SAAS,GAAG;AAChC,iBAAa;EACf,WAAW,QAAQ,KAAK,SAAS,GAAG;AAClC,iBAAa;EACf,WAAW,SAAS,GAAG;AACrB,iBAAa;EACf,WAAW,QAAQ,GAAG;AACpB,iBAAa;EACf;AAEA,SAAO;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA,WAAW,YAAY,KAAK,KAAK;IACjC,gBAAgB,MAAM,oBAAoB,SAAS,QAAQ;EAC7D;AACF;AAEA,SAAS,kBACP,QACA,YACmB;AACnB,SAAO;IACL,GAAG;IACH,aAAa,WAAW;IACxB,QAAQ,WAAW;IACnB,UAAU,WAAW;IACrB,OAAO,WAAW;IAClB,QAAQ,WAAW;IACnB,aAAa,WAAW;IACxB,kBAAkB,WAAW;IAC7B,YAAY,WAAW;IACvB,kBAAkB,WAAW;IAC7B,YAAY,0BAA0B,QAAQ,UAAU;EAC1D;AACF;AAEA,SAAS,0BACP,QACA,YACoB;AACpB,MAAI,WAAW,eAAe,cAAc;AAC1C,WAAO;EACT;AAEA,MAAI,WAAW,eAAe,YAAY;AACxC,WAAO;EACT;AAEA,MAAI,WAAW,eAAe,SAAS;AACrC,QAAI,OAAO,cAAc,OAAO;AAC9B,aAAO;IACT;EACF;AAEA,SAAO;AACT;AAyBA,IAAM,iCAAN,cAA6C,MAAM;EACjD,YAAqB,QAAiC;AACpD,UAAM,OAAO,gBAAgB,8BAA8B;AADxC,SAAA,SAAA;AAEnB,SAAK,OAAO;EACd;AACF;AAEA,SAAS,kBACP,SAYA;AACA,MAAI,CAAC,SAAS;AACZ,WAAO,CAAC;EACV;AACA,SAAO;IACL,sBAAsB,QAAQ;IAC9B,eAAe,QAAQ;IACvB,GAAI,QAAQ,iBAAiB,UAAa,EAAE,eAAe,QAAQ,aAAa;IAChF,GAAI,QAAQ,gBAAgB,UAAa,EAAE,cAAc,QAAQ,YAAY;IAC7E,GAAI,QAAQ,cAAc,UAAa,EAAE,YAAY,QAAQ,UAAU;IACvE,GAAI,QAAQ,iBAAiB,UAAa,EAAE,eAAe,QAAQ,aAAa;IAChF,GAAI,QAAQ,yBAAyB,UAAa;MAChD,wBAAwB,QAAQ;IAClC;IACA,GAAI,QAAQ,sBAAsB,UAAa;MAC7C,qBAAqB,QAAQ;IAC/B;IACA,GAAI,QAAQ,gBAAgB,UAAa,EAAE,cAAc,QAAQ,YAAY;EAC/E;AACF;AAEA,SAAS,kBACP,QACA,aACA,OAMmB;AACnB,SAAO;IACL,GAAG;IACH,GAAG,kBAAkB,OAAO,WAAW;IACvC,SAAS;IACT,cAAc;IACd,GAAI,OAAO,kBAAkB,UAAa,EAAE,gBAAgB,MAAM,cAAc;IAChF,GAAI,OAAO,kBAAkB,UAAa,EAAE,gBAAgB,MAAM,cAAc;IAChF,GAAI,OAAO,kBAAkB,UAAa,EAAE,gBAAgB,MAAM,cAAc;EAClF;AACF;AAEA,SAAS,uBACP,QACA,aACA,SACA,OAKmB;AACnB,SAAO;IACL;MACE,GAAG;MACH,aAAa;IACf;IACA;IACA;MACE,GAAG;MACH,aAAa;IACf;EACF;AACF;AAEA,SAAS,gBACP,QACA,OAMmB;AACnB,SAAO;IACL,GAAG;IACH,GAAG,kBAAkB,MAAM,WAAW;IACtC,SAAS;IACT,gBAAgB,MAAM;IACtB,gBAAgB,MAAM;IACtB,gBAAgB,MAAM;EACxB;AACF;AAEA,SAAS,sBAAsB,GAAoB;AACjD,SAAO,0BAA0B,KAAK,CAAC,QAAQ,MAAM,OAAO,EAAE,WAAW,GAAG,GAAG,GAAG,CAAC;AACrF;AAKA,eAAe,2BAA2B,SAAoC;AAC5E,QAAM,UAAoB,CAAC;AAC3B,aAAW,OAAO,2BAA2B;AAC3C,QAAI,WAAWA,MAAK,KAAK,SAAS,GAAG,CAAC,GAAG;AACvC,cAAQ,KAAK,GAAG;AAChB;IACF;AACA,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,CAAC,YAAY,MAAM,GAAG,GAAG,EAAE,KAAK,SAAS,OAAO,MAAM,CAAC;AACvF,QAAI,OAAO,KAAK,EAAE,SAAS,GAAG;AAC5B,cAAQ,KAAK,GAAG;IAClB;EACF;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAAmC;AAClE,SAAO,MAAM,SAAS,KAAK,MAAM,MAAM,qBAAqB;AAC9D;AAEA,eAAe,cACb,SACA,UACA,SAAS,QACmB;AAC5B,MAAI,CAAC,UAAU;AACb,WAAO,CAAC;EACV;AACA,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,CAAC,QAAQ,eAAe,GAAG,QAAQ,KAAK,MAAM,EAAE,GAAG;IACjF,KAAK;IACL,OAAO;EACT,CAAC;AACD,SAAO,OACJ,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO,EACd,KAAK;AACV;AAEA,SAAS,oBACP,UACA,YACA,SAAS,UACD;AACR,QAAM,SAAS,GAAG,MAAM;AACxB,SAAO,UAAU,WAAW,MAAM,IAAI,SAAS,MAAM,OAAO,MAAM,IAAI;AACxE;AAEA,SAAS,sBAAsB,OAAO,oBAAI,KAAK,GAAW;AACxD,QAAM,MAAM,CAAC,UAAkB,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG;AAC5D,SAAO,GAAG,KAAK,eAAe,CAAC,GAAG,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,WAAW,CAAC,CAAC,IAAI;IACxF,KAAK,YAAY;EACnB,CAAC,GAAG,IAAI,KAAK,cAAc,CAAC,CAAC,GAAG,IAAI,KAAK,cAAc,CAAC,CAAC;AAC3D;AAEA,SAAS,0BAA0B,QAAwB;AACzD,SACE,OACG,KAAK,EACL,QAAQ,qBAAqB,GAAG,EAChC,QAAQ,YAAY,EAAE,KAAK;AAElC;AAEA,SAAS,sBAAsB,cAAsB,cAA8B;AACjF,SAAO,kBAAkB,sBAAsB,CAAC,IAAI;IAClD;EACF,CAAC,IAAI,aAAa,MAAM,GAAG,CAAC,CAAC;AAC/B;AAEA,eAAe,aAAa,SAAiB,KAAsD;AACjG,MAAI,CAAC,KAAK;AACR,WAAO;EACT;AACA,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,CAAC,aAAa,YAAY,GAAG,GAAG,WAAW,GAAG;IAC5E,KAAK;IACL,OAAO;EACT,CAAC;AACD,QAAM,MAAM,OAAO,KAAK;AACxB,SAAO,IAAI,SAAS,IAAI,MAAM;AAChC;AAEA,SAAS,0BAA0B,OAAyB;AAC1D,QAAM,OAAO,aAAa,KAAK;AAC/B,SACE,KAAK,SAAS,kBAAkB,KAChC,KAAK,SAAS,aAAa,KAC3B,KAAK,SAAS,0BAA0B,KACxC,KAAK,SAAS,0BAA0B,KACxC,KAAK,SAAS,YAAY;AAE9B;AAEA,SAAS,eAAe,KAAiC;AACvD,SAAO,MAAM,IAAI,MAAM,GAAG,EAAE,IAAI;AAClC;AAEA,SAAS,+BAA+B,SAA2C;AACjF,SAAO,mCAAmC,QAAQ,YAAY,YAAY;IACxE,QAAQ;EACV,CAAC,WAAW,eAAe,QAAQ,WAAW,CAAC;AACjD;AAEA,eAAe,gCAAgC,QAKT;AACpC,QAAM,iBAAiB,OAAO,SAAS,OAAO,WAAW,QAAQ,OAAO,YAAY;AACpF,QAAM,YAAY,gBAAgB,OAAO,cAAc,OAAO,WAAW,MAAM;AAC/E,QAAM,eAAe,MAAM,aAAa,OAAO,SAAS,SAAS;AACjE,QAAM,cAAc,MAAM,aAAa,OAAO,SAAS,OAAO,SAAS;AACvE,QAAM,cAAwC;IAC5C,oBAAoB,OAAO,WAAW;IACtC,cAAc,OAAO;IACrB,GAAI,iBAAiB,UAAa;MAChC;MACA,sBAAsB;MACtB,aAAa;IACf;IACA,GAAI,gBAAgB,UAAa,EAAE,YAAY;EACjD;AAEA,MAAI,CAAC,cAAc;AACjB,WAAO;MACL,SAAS;MACT,aAAa,mCAAmC,OAAO,YAAY;MACnE,SAAS;IACX;EACF;AAEA,MAAI,OAAO,WAAW,yBAAyB,SAAS;AACtD,WAAO;MACL,SAAS;MACT,aAAa,+BAA+B,WAAW;MACvD,SAAS;IACX;EACF;AAEA,QAAM,YAAY,sBAAsB,OAAO,cAAc,YAAY;AACzE,QAAM,gBAA0C;IAC9C,GAAG;IACH;IACA,cAAc;EAChB;AAEA,MAAI;AACF,UAAM,6BAA6B,OAAO,SAAS,SAAS;AAC5D,UAAM;MACJ,CAAC,QAAQ,eAAe,OAAO,WAAW,QAAQ,GAAG,YAAY,eAAe,SAAS,EAAE;MAC3F,EAAE,KAAK,OAAO,QAAQ;IACxB;EACF,SAAS,OAAO;AACd,WAAO;MACL,SAAS;MACT,aAAa,6CAA6C,OAAO,YAAY,OAAO;QAClF;MACF,CAAC,KAAK,iBAAiB,KAAK,CAAC;MAC7B,SAAS;IACX;EACF;AAEA,MAAI;AACF,UAAM;MACJ;QACE;QACA;QACA,iCAAiC,OAAO,YAAY,IAAI,YAAY;QACpE,OAAO,WAAW;QAClB,GAAG,OAAO,SAAS,eAAe,OAAO,YAAY;MACvD;MACA,EAAE,KAAK,OAAO,QAAQ;IACxB;EACF,SAAS,OAAO;AACd,WAAO;MACL,SAAS;MACT,aAAa,8CAA8C,OAAO,YAAY,iCAAiC,SAAS,2BAA2B;QACjJ;MACF,CAAC,KAAK,iBAAiB,KAAK,CAAC;MAC7B,SAAS;IACX;EACF;AAEA,SAAO;IACL,SAAS;IACT,SAAS;MACP,GAAG;MACH,GAAI,gBAAgB,UAAa,EAAE,mBAAmB,YAAY;IACpE;EACF;AACF;AAEA,eAAe,qBACb,YACA,SAC4B;AAC5B,SAAO;IACL,qBAAqB,UAAU;IAC/B,MAAM,sBAAsB,SAAS,UAAU;EACjD;AACF;AAEA,eAAsB,yBAAyB,QAAoD;AACjG,QAAM,aAAa,qBAAqB,MAAM;AAC9C,MAAI,CAAC,QAAQ;AACX,WAAO;EACT;AAEA,QAAM,aAAa,uBAAuB,MAAM;AAChD,MAAI,uBAAuB,IAAI,WAAW,IAAI,GAAG;AAC/C,WAAO;MACL,GAAG;MACH,aAAa;IACf;EACF;AAEA,MAAI,CAAC,WAAW,WAAW,IAAI,KAAK,CAAE,MAAM,gBAAgB,WAAW,IAAI,GAAI;AAC7E,WAAO;MACL,GAAG;MACH,aAAa;IACf;EACF;AAEA,MAAI;AACF,UAAM,wBAAwB,WAAW,MAAM,UAAU;AACzD,QAAI,0BAA0B,UAAU,GAAG;AACzC,YAAM,iBAAiB,WAAW,MAAM,WAAW,QAAQ,WAAW,MAAM,EAAE;QAC5E,MAAM;MACR;AACA,aAAO;QACL;QACA,MAAM,+BAA+B,WAAW,MAAM,UAAU;MAClE;IACF;AACA,QAAI,WAAW,QAAQ;AACrB,YAAM,iBAAiB,WAAW,MAAM,WAAW,QAAQ,WAAW,MAAM,EAAE;QAC5E,MAAM;MACR;AACA,YAAM,gCAAgC,WAAW,MAAM,UAAU;IACnE;AACA,WAAO,kBAAkB,YAAY,MAAM,sBAAsB,WAAW,MAAM,UAAU,CAAC;EAC/F,SAAS,OAAO;AACd,WAAO;MACL,GAAG;MACH,GAAI,WAAW,SAAS,EAAE,WAAW,MAAM,IAAI,CAAC;MAChD,aAAa;MACb,YAAY,iBAAiB,KAAK;IACpC;EACF;AACF;AAEA,eAAsB,gBAAgB,QAAmD;AACvF,QAAM,aAAa,uBAAuB,MAAM;AAEhD,MAAI;AACF,UAAM,UAAU,MAAM,uBAAuB,UAAU;AACvD,UAAM,iBAAiB,SAAS,WAAW,QAAQ,WAAW,MAAM;AACpE,QAAI,CAAC,0BAA0B,UAAU,GAAG;AAC1C,YAAM,gCAAgC,SAAS,UAAU;IAC3D;AACA,qBAAiB,YAAY;MAC3B,iBAAgB,oBAAI,KAAK,GAAE,YAAY;MACvC,YAAY;IACd,CAAC;EACH,SAAS,OAAO;AACd,qBAAiB,YAAY;MAC3B,YAAY,4BAA4B,KAAK,EAAE;IACjD,CAAC;AACD,UAAM,4BAA4B,KAAK;EACzC;AAEA,SAAO,qBAAqB,UAAU;AACxC;AAEA,SAAS,iBAAiB,OAAwB;AAChD,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;AAEA,eAAsB,0BAA0B,QAAmD;AACjG,QAAM,aAAa,uBAAuB,MAAM;AAChD,QAAM,UAAU,WAAW;AAC3B,MAAI,uBAAuB,IAAI,OAAO,GAAG;AACvC,WAAO;MACL,GAAI,MAAM,yBAAyB,UAAU;MAC7C,aAAa;MACb,SAAS;MACT,cAAc;IAChB;EACF;AAEA,yBAAuB,IAAI,OAAO;AAClC,MAAI,gBAAgB;AACpB,MAAI,gBAAgB;AACpB,MAAI,gBAAgB;AACpB,MAAI;AAEJ,MAAI;AACF,UAAM,UAAU,MAAM,uBAAuB,UAAU;AACvD,QAAI,0BAA0B,UAAU,GAAG;AACzC,UAAI;AACF,cAAM,iBAAiB,SAAS,WAAW,QAAQ,WAAW,MAAM;MACtE,SAAS,OAAO;AACd,YAAI,WAAW,cAAc;AAC3B,gBAAM;QACR;MACF;AACA,UAAIa,cAAa,MAAM,+BAA+B,SAAS,UAAU;AACzE,YAAM,iCAAiC,YAAoD;AACzF,aAAKA,YAAW,UAAU,MAAM,MAAMA,YAAW,SAAS,KAAK,GAAG;AAChE,iBAAO;QACT;AAEA,YAAI,CAACA,YAAW,UAAU;AACxB,gBAAMC,UAAS,kBAAkB,qBAAqB,UAAU,GAAGD,WAAU;AAC7E,2BAAiB,YAAY;YAC3B,YAAY;UACd,CAAC;AACD,iBAAO,kBAAkBC,SAAQ,oDAAoD;YACnF;YACA;YACA;UACF,CAAC;QACH;AAEA,YAAI,CAAC,WAAW,QAAQ;AACtB,iBAAO;QACT;AAEA,YAAI;AACF,gBAAM;YACJ;YACA,EAAE,GAAG,YAAY,QAAQ,WAAW,OAAO;YAC3CD,YAAW;UACb;AACA,0BAAgB;AAChBA,wBAAa,MAAM,+BAA+B,SAAS,UAAU;AACrE,iBAAO;QACT,SAAS,OAAO;AACdA,wBAAa,MAAM,+BAA+B,SAAS,UAAU;AACrE,gBAAMC,UAAS,kBAAkB,qBAAqB,UAAU,GAAGD,WAAU;AAC7E,gBAAM,SAAS,6CAA6C,iBAAiB,KAAK,CAAC;AACnF,2BAAiB,YAAY,EAAE,YAAY,OAAO,CAAC;AACnD,iBAAO,kBAAkBC,SAAQ,QAAQ;YACvC;YACA;YACA;UACF,CAAC;QACH;MACF;AAEA,UAAID,YAAW,eAAe,cAAc;AAC1C,cAAMC,UAAS,kBAAkB,qBAAqB,UAAU,GAAGD,WAAU;AAC7E,yBAAiB,YAAY;UAC3B,YAAY;QACd,CAAC;AACD,eAAO,kBAAkBC,SAAQ,6CAA6C;UAC5E;UACA;UACA;QACF,CAAC;MACH;AAEA,WAAKD,YAAW,SAAS,KAAK,MAAMA,YAAW,UAAU,KAAK,GAAG;AAC/D,cAAMC,UAAS,kBAAkB,qBAAqB,UAAU,GAAGD,WAAU;AAC7E,YAAI,CAAC,WAAW,QAAQ;AACtB,2BAAiB,YAAY;YAC3B,YAAY;UACd,CAAC;AACD,iBAAO;YACLC;YACA;YACA;cACE;cACA;cACA;YACF;UACF;QACF;AACA,cAAM,WAAW,cAAc,WAAW,MAAM;AAChD,cAAM,aAAa,MAAM,cAAc,SAASD,YAAW,UAAU,QAAQ;AAC7E,YAAI,CAACA,YAAW,YAAY,CAAC,wBAAwB,UAAU,GAAG;AAChE,gBAAM,SAAS,CAACA,YAAW,WACvB,mDACA;AACJ,2BAAiB,YAAY,EAAE,YAAY,OAAO,CAAC;AACnD,iBAAO,kBAAkBC,SAAQ,QAAQ;YACvC;YACA;YACA;UACF,CAAC;QACH;AACA,cAAM,UAAU,MAAM,gCAAgC;UACpD,YAAY,EAAE,GAAG,YAAY,QAAQ,WAAW,OAAO;UACvD;UACA,cAAc,WAAW;UACzB,WAAW;QACb,CAAC;AACD,sBAAc,QAAQ;AACtB,YAAI,QAAQ,SAAS;AACnB,2BAAiB,YAAY,EAAE,YAAY,QAAQ,YAAY,CAAC;AAChE,iBAAO,uBAAuBA,SAAQ,QAAQ,aAAa,QAAQ,SAAS;YAC1E;YACA;YACA;UACF,CAAC;QACH;AACA,wBAAgB;AAChB,cAAM,iBAAiB,SAAS,WAAW,QAAQ,WAAW,MAAM,EAAE;UACpE,MAAM;QACR;AACAD,sBAAa,MAAM,+BAA+B,SAAS,UAAU;MACvE;AAEA,UAAIA,YAAW,eAAe,SAAS;AACrC,YAAI,CAAC,WAAW,aAAa,CAAC,WAAW,cAAc;AACrD,gBAAMC,UAAS,kBAAkB,qBAAqB,UAAU,GAAGD,WAAU;AAC7E,2BAAiB,YAAY;YAC3B,YAAY;UACd,CAAC;AACD,iBAAO;YACLC;YACA;YACA;cACE;cACA;cACA;YACF;UACF;QACF;AAEA,aAAKD,YAAW,UAAU,KAAK,GAAG;AAChC,cAAIA,YAAW,YAAY,WAAW,QAAQ;AAC5C,kBAAM,oBAAoB,MAAM;cAC9B;cACA,EAAE,GAAG,YAAY,QAAQ,WAAW,OAAO;cAC3CA,YAAW;cACXA,YAAW;YACb;AACA,gBAAI,kBAAkB,SAAS,GAAG;AAChC,oBAAM,qBAA+C;gBACnD,GAAGA;gBACH,YAAY;gBACZ,iBAAiB;kBACf,GAAG,oBAAI,IAAI,CAAC,GAAGA,YAAW,iBAAiB,GAAG,iBAAiB,CAAC;gBAClE,EAAE,KAAK;cACT;AACA,oBAAMC,UAAS;gBACb,qBAAqB,UAAU;gBAC/B;cACF;AACA,oBAAM,SAAS,uEAAuE,kBAAkB,KAAK,IAAI,CAAC;AAClH,+BAAiB,YAAY,EAAE,YAAY,OAAO,CAAC;AACnD,qBAAO,kBAAkBA,SAAQ,QAAQ;gBACvC;gBACA;gBACA;cACF,CAAC;YACH;UACF;AACA,gBAAM,gBAAgB,MAAM,+BAA+B;AAC3D,cAAI,eAAe;AACjB,mBAAO;UACT;QACF;AAEA,YAAI,WAAW,QAAQ;AACrB,0BAAgB,MAAM,iCAAiC;YACrD,YAAY,EAAE,GAAG,YAAY,QAAQ,WAAW,OAAO;YACvD;YACA,OAAOD,YAAW;YAClB,eAAe;UACjB,CAAC;AACDA,wBAAa,MAAM,+BAA+B,SAAS,UAAU;QACvE;MACF;AAEA,WAAKA,YAAW,UAAU,KAAK,MAAMA,YAAW,SAAS,OAAO,GAAG;AACjE,cAAM,gBAAgB,MAAM,+BAA+B;AAC3D,YAAI,eAAe;AACjB,iBAAO;QACT;MACF;AAEA,UAAI,WAAW,aAAa,WAAW,cAAc;AACnD,YAAI,WAAW,QAAQ;AACrB,gBAAM,WAAW,cAAc,WAAW,MAAM;AAChD,cAAI,MAAM,aAAa,SAAS,QAAQ,GAAG;AACzC,gBAAI;AACF,oBAAM;gBACJ;kBACE;kBACA;kBACA,WAAW;kBACX,GAAG,QAAQ,eAAe,WAAW,MAAM;gBAC7C;gBACA,EAAE,KAAK,QAAQ;cACjB;AACA,8BAAgB;AAChB,oBAAM,iBAAiB,SAAS,WAAW,QAAQ,WAAW,MAAM,EAAE;gBACpE,MAAM;cACR;YACF,SAAS,OAAO;AACd,kBAAI,0BAA0B,KAAK,GAAG;AACpC,sBAAM,UAAU,MAAM,gCAAgC;kBACpD,YAAY,EAAE,GAAG,YAAY,QAAQ,WAAW,OAAO;kBACvD;kBACA,cAAc,WAAW;kBACzB,WAAW;gBACb,CAAC;AACD,8BAAc,QAAQ;AACtB,oBAAI,CAAC,QAAQ,SAAS;AACpB,kCAAgB;AAChB,wBAAM,iBAAiB,SAAS,WAAW,QAAQ,WAAW,MAAM,EAAE;oBACpE,MAAM;kBACR;AACAA,gCAAa,MAAM,+BAA+B,SAAS,UAAU;gBACvE,OAAO;AACL,mCAAiB,YAAY,EAAE,YAAY,QAAQ,YAAY,CAAC;AAChE,wBAAMC,UAAS;oBACb,qBAAqB,UAAU;oBAC/B,MAAM,+BAA+B,SAAS,UAAU;kBAC1D;AACA,yBAAO,uBAAuBA,SAAQ,QAAQ,aAAa,QAAQ,SAAS;oBAC1E;oBACA;oBACA;kBACF,CAAC;gBACH;cACF,OAAO;AACL,iCAAiB,YAAY,EAAE,YAAY,iBAAiB,KAAK,EAAE,CAAC;AACpE,oBAAI,WAAW,cAAc;AAC3B,wBAAM;gBACR;AACA,sBAAMA,UAAS;kBACb,qBAAqB,UAAU;kBAC/B,MAAM,+BAA+B,SAAS,UAAU;gBAC1D;AACA,uBAAO;kBACLA;kBACA,mCAAmC,iBAAiB,KAAK,CAAC;kBAC1D;oBACE;oBACA;oBACA;kBACF;gBACF;cACF;YACF;UACF;QACF;MACF;AACA,uBAAiB,YAAY;QAC3B,iBAAgB,oBAAI,KAAK,GAAE,YAAY;QACvC,YAAY;MACd,CAAC;AACD,YAAM,SAAS;QACb,qBAAqB,UAAU;QAC/B,MAAM,+BAA+B,SAAS,UAAU;MAC1D;AACA,aAAO,gBAAgB,QAAQ,EAAE,eAAe,eAAe,eAAe,YAAY,CAAC;IAC7F;AACA,UAAM,iBAAiB,SAAS,WAAW,QAAQ,WAAW,MAAM;AACpE,UAAM,gCAAgC,SAAS,UAAU;AACzD,QAAI,aAAa,MAAM,sBAAsB,SAAS,UAAU;AAEhE,QAAI,WAAW,eAAe,cAAc;AAC1C,YAAM,SAAS,kBAAkB,qBAAqB,UAAU,GAAG,UAAU;AAC7E,uBAAiB,YAAY;QAC3B,YAAY;MACd,CAAC;AACD,aAAO,kBAAkB,QAAQ,6CAA6C;QAC5E;QACA;QACA;MACF,CAAC;IACH;AAEA,QAAI,WAAW,eAAe,SAAS;AACrC,UAAI,CAAC,WAAW,WAAW;AACzB,cAAM,SAAS,kBAAkB,qBAAqB,UAAU,GAAG,UAAU;AAC7E,yBAAiB,YAAY;UAC3B,YAAY;QACd,CAAC;AACD,eAAO;UACL;UACA;UACA;YACE;YACA;YACA;UACF;QACF;MACF;AAEA,WAAK,WAAW,UAAU,KAAK,GAAG;AAChC,YAAI,CAAC,WAAW,UAAU;AACxB,gBAAM,SAAS,kBAAkB,qBAAqB,UAAU,GAAG,UAAU;AAC7E,2BAAiB,YAAY;YAC3B,YAAY;UACd,CAAC;AACD,iBAAO,kBAAkB,QAAQ,oDAAoD;YACnF;YACA;YACA;UACF,CAAC;QACH;AAEA,YAAI;AACF,gBAAM,OAAO,CAAC,SAAS,aAAa,WAAW,QAAQ,GAAG,EAAE,KAAK,QAAQ,CAAC;AAC1E,0BAAgB;AAChB,uBAAa,MAAM,sBAAsB,SAAS,UAAU;QAC9D,SAAS,OAAO;AACd,uBAAa,MAAM,sBAAsB,SAAS,UAAU;AAC5D,gBAAM,SAAS,kBAAkB,qBAAqB,UAAU,GAAG,UAAU;AAC7E,gBAAM,SAAS,6CAA6C,iBAAiB,KAAK,CAAC;AACnF,2BAAiB,YAAY,EAAE,YAAY,OAAO,CAAC;AACnD,iBAAO,kBAAkB,QAAQ,QAAQ;YACvC;YACA;YACA;UACF,CAAC;QACH;MACF;AAEA,UAAI,WAAW,eAAe,SAAS;AACrC,cAAM,cAAc,MAAM,2BAA2B,OAAO;AAC5D,cAAM,OAAO,CAAC,OAAO,SAAS,MAAM,GAAG,WAAW,GAAG,EAAE,KAAK,QAAQ,CAAC;AACrE,cAAM;UACJ,CAAC,UAAU,MAAM,8CAA8C,MAAM,GAAG,WAAW;UACnF;YACE,KAAK;UACP;QACF;AACA,wBAAgB;AAChB,qBAAa,MAAM,sBAAsB,SAAS,UAAU;MAC9D;IACF;AAEA,QAAI,WAAW,eAAe,YAAY;AACxC,YAAM,SAAS,kBAAkB,qBAAqB,UAAU,GAAG,UAAU;AAC7E,YAAM,aAAa,MAAM,cAAc,SAAS,WAAW,QAAQ;AACnE,UAAI,CAAC,WAAW,YAAY,CAAC,wBAAwB,UAAU,GAAG;AAChE,cAAM,SAAS,CAAC,WAAW,WACvB,mDACA;AACJ,yBAAiB,YAAY,EAAE,YAAY,OAAO,CAAC;AACnD,eAAO,kBAAkB,QAAQ,QAAQ;UACvC;UACA;UACA;QACF,CAAC;MACH;AACA,YAAM,aAAa,WAAW,UAAW,MAAM,qBAAqB,OAAO;AAC3E,YAAM,eAAe,oBAAoB,WAAW,UAAU,YAAY,WAAW,MAAM;AAC3F,YAAM,UAAU,MAAM,gCAAgC;QACpD,YAAY,EAAE,GAAG,YAAY,QAAQ,aAAa;QAClD;QACA;QACA,WAAW;MACb,CAAC;AACD,oBAAc,QAAQ;AACtB,UAAI,QAAQ,SAAS;AACnB,yBAAiB,YAAY,EAAE,YAAY,QAAQ,YAAY,CAAC;AAChE,eAAO,uBAAuB,QAAQ,QAAQ,aAAa,QAAQ,SAAS;UAC1E;UACA;UACA;QACF,CAAC;MACH;AACA,sBAAgB;AAChB,YAAM,iBAAiB,SAAS,WAAW,QAAQ,WAAW,MAAM;AACpE,mBAAa,MAAM,sBAAsB,SAAS,UAAU;IAC9D;AAEA,SAAK,WAAW,UAAU,KAAK,MAAM,WAAW,SAAS,OAAO,GAAG;AACjE,UAAI,CAAC,WAAW,UAAU;AACxB,cAAM,SAAS,kBAAkB,qBAAqB,UAAU,GAAG,UAAU;AAC7E,yBAAiB,YAAY;UAC3B,YAAY;QACd,CAAC;AACD,eAAO,kBAAkB,QAAQ,oDAAoD;UACnF;UACA;UACA;QACF,CAAC;MACH;AAEA,UAAI;AACF,cAAM,OAAO,CAAC,SAAS,aAAa,WAAW,QAAQ,GAAG,EAAE,KAAK,QAAQ,CAAC;AAC1E,wBAAgB;AAChB,qBAAa,MAAM,sBAAsB,SAAS,UAAU;MAC9D,SAAS,OAAO;AACd,qBAAa,MAAM,sBAAsB,SAAS,UAAU;AAC5D,cAAM,SAAS,kBAAkB,qBAAqB,UAAU,GAAG,UAAU;AAC7E,cAAM,SAAS,6CAA6C,iBAAiB,KAAK,CAAC;AACnF,yBAAiB,YAAY,EAAE,YAAY,OAAO,CAAC;AACnD,eAAO,kBAAkB,QAAQ,QAAQ;UACvC;UACA;UACA;QACF,CAAC;MACH;IACF;AAEA,SAAK,WAAW,SAAS,KAAK,GAAG;AAC/B,UAAI,CAAC,WAAW,WAAW;AACzB,cAAM,SAAS,kBAAkB,qBAAqB,UAAU,GAAG,UAAU;AAC7E,eAAO,gBAAgB,QAAQ;UAC7B;UACA;UACA;QACF,CAAC;MACH;AAEA,YAAM,aAAa,MAAM,cAAc,SAAS,WAAW,QAAQ;AACnE,UAAI,CAAC,WAAW,YAAY,CAAC,wBAAwB,UAAU,GAAG;AAChE,cAAM,SAAS,kBAAkB,qBAAqB,UAAU,GAAG,UAAU;AAC7E,cAAM,SAAS,CAAC,WAAW,WACvB,mDACA;AACJ,yBAAiB,YAAY,EAAE,YAAY,OAAO,CAAC;AACnD,eAAO,kBAAkB,QAAQ,QAAQ;UACvC;UACA;UACA;QACF,CAAC;MACH;AAEA,YAAM,aAAa,WAAW,UAAW,MAAM,qBAAqB,OAAO;AAC3E,YAAM,eAAe,oBAAoB,WAAW,UAAU,YAAY,WAAW,MAAM;AAC3F,UAAI;AACF,cAAM,OAAO,CAAC,QAAQ,WAAW,QAAQ,QAAQ,YAAY,EAAE,GAAG,EAAE,KAAK,QAAQ,CAAC;AAClF,wBAAgB;AAChB,cAAM,iBAAiB,SAAS,WAAW,QAAQ,WAAW,MAAM;AACpE,qBAAa,MAAM,sBAAsB,SAAS,UAAU;MAC9D,SAAS,OAAO;AACd,YAAI,0BAA0B,KAAK,GAAG;AACpC,gBAAM,UAAU,MAAM,gCAAgC;YACpD,YAAY,EAAE,GAAG,YAAY,QAAQ,aAAa;YAClD;YACA;YACA,WAAW;UACb,CAAC;AACD,wBAAc,QAAQ;AACtB,cAAI,CAAC,QAAQ,SAAS;AACpB,4BAAgB;AAChB,kBAAM,iBAAiB,SAAS,WAAW,QAAQ,WAAW,MAAM;AACpE,yBAAa,MAAM,sBAAsB,SAAS,UAAU;UAC9D,OAAO;AACL,kBAAM,iBAAiB,SAAS,WAAW,QAAQ,WAAW,MAAM,EAAE;cACpE,MAAM;YACR;AACA,yBAAa,MAAM,sBAAsB,SAAS,UAAU;AAC5D,kBAAM,SAAS,kBAAkB,qBAAqB,UAAU,GAAG,UAAU;AAC7E,6BAAiB,YAAY,EAAE,YAAY,QAAQ,YAAY,CAAC;AAChE,mBAAO,uBAAuB,QAAQ,QAAQ,aAAa,QAAQ,SAAS;cAC1E;cACA;cACA;YACF,CAAC;UACH;QACF,OAAO;AACL,gBAAM,iBAAiB,SAAS,WAAW,QAAQ,WAAW,MAAM,EAAE;YACpE,MAAM;UACR;AACA,uBAAa,MAAM,sBAAsB,SAAS,UAAU;AAC5D,gBAAM,SAAS,kBAAkB,qBAAqB,UAAU,GAAG,UAAU;AAC7E,gBAAM,SAAS,mCAAmC,iBAAiB,KAAK,CAAC;AACzE,2BAAiB,YAAY,EAAE,YAAY,OAAO,CAAC;AACnD,iBAAO,kBAAkB,QAAQ,QAAQ;YACvC;YACA;YACA;UACF,CAAC;QACH;MACF;IACF;AAEA,qBAAiB,YAAY;MAC3B,iBAAgB,oBAAI,KAAK,GAAE,YAAY;MACvC,YAAY;IACd,CAAC;AAED,WAAO,gBAAgB,MAAM,qBAAqB,YAAY,OAAO,GAAG;MACtE;MACA;MACA;MACA;IACF,CAAC;EACH,SAAS,OAAO;AACd,qBAAiB,YAAY;MAC3B,YAAY,4BAA4B,KAAK,EAAE;IACjD,CAAC;AACD,UAAM,4BAA4B,KAAK;EACzC,UAAA;AACE,2BAAuB,OAAO,OAAO;EACvC;AACF;AAEA,eAAsB,0BACpB,QACA,YACsC;AACtC,QAAM,aAAa,uBAAuB,MAAM;AAChD,QAAM,UAAU,MAAM,uBAAuB,UAAU;AACvD,QAAM,aAAa,MAAM,qBAAqB,OAAO;AACrD,QAAM,iBAAiB,SAAS,WAAW,MAAM;AACjD,QAAM,OAAO,CAAC,YAAY,MAAM,YAAY,GAAG,WAAW,MAAM,IAAI,UAAU,EAAE,GAAG;IACjF,KAAK;EACP,CAAC;AACD,mBAAiB,YAAY,EAAE,YAAY,OAAU,CAAC;AACtD,SAAO;IACL;IACA;IACA;EACF;AACF;AAEA,eAAsB,yBACpB,QACA,YACoC;AACpC,QAAM,aAAa,uBAAuB,MAAM;AAChD,QAAM,WAAW,MAAM,uBAAuB,UAAU;AACxD,QAAM,aAAa,MAAM,qBAAqB,QAAQ;AACtD,QAAM,iBAAiB,UAAU,WAAW,MAAM;AAElD,QAAM,eAAe,MAAM,QAAQd,MAAK,KAAK,GAAG,OAAO,GAAG,sBAAsB,CAAC;AACjF,QAAM,cAAcA,MAAK,KAAK,cAAc,MAAM;AAClD,QAAM;IACJ,CAAC,YAAY,OAAO,MAAM,YAAY,aAAa,GAAG,WAAW,MAAM,IAAI,UAAU,EAAE;IACvF;MACE,KAAK;IACP;EACF;AAEA,SAAO;IACL;IACA;IACA,SAAS;IACT,SAAS,YAAY;AACnB,UAAI;AACF,cAAM,OAAO,CAAC,YAAY,UAAU,WAAW,WAAW,GAAG,EAAE,KAAK,SAAS,CAAC;MAChF,UAAA;AACE,cAAM,GAAG,cAAc,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;MAChF;IACF;EACF;AACF;AAEA,eAAsB,sBAAsB,QAI1B;AAChB,SAAO,OAAO,gBAAgB,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC9D,YAAUA,MAAK,QAAQ,OAAO,cAAc,GAAG,EAAE,WAAW,KAAK,CAAC;AAClE,QAAM,GAAG,OAAO,WAAW,OAAO,gBAAgB,EAAE,WAAW,KAAK,CAAC;AACvE;AAEO,SAAS,0BAA0B,QAA+B;AACvE,QAAM,aAAa,uBAAuB,MAAM;AAChD,SAAOA,MAAK,KAAK,WAAW,MAAM,wBAAwB;AAC5D;AAEA,eAAsB,mBAAmB,YAAqC;AAC5E,QAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,MAAI,MAAM,OAAO,GAAG;AAClB,WAAO,MAAM;EACf;AAEA,MAAI,QAAQ;AACZ,aAAW,SAAS,MAAM,QAAQ,YAAY,EAAE,eAAe,KAAK,CAAC,GAAG;AACtE,aAAS,MAAM,mBAAmBA,MAAK,KAAK,YAAY,MAAM,IAAI,CAAC;EACrE;AACA,SAAO;AACT;AAEA,eAAsB,2BAA2B,QAI5B;AACnB,QAAM,OAAO,CAAC,OAAO,OAAO,GAAG,EAAE,KAAK,OAAO,QAAQ,CAAC;AAEtD,QAAM,EAAE,QAAQ,WAAW,IAAI,MAAM,OAAO,CAAC,UAAU,aAAa,GAAG;IACrE,KAAK,OAAO;IACZ,OAAO;EACT,CAAC;AACD,MAAI,WAAW,KAAK,EAAE,WAAW,GAAG;AAClC,WAAO;EACT;AAEA,QAAM,iCAAiC,CAAC,UAAU,MAAM,OAAO,aAAa,GAAG;IAC7E,KAAK,OAAO;EACd,CAAC;AACD,QAAM,OAAO,CAAC,QAAQ,MAAM,UAAU,OAAO,UAAU,GAAG,EAAE,KAAK,OAAO,QAAQ,CAAC;AACjF,SAAO;AACT;AAEA,eAAsB,sBACpB,QACA,YACA,KACe;AACf,QAAM,aAAa,uBAAuB,MAAM;AAChD,QAAM,OAAO,CAAC,QAAQ,MAAM,WAAW,QAAQ,UAAU,GAAG;IAC1D,KAAK,OAAO,WAAW;EACzB,CAAC;AACD,mBAAiB,YAAY;IAC3B,iBAAgB,oBAAI,KAAK,GAAE,YAAY;IACvC,YAAY;EACd,CAAC;AACH;AAEA,eAAsB,qBAAqB,QAOvB;AAClB,QAAM,EAAE,OAAO,IAAI,MAAM;IACvB;MACE;MACA;MACA;MACA;MACA,OAAO;MACP;MACA,OAAO;MACP;MACA,OAAO;MACP;MACA,OAAO;MACP;MACA,OAAO;IACT;IACA,EAAE,KAAK,OAAO,QAAQ;EACxB;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,eAAe,mBACb,SACA,aACA,QACkB;AAClB,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,CAAC,YAAY,WAAW,GAAG,WAAW,gBAAgB,MAAM,EAAE,GAAG;IAC/F,KAAK;IACL,OAAO;EACT,CAAC;AACD,SAAO,OAAO,SAAS,OAAO,KAAK,GAAG,EAAE,IAAI;AAC9C;AAEA,eAAe,6BAA6B,SAAiB,QAA+B;AAC1F,MACE,OAAO,WAAW,KAClB,OAAO,SAAS,IAAI,KACpB,OAAO,WAAW,GAAG,KACrB,OAAO,SAAS,GAAG,KACnB,OAAO,SAAS,OAAO,KACvB,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,SAAS;AACzB,UAAM,OAAO,KAAK,WAAW,CAAC;AAC9B,WAAO,QAAQ,MAAM,SAAS;EAChC,CAAC,GACD;AACA,UAAM,IAAI,MAAM,gCAAgC,MAAM,EAAE;EAC1D;AACA,QAAM,OAAO,CAAC,oBAAoB,YAAY,MAAM,GAAG,EAAE,KAAK,QAAQ,CAAC;AACzE;AAEA,SAAS,yBAAyB,iBAAiC;AACjE,QAAM,aAAa,gBAAgB,MAAMA,MAAK,GAAG,EAAE,KAAK,GAAG;AAC3D,QAAM,WAAW,WAAW,MAAM,GAAG,EAAE,OAAO,OAAO;AACrD,MACE,SAAS,WAAW,KACpB,WAAW,WAAW,GAAG,KACzB,SAAS,KAAK,CAAC,YAAY,YAAY,IAAI,KAC3C,WAAW,MAAM,EAAE,EAAE,KAAK,CAAC,SAAS;AAClC,UAAM,OAAO,KAAK,WAAW,CAAC;AAC9B,WAAO,QAAQ,MAAM,SAAS;EAChC,CAAC,GACD;AACA,UAAM,IAAI,MAAM,qCAAqC,eAAe,EAAE;EACxE;AACA,SAAO,SAAS,KAAK,GAAG;AAC1B;AAEA,eAAe,gBAAgB,WAAsC;AACnE,QAAM,UAAoB,CAAC;AAC3B,iBAAe,MAAM,KAA4B;AAC/C,eAAW,SAAS,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAC/D,YAAM,eAAeA,MAAK,KAAK,KAAK,MAAM,IAAI;AAC9C,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,MAAM,YAAY;MAC1B,WAAW,MAAM,OAAO,KAAK,MAAM,eAAe,GAAG;AACnD,gBAAQ,KAAK,YAAY;MAC3B;IACF;EACF;AACA,QAAM,MAAM,SAAS;AACrB,UAAQ,KAAK;AACb,SAAO;AACT;AAaA,SAASe,UAAS,OAAkD;AAClE,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACrE;AAEA,SAAS,wBAAwB,QAA2C;AAC1E,MAAI,CAACA,UAAS,MAAM,KAAK,CAACA,UAAS,OAAO,iBAAiB,GAAG;AAC5D,WAAO,CAAC;EACV;AAEA,QAAM,WAAqC,CAAC;AAC5C,aAAW,WAAW,OAAO,OAAO,OAAO,iBAAiB,GAAG;AAC7D,QAAI,CAACA,UAAS,OAAO,GAAG;AACtB;IACF;AACA,QAAI,QAAQ,QAAQ,gCAAgC,OAAO,QAAQ,SAAS,UAAU;AACpF;IACF;AACA,aAAS,KAAK;MACZ,MAAM,QAAQ;MACd,GAAI,OAAO,QAAQ,WAAW,WAAW,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;MACvE,GAAI,OAAO,QAAQ,mBAAmB,WAClC,EAAE,eAAe,QAAQ,eAAe,IACxC,CAAC;IACP,CAAC;EACH;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,iBAAyB,aAA6B;AAChF,SAAOf,MAAK,MAAM;IAChB;IACA,yBAAyB,eAAe;IACxC,yBAAyB,WAAW;EACtC;AACF;AAEA,SAAS,+BAA+B,WAA6C;AACnF,QAAM,YAAYA,MAAK,KAAK,WAAWY,sBAAqB;AAC5D,MAAI,CAAC,WAAW,SAAS,GAAG;AAC1B,WAAO,CAAC;EACV;AAEA,QAAM,WAAqC,CAAC;AAC5C,aAAW,QAAQX,cAAa,WAAW,MAAM,EAAE,MAAM,OAAO,GAAG;AACjE,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,SAAS;AACZ;IACF;AACA,QAAI;AACF,eAAS,KAAK,GAAG,wBAAwB,KAAK,MAAM,OAAO,CAAC,CAAC;IAC/D,QAAQ;IAAC;EACX;AACA,SAAO;AACT;AAEA,SAAS,iCAAiC,WAAmB,aAA6B;AACxF,QAAM,wBAAwB,yBAAyB,WAAW;AAClE,QAAM,aAAaD,MAAK,QAAQ,SAAS;AACzC,QAAM,aAAaA,MAAK,QAAQ,YAAY,GAAG,sBAAsB,MAAM,GAAG,CAAC;AAC/E,QAAM,WAAWA,MAAK,SAAS,YAAY,UAAU;AACrD,MAAI,SAAS,WAAW,IAAI,KAAKA,MAAK,WAAW,QAAQ,GAAG;AAC1D,UAAM,IAAI,MAAM,gDAAgD,WAAW,EAAE;EAC/E;AACA,SAAO;AACT;AAEA,SAAS,8BAA8B,SAAiC,SAAuB;AAC7F,QAAM,SAAS,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAChE,MAAI,QAAQ,UAAU,QAAQ,WAAW,QAAQ;AAC/C,UAAM,IAAI,MAAM,0CAA0C,QAAQ,IAAI,EAAE;EAC1E;AACA,MAAI,QAAQ,iBAAiB,QAAQ,kBAAkB,UAAU,MAAM,IAAI;AACzE,UAAM,IAAI,MAAM,gDAAgD,QAAQ,IAAI,EAAE;EAChF;AACF;AAEA,eAAe,uBAAuB,QAGW;AAC/C,MAAI,OAAO,SAAS,WAAW,GAAG;AAChC,WAAO;EACT;AAEA,QAAM,cAAc,MAAM,QAAQA,MAAK,KAAK,GAAG,OAAO,GAAG,0BAA0B,CAAC;AACpF,QAAM,SAAS,oBAAI,IAAY;AAC/B,QAAM,gBAAgB,oBAAI,IAAoB;AAE9C,MAAI;AACF,eAAW,WAAW,OAAO,UAAU;AACrC,YAAM,sBAAsB,yBAAyB,QAAQ,IAAI;AACjE,UAAI,UAAU,cAAc,IAAI,mBAAmB;AACnD,UAAI,CAAC,SAAS;AACZ,cAAM,aAAa,iCAAiC,OAAO,WAAW,mBAAmB;AACzF,kBAAUC,cAAa,UAAU;AACjC,sBAAc,IAAI,qBAAqB,OAAO;MAChD;AACA,oCAA8B,SAAS,OAAO;AAC9C,UAAI,OAAO,IAAI,mBAAmB,GAAG;AACnC;MACF;AACA,YAAM,kBAAkBD,MAAK,KAAK,aAAa,GAAG,oBAAoB,MAAM,GAAG,CAAC;AAChF,gBAAUA,MAAK,QAAQ,eAAe,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,oBAAc,iBAAiB,OAAO;AACtC,aAAO,IAAI,mBAAmB;IAChC;EACF,SAAS,OAAO;AACd,UAAM,GAAG,aAAa,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAC7E,UAAM;EACR;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,GAAG,aAAa,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAC7E,WAAO;EACT;AAEA,SAAO;IACL,WAAW;IACX,SAAS,MAAM,GAAG,aAAa,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;EACjE;AACF;AAEA,SAAS,0BAA0B,MAAc,iBAAiC;AAChF,MAAI,CAAC,KAAK,KAAK,GAAG;AAChB,WAAO;EACT;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,IAAI;EAC1B,QAAQ;AACN,WAAO;EACT;AAEA,MAAI,CAACe,UAAS,MAAM,KAAK,CAACA,UAAS,OAAO,iBAAiB,GAAG;AAC5D,WAAO;EACT;AAEA,MAAI,UAAU;AACd,aAAW,WAAW,OAAO,OAAO,OAAO,iBAAiB,GAAG;AAC7D,QAAI,CAACA,UAAS,OAAO,GAAG;AACtB;IACF;AACA,QAAI,QAAQ,QAAQ,gCAAgC,OAAO,QAAQ,SAAS,UAAU;AACpF;IACF;AACA,UAAM,MAAM,mBAAmB,iBAAiB,QAAQ,IAAI;AAC5D,QAAI,QAAQ,QAAQ,KAAK;AACvB,cAAQ,MAAM;AACd,gBAAU;IACZ;EACF;AAEA,SAAO,UAAU,KAAK,UAAU,MAAM,IAAI;AAC5C;AAEA,eAAe,8BAA8B,QAII;AAC/C,MAAI,OAAO,SAAS,WAAW,GAAG;AAChC,WAAO;EACT;AAEA,QAAM,gBAAgB,MAAM,QAAQf,MAAK,KAAK,GAAG,OAAO,GAAG,2BAA2B,CAAC;AACvF,QAAM,eAAe,IAAI;IACvB,OAAO,SAAS,IAAI,CAAC,YAAY,yBAAyB,QAAQ,IAAI,CAAC;EACzE;AAEA,MAAI;AACF,UAAM,cAAc,MAAM,gBAAgB,OAAO,SAAS;AAC1D,eAAW,cAAc,aAAa;AACpC,YAAM,eAAeA,MAAK,SAAS,OAAO,WAAW,UAAU,EAAE,MAAMA,MAAK,GAAG,EAAE,KAAK,GAAG;AACzF,YAAM,kBAAkBA,MAAK,KAAK,eAAe,GAAG,aAAa,MAAM,GAAG,CAAC;AAC3E,UAAI,iBAAiBY,wBAAuB;AAC1C,cAAM,WAAWX,cAAa,YAAY,MAAM;AAChD,cAAM,YAAY,SACf,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,0BAA0B,MAAM,OAAO,eAAe,CAAC,EACrE,KAAK,IAAI;AACZ,kBAAUD,MAAK,QAAQ,eAAe,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,sBAAc,iBAAiB,SAAS;AACxC;MACF;AACA,UAAI,aAAa,IAAI,YAAY,GAAG;AAClC;MACF;AACA,gBAAUA,MAAK,QAAQ,eAAe,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,YAAM,GAAG,YAAY,iBAAiB,EAAE,aAAa,MAAM,CAAC;IAC9D;EACF,SAAS,OAAO;AACd,UAAM,GAAG,eAAe,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAC/E,UAAM;EACR;AAEA,SAAO;IACL,WAAW;IACX,SAAS,MAAM,GAAG,eAAe,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;EACnE;AACF;AAEA,eAAe,wBACb,SACA,KACA,qBACmB;AACnB,MAAI,CAAC,KAAK;AACR,WAAO,CAAC;EACV;AACA,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,CAAC,WAAW,MAAM,eAAe,KAAK,mBAAmB,GAAG;IAC1F,KAAK;IACL,OAAO;EACT,CAAC;AACD,SAAO,OACJ,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AACnB;AAEA,eAAe,yBAAyB,QAYrC;AACD,QAAM,WAAW,cAAc,OAAO,WAAW,MAAM;AACvD,QAAM,YAAY,gBAAgB,OAAO,WAAW,MAAM,IAAI,OAAO,WAAW,MAAM;AACtF,QAAM,cAAc,MAAM,aAAa,OAAO,SAAS,QAAQ;AAC/D,QAAM,eAAe,MAAM,aAAa,OAAO,SAAS,SAAS;AACjE,QAAM,UAAU,OAAO,eACnB,eACE,YACA,cACE,WACA,SACJ,cACE,WACA,eACE,YACA;AACR,QAAM,aAAa,WAEb,MAAM,OAAO,CAAC,aAAa,GAAG,OAAO,WAAW,GAAG;IACjD,KAAK,OAAO;EACd,CAAC,GACD,OAAO,KAAK,IACd;AACJ,QAAM,WAAW,WAEX,MAAM,OAAO,CAAC,aAAa,GAAG,OAAO,SAAS,GAAG;IAC/C,KAAK,OAAO;EACd,CAAC,GACD,OAAO,KAAK,IACd;AACJ,SAAO,EAAE,SAAS,YAAY,UAAU,UAAU,aAAa,WAAW,aAAa;AACzF;AAEA,eAAe,iCACb,SACA,YACe;AACf,QAAM,gBAAgB,MAAM,iBAAiB,OAAO;AACpD,MAAI,kBAAkB,WAAW,QAAQ;AACvC;EACF;AACA,MAAI,0BAA0B,UAAU,GAAG;AACzC,UAAM,IAAI;MACR,sCAAsC,WAAW,MAAM,uBAAuB,OAAO;IACvF;EACF;AACA,QAAM,OAAO,CAAC,YAAY,UAAU,GAAG,EAAE,KAAK,QAAQ,CAAC;AACzD;AAEA,eAAe,iCAAiC,QAK3B;AACnB,QAAM,EAAE,WAAW,IAAI;AACvB,QAAM,QAAQ,CAAC,GAAG,IAAI,IAAI,OAAO,MAAM,OAAO,qBAAqB,CAAC,CAAC,EAAE,KAAK;AAC5E,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;EACT;AAEA,QAAM,6BAA6B,OAAO,SAAS,WAAW,MAAM;AACpE,QAAM,iCAAiC,OAAO,SAAS,UAAU;AAEjE,MAAI,OAAO,MAAM,yBAAyB;IACxC,SAAS,OAAO;IAChB;EACF,CAAC;AACD,MAAI,CAAC,KAAK,SAAS;AACjB,UAAM,0BAA0B,OAAO,SAAS,WAAW,MAAM;AACjE,WAAO,MAAM,yBAAyB;MACpC,SAAS,OAAO;MAChB;IACF,CAAC;EACH;AAEA,QAAM,YAAY,MAAM,QAAQA,MAAK,KAAK,GAAG,OAAO,GAAG,uBAAuB,CAAC;AAC/E,QAAM,YAAYA,MAAK,KAAK,WAAW,OAAO;AAC9C,QAAM,WAAW,EAAE,gBAAgB,UAAU;AAE7C,MAAI;AACF,QAAI,KAAK,SAAS;AAChB,YAAM,OAAO,CAAC,aAAa,KAAK,OAAO,GAAG,EAAE,KAAK,OAAO,SAAS,KAAK,SAAS,CAAC;IAClF,OAAO;AACL,YAAM,OAAO,CAAC,aAAa,SAAS,GAAG,EAAE,KAAK,OAAO,SAAS,KAAK,SAAS,CAAC;IAC/E;AAEA,eAAW,WAAW,OAAO;AAC3B,YAAM,aAAaA,MAAK,KAAK,OAAO,SAAS,GAAG,QAAQ,MAAM,GAAG,CAAC;AAClE,UAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,cAAM,OAAO,CAAC,gBAAgB,kBAAkB,MAAM,OAAO,GAAG;UAC9D,KAAK,OAAO;UACZ,KAAK;UACL,OAAO;QACT,CAAC;AACD;MACF;AAEA,YAAM,WAAW,MAAM,MAAM,UAAU;AACvC,UAAI,OAAO,SAAS,OAAO,KAAQ,WAAW;AAC9C,UAAI,SAAS,eAAe,GAAG;AAC7B,eAAO;MACT;AACA,YAAM,EAAE,QAAQ,KAAK,IAAI,MAAM,OAAO,CAAC,eAAe,MAAM,gBAAgB,UAAU,GAAG;QACvF,KAAK,OAAO;MACd,CAAC;AACD,YAAM,OAAO,CAAC,gBAAgB,SAAS,eAAe,GAAG,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,OAAO,EAAE,GAAG;QAC1F,KAAK,OAAO;QACZ,KAAK;MACP,CAAC;IACH;AAEA,UAAM,EAAE,QAAQ,cAAc,IAAI,MAAM,OAAO,CAAC,YAAY,GAAG;MAC7D,KAAK,OAAO;MACZ,KAAK;IACP,CAAC;AACD,UAAM,UAAU,cAAc,KAAK;AACnC,QAAI,KAAK,YAAY,YAAY,KAAK,UAAU;AAC9C,aAAO;IACT;AAEA,UAAM,aAAa;MACjB;MACA;MACA,GAAI,KAAK,aAAa,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC;MACjD;MACA,OAAO;IACT;AACA,UAAM,EAAE,QAAQ,aAAa,IAAI,MAAM,iCAAiC,YAAY;MAClF,KAAK,OAAO;IACd,CAAC;AACD,UAAM,YAAY,aAAa,KAAK;AACpC,UAAM;MACJ;QACE;QACA,cAAc,WAAW,MAAM;QAC/B;QACA,GAAI,KAAK,cAAc,CAAC,KAAK,cAAc,EAAE,IAAI,CAAC;MACpD,EAAE,OAAO,OAAO;MAChB,EAAE,KAAK,OAAO,QAAQ;IACxB;AAEA,QAAI,KAAK,cAAc;AACrB,YAAM,OAAO,CAAC,UAAU,qBAAqB,KAAK,WAAW,WAAW,MAAM,GAAG;QAC/E,KAAK,OAAO;QACZ,OAAO;MACT,CAAC;IACH;AAEA,WAAO;EACT,UAAA;AACE,UAAM,GAAG,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;EAC7E;AACF;AAEA,eAAe,mCAAmC,QAY/C;AACD,QAAM,EAAE,WAAW,IAAI;AACvB,QAAM,6BAA6B,OAAO,SAAS,WAAW,MAAM;AACpE,QAAM,iCAAiC,OAAO,SAAS,UAAU;AAEjE,QAAM,qBAAqB,yBAAyB,OAAO,eAAe;AAC1E,QAAM,sBAAsBA,MAAK,MAAM,KAAK,uBAAuB,kBAAkB;AACrF,MAAI,OAAO,MAAM,yBAAyB;IACxC,SAAS,OAAO;IAChB;IACA,cAAc,OAAO;EACvB,CAAC;AAQD,MAAI,CAAC,KAAK,SAAS;AACjB,UAAM,0BAA0B,OAAO,SAAS,WAAW,MAAM;AACjE,WAAO,MAAM,yBAAyB;MACpC,SAAS,OAAO;MAChB;MACA,cAAc,OAAO;IACvB,CAAC;EACH;AAEA,QAAM,YAAY,MAAM,QAAQA,MAAK,KAAK,GAAG,OAAO,GAAG,uBAAuB,CAAC;AAC/E,QAAM,YAAYA,MAAK,KAAK,WAAW,OAAO;AAC9C,QAAM,WAAW,EAAE,gBAAgB,UAAU;AAE7C,MAAI;AACF,QAAI,KAAK,SAAS;AAChB,YAAM,OAAO,CAAC,aAAa,KAAK,OAAO,GAAG,EAAE,KAAK,OAAO,SAAS,KAAK,SAAS,CAAC;IAClF,OAAO;AACL,YAAM,OAAO,CAAC,aAAa,SAAS,GAAG,EAAE,KAAK,OAAO,SAAS,KAAK,SAAS,CAAC;IAC/E;AAEA,UAAM,gBAAgB,MAAM;MAC1B,OAAO;MACP,KAAK;MACL;IACF;AACA,eAAW,gBAAgB,eAAe;AACxC,YAAM,OAAO,CAAC,gBAAgB,kBAAkB,MAAM,YAAY,GAAG;QACnE,KAAK,OAAO;QACZ,KAAK;QACL,OAAO;MACT,CAAC;IACH;AAEA,UAAM,cAAc,MAAM,gBAAgB,OAAO,SAAS;AAC1D,eAAW,cAAc,aAAa;AACpC,YAAM,eAAeA,MAAK,SAAS,OAAO,WAAW,UAAU,EAAE,MAAMA,MAAK,GAAG,EAAE,KAAK,GAAG;AACzF,YAAM,kBAAkBA,MAAK,MAAM,KAAK,qBAAqB,YAAY;AACzE,YAAM,WAAW,MAAM,MAAM,UAAU;AACvC,UAAI,OAAO,SAAS,OAAO,KAAQ,WAAW;AAC9C,UAAI,gBAAgB;AACpB,UAAI,SAAS,eAAe,GAAG;AAC7B,eAAO;AACP,wBAAgB;MAClB;AACA,YAAM,EAAE,QAAQ,KAAK,IAAI,MAAM,OAAO,CAAC,eAAe,MAAM,gBAAgB,aAAa,GAAG;QAC1F,KAAK,OAAO;MACd,CAAC;AACD,YAAM;QACJ,CAAC,gBAAgB,SAAS,eAAe,GAAG,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,eAAe,EAAE;QACpF;UACE,KAAK,OAAO;UACZ,KAAK;QACP;MACF;IACF;AAEA,UAAM,EAAE,QAAQ,cAAc,IAAI,MAAM,OAAO,CAAC,YAAY,GAAG;MAC7D,KAAK,OAAO;MACZ,KAAK;IACP,CAAC;AACD,UAAM,UAAU,cAAc,KAAK;AACnC,QAAI,KAAK,YAAY,YAAY,KAAK,UAAU;AAC9C,aAAO;QACL,eAAe;QACf,eAAe;QACf,aAAa,KAAK,eAAe,KAAK,YAAY;MACpD;IACF;AAEA,UAAM,aAAa;MACjB;MACA;MACA,GAAI,KAAK,aAAa,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC;MACjD;MACA,OAAO;MACP;MACA,eAAe,OAAO,WAAW;IACnC;AACA,UAAM,EAAE,QAAQ,aAAa,IAAI,MAAM,iCAAiC,YAAY;MAClF,KAAK,OAAO;IACd,CAAC;AACD,UAAM,YAAY,aAAa,KAAK;AACpC,UAAM;MACJ;QACE;QACA,cAAc,WAAW,MAAM;QAC/B;QACA,GAAI,KAAK,eAAe,CAAC,OAAO,mBAAmB,CAAC,KAAK,cAAc,EAAE,IAAI,CAAC;MAChF,EAAE,OAAO,OAAO;MAChB,EAAE,KAAK,OAAO,QAAQ;IACxB;AAEA,QAAI,KAAK,cAAc;AACrB,YAAM,OAAO,CAAC,UAAU,qBAAqB,KAAK,WAAW,WAAW,MAAM,GAAG;QAC/E,KAAK,OAAO;QACZ,OAAO;MACT,CAAC;IACH;AAEA,WAAO;MACL,eAAe;MACf,eAAe;MACf,aAAa,KAAK,eAAe,KAAK,YAAY;IACpD;EACF,UAAA;AACE,UAAM,GAAG,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;EAC7E;AACF;AAEA,SAAS,sBACP,YACA,SACA,SACyB;AACzB,QAAM,UAAU,SAAS;AACzB,SAAO;IACL;IACA,sBAAsB,WAAW;IACjC,GAAI,SAAS,YAAY,QAAQ;MAC/B,SAAS;MACT,cAAc,QAAQ;MACtB,aAAa;IACf;IACA,GAAG,kBAAkB,OAAO;EAC9B;AACF;AAEA,SAAS,uBACP,YACA,SACyB;AACzB,QAAM,UAAU,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO;AACvD,MAAI,SAAS;AACX,WAAO;EACT;AACA,QAAM,WAAW,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,WAAW,OAAO,eAAe,MAAS;AACxF,SAAO;IACL,SAAS,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO;IAChD,sBAAsB,WAAW;IACjC,GAAI,UAAU,eAAe,UAAa;MACxC,YAAY,SAAS;IACvB;IACA,GAAI,UAAU,kBAAkB,UAAa,EAAE,eAAe,SAAS,cAAc;IACrF,GAAI,UAAU,kBAAkB,UAAa,EAAE,eAAe,SAAS,cAAc;IACrF,GAAI,UAAU,iBAAiB,UAAa,EAAE,cAAc,SAAS,aAAa;IAClF,GAAI,UAAU,kBAAkB,UAAa,EAAE,eAAe,SAAS,cAAc;IACrF,GAAI,UAAU,2BAA2B,UAAa;MACpD,wBAAwB,SAAS;IACnC;IACA,GAAI,UAAU,wBAAwB,UAAa;MACjD,qBAAqB,SAAS;IAChC;IACA,GAAI,UAAU,iBAAiB,UAAa,EAAE,cAAc,SAAS,aAAa;EACpF;AACF;AAEA,eAAe,iCAAiC,QAIE;AAChD,MAAI;AACF,UAAM;MACJ;QACE;QACA;QACA,OAAO,WAAW;QAClB,cAAc,OAAO,aAAa,eAAe,OAAO,aAAa;MACvE;MACA,EAAE,KAAK,OAAO,QAAQ;IACxB;AACA,qBAAiB,OAAO,YAAY;MAClC,iBAAgB,oBAAI,KAAK,GAAE,YAAY;MACvC,YAAY;IACd,CAAC;AACD,UAAM,iBAAiB,OAAO,SAAS,OAAO,WAAW,QAAQ,OAAO,aAAa,EAAE;MACrF,MAAM;IACR;AACA,WAAO;EACT,SAAS,OAAO;AACd,QAAI,CAAC,0BAA0B,KAAK,GAAG;AACrC,YAAM;IACR;AACA,UAAM,UAAU,MAAM,gCAAgC;MACpD,YAAY,OAAO;MACnB,SAAS,OAAO;MAChB,cAAc,OAAO;MACrB,WAAW,cAAc,OAAO,aAAa;IAC/C,CAAC;AACD,QAAI,QAAQ,SAAS;AACnB,uBAAiB,OAAO,YAAY,EAAE,YAAY,QAAQ,YAAY,CAAC;AACvE,aAAO;IACT;AACA,qBAAiB,OAAO,YAAY;MAClC,iBAAgB,oBAAI,KAAK,GAAE,YAAY;MACvC,YAAY;IACd,CAAC;AACD,UAAM,iBAAiB,OAAO,SAAS,OAAO,WAAW,QAAQ,OAAO,aAAa,EAAE;MACrF,MAAM;IACR;AACA,WAAO;EACT;AACF;AAEA,eAAe,0BAA0B,QAQJ;AACnC,QAAM,SAAS,MAAM,mCAAmC;IACtD,YAAY,OAAO;IACnB,SAAS,OAAO;IAChB,WAAW,OAAO;IAClB,iBAAiB,OAAO;IACxB,eAAe,OAAO;IACtB,aAAa,OAAO;EACtB,CAAC;AAED,MAAI,CAAC,OAAO,YAAY;AACtB,qBAAiB,OAAO,YAAY,EAAE,YAAY,OAAU,CAAC;AAC7D,WAAO,sBAAsB,OAAO,YAAY,OAAO,aAAa;EACtE;AAEA,MAAI,CAAC,OAAO,eAAe;AACzB,UAAMgB,qBAAoB,MAAM;MAC9B,OAAO;MACP,cAAc,OAAO,WAAW,MAAM;IACxC;AACA,UAAM,cAAc,OAAO,cACvBA,qBACE,MAAM,mBAAmB,OAAO,SAAS,OAAO,aAAa,OAAO,WAAW,MAAM,IACrF,QACFA;AACJ,QAAI,CAAC,aAAa;AAChB,aAAO,sBAAsB,OAAO,YAAY,KAAK;IACvD;AAEA,UAAM,aAAa,OAAO,cACtB,MAAM;MACJ,OAAO;MACP,OAAO;MACP,cAAc,OAAO,WAAW,MAAM;IACxC,IACA,CAAC;AACL,QAAI,OAAO,eAAe,CAAC,wBAAwB,UAAU,GAAG;AAC9D,YAAM,QAAQ,IAAI,MAAM,gDAAgD;AACxE,uBAAiB,OAAO,YAAY,EAAE,YAAY,MAAM,QAAQ,CAAC;AACjE,YAAM;IACR;AACA,UAAMC,WAAU,MAAM,iCAAiC;MACrD,YAAY,OAAO;MACnB,SAAS,OAAO;MAChB,eAAe,OAAO,WAAW;IACnC,CAAC;AACD,WAAO,sBAAsB,OAAO,YAAY,CAACA,UAAS,SAASA,QAAO;EAC5E;AAEA,QAAM,UAAU,MAAM,iCAAiC;IACrD,YAAY,OAAO;IACnB,SAAS,OAAO;IAChB,eAAe,OAAO,WAAW;EACnC,CAAC;AACD,SAAO,sBAAsB,OAAO,YAAY,CAAC,SAAS,SAAS,OAAO;AAC5E;AAOA,eAAsB,kBAAkB,QAKnB;AACnB,QAAM,SAAS,MAAM,6BAA6B,MAAM;AACxD,MAAI,OAAO,SAAS;AAClB,UAAM,IAAI,+BAA+B,MAAM;EACjD;AACA,SAAO,OAAO;AAChB;AAEA,eAAsB,6BAA6B,QAKd;AACnC,QAAM,aAAa,uBAAuB,OAAO,MAAM;AACvD,QAAM,UAAU,MAAM,uBAAuB,UAAU;AACvD,QAAM,iBAAiB,SAAS,WAAW,QAAQ,WAAW,MAAM,EAAE,MAAM,CAAC,UAAU;AACrF,QAAI,WAAW,cAAc;AAC3B,YAAM;IACR;EACF,CAAC;AACD,QAAM,gBAAgB,WAAW,UAAW,MAAM,qBAAqB,OAAO;AAC9E,QAAM,gBAA4C;IAChD,GAAG;IACH,QAAQ;EACV;AACA,QAAM,cAAc,cAAc,OAAO,eAAe;AACxD,QAAM,aAAa,WAAW,aAAa,WAAW;AACtD,QAAM,kBAAkB,+BAA+B,OAAO,SAAS;AACvE,QAAM,UAAU,MAAM,uBAAuB;IAC3C,WAAW,OAAO;IAClB,UAAU;EACZ,CAAC;AACD,MAAI;AAEJ,MAAI;AACF,6BAAyB,MAAM,8BAA8B;MAC3D,WAAW,OAAO;MAClB,iBAAiB,OAAO;MACxB,UAAU;IACZ,CAAC;AAED,UAAM,cAAyC,CAAC;AAChD,QAAI,SAAS;AACX,YAAM,iBAAiB,SAAS,WAAW,QAAQ,4BAA4B,EAAE;QAC/E,CAAC,UAAU;AACT,cAAI,WAAW,cAAc;AAC3B,kBAAM;UACR;QACF;MACF;AACA,YAAM,gBAAgB,MAAM,0BAA0B;QACpD,YAAY;UACV,GAAG;UACH,QAAQ;QACV;QACA;QACA,WAAW,QAAQ;QACnB,iBAAiB,OAAO;QACxB,eAAe,iDAAiD,WAAW;QAC3E;QACA;MACF,CAAC;AACD,kBAAY,KAAK,aAAa;AAC9B,UAAI,cAAc,SAAS;AACzB,eAAO;MACT;IACF;AAEA,gBAAY;MACV,MAAM,0BAA0B;QAC9B,YAAY;QACZ;QACA,WAAW,wBAAwB,aAAa,OAAO;QACvD,iBAAiB,OAAO;QACxB,eAAe,OAAO;QACtB;QACA;MACF,CAAC;IACH;AACA,WAAO,uBAAuB,YAAY,WAAW;EACvD,UAAA;AACE,UAAM,wBAAwB,QAAQ,EAAE,MAAM,MAAM,MAAS;AAC7D,UAAM,SAAS,QAAQ,EAAE,MAAM,MAAM,MAAS;EAChD;AACF;AAqCA,SAAS,cAAc,iBAAiC;AACtD,QAAM,aAAa,gBAAgB,MAAMjB,MAAK,GAAG,EAAE,KAAK,GAAG;AAC3D,QAAM,WAAW,WAAW,MAAM,GAAG,EAAE,OAAO,OAAO;AACrD,MAAI,SAAS,UAAU,GAAG;AACxB,UAAM,aAAa,SAAS,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG;AACjD,UAAM,YAAY,SAAS,GAAG,EAAE;AAChC,QAAI,eAAe,WAAW;AAC5B,aAAO,aAAa;IACtB;AACA,WAAO,GAAG,UAAU,KAAK,SAAS;EACpC;AACA,SAAO,SAAS,CAAC,KAAK;AACxB;AAEA,SAAS,iBAAiB,OAAe,WAAoC;AAC3E,QAAM,aAAa,UAAU,UAAU,YAAY,KAAK;AACxD,MAAI,YAAY;AACd,WAAO;EACT;AAEA,QAAM,iBAAiB,MAAM,YAAY,IAAI;AAC7C,SAAO,mBAAmB,KAAK,YAAY,MAAM,MAAM,GAAG,cAAc;AAC1E;AAEA,SAAS,uBAAuB,YAAgE;AAC9F,MAAI,CAAC,YAAY;AACf,WAAO;EACT;AAEA,QAAM,YAAY,OAAO,OAAO,UAAU,EACvC,IAAI,CAAC,YAAY,QAAQ,WAAW,IAAI,EACxC,OAAO,CAAC,UAA2B,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,CAAC;AAEzF,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;EACT;AAEA,SAAO,UAAU,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,IAAI,UAAU;AACtE;AAEA,eAAe,YAAY,SAAiB,OAAgC;AAC1E,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,QAAQ,MAAM,OAAO,CAAC,YAAY,SAAS,GAAG;MAClD,KAAK;MACL,KAAK,UAAU;MACf,OAAO,CAAC,QAAQ,QAAQ,MAAM;IAChC,CAAC;AAED,UAAM,eAAyB,CAAC;AAChC,UAAM,eAAyB,CAAC;AAEhC,UAAM,OAAO,GAAG,QAAQ,CAAC,UAA2B;AAClD,mBAAa,KAAK,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK,CAAC;IACvE,CAAC;AACD,UAAM,OAAO,GAAG,QAAQ,CAAC,UAA2B;AAClD,mBAAa,KAAK,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK,CAAC;IACvE,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,UAAU,OAAO,4BAA4B,KAAK,CAAC,CAAC;AACvE,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,UAAI,SAAS,GAAG;AACd,gBAAQ,OAAO,OAAO,YAAY,CAAC;AACnC;MACF;AAEA,YAAM,SAAS,OAAO,OAAO,YAAY,EAAE,SAAS,MAAM,EAAE,KAAK;AACjE;QACE;UACE,OAAO,SAAS,IAAI,IAAI,MAAM,MAAM,IAAI,IAAI,MAAM,qBAAqB;QACzE;MACF;IACF,CAAC;AAED,UAAM,MAAM,IAAI,KAAK;EACvB,CAAC;AACH;AAEA,SAAS,mBAAmB,QAAgC;AAC1D,QAAM,QAAwB,CAAC;AAC/B,MAAI,SAAS;AAEb,SAAO,SAAS,OAAO,QAAQ;AAC7B,UAAM,YAAY,OAAO,QAAQ,IAAM,MAAM;AAC7C,QAAI,cAAc,IAAI;AACpB,YAAM,IAAI,MAAM,0DAA0D;IAC5E;AAEA,UAAM,SAAS,OAAO,SAAS,QAAQ,SAAS,EAAE,SAAS,MAAM;AACjE,aAAS,YAAY;AAErB,QAAI,OAAO,WAAW,GAAG;AACvB;IACF;AAEA,UAAM,eAAe,iBAAiB,KAAK,MAAM;AACjD,QAAI,cAAc;AAChB;IACF;AAEA,UAAM,cAAc,qBAAqB,KAAK,MAAM;AACpD,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,kCAAkC,MAAM,EAAE;IAC5D;AAEA,UAAM,CAAC,EAAE,WAAW,YAAY,QAAQ,IAAI;AAC5C,QAAI,eAAe,QAAQ;AACzB,YAAM,IAAI,MAAM,mCAAmC,SAAS,KAAK,UAAU,EAAE;IAC/E;AAEA,UAAM,OAAO,OAAO,SAAS,UAAU,EAAE;AACzC,UAAM,aAAa,SAAS;AAC5B,QAAI,aAAa,OAAO,QAAQ;AAC9B,YAAM,IAAI,MAAM,qCAAqC,SAAS,0BAA0B;IAC1F;AAEA,UAAM,KAAK;MACT;MACA,SAAS,OAAO,SAAS,QAAQ,UAAU;IAC7C,CAAC;AACD,aAAS;AAET,QAAI,SAAS,OAAO,UAAU,OAAO,MAAM,MAAM,IAAM;AACrD,gBAAU;IACZ;EACF;AAEA,SAAO;AACT;AAWA,eAAsB,sBACpB,QAC6B;AAC7B,QAAM,cAAc,OAAO,OAAO;AAClC,QAAM,gBAAgB,yBAAyB,OAAO,GAAG;AACzD,QAAM,SAAS,OAAO,UAAU;AAChC,MAAI,CAAC,YAAY,WAAW,OAAO,GAAG;AACpC,UAAM,wBAAwB,OAAO,SAAS,QAAQ,WAAW,EAAE,MAAM,MAAM,MAAS;EAC1F;AAEA,QAAM,gBAAgB;IACpB,gBAAgB,MAAM,IAAI,WAAW;IACrC,cAAc,WAAW;IACzB;EACF,EAAE,OAAO,CAAC,WAAW,OAAO,QAAQ,IAAI,QAAQ,SAAS,MAAM,KAAK;AAEpE,aAAW,gBAAgB,eAAe;AACxC,UAAM,QAAQ;MACZ,MAAM,YAAY,OAAO,SAAS,GAAG,YAAY,IAAI,aAAa;CAAI;IACxE;AACA,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,CAAC,MAAM;AACT;IACF;AACA;MACE;QACE,MAAM;QACN,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;QACjD,GAAI,OAAO,gBAAgB,EAAE,eAAe,OAAO,cAAc,IAAI,CAAC;MACxE;MACA,KAAK;IACP;AACA,WAAO,OAAO,KAAK,KAAK,OAAO;EACjC;AAEA,SAAO;AACT;AAcO,SAAS,mBAAmB,QAAwB;AACzD,QAAM,WAAW,GACd,SAAS,EACT,QAAQ,qBAAqB,GAAG,EAChC,MAAM,GAAG,EAAE;AACd,QAAM,cAAcA,MACjB,SAAS,MAAM,EACf,QAAQ,qBAAqB,GAAG,EAChC,MAAM,GAAG,EAAE;AACd,SAAO,cAAc,QAAQ,IAAI,WAAW;AAC9C;AAUA,eAAsB,iBAAiB,QAGR;AAC7B,QAAM,aAAa,uBAAuB,OAAO,MAAM;AACvD,QAAM,WAAW,MAAM,uBAAuB,UAAU;AACxD,QAAM,iBAAiB,UAAU,WAAW,QAAQ,WAAW,MAAM,EAAE,MAAM,CAAC,UAAU;AACtF,QAAI,WAAW,cAAc;AAC3B,YAAM;IACR;EACF,CAAC;AACD,MAAI,UAAU,WAAW,SACrB,MAAM,2BAA2B,UAAU,UAAU,IACrD,gBAAgB,MAAM,qBAAqB,QAAQ,GAAG,WAAW,MAAM;AAC3E,MAAI,CAAC,WAAW,WAAW,QAAQ;AACjC,UAAM,0BAA0B,UAAU,WAAW,MAAM;AAC3D,cAAU,WAAW;EACvB;AACA,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,yDAAyD;EAC3E;AACA,QAAM,eAAe,MAAM,QAAQA,MAAK,KAAK,GAAG,OAAO,GAAG,aAAa,CAAC;AACxE,QAAM,cAAcA,MAAK,KAAK,cAAc,MAAM;AAClD,QAAM,OAAO,CAAC,YAAY,OAAO,MAAM,OAAO,WAAW,aAAa,OAAO,GAAG;IAC9E,KAAK;EACP,CAAC;AACD,SAAO;IACL,WAAW,OAAO;IAClB;IACA;IACA,QAAQ,WAAW;IACnB,SAAS,YAAY;AACnB,UAAI;AACF,cAAM,OAAO,CAAC,YAAY,UAAU,WAAW,WAAW,GAAG,EAAE,KAAK,SAAS,CAAC;MAChF,UAAA;AACE,cAAM,GAAG,cAAc,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;MAChF;IACF;EACF;AACF;AASA,eAAsB,kBAAkB,QAInB;AACnB,QAAM,iBAAiBA,MAAK;IAC1B,OAAO,OAAO;IACd;IACA,OAAO;EACT;AACA,QAAM,sBAAsB;IAC1B,SAAS,OAAO,OAAO;IACvB,WAAW,OAAO;IAClB;EACF,CAAC;AACD,QAAM,cAAc,MAAM,2BAA2B,OAAO,OAAO,WAAW;AAC9E,QAAM,OAAO,CAAC,OAAO,SAAS,MAAM,GAAG,WAAW,GAAG;IACnD,KAAK,OAAO,OAAO;EACrB,CAAC;AACD,QAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,OAAO,CAAC,UAAU,aAAa,GAAG;IACjE,KAAK,OAAO,OAAO;IACnB,OAAO;EACT,CAAC;AACD,MAAI,CAAC,OAAO,KAAK,GAAG;AAClB,WAAO;EACT;AACA,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,QAAM;IACJ,CAAC,UAAU,WAAW,MAAM,4BAA4B,OAAO,OAAO,SAAS,IAAI,SAAS,EAAE;IAC9F,EAAE,KAAK,OAAO,OAAO,YAAY;EACnC;AACA,QAAM,OAAO,CAAC,QAAQ,WAAW,OAAO,OAAO,QAAQ,OAAO,OAAO,SAAS,GAAG;IAC/E,KAAK,OAAO,OAAO;EACrB,CAAC;AACD,SAAO;AACT;AAEA,eAAsB,gBAAgB,QAGpB;AAChB,QAAM,aAAa,uBAAuB,OAAO,MAAM;AACvD,QAAM,WAAW,MAAM,uBAAuB,UAAU;AACxD,QAAM,OAAO,CAAC,QAAQ,WAAW,QAAQ,YAAY,OAAO,SAAS,GAAG,EAAE,KAAK,SAAS,CAAC;AAC3F;AAKA,SAAS,qBAAqB,OAAyB;AACrD,QAAM,QAAkB,CAAC;AACzB,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,IAAI;AACV,QAAI,OAAO,EAAE,WAAW,SAAU,OAAM,KAAK,EAAE,MAAM;AACrD,QAAI,OAAO,EAAE,YAAY,SAAU,OAAM,KAAK,EAAE,OAAO;EACzD,WAAW,OAAO,UAAU,UAAU;AACpC,UAAM,KAAK,KAAK;EAClB;AACA,QAAM,WAAW,MAAM,KAAK,IAAI,EAAE,YAAY;AAC9C,SACE,SAAS,SAAS,yBAAyB,KAC3C,SAAS,SAAS,0BAA0B,KAC5C,SAAS,SAAS,cAAc,KAChC,SAAS,SAAS,gBAAgB;AAEtC;AAEA,eAAsB,YAAY,SAAiB,MAAM,eAAwC;AAC/F,MAAI;AACJ,MAAI;AACF,KAAC,EAAE,QAAQ,QAAQ,IAAI,MAAM;MAC3B,CAAC,WAAW,MAAM,eAAe,KAAK,qBAAqB;MAC3D;QACE,KAAK;MACP;IACF;EACF,SAAS,OAAO;AAGd,QAAI,qBAAqB,KAAK,GAAG;AAC/B,aAAO,CAAC;IACV;AACA,UAAM;EACR;AAEA,QAAM,iBAAiB,QACpB,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,iBAAiB,CAAC;AACpD,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO,CAAC;EACV;AAEA,QAAM,aAAa,GAAG,eAAe,IAAI,CAAC,kBAAkB,GAAG,GAAG,IAAI,aAAa,EAAE,EAAE,KAAK,IAAI,CAAC;;AACjG,QAAM,QAAQ,mBAAmB,MAAM,YAAY,SAAS,UAAU,CAAC;AACvE,MAAI,MAAM,WAAW,eAAe,QAAQ;AAC1C,UAAM,IAAI;MACR,YAAY,eAAe,MAAM,2BAA2B,MAAM,MAAM;IAC1E;EACF;AAEA,QAAM,OAAO,MAAM,QAAQ,CAAC,MAAM,UAA0B;AAC1D,UAAM,gBAAgB,eAAe,KAAK;AAC1C,UAAM,YAAY,KAAK,MAAM,KAAK,QAAQ,SAAS,MAAM,CAAC;AAC1D,UAAM,SAASA,MAAK,MAAM,QAAQ,aAAa;AAC/C,UAAM,kBAAkBA,MAAK,MAAM,SAAS,uBAAuB,MAAM;AACzE,UAAM,QAAQ,cAAc,eAAe;AAC3C,UAAM,YAAY,UAAU,UAAU,WAAW,KAAK,KAAKA,MAAK,MAAM,SAAS,MAAM;AACrF,UAAM,cAAc,UAAU,UAAU,cAAc,KAAK,KAAKA,MAAK,MAAM,SAAS,MAAM;AAC1F,UAAM,UAAU,UAAU,UAAU,WAAW,CAAC;AAChD,UAAM,WAAW,uBAAuB,UAAU,WAAW;AAE7D,WAAO;MACL;QACE,QAAQ;QACR,YAAY,iBAAiB,OAAO,SAAS;QAC7C;QACA,GAAI,aAAa,UAAa,EAAE,WAAW,SAAS;QACpD,GAAI,QAAQ,WAAW,KAAK,QAAQ,CAAC,IAAI,EAAE,QAAQ,QAAQ,CAAC,EAAE,IAAI,CAAC;QACnE,eAAeA,MAAK,MAAM,KAAK,QAAQ,aAAa;QACpD,gBAAgB;QAChB,cAAc;QACd,YAAY,UAAU,UAAU,WAAW,UAAU;QACrD,WAAW;QACX,YAAY,KAAK;MACnB;IACF;EACF,CAAC;AAED,OAAK,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,cAAc,EAAE,SAAS,CAAC;AAC1D,SAAO;AACT;AAEA,eAAsB,kBACpB,SACA,iBACA,MAAM,eACS;AACf,QAAM,oBAAoB,gBAAgB,MAAMA,MAAK,GAAG,EAAE,KAAK,GAAG;AAClE,QAAM,cAAcA,MAAK,MAAM,KAAK,uBAAuB,iBAAiB;AAC5E,QAAM,eAAeA,MAAK,KAAK,SAAS,GAAG,YAAY,MAAM,GAAG,CAAC;AACjE,QAAM,EAAE,QAAQ,QAAQ,IAAI,MAAM,OAAO,CAAC,WAAW,MAAM,eAAe,KAAK,WAAW,GAAG;IAC3F,KAAK;EACP,CAAC;AAED,QAAM,YAAY,QACf,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AACnC,MAAI,UAAU,WAAW,GAAG;AAC1B;EACF;AAEA,QAAM,aAAa,GAAG,UAAU,IAAI,CAAC,aAAa,GAAG,GAAG,IAAI,QAAQ,EAAE,EAAE,KAAK,IAAI,CAAC;;AAClF,QAAM,QAAQ,mBAAmB,MAAM,YAAY,SAAS,UAAU,CAAC;AACvE,MAAI,MAAM,WAAW,UAAU,QAAQ;AACrC,UAAM,IAAI;MACR,YAAY,UAAU,MAAM,2BAA2B,MAAM,MAAM;IACrE;EACF;AAEA,QAAM,WAAW,YAAYA,MAAK,KAAK,SAAS,cAAc,CAAC;AAC/D,QAAM,aAAaA,MAAK,KAAK,UAAU,KAAK;AAE5C,MAAI;AACF,eAAW,CAAC,OAAO,QAAQ,KAAK,UAAU,QAAQ,GAAG;AACnD,YAAM,mBAAmBA,MAAK,MAAM,SAAS,aAAa,QAAQ;AAClE,YAAM,eAAeA,MAAK,KAAK,YAAY,GAAG,iBAAiB,MAAM,GAAG,CAAC;AACzE,gBAAUA,MAAK,QAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AACzD,oBAAc,cAAc,MAAM,KAAK,EAAE,OAAO;IAClD;AAEA,cAAUA,MAAK,QAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AACzD,QAAI;AACF,iBAAW,YAAY,YAAY;IACrC,SAAS,OAAO;AACd,YAAM,OACJ,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,QAAQ,MAAM,OAAO;AAChF,WAAK,SAAS,YAAY,SAAS,gBAAgB,WAAW,YAAY,GAAG;AAC3E;MACF;AACA,YAAM;IACR;EACF,UAAA;AACE,WAAO,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;EACnD;AACF;ACl7GA,eAAsB,YAAY,OAAoC;AACpE,MAAI,CAAC,MAAM,SAAS;AAClB,UAAM,IAAI,MAAM,YAAY,MAAM,EAAE,2BAA2B;EACjE;AACA,MAAI,CAAC,MAAM,KAAK;AACd,UAAM,IAAI,MAAM,YAAY,MAAM,EAAE,8BAA8B;EACpE;AACA,QAAM,OAAO,MAAM;AAEnB,MAAIE,YAAW,GAAG,IAAI,OAAO,GAAG;AACjB,IAAA,0BAAa,OAAO,CAAC,MAAM,MAAM,QAAQ,WAAW,GAAG,EAAE,OAAO,UAAU,CAAC;EAC1F,OAAO;AACQ,IAAA;MACX;MACA,CAAC,SAAS,WAAW,KAAK,sBAAsB,YAAY,MAAM,KAAK,MAAM,SAAS,IAAI;MAC1F,EAAE,OAAO,UAAU;IACrB;EACF;AACF;AAMA,eAAsB,aAAa,SAAwC;AACzE,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,QAAS;AACpB,YAAQ,IAAI,oBAAoB,MAAM,EAAE,UAAU,MAAM,OAAO,KAAK;AACpE,UAAM,YAAY,KAAK;AACvB,YAAQ,IAAI,YAAY,MAAM,EAAE,WAAW;EAC7C;AACF;ACnDA,IAAM,4BAA4B,oBAAI,IAAI;EACxC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;AACF,CAAC;AAKD,IAAM,4BAA4B,oBAAI,IAAI,CAAC,cAAc,OAAO,CAAC;AAOjE,SAAS,oBAAoB,QAAoC;AAC/D,QAAM,UAAmC,CAAC;AAC1C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,0BAA0B,IAAI,GAAG,EAAG;AACxC,QAAI,QAAQ,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC5C,cAAQ,GAAG,IAAK,MAAyB,IAAI,mBAAmB;IAClE,OAAO;AACL,cAAQ,GAAG,IAAI;IACjB;EACF;AACA,SAAO;AACT;AASO,SAAS,mBAAmB,QAA4C;AAC7E,QAAM,UAAmC,CAAC;AAC1C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,0BAA0B,IAAI,GAAG,EAAG;AACxC,QAAI,QAAQ,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC5C,cAAQ,GAAG,IAAK,MAAyB,IAAI,mBAAmB;IAClE,OAAO;AACL,cAAQ,GAAG,IAAI;IACjB;EACF;AACA,SAAO;AACT;AChEO,IAAM,mBAAmB;AASzB,SAAS,eAAe,cAA8B;AAC3D,QAAM,QAAQ,aAAa,MAAM,OAAO;AACxC,MAAI,MAAM,UAAU,GAAG;AACrB,WAAO;EACT;AACA,QAAM,OAAO,MAAM,MAAM,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,MAAM,OAAO;AAC3D,SAAO,KAAK,SAAS,IAAI,KAAK,KAAK,GAAG,IAAI;AAC5C;ACQO,IAAM,oBAAN,MAAwB;EAO7B,YAA6B,SAA4B;AAA5B,SAAA,UAAA;EAA6B;EANlD,WAAsC;EACtC,SAAwB;EACxB,MAAsB;;EAEtB,gBAAqB;;EAK7B,MAAM,OAAyB;AAC7B,QAAI;AACF,YAAM,CAAC,cAAc,cAAc,YAAY,KAAK,OAAO,IAAI,MAAM,QAAQ,IAAI;QAC/E,OAAO,mBAA+B;QACtC,OAAO,mBAA0B;QACjC,OAAO,mBAAqC;QAC5C,OAAO,mBAAoB;QAC3B,OAAO,4BAAqB,EAAE,MAAM,MAAM,IAAI;MAChD,CAAC;AAED,YAAM,EAAE,oBAAoB,UAAU,oBAAoB,IAAI;AAC9D,YAAM,EAAE,uBAAuB,IAAI;AACnC,YAAM,EAAE,kBAAkB,IAAI;AAE9B,YAAM,qBAAqB;QACzB,CAAC,iBAAiB,GAAG,KAAK,QAAQ,eAAe;QACjD,GAAG,KAAK,QAAQ;MAClB;AACA,YAAM,WAAW,uBAAuB,kBAAkB;AAG1D,YAAM,aAAoB,CAAC;AAG3B,UAAI,KAAK,QAAQ,UAAU;AACzB,cAAM,WAAW,MAAM,OAAO,mBAAyC;AACvE,cAAM,EAAE,kBAAkB,IAAI;AAC9B,cAAM,WAAW,IAAI,kBAAkB;UACrC,KAAK,KAAK,QAAQ;UAClB,SAAS,KAAK,QAAQ;QACxB,CAAC;AACD,mBAAW,KAAK,IAAI,oBAAoB,QAAQ,CAAC;MACnD;AAGA,UAAI,KAAK,QAAQ,cAAc;AAC7B,cAAM,EAAE,sBAAAgB,sBAAqB,IAAI,MAAM,OAAO,gDAA8B;AAC5E,mBAAW;UACT,IAAI;YACF,IAAIA,sBAAqB,KAAK,QAAQ,cAAc,kBAAkB;UACxE;QACF;MACF;AAEA,UAAI,WAAW,WAAW,GAAG;AAC3B,eAAO;MACT;AAEA,WAAK,WAAW,IAAI,SAAS;QAC3B;QACA,gBAAgB;MAClB,CAAC;AACD,WAAK,SAAS,SAAS;AACvB,WAAK,MAAM;AACX,WAAK,SAAS,IAAI,MAAM,UAAU,UAAU,OAAO;AACnD,WAAK,gBAAgB,SAAS,6BAA6B;AAC3D,aAAO;IACT,QAAQ;AACN,aAAO;IACT;EACF;;EAGA,MAAM,aAAa,QAAyC;AAC1D,QAAI,CAAC,KAAK,UAAU,CAAC,KAAK,IAAK;AAE/B,UAAM,MAAM,KAAK;AACjB,UAAM,SAAS,KAAK;AACpB,UAAM,iBAAiB,KAAK,QAAQ,kBAAkB;AAGtD,UAAM,UAAU,SAAS,OAAO,aAAa,OAAO,SAAS;AAC7D,UAAM,QAAQ,SAAS,OAAO,WAAW,OAAO,SAAS;AAGzD,QAAI,YAAY,IAAI;AACpB,UAAM,cAAc,QAAQ,IAAI;AAChC,QAAI,eAAe,KAAK,eAAe;AACrC,UAAI;AACF,cAAM,aAAa,IAAI,KAAK,cAAc;AAC1C,oBAAY,WAAW;UACrB,IAAI;UACJ,EAAE,aAAa,YAAY,QAAQ,IAAI,cAAc,GAAG;UACxD;YACE,KAAK,CAAC,SAAiC,QAAgB,QAAQ,GAAG;YAClE,MAAM,CAAC,YAAoC,OAAO,KAAK,OAAO;UAChE;QACF;MACF,QAAQ;MAER;IACF;AAEA,WAAO;MACL;MACA,EAAE,WAAW,QAAQ;MACrB;MACA,CAAC,aAKK;AAEJ,iBAAS,aAAa,yBAAyB,UAAU;AACzD,iBAAS,aAAa,iBAAiB,QAAQ;AAG/C,iBAAS,aAAa,kBAAkB,OAAO,MAAM;AACrD,iBAAS,aAAa,iBAAiB,OAAO,MAAM;AACpD,YAAI,OAAO,MAAO,UAAS,aAAa,gBAAgB,OAAO,KAAK;AACpE,iBAAS,aAAa,gBAAgB,OAAO,KAAK;AAClD,YAAI,kBAAkB,OAAO,OAAO,SAAS,GAAG;AAC9C,mBAAS,aAAa,sBAAsB,OAAO,MAAM;QAC3D;AAGA,YAAI,OAAO,cAAc;AACvB,mBAAS,aAAa,4BAA4B,OAAO,UAAU;AACrE,YAAI,OAAO,WAAW,KAAM,UAAS,aAAa,yBAAyB,OAAO,OAAO;AACzF,YAAI,OAAO,YAAY;AACrB,cAAI,OAAO,WAAW,SAAS,MAAM;AACnC,qBAAS,aAAa,4BAA4B,OAAO,WAAW,KAAK;UAC3E;AACA,cAAI,OAAO,WAAW,UAAU,MAAM;AACpC,qBAAS,aAAa,6BAA6B,OAAO,WAAW,MAAM;UAC7E;AACA,cAAI,OAAO,WAAW,UAAU,MAAM;AACpC,qBAAS,aAAa,6BAA6B,OAAO,WAAW,MAAM;UAC7E;QACF;AAGA,YAAI,OAAO,OAAO;AAChB,gBAAM,IAAI,OAAO;AACjB,mBAAS,aAAa,4BAA4B,EAAE,UAAU;AAC9D,mBAAS;YACP;YACA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG;UAC1C;AACA,cAAI,EAAE,gBAAgB;AACpB,qBAAS,aAAa,+BAA+B,EAAE,YAAY;QACvE;AAMA,cAAM,gBAAgB,OAAO,OAAO,YAAY,CAAC;AACjD,YAAI,cAAc,SAAS,GAAG;AAC5B,gBAAMC,aAAY,IAAI,MAAM,QAAQ,IAAI,QAAQ,OAAO,GAAG,QAAQ;AAElE,cAAI,KAAK,QAAQ,YAAY;AAC3B,kBAAM,QAAQ,uBAAuB,aAAa;AAClD,gBAAI,MAAM,SAAS,GAAG;AACpB,yBAAW,CAAC,GAAG,IAAI,KAAK,MAAM,QAAQ,GAAG;AACvC,oBAAI,QAAQ,KAAKA,YAAW,MAAM;AAChC,yBAAO;oBACL,eAAe,IAAI,CAAC;oBACpB,CAAC;oBACD,CAAC,aAEK;AACJ,4BAAM,UAAU,IAAI,MAAM,QAAQ,IAAI,QAAQ,OAAO,GAAG,QAAQ;AAChE,iCAAW,OAAO,KAAK,UAAU;AAC/B,6BAAK,cAAc,QAAQ,KAAK,SAAS,KAAK,cAAc;sBAC9D;AACA,+BAAS,IAAI;oBACf;kBACF;gBACF,CAAC;cACH;YACF,OAAO;AACL,yBAAW,OAAO,eAAe;AAC/B,qBAAK,cAAc,QAAQ,KAAKA,YAAW,KAAK,cAAc;cAChE;YACF;UACF,OAAO;AACL,uBAAW,OAAO,eAAe;AAC/B,mBAAK,cAAc,QAAQ,KAAKA,YAAW,KAAK,cAAc;YAChE;UACF;QACF;AAGA,YAAI,OAAO,QAAQ;AACjB,qBAAW,SAAS,OAAO,QAAQ;AACjC,qBAAS,SAAS,iBAAiB,MAAM,IAAI,IAAI;cAC/C,uBAAuB,MAAM;cAC7B,sBAAsB,MAAM;cAC5B,GAAI,MAAM,UAAU,EAAE,yBAAyB,MAAM,QAAQ,IAAI,CAAC;YACpE,CAAC;UACH;QACF;AAGA,YAAI,OAAO,OAAO;AAChB,mBAAS,UAAU,EAAE,MAAM,IAAI,eAAe,OAAO,SAAS,OAAO,MAAM,CAAC;QAC9E,OAAO;AACL,mBAAS,UAAU,EAAE,MAAM,IAAI,eAAe,GAAG,CAAC;QACpD;AAEA,iBAAS,IAAI,KAAK;MACpB;IACF;EACF;;EAGA,MAAM,WAA0B;AAC9B,UAAM,KAAK,UAAU,SAAS;EAChC;;EAGA,0BAAwD;AACtD,QAAI,CAAC,KAAK,UAAU,CAAC,KAAK,IAAK,QAAO;AAEtC,QAAI;AACJ,UAAM,cAAc,QAAQ,IAAI;AAChC,QAAI,eAAe,KAAK,eAAe;AACrC,UAAI;AACF,cAAM,aAAa,IAAI,KAAK,cAAc;AAC1C,oBAAY,WAAW;UACrB,KAAK,IAAI;UACT,EAAE,aAAa,YAAY,QAAQ,IAAI,cAAc,GAAG;UACxD;YACE,KAAK,CAAC,SAAiC,QAAgB,QAAQ,GAAG;YAClE,MAAM,CAAC,YAAoC,OAAO,KAAK,OAAO;UAChE;QACF;MACF,QAAQ;MAER;IACF;AACA,WAAO,IAAI;MACT,KAAK;MACL,KAAK;MACL,KAAK,QAAQ,kBAAkB;MAC/B;IACF;EACF;;;;EAMQ,cACN,QACA,KACA,WACA,KACA,gBACM;AACN,UAAM,cAAc,IAAI,SAAS;AACjC,UAAM,QAAQ,IAAI,UAAU,QAAQ,OAAO,IAAI,SAAS,KAAK,IAAI;AACjE,UAAM,WAAW,cAAc,QAAQ,SAAS,SAAS,KAAK,kBAAkB,IAAI,IAAI;AAExF,UAAM,UAAU,SAAS,IAAI,SAAS;AACtC,UAAM,QAAQ,SAAS,IAAI,OAAO;AAElC,QAAI,QAAQ,KAAK,WAAW,MAAM;AAChC,aAAO;QACL;QACA,EAAE,WAAW,QAAQ;QACrB;QACA,CAAC,SAGK;AACJ,cAAI,aAAa;AACf,iBAAK,aAAa,yBAAyB,MAAM;UACnD;AACA,cAAI,OAAO;AACT,iBAAK,aAAa,wBAAwB,KAAK;AAC/C,iBAAK,aAAa,yBAAyB,KAAK;UAClD;AAGA,cAAI,IAAI,YAAY;AAClB,gBAAI,IAAI,WAAW,SAAS,MAAM;AAChC,mBAAK,aAAa,6BAA6B,IAAI,WAAW,KAAK;YACrE;AACA,gBAAI,IAAI,WAAW,UAAU,MAAM;AACjC,mBAAK,aAAa,8BAA8B,IAAI,WAAW,MAAM;YACvE;AACA,gBAAI,IAAI,WAAW,UAAU,MAAM;AACjC,mBAAK,aAAa,wCAAwC,IAAI,WAAW,MAAM;YACjF;UACF;AAEA,cAAI,kBAAkB,IAAI,WAAW,MAAM;AACzC,iBAAK;cACH;cACA,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU,KAAK,UAAU,IAAI,OAAO;YAC5E;UACF;AAGA,cAAI,IAAI,WAAW;AACjB,kBAAM,SAAS,IAAI,MAAM,QAAQ,IAAI,QAAQ,OAAO,GAAG,IAAI;AAC3D,uBAAW,MAAM,IAAI,WAAW;AAC9B,kBAAI,QAAQ,KAAK,QAAQ,MAAM;AAC7B,uBAAO;kBACL,gBAAgB,GAAG,IAAI;kBACvB,CAAC;kBACD;kBACA,CAAC,aAGK;AACJ,6BAAS,aAAa,oBAAoB,GAAG,IAAI;AACjD,wBAAI,GAAG,GAAI,UAAS,aAAa,uBAAuB,GAAG,EAAE;AAE7D,wBAAI,gBAAgB;AAClB,0BAAI,GAAG,SAAS,MAAM;AACpB,iCAAS;0BACP;0BACA,OAAO,GAAG,UAAU,WAAW,GAAG,QAAQ,KAAK,UAAU,GAAG,KAAK;wBACnE;sBACF;AACA,0BAAI,GAAG,UAAU,MAAM;AACrB,iCAAS;0BACP;0BACA,OAAO,GAAG,WAAW,WAAW,GAAG,SAAS,KAAK,UAAU,GAAG,MAAM;wBACtE;sBACF;oBACF;AAEA,6BAAS,IAAI;kBACf;gBACF;cACF,CAAC;YACH;UACF;AAEA,eAAK,IAAI,KAAK;QAChB;MACF;IACF,CAAC;EACH;AACF;AAUO,IAAM,wBAAN,MAA4B;EAiBjC,YACmB,QACA,KACA,gBAEA,WACjB;AALiB,SAAA,SAAA;AACA,SAAA,MAAA;AACA,SAAA,iBAAA;AAEA,SAAA,YAAA;EAChB;;EArBK,WAAgB;;EAEhB,UAAe;EACf,qBAAqB;EACrB,iBASG;;EAWX,cAAc,QAAgB,QAAgB,SAAwB;AACpE,SAAK,iBAAiB;AACtB,SAAK,qBAAqB;AAC1B,UAAM,MAAM,KAAK,aAAa,KAAK,IAAI,QAAQ,OAAO;AACtD,SAAK,WAAW,KAAK,OAAO,UAAU,eAAe,QAAW,GAAG;AACnE,SAAK,SAAS,aAAa,yBAAyB,UAAU;AAC9D,SAAK,SAAS,aAAa,iBAAiB,QAAQ;AACpD,SAAK,SAAS,aAAa,kBAAkB,MAAM;AACnD,SAAK,SAAS,aAAa,iBAAiB,MAAM;AAClD,QAAI,QAAS,MAAK,SAAS,aAAa,gBAAgB,OAAO;AAC/D,SAAK,UAAU,KAAK,IAAI,MAAM,QAAQ,KAAK,IAAI,QAAQ,OAAO,GAAG,KAAK,QAAQ;EAChF;;EAGA,WACE,MACA,OACA,QACA,aACA,YACM;AACN,QAAI,CAAC,KAAK,QAAS;AACnB,SAAK,qBAAqB;AAC1B,SAAK,IAAI,QAAQ,KAAK,KAAK,SAAS,MAAM;AACxC,YAAM,OAAO,KAAK,OAAO,UAAU,gBAAgB,IAAI,IAAI,QAAW,KAAK,OAAO;AAClF,WAAK,aAAa,oBAAoB,IAAI;AAC1C,UAAI,WAAY,MAAK,aAAa,uBAAuB,UAAU;AACnE,UAAI,KAAK,gBAAgB;AACvB,YAAI,SAAS;AACX,eAAK;YACH;YACA,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,KAAK;UAC1D;AACF,YAAI,UAAU;AACZ,eAAK;YACH;YACA,OAAO,WAAW,WAAW,SAAS,KAAK,UAAU,MAAM;UAC7D;MACJ;AACA,WAAK,IAAI;IACX,CAAC;EACH;;EAGA,UAAU,OAAe,YAAuC;AAC9D,QAAI,CAAC,KAAK,QAAS;AACnB,SAAK,qBAAqB;AAC1B,SAAK,IAAI,QAAQ,KAAK,KAAK,SAAS,MAAM;AACxC,YAAM,OAAO,KAAK,OAAO,UAAU,QAAQ,KAAK,IAAI,QAAW,KAAK,OAAO;AAC3E,WAAK,aAAa,yBAAyB,MAAM;AACjD,WAAK,aAAa,wBAAwB,KAAK;AAC/C,WAAK,aAAa,yBAAyB,KAAK;AAChD,UAAI,YAAY;AACd,YAAI,WAAW,SAAS;AACtB,eAAK,aAAa,6BAA6B,WAAW,KAAK;AACjE,YAAI,WAAW,UAAU;AACvB,eAAK,aAAa,8BAA8B,WAAW,MAAM;AACnE,YAAI,WAAW,UAAU;AACvB,eAAK,aAAa,wCAAwC,WAAW,MAAM;MAC/E;AACA,WAAK,IAAI;IACX,CAAC;EACH;;EAGA,kBAAkB,QAST;AACP,SAAK,iBAAiB;EACxB;;EAGA,iBAAiB,OAAe,OAAsB;AACpD,QAAI,CAAC,KAAK,SAAU;AACpB,SAAK,SAAS,aAAa,gBAAgB,KAAK;AAChD,QAAI,KAAK,gBAAgB,cAAc,MAAM;AAC3C,WAAK,SAAS,aAAa,4BAA4B,KAAK,eAAe,UAAU;IACvF;AACA,QAAI,KAAK,gBAAgB,WAAW,MAAM;AACxC,WAAK,SAAS,aAAa,yBAAyB,KAAK,eAAe,OAAO;IACjF;AACA,QAAI,KAAK,gBAAgB,YAAY;AACnC,UAAI,KAAK,eAAe,WAAW,SAAS,MAAM;AAChD,aAAK,SAAS;UACZ;UACA,KAAK,eAAe,WAAW;QACjC;MACF;AACA,UAAI,KAAK,eAAe,WAAW,UAAU,MAAM;AACjD,aAAK,SAAS;UACZ;UACA,KAAK,eAAe,WAAW;QACjC;MACF;AACA,UAAI,KAAK,eAAe,WAAW,UAAU,MAAM;AACjD,aAAK,SAAS;UACZ;UACA,KAAK,eAAe,WAAW;QACjC;MACF;IACF;AACA,QAAI,KAAK,gBAAgB,OAAO;AAC9B,WAAK,SAAS,aAAa,4BAA4B,KAAK,eAAe,MAAM,UAAU;AAC3F,WAAK,SAAS;QACZ;QACA,OAAO,KAAK,KAAK,eAAe,MAAM,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG;MAClE;AACA,UAAI,KAAK,eAAe,MAAM,gBAAgB,MAAM;AAClD,aAAK,SAAS;UACZ;UACA,KAAK,eAAe,MAAM;QAC5B;MACF;IACF;AACA,QAAI,OAAO;AACT,WAAK,SAAS,UAAU,EAAE,MAAM,KAAK,IAAI,eAAe,OAAO,SAAS,MAAM,CAAC;IACjF,OAAO;AACL,WAAK,SAAS,UAAU,EAAE,MAAM,KAAK,IAAI,eAAe,GAAG,CAAC;IAC9D;AACA,SAAK,SAAS,IAAI;AAClB,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,qBAAqB;AAC1B,SAAK,iBAAiB;EACxB;;EAGA,mBAAmB,QAAgC;AACjD,SAAK,kBAAkB;MACrB,YAAY,OAAO;MACnB,SAAS,OAAO;MAChB,YAAY,OAAO;MACnB,OAAO,OAAO;IAChB,CAAC;AAED,QAAI,KAAK,sBAAsB,CAAC,KAAK,SAAS;AAC5C;IACF;AAEA,UAAM,QACJ,OAAO,MAAM,SAAS,KAAK,CAAC,QAAQ,IAAI,SAAS,WAAW,GAAG,UAAU,SACzE,OAAO,UACP;AAEF,SAAK,UAAU,OAAO,KAAK,GAAG,OAAO,UAAU;AAE/C,eAAW,WAAW,OAAO,MAAM,UAAU;AAC3C,iBAAW,YAAY,QAAQ,aAAa,CAAC,GAAG;AAC9C,aAAK;UACH,SAAS;UACT,SAAS;UACT,SAAS;UACT,SAAS,cAAc;UACvB,SAAS;QACX;MACF;IACF;EACF;;EAGA,mBAAwE;AACtE,QAAI,CAAC,KAAK,SAAU,QAAO;AAC3B,QAAI;AACF,YAAM,UAAU,KAAK,SAAS,cAAc,KAAK,KAAK,SAAS;AAC/D,UAAI,CAAC,SAAS,WAAW,CAAC,SAAS,OAAQ,QAAO;AAClD,aAAO,EAAE,cAAc,QAAQ,QAAQ,YAAY,QAAQ,QAAQ;IACrE,QAAQ;AACN,aAAO;IACT;EACF;;EAGA,qBAA8C;AAC5C,WAAO;MACL,eAAe,CAAC,MAAM,OAAO,QAAQ,YAAY,eAC/C,KAAK,WAAW,MAAM,OAAO,QAAQ,YAAY,UAAU;MAC7D,cAAc,CAAC,OAAO,eAAe,KAAK,UAAU,OAAO,UAAU;MACrE,kBAAkB,MAAM,KAAK,iBAAiB;IAChD;EACF;AACF;AAUA,SAAS,uBAAuB,UAAsC;AACpE,QAAM,QAAgB,CAAC;AACvB,MAAI,UAAqB,CAAC;AAC1B,aAAW,OAAO,UAAU;AAC1B,QAAI,IAAI,SAAS,UAAU,QAAQ,SAAS,GAAG;AAC7C,YAAM,KAAK,EAAE,UAAU,QAAQ,CAAC;AAChC,gBAAU,CAAC;IACb;AACA,YAAQ,KAAK,GAAG;EAClB;AACA,MAAI,QAAQ,SAAS,EAAG,OAAM,KAAK,EAAE,UAAU,QAAQ,CAAC;AACxD,SAAO;AACT;AAOA,SAAS,SAAS,KAAkC;AAClD,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,IAAI,KAAK,GAAG,EAAE,QAAQ;AAC/B;ACpmBO,IAAM,mBAAN,MAAuB;EAG5B,YAA6B,QAAgB;AAAhB,SAAA,SAAA;EAAiB;EAFtC,aAAa;;EAKrB,IAAI,SAAuB;AACzB,SAAK,cAAc;EACrB;;EAGA,aAAsB;AACpB,WAAO,KAAK,cAAc,KAAK;EACjC;;EAGA,IAAI,iBAAyB;AAC3B,WAAO,KAAK;EACd;;EAGA,IAAI,eAAuB;AACzB,WAAO,KAAK;EACd;AACF;ACDO,SAAS,eAAe,QAAwC;AACrE,QAAM,SAAiC,CAAC;AAExC,aAAW,QAAQ,OAAO,MAAM,IAAI,GAAG;AACrC,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AAGzC,UAAM,QAAQ,QAAQ,MAAM,+CAA+C;AAC3E,QAAI,CAAC,MAAO;AAEZ,UAAM,MAAM,MAAM,CAAC;AACnB,QAAI,QAAQ,MAAM,CAAC;AAGnB,QACG,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,KAC3C,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAC5C;AACA,cAAQ,MAAM,MAAM,GAAG,EAAE;IAC3B;AAEA,QAAI,KAAK;AACP,aAAO,GAAG,IAAI;IAChB;EACF;AAEA,SAAO;AACT;AAYO,SAAS,qBAAqB,SAAuB;AAC1D,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,QAAQ,YAAY,QAAQ;AAClC,QAAM,YAAY,YAAY,OAAO;AAErC,UAAQ,IAAI,gCAAgC,OAAO,EAAE;AAErD,QAAM,SAAS,UAAU,OAAO,CAAC,WAAW,OAAO,GAAG;IACpD,UAAU;;IAEV,OAAO,CAAC,UAAU,QAAQ,MAAM;EAClC,CAAC;AAGD,MAAI,OAAO,QAAQ;AACjB,YAAQ,OAAO,MAAM,OAAO,MAAM;EACpC;AAEA,MAAI,OAAO,OAAO;AAChB,UAAM,IAAI,MAAM,wCAAwC,OAAO,MAAM,OAAO,EAAE;EAChF;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI;MACR,wCAAwC,OAAO,UAAU,SAAS,KAAK,OAAO;IAChF;EACF;AAEA,QAAM,OAAO,eAAe,OAAO,UAAU,EAAE;AAC/C,MAAI,WAAW;AAEf,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,QAAI,QAAQ,IAAI,GAAG,MAAM,QAAW;AAClC,cAAQ,IAAI,GAAG,IAAI;AACnB;IACF;EACF;AAEA,MAAI,WAAW,GAAG;AAChB,YAAQ,IAAI,gCAAgC,QAAQ,2BAA2B;EACjF;AACF;AC3DA,IAAM,gBAAgB,oBAAI,IAAI,CAAC,YAAY,UAAU,uBAAuB,CAAC;AAEtE,SAAS,mBAAmB,OAAgC;AACjE,QAAM,WAAsB,CAAC;AAC7B,MAAI,YAAY;AAChB,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AAGJ,QAAM,mBAAmB,oBAAI,IAAyB;AAGtD,MAAI;AACJ,MAAI,mBAAmB;AAGvB,QAAM,mBAAmB,oBAAI,IAAiD;AAE9E,QAAM,QAAQ,MAAM,MAAM,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;AAEjE,aAAW,QAAQ,OAAO;AACxB,QAAI;AACJ,QAAI;AACF,cAAQ,KAAK,MAAM,IAAI;IACzB,QAAQ;AACN;IACF;AAEA,QAAI,CAAC,MAAM,KAAM;AAGjB,QAAI,MAAM,WAAW;AACnB,UAAI,CAAC,eAAgB,kBAAiB,MAAM;AAC5C,qBAAe,MAAM;IACvB;AAGA,QAAI,cAAc,IAAI,MAAM,IAAI,EAAG;AAGnC,QAAI,MAAM,YAAa;AAGvB,QAAI,CAAC,aAAa,MAAM,WAAW;AACjC,kBAAY,MAAM;IACpB;AACA,QAAI,CAAC,eAAe,MAAM,KAAK;AAC7B,oBAAc,MAAM;IACtB;AAEA,YAAQ,MAAM,MAAM;MAClB,KAAK,QAAQ;AACX,cAAM,MAAM,MAAM;AAClB,YAAI,CAAC,IAAK;AAEV,cAAM,aAAa,IAAI;AAIvB,YAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,qBAAW,SAAS,YAA6C;AAC/D,gBAAI,MAAM,SAAS,iBAAiB,MAAM,aAAa;AACrD,oBAAM,UAAU,iBAAiB,IAAI,MAAM,WAAW;AACtD,kBAAI,SAAS;AACX,sBAAM,cAAc,SAAS,QAAQ,MAAM;AAC3C,sBAAM,gBAAgB,CAAC,GAAI,YAAY,aAAa,CAAC,CAAE;AACvD,8BAAc,QAAQ,OAAO,IAAI;kBAC/B,GAAG,cAAc,QAAQ,OAAO;kBAChC,QAAQ,yBAAyB,MAAM,OAAO;gBAChD;AACA,yBAAS,QAAQ,MAAM,IAAI,EAAE,GAAG,aAAa,WAAW,cAAc;AACtE,iCAAiB,OAAO,MAAM,WAAW;cAC3C;YACF;UACF;QACF;AAGA,cAAM,OAAO,mBAAmB,UAAU;AAC1C,YAAI,SAAS,QAAW;AACtB,mBAAS,KAAK,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;QAC/C;AACA;MACF;MAEA,KAAK,aAAa;AAChB,cAAM,MAAM,MAAM;AAClB,YAAI,CAAC,IAAK;AAGV,YAAI,CAAC,SAAS,IAAI,OAAO;AACvB,kBAAQ,IAAI;QACd;AAGA,YAAI,IAAI,SAAS,MAAM,WAAW;AAChC,2BAAiB,IAAI,MAAM,WAAW,IAAI,KAAK;QACjD;AAGA,cAAM,EAAE,MAAM,UAAU,IAAI,wBAAwB,IAAI,OAAO;AAG/D,YACE,MAAM,aACN,MAAM,cAAc,0BACpB,oBAAoB,GACpB;AAEA,mBAAS,gBAAgB,IAAI;YAC3B,MAAM;YACN,SAAS,QAAQ;YACjB,WAAW,UAAU,SAAS,IAAI,YAAY;UAChD;AAEA,mCAAyB,WAAW,kBAAkB,gBAAgB;QACxE,OAAO;AAEL,cAAI,QAAQ,UAAU,SAAS,GAAG;AAChC,+BAAmB,SAAS;AAC5B,qBAAS,KAAK;cACZ,MAAM;cACN,SAAS,QAAQ;cACjB,WAAW,UAAU,SAAS,IAAI,YAAY;YAChD,CAAC;AACD,qCAAyB,WAAW,kBAAkB,gBAAgB;UACxE;QACF;AACA,iCAAyB,MAAM;AAC/B;MACF;IACF;EACF;AAGA,MAAI,mBAAmB;AACvB,MAAI,oBAAoB;AACxB,aAAW,SAAS,iBAAiB,OAAO,GAAG;AAC7C,wBAAoB,OAAO,MAAM,gBAAgB,CAAC;AAClD,yBAAqB,OAAO,MAAM,iBAAiB,CAAC;EACtD;AACA,QAAM,WAAW,iBAAiB,OAAO;AAEzC,MAAI;AACJ,MAAI,kBAAkB,cAAc;AAClC,iBAAa,IAAI,KAAK,YAAY,EAAE,QAAQ,IAAI,IAAI,KAAK,cAAc,EAAE,QAAQ;EACnF;AAEA,QAAM,SAA2B;IAC/B,UAAU;IACV;IACA;IACA,WAAW;IACX;EACF;AAEA,SAAO;IACL;IACA;IACA,YAAY,WAAW,EAAE,OAAO,kBAAkB,QAAQ,kBAAkB,IAAI;IAChF;IACA,SAAS;EACX;AACF;AAKA,SAAS,yBACP,WACA,QACA,SACM;AACN,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,UAAM,KAAK,UAAU,CAAC,EAAE;AACxB,QAAI,IAAI;AACN,cAAQ,IAAI,IAAI,EAAE,QAAQ,SAAS,EAAE,CAAC;IACxC;EACF;AACF;AAKA,SAAS,mBACP,SACoB;AACpB,MAAI,YAAY,UAAa,YAAY,KAAM,QAAO;AACtD,MAAI,OAAO,YAAY,SAAU,QAAO;AAExC,QAAM,YAAsB,CAAC;AAC7B,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,SAAS,UAAU,MAAM,MAAM;AACvC,gBAAU,KAAK,MAAM,IAAI;IAC3B;EACF;AACA,SAAO,UAAU,SAAS,IAAI,UAAU,KAAK,EAAE,IAAI;AACrD;AAMA,SAAS,wBAAwB,SAG/B;AACA,MAAI,YAAY,UAAa,YAAY,MAAM;AAC7C,WAAO,EAAE,MAAM,QAAW,WAAW,CAAC,EAAE;EAC1C;AACA,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,EAAE,MAAM,SAAS,WAAW,CAAC,EAAE;EACxC;AAEA,QAAM,YAAsB,CAAC;AAC7B,QAAM,YAAwB,CAAC;AAE/B,aAAW,SAAS,SAAS;AAC3B,YAAQ,MAAM,MAAM;MAClB,KAAK;AACH,YAAI,MAAM,KAAM,WAAU,KAAK,MAAM,IAAI;AACzC;MAEF,KAAK;AACH,YAAI,MAAM,MAAM;AACd,oBAAU;YACR,kBAAkB,UAAU;cAC1B,MAAM,MAAM;cACZ,OAAO,MAAM;cACb,IAAI,MAAM;YACZ,CAAC;UACH;QACF;AACA;IAGJ;EACF;AAEA,SAAO;IACL,MAAM,UAAU,SAAS,IAAI,UAAU,KAAK,EAAE,IAAI;IAClD;EACF;AACF;AAKA,SAAS,yBACP,SACoB;AACpB,MAAI,YAAY,UAAa,YAAY,KAAM,QAAO;AACtD,MAAI,OAAO,YAAY,SAAU,QAAO;AAExC,QAAM,QAAkB,CAAC;AACzB,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,SAAS,UAAU,MAAM,MAAM;AACvC,YAAM,KAAK,MAAM,IAAI;IACvB;EACF;AACA,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,EAAE,IAAI;AAC7C;AC3RO,SAAS,kBAAkB,OAAgC;AAChE,QAAM,WAAsB,CAAC;AAC7B,MAAI,YAAY;AAChB,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AAGJ,QAAM,eAAe,oBAAI,IAAiD;AAE1E,QAAM,QAAQ,MAAM,MAAM,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;AAEjE,aAAW,QAAQ,OAAO;AACxB,QAAI;AACJ,QAAI;AACF,cAAQ,KAAK,MAAM,IAAI;IACzB,QAAQ;AACN;IACF;AAEA,QAAI,CAAC,MAAM,KAAM;AAGjB,QAAI,MAAM,WAAW;AACnB,UAAI,CAAC,eAAgB,kBAAiB,MAAM;AAC5C,qBAAe,MAAM;IACvB;AAEA,UAAM,UAAU,MAAM,WAAW,CAAC;AAElC,YAAQ,MAAM,MAAM;MAClB,KAAK,gBAAgB;AACnB,oBAAY,OAAO,QAAQ,MAAM,EAAE;AACnC,cAAM,QAAQ,MAAM,OAAO,QAAQ,GAAG,IAAI;AAC1C,kBAAU,QAAQ,cAAc,OAAO,QAAQ,WAAW,IAAI;AAC9D,YAAI,QAAQ,SAAS,CAAC,OAAO;AAC3B,kBAAQ,OAAO,QAAQ,KAAK;QAC9B;AACA;MACF;MAEA,KAAK,gBAAgB;AACnB,YAAI,QAAQ,SAAS,CAAC,OAAO;AAC3B,kBAAQ,OAAO,QAAQ,KAAK;QAC9B;AACA,YAAI,QAAQ,OAAO,CAAC,KAAK;AACvB,gBAAM,OAAO,QAAQ,GAAG;QAC1B;AACA;MACF;MAEA,KAAK,iBAAiB;AACpB,cAAM,WAAW,OAAO,QAAQ,QAAQ,EAAE;AAC1C,cAAM,OAAO,OAAO,QAAQ,QAAQ,EAAE;AAEtC,gBAAQ,UAAU;UAChB,KAAK,WAAW;AAEd,gBAAI,SAAS,YAAa;AAE1B,kBAAM,UAAU,2BAA2B,QAAQ,OAAO;AAC1D,gBAAI,SAAS,UAAU,SAAS;AAC9B,uBAAS,KAAK,EAAE,MAAM,QAAQ,QAAQ,CAAC;YACzC,WAAW,SAAS,eAAe,SAAS;AAC1C,uBAAS,KAAK,EAAE,MAAM,aAAa,QAAQ,CAAC;YAC9C;AACA;UACF;UAEA,KAAK,iBAAiB;AACpB,kBAAM,WAAW,OAAO,QAAQ,QAAQ,EAAE;AAC1C,kBAAM,SAAS,OAAO,QAAQ,WAAW,EAAE;AAC3C,gBAAI;AACJ,gBAAI,OAAO,QAAQ,cAAc,UAAU;AACzC,kBAAI;AACF,wBAAQ,KAAK,MAAM,QAAQ,SAAS;cACtC,QAAQ;AACN,wBAAQ,QAAQ;cAClB;YACF,OAAO;AACL,sBAAQ,QAAQ;YAClB;AAEA,kBAAM,WAAqB,kBAAkB,SAAS;cACpD,MAAM;cACN;cACA,IAAI;YACN,CAAC;AACD,kBAAM,SAAS,SAAS;AACxB,qBAAS,KAAK;cACZ,MAAM;cACN,WAAW,CAAC,QAAQ;YACtB,CAAC;AAED,gBAAI,QAAQ;AACV,2BAAa,IAAI,QAAQ,EAAE,QAAQ,SAAS,EAAE,CAAC;YACjD;AACA;UACF;UAEA,KAAK,oBAAoB;AACvB,kBAAM,WAAW,OAAO,QAAQ,QAAQ,EAAE;AAC1C,kBAAM,SAAS,OAAO,QAAQ,WAAW,EAAE;AAC3C,gBAAI;AACJ,gBAAI,OAAO,QAAQ,cAAc,UAAU;AACzC,kBAAI;AACF,wBAAQ,KAAK,MAAM,QAAQ,SAAS;cACtC,QAAQ;AACN,wBAAQ,QAAQ;cAClB;YACF,OAAO;AACL,sBAAQ,QAAQ;YAClB;AAEA,kBAAM,WAAqB,kBAAkB,SAAS;cACpD,MAAM;cACN;cACA,IAAI;YACN,CAAC;AACD,kBAAM,SAAS,SAAS;AACxB,qBAAS,KAAK;cACZ,MAAM;cACN,WAAW,CAAC,QAAQ;YACtB,CAAC;AAED,gBAAI,QAAQ;AACV,2BAAa,IAAI,QAAQ,EAAE,QAAQ,SAAS,EAAE,CAAC;YACjD;AACA;UACF;UAEA,KAAK;UACL,KAAK,2BAA2B;AAC9B,kBAAM,SAAS,OAAO,QAAQ,WAAW,EAAE;AAC3C,kBAAM,UAAU,aAAa,IAAI,MAAM;AACvC,gBAAI,SAAS;AACX,oBAAM,cAAc,SAAS,QAAQ,MAAM;AAC3C,oBAAM,gBAAgB,CAAC,GAAI,YAAY,aAAa,CAAC,CAAE;AACvD,4BAAc,QAAQ,OAAO,IAAI;gBAC/B,GAAG,cAAc,QAAQ,OAAO;gBAChC,QAAQ,QAAQ;cAClB;AACA,uBAAS,QAAQ,MAAM,IAAI,EAAE,GAAG,aAAa,WAAW,cAAc;AACtE,2BAAa,OAAO,MAAM;YAC5B;AACA;UACF;;UAGA,KAAK;AACH;QACJ;AACA;MACF;IAIF;EACF;AAEA,MAAI;AACJ,MAAI,kBAAkB,cAAc;AAClC,iBAAa,IAAI,KAAK,YAAY,EAAE,QAAQ,IAAI,IAAI,KAAK,cAAc,EAAE,QAAQ;EACnF;AAEA,QAAM,SAA2B;IAC/B,UAAU;IACV;IACA;IACA,WAAW;IACX;IACA;EACF;AAEA,SAAO;IACL;IACA;;IAEA,YAAY;IACZ;IACA,SAAS;EACX;AACF;AAMA,SAAS,2BAA2B,SAAsC;AACxE,MAAI,OAAO,YAAY,SAAU,QAAO;AACxC,MAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO;AAEpC,QAAM,QAAkB,CAAC;AACzB,aAAW,SAAS,SAAS;AAC3B,QAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,YAAM,IAAI;AACV,UAAI,OAAO,EAAE,SAAS,UAAU;AAC9B,cAAM,KAAK,EAAE,IAAI;MACnB;IACF;EACF;AACA,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,EAAE,IAAI;AAC7C;ACnNA,IAAM,uBAAuB,MAAMnB,MAAK,KAAK,QAAQ,GAAG,UAAU,UAAU;AAE5E,eAAsB,sBAAsB,MAAsD;AAChG,QAAM,cAAc,MAAM,eAAe,qBAAqB;AAC9D,QAAM,QAAQ,MAAM,SAAS,IAAK,MAAM,SAAS;AAEjD,QAAM,WAA2B,CAAC;AAGlC,MAAI;AACJ,MAAI;AACF,eAAW,MAAMG,SAAQ,WAAW;EACtC,QAAQ;AACN,WAAO,CAAC;EACV;AAEA,aAAW,QAAQ,UAAU;AAC3B,UAAM,WAAWH,MAAK,KAAK,aAAa,IAAI;AAC5C,QAAI;AACJ,QAAI;AACF,kBAAY,MAAMG,SAAQ,QAAQ;IACpC,QAAQ;AACN;IACF;AAEA,eAAW,SAAS,WAAW;AAC7B,YAAM,YAAYH,MAAK,KAAK,UAAU,KAAK;AAC3C,UAAI;AACJ,UAAI;AACF,kBAAU,MAAMG,SAAQ,SAAS;MACnC,QAAQ;AACN;MACF;AAEA,iBAAW,OAAO,SAAS;AAEzB,YAAI,MAAM,MAAM;AACd,gBAAM,UAAU,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG;AACvC,cAAI,YAAY,KAAK,KAAM;QAC7B;AAEA,cAAM,UAAUH,MAAK,KAAK,WAAW,GAAG;AACxC,YAAI;AACJ,YAAI;AACF,kBAAQ,MAAMG,SAAQ,OAAO;QAC/B,QAAQ;AACN;QACF;AAEA,mBAAW,QAAQ,OAAO;AACxB,cAAI,CAAC,KAAK,WAAW,UAAU,KAAK,CAAC,KAAK,SAAS,QAAQ,EAAG;AAE9D,gBAAM,WAAWH,MAAK,KAAK,SAAS,IAAI;AAIxC,gBAAM,iBAAiB,KAAK,QAAQ,YAAY,EAAE;AAClD,gBAAM,QAAQ,eAAe,MAAM,GAAG;AAEtC,gBAAM,YAAY,MAAM,UAAU,IAAI,MAAM,MAAM,EAAE,EAAE,KAAK,GAAG,IAAI;AAElE,cAAI;AACJ,cAAI;AACF,kBAAM,WAAW,MAAMI,MAAK,QAAQ;AACpC,wBAAY,SAAS;UACvB,QAAQ;AACN,wBAAY,oBAAI,KAAK,CAAC;UACxB;AAEA,mBAAS,KAAK,EAAE,WAAW,UAAU,UAAU,MAAM,UAAU,CAAC;QAClE;MACF;IACF;EACF;AAEA,WAAS,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ,CAAC;AACrE,SAAO,SAAS,MAAM,GAAG,KAAK;AAChC;ACvEA,IAAM,uBAAuB,MAAMJ,MAAK,KAAKK,SAAQ,GAAG,WAAW,UAAU;AAM7E,SAAS,kBAAkB,aAA6B;AACtD,SAAO,YAAY,QAAQ,OAAO,GAAG;AACvC;AAEA,eAAsB,uBACpB,MAC0B;AAC1B,QAAM,cAAc,MAAM,eAAe,qBAAqB;AAC9D,QAAM,QAAQ,MAAM,SAAS,IAAK,MAAM,SAAS;AAEjD,MAAI;AACJ,MAAI;AACF,kBAAc,MAAMF,SAAQ,WAAW;EACzC,QAAQ;AACN,WAAO,CAAC;EACV;AAGA,MAAI,MAAM,aAAa;AACrB,UAAM,UAAU,kBAAkB,KAAK,WAAW;AAClD,kBAAc,YAAY,OAAO,CAAC,QAAQ,QAAQ,WAAW,IAAI,SAAS,OAAO,CAAC;EACpF;AAEA,QAAM,WAA4B,CAAC;AAEnC,aAAW,cAAc,aAAa;AACpC,UAAM,UAAUH,MAAK,KAAK,aAAa,UAAU;AAEjD,QAAI;AACJ,QAAI;AACF,gBAAU,MAAMG,SAAQ,OAAO;IACjC,QAAQ;AACN;IACF;AAEA,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,MAAM,SAAS,QAAQ,EAAG;AAE/B,YAAM,YAAY,MAAM,QAAQ,YAAY,EAAE;AAG9C,UAAI,MAAM,aAAa,cAAc,KAAK,UAAW;AAErD,YAAM,WAAWH,MAAK,KAAK,SAAS,KAAK;AAEzC,UAAI;AACJ,UAAI;AACF,cAAM,WAAW,MAAMI,MAAK,QAAQ;AACpC,oBAAY,SAAS;MACvB,QAAQ;AACN,oBAAY,oBAAI,KAAK,CAAC;MACxB;AAEA,eAAS,KAAK;QACZ;QACA;QACA;QACA;MACF,CAAC;IACH;EACF;AAGA,WAAS,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ,CAAC;AAErE,SAAO,SAAS,MAAM,GAAG,KAAK;AAChC;AC7FO,IAAM,qBAAN,MAAM,oBAAuC;EACzC;EACA,OAAO;EACP;EAED;EACA,SAAS;EAEjB,YAAY,YAAoB,SAAkC;AAChE,SAAK,aAAa;AAClB,SAAK,KAAK,cAAc,UAAU;AAClC,SAAK,UAAU;EACjB;;;;EAKA,aAAa,SAAS,UAA+C;AACnE,UAAM,QAAQ,MAAM,oBAAoB,QAAQ;AAChD,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,IAAI,MAAM,6BAA6B,QAAQ,EAAE;IACzD;AACA,UAAM,UAAU,yBAAyB,KAAK;AAC9C,UAAM,eAAe,QAAQ,CAAC,GAAG,OAAO,YAAY;AACpD,WAAO,IAAI,oBAAmB,cAAc,OAAO;EACrD;EAEA,IAAI,YAAoB;AACtB,WAAO,KAAK,QAAQ;EACtB;EAEA,MAAM,OAAO,UAAsD;AACjE,QAAI,KAAK,UAAU,KAAK,QAAQ,QAAQ;AACtC,YAAM,IAAI;QACR,yBAAyB,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,WAAW,IAAI,MAAM,KAAK,kBACtF,KAAK,SAAS,CAAC;MACtB;IACF;AAEA,UAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ;AAExC,WAAO;MACL,QAAQ,MAAM;MACd,YAAY,MAAM,aACd;QACE,OAAO,MAAM,WAAW;QACxB,QAAQ,MAAM,WAAW;QACzB,QAAQ,MAAM,WAAW;QACzB,WAAW,MAAM,WAAW;MAC9B,IACA;MACJ,YAAY,MAAM;MAClB,SAAS,MAAM,WAAW;MAC1B,WAAW,MAAM,OAAO;IAC1B;EACF;AACF;ACqIO,SAAS,oBAAiC;AAC/C,SAAO,EAAE,QAAQ,OAAO;AAC1B;","names":["path","path","readFileSync","existsSync","readdir","stat","homedir","asRecord","stringValue","resourceAttributes","dropUndefined","noSkillFile","z","RESULT_INDEX_FILENAME","inspection","status","isRecord","localBranchExists","outcome","OtlpJsonFileExporter","parentCtx"]}