contract Ownable is Initializable {

  address private _owner;
uint256 private _ownershipLocked;

event OwnershipLocked(address lockedOwner);
  event OwnershipRenounced(address indexed previousOwner);
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );


function initialize(address sender) internal initializer
{
    _owner = sender;
    _ownershipLocked = 0;
}

function owner() public view returns(address)
{
    return _owner;
}

modifier onlyOwner()
{
    require(isOwner());
    _;
}

function isOwner() public view returns(bool)
{
    return msg.sender == _owner;
}

function transferOwnership(address newOwner) public onlyOwner
{
    _transferOwnership(newOwner);
}

function _transferOwnership(address newOwner) internal
{
    require(_ownershipLocked == 0);
    require(newOwner != address(0));
    emit OwnershipTransferred(_owner, newOwner);
    _owner = newOwner;
}

// Set _ownershipLocked flag to lock contract owner forever
function lockOwnership() public onlyOwner
{
    require(_ownershipLocked == 0);
    emit OwnershipLocked(_owner);
    _ownershipLocked = 1;
}

uint256[50] private ______gap;
}
function lockOwnership() public onlyOwner
{
    require(_ownershipLocked == 0);
    emit OwnershipLocked(_owner);
    _ownershipLocked = 1;
}

// Set _ownershipLocked flag to lock contract owner forever