Contributed by Florian Hardwig
Contributed by Ramiro Espinoza
Contributed by Kirill Gluschenko
Contributed by Yury Ostromentsky