{"files":{"main.py":"from core import run\nfrom policy import POLICY\ndef evaluate(payload):\n    return run(payload, POLICY)\n","policy.py":"POLICY = {\n    'adjacency_allowed': True,\n    'cancelled_blocks': True,\n    'duplicate_policy': 'first',\n    'duration_max': 120,\n    'capacity': 1,\n    'report_order': 'id',\n    'blackout_day': '2026-11-01',\n    'priority_high_first': True,\n    'cutoff_hour': 17,\n    'cutoff_inclusive': True,\n    'lead_minutes': 30,\n    'timezone': 'America/New_York',\n}\n","helpers.py":"from datetime import datetime, timezone\n\ndef parse_dt(s):\n    if not isinstance(s, str):\n        raise ValueError('bad')\n    if s.endswith('Z') or s.endswith('z'):\n        s = s[:-1] + '+00:00'\n    d = datetime.fromisoformat(s)\n    if d.tzinfo is None or d.utcoffset() is None:\n        raise ValueError('naive')\n    return d.astimezone(timezone.utc)\n\ndef sort_ids(items, key):\n    try:\n        return sorted(items, key=key)\n    except TypeError:\n        return sorted(items, key=lambda x: str(key(x)))\n","core.py":"from datetime import datetime, timedelta\nfrom zoneinfo import ZoneInfo\nfrom helpers import parse_dt, sort_ids\n\ndef run(payload, policy):\n    zone = ZoneInfo(policy['timezone'])\n    try:\n        now = parse_dt(payload['now'])\n    except Exception:\n        now = None\n    rows = payload.get('appointments', []) or []\n    chosen = {}\n    order = []\n    for i, a in enumerate(rows):\n        k = a.get('id') if isinstance(a, dict) else None\n        if k not in chosen:\n            order.append(k)\n            chosen[k] = (i, a)\n        elif policy['duplicate_policy'] == 'last':\n            chosen[k] = (i, a)\n    items = [chosen[k] for k in order]\n    hi = policy['priority_high_first']\n\n    def prio(t):\n        p = t[1].get('priority', 0)\n        try:\n            p = float(p)\n        except Exception:\n            p = 0\n        return (-p if hi else p, t[0])\n    items.sort(key=prio)\n\n    selected, blocked, rejected = [], [], []\n    accepted = []  # (start, end)\n    idx = {}\n    for i, a in items:\n        idx[a.get('id')] = i\n        aid = a.get('id')\n        try:\n            dur = a['duration']\n            if isinstance(dur, bool) or not isinstance(dur, (int, float)):\n                raise ValueError\n            if dur <= 0 or dur > policy['duration_max']:\n                raise ValueError\n            if now is None:\n                raise ValueError\n            st = parse_dt(a['start'])\n            en = st + timedelta(minutes=dur)\n            if st < now + timedelta(minutes=policy['lead_minutes']):\n                raise ValueError\n            local = st.astimezone(zone)\n            if local.date().isoformat() == policy['blackout_day']:\n                raise ValueError\n            cutoff = datetime(local.year, local.month, local.day,\n                              policy['cutoff_hour'], tzinfo=zone)\n            if policy['cutoff_inclusive']:\n                if not en <= cutoff:\n                    raise ValueError\n            elif not en < cutoff:\n                raise ValueError\n            cancelled = bool(a.get('cancelled', False))\n            if cancelled and not policy['cancelled_blocks']:\n                raise ValueError\n        except Exception:\n            rejected.append(aid)\n            continue\n        cnt = 0\n        for s2, e2 in accepted:\n            if policy['adjacency_allowed']:\n                ov = st < e2 and s2 < en\n            else:\n                ov = st <= e2 and s2 <= en\n            if ov:\n                cnt += 1\n        if cnt < policy['capacity']:\n            accepted.append((st, en))\n            (blocked if cancelled else selected).append(aid)\n        else:\n            rejected.append(aid)\n\n    def fin(lst):\n        if policy['report_order'] == 'id':\n            return sort_ids(lst, lambda x: x)\n        return sorted(lst, key=lambda x: idx[x])\n    return {'selected': fin(selected), 'blocked': fin(blocked), 'rejected': fin(rejected)}\n"}}