Contributed by Pavel Kedich
Contributed by Kirill Gluschenko
Contributed by Adelina Shaydullina
Contributed by Yury Ostromentsky