completed with all functionality