This work took me a long time as I was doing it in free time. done several iterations of it, this is the final one.