all done. just need to clean up and optimize