Author: Nottingham Algorithms Group.