Contributed by TYPE01
Contributed by Ji Kim
Contributed by Xiaoyuan Gao
Contributed by Fanny Hamelin