this was really hard