import "./Initializable.sol";

contract Fixed is Initializable{
    address payable owner;

    constructor() {
        owner = msg.sender;
    }

    function initialize() external initializer{
        require(owner == address(0));
        owner = msg.sender;
    }
    function kill() external{
        require(msg.sender == owner);
        selfdestruct(owner);
    }

    function other_function() external{

    }
}

contract Not_Upgradeable{
}

contract UpgradeableNoDestruct is Initializable{
    address payable owner;

    constructor() {
        owner = msg.sender;
    }

    function initialize() external initializer{
        require(owner == address(0));
        owner = msg.sender;
    }
}

contract Fixed2 is Initializable {
    address payable owner;

    constructor() initializer {}

    function initialize() external initializer {
        require(owner == address(0));
        owner = msg.sender;
    }

    function kill() external {
        require(msg.sender == owner);
        selfdestruct(owner);
    }
}

contract Fixed3 is Initializable {
    address payable owner;

    constructor() {
        _disableInitializers();
    }

    function initialize() external initializer {
        require(owner == address(0));
        owner = payable(msg.sender);
    }

    function kill() external {
        require(msg.sender == owner);
        selfdestruct(owner);
    }
}