added some comments to make the code easier to understand