contract BurnerRole {

    using Roles for Roles.Role;

    Roles.Role private _burners;

    /**
     * @notice Fired when a new role is added.
     */
    event BurnerAdded(address indexed account);

    /**
     * @notice Fired when a new role is added.
     */
    event BurnerRemoved(address indexed account);

    /**
     * @dev The role is granted to the deployer.
     */
    constructor () internal {
        _addBurner(msg.sender);
    }

    /**
     * @dev Callers must have the role.
     */
    modifier onlyBurner() {
        require(isBurner(msg.sender), "BurnerRole: caller does not have the Burner role");
        _;
    }

    /**
     * @dev The role is removed for the caller.    
     */
    function renounceBurner() public {
        _removeBurner(msg.sender);
    }

    /**
     * @dev Checks if @param account has the role.
     */
    function isBurner(address account) public view returns (bool) {
        return _burners.has(account);
    }

    /**
     * @dev Assigns the role to @param account.
     */
    function _addBurner(address account) internal {
        _burners.add(account);
        emit BurnerAdded(account);
    }

    /**
     * @dev Removes the role from @param account.
     */
    function _removeBurner(address account) internal {
        _burners.remove(account);
        emit BurnerRemoved(account);
    }

}
/**
 * @title Burner Role
 * @dev Follows the openzeppelin's guidelines of working with roles.
 * @dev Derived contracts must implement the `addBurner` and the `removeBurner` functions.
 */
function isBurner(address account) public view returns (bool) {
    return _burners.has(account);
}

/**
 * @dev Checks if @param account has the role.
 */