con casi todos los comentarios y casi compila :)