{"files": {"main.py": "from core import run\nfrom policy import POLICY\ndef evaluate(payload):\n    return run(payload, POLICY)\n", "policy.py": "POLICY = {\"adjacency_allowed\": False, \"blackout_day\": \"2026-11-02\", \"cancelled_blocks\": False, \"capacity\": 2, \"cutoff_hour\": 18, \"cutoff_inclusive\": False, \"duplicate_policy\": \"last\", \"duration_max\": 90, \"lead_minutes\": 60, \"priority_high_first\": False, \"report_order\": \"input\", \"timezone\": \"UTC\"}\n", "helpers.py": "from datetime import datetime\n\ndef parse_dt(s):\n    if isinstance(s, str) and s.endswith('Z'):\n        s = s[:-1] + '+00:00'\n    return datetime.fromisoformat(s)\n", "core.py": "from datetime import datetime, timedelta, timezone\nfrom zoneinfo import ZoneInfo\nfrom helpers import parse_dt\n\n\ndef run(payload, policy):\n    tz = ZoneInfo(policy['timezone'])\n    now = parse_dt(payload['now']).astimezone(timezone.utc)\n    rows = payload.get('appointments', [])\n    kept = {}\n    order = []\n    for i, a in enumerate(rows):\n        id_ = a['id']\n        if id_ not in kept:\n            order.append(id_)\n            kept[id_] = (i, a)\n        elif policy['duplicate_policy'] == 'last':\n            kept[id_] = (i, a)\n    items = [(kept[k][0], kept[k][1]) for k in order]\n    hi = policy['priority_high_first']\n    items.sort(key=lambda t: ((-t[1]['priority']) if hi else t[1]['priority'], t[0]))\n\n    selected, blocked, rejected = [], [], []\n    accepted = []\n    lead = timedelta(minutes=policy['lead_minutes'])\n    for idx, a in items:\n        dur = a['duration']\n        ok = True\n        if not (isinstance(dur, (int, float)) and not isinstance(dur, bool)) or dur <= 0 or dur > policy['duration_max']:\n            rejected.append((idx, a['id']))\n            continue\n        start = parse_dt(a['start']).astimezone(timezone.utc)\n        end = start + timedelta(minutes=dur)\n        if start < now + lead:\n            rejected.append((idx, a['id']))\n            continue\n        ls = start.astimezone(tz)\n        if ls.date().isoformat() == policy['blackout_day']:\n            rejected.append((idx, a['id']))\n            continue\n        cutoff = datetime(ls.year, ls.month, ls.day, policy['cutoff_hour'], 0, tzinfo=tz).astimezone(timezone.utc)\n        if policy['cutoff_inclusive']:\n            ok = end <= cutoff\n        else:\n            ok = end < cutoff\n        if not ok:\n            rejected.append((idx, a['id']))\n            continue\n        if a['cancelled'] and not policy['cancelled_blocks']:\n            rejected.append((idx, a['id']))\n            continue\n        cnt = 0\n        for s, e in accepted:\n            if policy['adjacency_allowed']:\n                ov = start < e and s < end\n            else:\n                ov = start <= e and s <= end\n            if ov:\n                cnt += 1\n        if cnt >= policy['capacity']:\n            rejected.append((idx, a['id']))\n            continue\n        accepted.append((start, end))\n        if a['cancelled']:\n            blocked.append((idx, a['id']))\n        else:\n            selected.append((idx, a['id']))\n\n    def fin(lst):\n        if policy['report_order'] == 'id':\n            lst = sorted(lst, key=lambda t: (str(t[1])))\n        else:\n            lst = sorted(lst, key=lambda t: t[0])\n        return [x[1] for x in lst]\n\n    return {'selected': fin(selected), 'blocked': fin(blocked), 'rejected': fin(rejected)}\n"}}