contract Ownable is Context 
{
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

	// Initializes contract setting deployer as initial owner
    constructor () internal 
	{
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

	// Returns address of current owner
    function owner() public view returns (address) 
	{
        return _owner;
    }

	// Throw if called by any other account other than owner
    modifier onlyOwner() 
	{
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

	// Renounce ownership
    function renounceOwnership() public virtual onlyOwner 
	{
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

	// Transfer ownership
    function transferOwnership(address newOwner) public virtual onlyOwner 
	{
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}
// Owner is granted exclusive access to specific functions
// Deployer account is by default owner account
// Can be changed with transferOwnership
function transferOwnership(address newOwner) public virtual onlyOwner 
    require(newOwner != address(0), "Ownable: new owner is the zero address");
    emit OwnershipTransferred(_owner, newOwner);
    _owner = newOwner;
}

// Transfer ownership