{
  "files": {
    "main.py": "from core import run\nfrom policy import POLICY\n\n\ndef evaluate(payload):\n    return run(payload, POLICY)\n",
    "core.py": "from datetime import datetime, time, timedelta\nfrom zoneinfo import ZoneInfo\nfrom helpers import parse_utc, overlaps, valid_duration\n\n\ndef run(payload, policy):\n    zone = ZoneInfo(policy['timezone'])\n    now = parse_utc(payload['now'])\n    earliest = now + timedelta(minutes=policy['lead_minutes'])\n    retained = {}\n    for index, row in enumerate(payload['appointments']):\n        identifier = row['id']\n        if identifier not in retained or policy['duplicate_policy'] == 'last':\n            retained[identifier] = (index, row)\n\n    results = {'selected': [], 'blocked': [], 'rejected': []}\n    candidates = []\n    for identifier, (index, row) in retained.items():\n        try:\n            priority = row['priority']\n            cancelled = row['cancelled']\n            duration = row['duration']\n            if type(priority) is not int or type(cancelled) is not bool:\n                raise ValueError('Invalid appointment fields')\n            if not valid_duration(duration, policy['duration_max']):\n                raise ValueError('Invalid duration')\n            start = parse_utc(row['start'])\n            end = start + timedelta(minutes=duration)\n            local_start = start.astimezone(zone)\n            if start < earliest:\n                raise ValueError('Insufficient lead time')\n            if local_start.date().isoformat() == policy['blackout_day']:\n                raise ValueError('Blackout day')\n            cutoff = datetime.combine(local_start.date(), time(policy['cutoff_hour']), tzinfo=zone)\n            cutoff = cutoff.astimezone(now.tzinfo)\n            if end > cutoff or (end == cutoff and not policy['cutoff_inclusive']):\n                raise ValueError('Past cutoff')\n            if cancelled and not policy['cancelled_blocks']:\n                raise ValueError('Cancelled')\n            candidates.append((priority, index, identifier, start, end, cancelled))\n        except (KeyError, TypeError, ValueError, OverflowError):\n            results['rejected'].append((identifier, index))\n\n    candidates.sort(key=lambda item: ((-item[0] if policy['priority_high_first'] else item[0]), item[1]))\n    accepted = []\n    for priority, index, identifier, start, end, cancelled in candidates:\n        count = sum(overlaps(start, end, other_start, other_end, policy['adjacency_allowed'])\n                    for other_start, other_end in accepted)\n        if count >= policy['capacity']:\n            results['rejected'].append((identifier, index))\n            continue\n        accepted.append((start, end))\n        category = 'blocked' if cancelled else 'selected'\n        results[category].append((identifier, index))\n\n    order_key = (lambda item: item[0]) if policy['report_order'] == 'id' else (lambda item: item[1])\n    return {category: [identifier for identifier, index in sorted(items, key=order_key)]\n            for category, items in results.items()}\n",
    "policy.py": "POLICY = {\n    'timezone': 'America/New_York',\n    'cutoff_hour': 17,\n    'cutoff_inclusive': True,\n    'lead_minutes': 30,\n    'adjacency_allowed': True,\n    'duration_max': 120,\n    'duplicate_policy': 'first',\n    'cancelled_blocks': True,\n    'blackout_day': '2026-11-01',\n    'priority_high_first': True,\n    'capacity': 1,\n    'report_order': 'id',\n}\n",
    "helpers.py": "from datetime import datetime, timezone\nfrom math import isfinite\n\n\ndef parse_utc(value):\n    if not isinstance(value, str):\n        raise ValueError('Expected ISO datetime string')\n    parsed = datetime.fromisoformat(value.replace('Z', '+00:00'))\n    if parsed.tzinfo is None or parsed.utcoffset() is None:\n        raise ValueError('Expected offset-aware datetime')\n    return parsed.astimezone(timezone.utc)\n\n\ndef valid_duration(value, maximum):\n    return (type(value) in (int, float) and isfinite(value)\n            and 0 < value <= maximum)\n\n\ndef overlaps(start, end, other_start, other_end, adjacency_allowed):\n    if adjacency_allowed:\n        return start < other_end and other_start < end\n    return start <= other_end and other_start <= end\n"
  }
}