made with material from Andrew Campbell's cs50 course in spare time