abstract contract ERC20Burnable is Context, ERC20 {
	/**
	 * @dev Destroys `amount` tokens from the caller.
	 *
	 * See {ERC20-_burn}.
	 */
	function burn(uint256 amount) public virtual {
		_burn(_msgSender(), amount);
	}

	/**
	 * @dev Destroys `amount` tokens from `account`, deducting from the caller's
	 * allowance.
	 *
	 * See {ERC20-_burn} and {ERC20-allowance}.
	 *
	 * Requirements:
	 *
	 * - the caller must have allowance for ``accounts``'s tokens of at least
	 * `amount`.
	 */
	function burnFrom(address account, uint256 amount) public virtual {
		uint256 decreasedAllowance = allowance(account, _msgSender()).sub(
			amount,
			"ERC20: burn amount exceeds allowance"
		);

		_approve(account, _msgSender(), decreasedAllowance);
		_burn(account, amount);
	}
}
/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
function burnFrom(address account, uint256 amount) public virtual {
	uint256 decreasedAllowance = allowance(account, _msgSender()).sub(
		amount,
		"ERC20: burn amount exceeds allowance"
	);

	_approve(account, _msgSender(), decreasedAllowance);
	_burn(account, amount);
}

/**
 	 * @dev Destroys `amount` tokens from `account`, deducting from the caller's
 	 * allowance.
 	 *
 	 * See {ERC20-_burn} and {ERC20-allowance}.
 	 *
 	 * Requirements:
 	 *
 	 * - the caller must have allowance for ``accounts``'s tokens of at least
 	 * `amount`.
 	 */