Original author: Mike Oliphant Updates from v3.3.1: Hugo Villeneuve See Changelog and CREDITS for the many code contributions by others