refactor tour logic into model