initial version
final version