{"files": {"main.py": "from core import run\nfrom policy import POLICY\ndef evaluate(payload):\n    return run(payload, POLICY)\n", "core.py": "from datetime import datetime, timedelta, timezone\nfrom zoneinfo import ZoneInfo\nfrom helpers import parse_aware_datetime, intervals_overlap\n\ndef run(payload, policy):\n    selected = []\n    blocked = []\n    rejected = []\n    if not isinstance(payload, dict):\n        return {'selected': [], 'blocked': [], 'rejected': []}\n    appointments = payload.get('appointments')\n    if not isinstance(appointments, list):\n        return {'selected': [], 'blocked': [], 'rejected': []}\n    duplicate_policy = policy.get('duplicate_policy', 'first')\n    retained = {}\n    order = []\n    extra_rejected = []\n    for index, item in enumerate(appointments):\n        if not isinstance(item, dict):\n            continue\n        appt_id = item.get('id')\n        if not isinstance(appt_id, str) or appt_id == '':\n            if isinstance(appt_id, str) and appt_id != '':\n                extra_rejected.append((appt_id, index))\n            continue\n        if appt_id not in retained:\n            retained[appt_id] = (index, item)\n            order.append(appt_id)\n        elif duplicate_policy == 'last':\n            retained[appt_id] = (index, item)\n    now = parse_aware_datetime(payload.get('now'))\n    try:\n        tz = ZoneInfo(policy.get('timezone', 'UTC'))\n    except Exception:\n        tz = timezone.utc\n    capacity = policy.get('capacity', 1)\n    if isinstance(capacity, bool) or not isinstance(capacity, int) or capacity < 0:\n        capacity = 1\n    duration_max = policy.get('duration_max')\n    lead_minutes = policy.get('lead_minutes', 0)\n    cutoff_hour = policy.get('cutoff_hour', 23)\n    cutoff_inclusive = policy.get('cutoff_inclusive', True)\n    blackout_day = policy.get('blackout_day')\n    cancelled_blocks = policy.get('cancelled_blocks', False)\n    priority_high_first = policy.get('priority_high_first', True)\n    adjacency_allowed = policy.get('adjacency_allowed', True)\n    records = []\n    for appt_id in order:\n        index, item = retained[appt_id]\n        records.append((index, item))\n    def validate(item):\n        if now is None:\n            return None\n        start = parse_aware_datetime(item.get('start'))\n        if start is None:\n            return None\n        duration = item.get('duration')\n        if isinstance(duration, bool) or not isinstance(duration, (int, float)):\n            return None\n        if isinstance(duration, float) and (duration != duration or duration in (float('inf'), float('-inf'))):\n            return None\n        if duration <= 0:\n            return None\n        if duration_max is not None and duration > duration_max:\n            return None\n        priority = item.get('priority')\n        if isinstance(priority, bool) or not isinstance(priority, int):\n            return None\n        cancelled = item.get('cancelled')\n        if not isinstance(cancelled, bool):\n            return None\n        start_utc = start.astimezone(timezone.utc)\n        try:\n            earliest = now.astimezone(timezone.utc) + timedelta(minutes=lead_minutes)\n        except Exception:\n            return None\n        if start_utc < earliest:\n            return None\n        try:\n            start_local = start_utc.astimezone(tz)\n        except Exception:\n            return None\n        if blackout_day is not None and start_local.date().isoformat() == str(blackout_day):\n            return None\n        end_utc = start_utc + timedelta(minutes=duration)\n        try:\n            cutoff = datetime(start_local.year, start_local.month, start_local.day, int(cutoff_hour), 0, tzinfo=tz)\n        except Exception:\n            return None\n        if cutoff_inclusive:\n            if not (end_utc <= cutoff):\n                return None\n        else:\n            if not (end_utc < cutoff):\n                return None\n        return (start_utc, end_utc, priority, cancelled)\n    validated = []\n    for index, item in records:\n        appt_id = item.get('id')\n        result = validate(item)\n        if result is None:\n            rejected.append((appt_id, index))\n        else:\n            start_utc, end_utc, priority, cancelled = result\n            if cancelled and not cancelled_blocks:\n                rejected.append((appt_id, index))\n            else:\n                validated.append((index, appt_id, start_utc, end_utc, priority, cancelled))\n    if priority_high_first:\n        validated.sort(key=lambda r: (-r[5 - 1], r[0]))\n    else:\n        validated.sort(key=lambda r: (r[4], r[0]))\n    accepted = []\n    for index, appt_id, start_utc, end_utc, priority, cancelled in validated:\n        count = 0\n        for a_start, a_end in accepted:\n            if intervals_overlap(start_utc, end_utc, a_start, a_end, adjacency_allowed):\n                count += 1\n        if count < capacity:\n            accepted.append((start_utc, end_utc))\n            if cancelled:\n                blocked.append((appt_id, index))\n            else:\n                selected.append((appt_id, index))\n        else:\n            rejected.append((appt_id, index))\n    rejected.extend(extra_rejected)\n    report_order = policy.get('report_order', 'id')\n    def sort_entries(entries):\n        if report_order == 'id':\n            return [entry_id for entry_id, _ in sorted(entries, key=lambda e: e[0])]\n        return [entry_id for entry_id, _ in sorted(entries, key=lambda e: e[1])]\n    return {'selected': sort_entries(selected), 'blocked': sort_entries(blocked), 'rejected': sort_entries(rejected)}\n", "policy.py": "POLICY = {'adjacency_allowed': True, 'blackout_day': '2026-11-01', 'cancelled_blocks': True, 'capacity': 1, 'cutoff_hour': 17, 'cutoff_inclusive': True, 'duplicate_policy': 'first', 'duration_max': 120, 'lead_minutes': 30, 'priority_high_first': True, 'report_order': 'id', 'timezone': 'America/New_York'}\n", "helpers.py": "from datetime import datetime, timezone\n\ndef parse_aware_datetime(value):\n    if isinstance(value, datetime):\n        parsed = value\n    elif isinstance(value, str):\n        text = value.strip()\n        if text.endswith('Z') or text.endswith('z'):\n            text = text[:-1] + '+00:00'\n        try:\n            parsed = datetime.fromisoformat(text)\n        except Exception:\n            return None\n    else:\n        return None\n    if parsed.tzinfo is None or parsed.tzinfo.utcoffset(parsed) is None:\n        return None\n    return parsed.astimezone(timezone.utc)\n\ndef intervals_overlap(a_start, a_end, b_start, b_end, adjacency_allowed):\n    if adjacency_allowed:\n        return a_start < b_end and b_start < a_end\n    return a_start <= b_end and b_start <= a_end\n"}}