completed, need some optimization 2