ところどころ冗長な if があったので整理した