Resulting code is here