Created by xavier c
Contributed by Richard Baird
Contributed by Rafael Nobre
Contributed by Nathaniel Hebert
Contributed by Stephen Coles