Verkada Command receives access events from multiple devices. Identify badge IDs that have at least max_denials valid denied attempts within any window_seconds interval.
Events may arrive out of order and can contain malformed records. Ignore records that are not dictionaries, have a blank or non-string badge_id, have a non-negative integer timestamp, or have an outcome other than "granted" or "denied". Only valid denied events contribute to the result. Invalid configuration must raise ValueError when window_seconds < 0 or max_denials < 1.
Implement detect_repeated_denials(events, window_seconds, max_denials). events is a list of dictionaries with badge_id, timestamp, and outcome fields. Return a sorted list of badge IDs meeting the threshold. Two events belong to the same interval when their timestamp difference is at most window_seconds.
def detect_repeated_denials(events, window_seconds, max_denials):