another abstraction version