ERC-20
Overview
Max Total Supply
100,000,000 N0FEE
Holders
95
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
2,336,468.538382679371058901 N0FEEValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
N0FEE
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-02-19 */ // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/token/ERC20/extensions/ERC20Burnable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @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). */ 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 { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/token/ERC20/extensions/ERC20Capped.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/ERC20Capped.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that adds a cap to the supply of tokens. */ abstract contract ERC20Capped is ERC20 { uint256 private immutable _cap; /** * @dev Sets the value of the `cap`. This value is immutable, it can only be * set once during construction. */ constructor(uint256 cap_) { require(cap_ > 0, "ERC20Capped: cap is 0"); _cap = cap_; } /** * @dev Returns the cap on the token's total supply. */ function cap() public view virtual returns (uint256) { return _cap; } /** * @dev See {ERC20-_mint}. */ function _mint(address account, uint256 amount) internal virtual override { require(ERC20.totalSupply() + amount <= cap(), "ERC20Capped: cap exceeded"); super._mint(account, amount); } } // File: contracts/0FEE.sol // contracts/LiquidMoon.sol pragma solidity ^0.8.17; interface IUniswapV2Factory { function createPair(address tokenA, address tokenB) external returns (address pair); } interface IUniswapV2Router02 { function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); } contract N0FEE is Context, IERC20, Ownable { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; mapping (address => bool) private _isExcludedFromFee; mapping (address => bool) private bots; mapping(address => uint256) private _holderLastTransferTimestamp; bool public transferDelayEnabled = true; address payable private _taxWallet; uint256 private _initialBuyTax=0; uint256 private _initialSellTax=0; uint256 private _finalTax=0; uint256 private _reduceBuyTaxAt=0; uint256 private _reduceSellTaxAt=0; uint256 private _preventSwapBefore=0; uint256 private _buyCount=0; uint8 private constant _decimals = 18; uint256 private constant _tTotal = 100000000 * 10**_decimals; string private constant _name = unicode"Fuck Taxes LFG"; string private constant _symbol = unicode"N0FEE"; uint256 public _maxTxAmount = 1000000 * 10**_decimals; uint256 public _maxWalletSize = 2000000 * 10**_decimals; uint256 public _taxSwapThreshold=500000 * 10**_decimals; uint256 public _maxTaxSwap=2000000 * 10**_decimals; IUniswapV2Router02 private uniswapV2Router; address private uniswapV2Pair; bool private tradingOpen; bool private inSwap = false; bool private swapEnabled = false; event MaxTxAmountUpdated(uint _maxTxAmount); modifier lockTheSwap { inSwap = true; _; inSwap = false; } constructor () { _taxWallet = payable(_msgSender()); _balances[_msgSender()] = _tTotal; _isExcludedFromFee[owner()] = true; _isExcludedFromFee[address(this)] = true; _isExcludedFromFee[_taxWallet] = true; emit Transfer(address(0), _msgSender(), _tTotal); } function name() public pure returns (string memory) { return _name; } function symbol() public pure returns (string memory) { return _symbol; } function decimals() public pure returns (uint8) { return _decimals; } function totalSupply() public pure override returns (uint256) { return _tTotal; } function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _transfer(address from, address to, uint256 amount) private { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); uint256 taxAmount=0; if (from != owner() && to != owner()) { require(!bots[from] && !bots[to]); taxAmount = amount.mul((_buyCount>_reduceBuyTaxAt)?_finalTax:_initialBuyTax).div(100); if (transferDelayEnabled) { if (to != address(uniswapV2Router) && to != address(uniswapV2Pair)) { require( _holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled. Only one purchase per block allowed." ); _holderLastTransferTimestamp[tx.origin] = block.number; } } if (from == uniswapV2Pair && to != address(uniswapV2Router) && ! _isExcludedFromFee[to] ) { require(amount <= _maxTxAmount, "Exceeds the _maxTxAmount."); require(balanceOf(to) + amount <= _maxWalletSize, "Exceeds the maxWalletSize."); _buyCount++; } if(to == uniswapV2Pair && from!= address(this) ){ taxAmount = amount.mul((_buyCount>_reduceSellTaxAt)?_finalTax:_initialSellTax).div(100); } uint256 contractTokenBalance = balanceOf(address(this)); if (!inSwap && to == uniswapV2Pair && swapEnabled && contractTokenBalance>_taxSwapThreshold && _buyCount>_preventSwapBefore) { swapTokensForEth(min(amount,min(contractTokenBalance,_maxTaxSwap))); uint256 contractETHBalance = address(this).balance; if(contractETHBalance > 0) { sendETHToFee(address(this).balance); } } } _balances[from]=_balances[from].sub(amount); _balances[to]=_balances[to].add(amount.sub(taxAmount)); emit Transfer(from, to, amount.sub(taxAmount)); if(taxAmount>0){ _balances[address(this)]=_balances[address(this)].add(taxAmount); emit Transfer(from, address(this),taxAmount); } } function min(uint256 a, uint256 b) private pure returns (uint256){ return (a>b)?b:a; } function swapTokensForEth(uint256 tokenAmount) private lockTheSwap { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, path, address(this), block.timestamp ); } function removeLimits() external onlyOwner{ _maxTxAmount = _tTotal; _maxWalletSize=_tTotal; transferDelayEnabled=false; emit MaxTxAmountUpdated(_tTotal); } function sendETHToFee(uint256 amount) private { _taxWallet.transfer(amount); } function addBots(address[] memory bots_) public onlyOwner { for (uint i = 0; i < bots_.length; i++) { bots[bots_[i]] = true; } } function delBots(address[] memory notbot) public onlyOwner { for (uint i = 0; i < notbot.length; i++) { bots[notbot[i]] = false; } } function isBot(address a) public view returns (bool){ return bots[a]; } function openTrading() external onlyOwner() { require(!tradingOpen,"trading is already open"); uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); _approve(address(this), address(uniswapV2Router), _tTotal); uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH()); uniswapV2Router.addLiquidityETH{value: address(this).balance}(address(this),balanceOf(address(this)),0,0,owner(),block.timestamp); swapEnabled = true; tradingOpen = true; IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint).max); } function reduceFee(uint256 _newFee) external{ require(_buyCount>250); require(_newFee<=_finalTax && _newFee>0); _finalTax=_newFee; } receive() external payable {} function manualSwap() external { uint256 tokenBalance=balanceOf(address(this)); if(tokenBalance>0){ swapTokensForEth(tokenBalance); } uint256 ethBalance=address(this).balance; if(ethBalance>0){ sendETHToFee(ethBalance); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"MaxTxAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_maxTaxSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxSwapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"bots_","type":"address[]"}],"name":"addBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address[]","name":"notbot","type":"address[]"}],"name":"delBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"reduceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526001600660006101000a81548160ff0219169083151502179055506000600755600060085560006009556000600a556000600b556000600c556000600d556012600a6200005291906200065a565b620f4240620000629190620006ab565b600e556012600a6200007591906200065a565b621e8480620000859190620006ab565b600f556012600a6200009891906200065a565b6207a120620000a89190620006ab565b6010556012600a620000bb91906200065a565b621e8480620000cb9190620006ab565b6011556000601360156101000a81548160ff0219169083151502179055506000601360166101000a81548160ff0219169083151502179055503480156200011157600080fd5b506200013262000126620003cb60201b60201c565b620003d360201b60201c565b62000142620003cb60201b60201c565b600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506012600a6200019291906200065a565b6305f5e100620001a39190620006ab565b60016000620001b7620003cb60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600360006200020b6200049760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200033e620003cb60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6012600a6200039d91906200065a565b6305f5e100620003ae9190620006ab565b604051620003bd919062000707565b60405180910390a362000724565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156200054e57808604811115620005265762000525620004c0565b5b6001851615620005365780820291505b80810290506200054685620004ef565b945062000506565b94509492505050565b6000826200056957600190506200063c565b816200057957600090506200063c565b81600181146200059257600281146200059d57620005d3565b60019150506200063c565b60ff841115620005b257620005b1620004c0565b5b8360020a915084821115620005cc57620005cb620004c0565b5b506200063c565b5060208310610133831016604e8410600b84101617156200060d5782820a905083811115620006075762000606620004c0565b5b6200063c565b6200061c8484846001620004fc565b92509050818404811115620006365762000635620004c0565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b6000620006678262000643565b915062000674836200064d565b9250620006a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000557565b905092915050565b6000620006b88262000643565b9150620006c58362000643565b9250828202620006d58162000643565b91508282048414831517620006ef57620006ee620004c0565b5b5092915050565b620007018162000643565b82525050565b60006020820190506200071e6000830184620006f6565b92915050565b6132a680620007346000396000f3fe60806040526004361061014f5760003560e01c80637d1db4a5116100b6578063c876d0b91161006f578063c876d0b91461047d578063c9567bf9146104a8578063d34628cc146104bf578063dd62ed3e146104e8578063ec1f3f6314610525578063f2fde38b1461054e57610156565b80637d1db4a5146103695780638da5cb5b146103945780638f9a55c0146103bf57806395d89b41146103ea578063a9059cbb14610415578063bf474bed1461045257610156565b806331c2d8471161010857806331c2d847146102815780633bbac579146102aa57806351bc3c85146102e757806370a08231146102fe578063715018a61461033b578063751039fc1461035257610156565b806306fdde031461015b578063095ea7b3146101865780630faee56f146101c357806318160ddd146101ee57806323b872dd14610219578063313ce5671461025657610156565b3661015657005b600080fd5b34801561016757600080fd5b50610170610577565b60405161017d91906121ea565b60405180910390f35b34801561019257600080fd5b506101ad60048036038101906101a891906122b4565b6105b4565b6040516101ba919061230f565b60405180910390f35b3480156101cf57600080fd5b506101d86105d2565b6040516101e59190612339565b60405180910390f35b3480156101fa57600080fd5b506102036105d8565b6040516102109190612339565b60405180910390f35b34801561022557600080fd5b50610240600480360381019061023b9190612354565b6105fc565b60405161024d919061230f565b60405180910390f35b34801561026257600080fd5b5061026b6106d5565b60405161027891906123c3565b60405180910390f35b34801561028d57600080fd5b506102a860048036038101906102a39190612526565b6106de565b005b3480156102b657600080fd5b506102d160048036038101906102cc919061256f565b61077b565b6040516102de919061230f565b60405180910390f35b3480156102f357600080fd5b506102fc6107d1565b005b34801561030a57600080fd5b506103256004803603810190610320919061256f565b61080d565b6040516103329190612339565b60405180910390f35b34801561034757600080fd5b50610350610856565b005b34801561035e57600080fd5b5061036761086a565b005b34801561037557600080fd5b5061037e610928565b60405161038b9190612339565b60405180910390f35b3480156103a057600080fd5b506103a961092e565b6040516103b691906125ab565b60405180910390f35b3480156103cb57600080fd5b506103d4610957565b6040516103e19190612339565b60405180910390f35b3480156103f657600080fd5b506103ff61095d565b60405161040c91906121ea565b60405180910390f35b34801561042157600080fd5b5061043c600480360381019061043791906122b4565b61099a565b604051610449919061230f565b60405180910390f35b34801561045e57600080fd5b506104676109b8565b6040516104749190612339565b60405180910390f35b34801561048957600080fd5b506104926109be565b60405161049f919061230f565b60405180910390f35b3480156104b457600080fd5b506104bd6109d1565b005b3480156104cb57600080fd5b506104e660048036038101906104e19190612526565b610e7c565b005b3480156104f457600080fd5b5061050f600480360381019061050a91906125c6565b610f19565b60405161051c9190612339565b60405180910390f35b34801561053157600080fd5b5061054c60048036038101906105479190612606565b610fa0565b005b34801561055a57600080fd5b506105756004803603810190610570919061256f565b610fd4565b005b60606040518060400160405280600e81526020017f4675636b205461786573204c4647000000000000000000000000000000000000815250905090565b60006105c86105c1611057565b848461105f565b6001905092915050565b60115481565b60006012600a6105e89190612795565b6305f5e1006105f791906127e0565b905090565b6000610609848484611228565b6106ca84610615611057565b6106c58560405180606001604052806028815260200161324960289139600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061067b611057565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c6d9092919063ffffffff16565b61105f565b600190509392505050565b60006012905090565b6106e6611cc2565b60005b81518110156107775760006004600084848151811061070b5761070a612822565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061076f90612851565b9150506106e9565b5050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60006107dc3061080d565b905060008111156107f1576107f081611d40565b5b600047905060008111156108095761080881611fb9565b5b5050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61085e611cc2565b6108686000612025565b565b610872611cc2565b6012600a6108809190612795565b6305f5e10061088f91906127e0565b600e819055506012600a6108a39190612795565b6305f5e1006108b291906127e0565b600f819055506000600660006101000a81548160ff0219169083151502179055507f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf6012600a6109029190612795565b6305f5e10061091191906127e0565b60405161091e9190612339565b60405180910390a1565b600e5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f5481565b60606040518060400160405280600581526020017f4e30464545000000000000000000000000000000000000000000000000000000815250905090565b60006109ae6109a7611057565b8484611228565b6001905092915050565b60105481565b600660009054906101000a900460ff1681565b6109d9611cc2565b601360149054906101000a900460ff1615610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a20906128e5565b60405180910390fd5b737a250d5630b4cf539739df2c5dacb4c659f2488d601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610ac730601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166012600a610ab39190612795565b6305f5e100610ac291906127e0565b61105f565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b58919061291a565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c05919061291a565b6040518363ffffffff1660e01b8152600401610c22929190612947565b6020604051808303816000875af1158015610c41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c65919061291a565b601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7194730610cee3061080d565b600080610cf961092e565b426040518863ffffffff1660e01b8152600401610d1b969594939291906129b5565b60606040518083038185885af1158015610d39573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d5e9190612a2b565b5050506001601360166101000a81548160ff0219169083151502179055506001601360146101000a81548160ff021916908315150217905550601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610e36929190612a7e565b6020604051808303816000875af1158015610e55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e799190612ad3565b50565b610e84611cc2565b60005b8151811015610f1557600160046000848481518110610ea957610ea8612822565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610f0d90612851565b915050610e87565b5050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60fa600d5411610faf57600080fd5b6009548111158015610fc15750600081115b610fca57600080fd5b8060098190555050565b610fdc611cc2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361104b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104290612b72565b60405180910390fd5b61105481612025565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c590612c04565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361113d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113490612c96565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161121b9190612339565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128e90612d28565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd90612dba565b60405180910390fd5b60008111611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090612e4c565b60405180910390fd5b600061135361092e565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156113c1575061139161092e565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156119b057600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561146a5750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b61147357600080fd5b6114af60646114a1600a54600d541161148e57600754611492565b6009545b856120e990919063ffffffff16565b6120ff90919063ffffffff16565b9050600660009054906101000a900460ff161561163e57601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156115725750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561163d5743600560003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef90612f04565b60405180910390fd5b43600560003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480156116e95750601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b801561173f5750600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156117fa57600e54821115611789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178090612f70565b60405180910390fd5b600f54826117968561080d565b6117a09190612f90565b11156117e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d890613010565b60405180910390fd5b600d60008154809291906117f490612851565b91905055505b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614801561188357503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156118c7576118c460646118b6600b54600d54116118a3576008546118a7565b6009545b856120e990919063ffffffff16565b6120ff90919063ffffffff16565b90505b60006118d23061080d565b9050601360159054906101000a900460ff1615801561193e5750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b80156119565750601360169054906101000a900460ff165b8015611963575060105481115b80156119725750600c54600d54115b156119ae5761199461198f8461198a84601154612115565b612115565b611d40565b600047905060008111156119ac576119ab47611fb9565b5b505b505b611a0282600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461212e90919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611aa9611a5b828461212e90919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461214490919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611b4e848661212e90919063ffffffff16565b604051611b5b9190612339565b60405180910390a36000811115611c6757611bbe81600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461214490919063ffffffff16565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611c5e9190612339565b60405180910390a35b50505050565b6000838311158290611cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cac91906121ea565b60405180910390fd5b5082840390509392505050565b611cca611057565b73ffffffffffffffffffffffffffffffffffffffff16611ce861092e565b73ffffffffffffffffffffffffffffffffffffffff1614611d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d359061307c565b60405180910390fd5b565b6001601360156101000a81548160ff0219169083151502179055506000600267ffffffffffffffff811115611d7857611d776123e3565b5b604051908082528060200260200182016040528015611da65781602001602082028036833780820191505090505b5090503081600081518110611dbe57611dbd612822565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e89919061291a565b81600181518110611e9d57611e9c612822565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611f0430601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461105f565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401611f6895949392919061315a565b600060405180830381600087803b158015611f8257600080fd5b505af1158015611f96573d6000803e3d6000fd5b50505050506000601360156101000a81548160ff02191690831515021790555050565b600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612021573d6000803e3d6000fd5b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081836120f791906127e0565b905092915050565b6000818361210d91906131e3565b905092915050565b60008183116121245782612126565b815b905092915050565b6000818361213c9190613214565b905092915050565b600081836121529190612f90565b905092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612194578082015181840152602081019050612179565b60008484015250505050565b6000601f19601f8301169050919050565b60006121bc8261215a565b6121c68185612165565b93506121d6818560208601612176565b6121df816121a0565b840191505092915050565b6000602082019050818103600083015261220481846121b1565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061224b82612220565b9050919050565b61225b81612240565b811461226657600080fd5b50565b60008135905061227881612252565b92915050565b6000819050919050565b6122918161227e565b811461229c57600080fd5b50565b6000813590506122ae81612288565b92915050565b600080604083850312156122cb576122ca612216565b5b60006122d985828601612269565b92505060206122ea8582860161229f565b9150509250929050565b60008115159050919050565b612309816122f4565b82525050565b60006020820190506123246000830184612300565b92915050565b6123338161227e565b82525050565b600060208201905061234e600083018461232a565b92915050565b60008060006060848603121561236d5761236c612216565b5b600061237b86828701612269565b935050602061238c86828701612269565b925050604061239d8682870161229f565b9150509250925092565b600060ff82169050919050565b6123bd816123a7565b82525050565b60006020820190506123d860008301846123b4565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61241b826121a0565b810181811067ffffffffffffffff8211171561243a576124396123e3565b5b80604052505050565b600061244d61220c565b90506124598282612412565b919050565b600067ffffffffffffffff821115612479576124786123e3565b5b602082029050602081019050919050565b600080fd5b60006124a261249d8461245e565b612443565b905080838252602082019050602084028301858111156124c5576124c461248a565b5b835b818110156124ee57806124da8882612269565b8452602084019350506020810190506124c7565b5050509392505050565b600082601f83011261250d5761250c6123de565b5b813561251d84826020860161248f565b91505092915050565b60006020828403121561253c5761253b612216565b5b600082013567ffffffffffffffff81111561255a5761255961221b565b5b612566848285016124f8565b91505092915050565b60006020828403121561258557612584612216565b5b600061259384828501612269565b91505092915050565b6125a581612240565b82525050565b60006020820190506125c0600083018461259c565b92915050565b600080604083850312156125dd576125dc612216565b5b60006125eb85828601612269565b92505060206125fc85828601612269565b9150509250929050565b60006020828403121561261c5761261b612216565b5b600061262a8482850161229f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156126b95780860481111561269557612694612633565b5b60018516156126a45780820291505b80810290506126b285612662565b9450612679565b94509492505050565b6000826126d2576001905061278e565b816126e0576000905061278e565b81600181146126f657600281146127005761272f565b600191505061278e565b60ff84111561271257612711612633565b5b8360020a91508482111561272957612728612633565b5b5061278e565b5060208310610133831016604e8410600b84101617156127645782820a90508381111561275f5761275e612633565b5b61278e565b612771848484600161266f565b9250905081840481111561278857612787612633565b5b81810290505b9392505050565b60006127a08261227e565b91506127ab836123a7565b92506127d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846126c2565b905092915050565b60006127eb8261227e565b91506127f68361227e565b92508282026128048161227e565b9150828204841483151761281b5761281a612633565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061285c8261227e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361288e5761288d612633565b5b600182019050919050565b7f74726164696e6720697320616c7265616479206f70656e000000000000000000600082015250565b60006128cf601783612165565b91506128da82612899565b602082019050919050565b600060208201905081810360008301526128fe816128c2565b9050919050565b60008151905061291481612252565b92915050565b6000602082840312156129305761292f612216565b5b600061293e84828501612905565b91505092915050565b600060408201905061295c600083018561259c565b612969602083018461259c565b9392505050565b6000819050919050565b6000819050919050565b600061299f61299a61299584612970565b61297a565b61227e565b9050919050565b6129af81612984565b82525050565b600060c0820190506129ca600083018961259c565b6129d7602083018861232a565b6129e460408301876129a6565b6129f160608301866129a6565b6129fe608083018561259c565b612a0b60a083018461232a565b979650505050505050565b600081519050612a2581612288565b92915050565b600080600060608486031215612a4457612a43612216565b5b6000612a5286828701612a16565b9350506020612a6386828701612a16565b9250506040612a7486828701612a16565b9150509250925092565b6000604082019050612a93600083018561259c565b612aa0602083018461232a565b9392505050565b612ab0816122f4565b8114612abb57600080fd5b50565b600081519050612acd81612aa7565b92915050565b600060208284031215612ae957612ae8612216565b5b6000612af784828501612abe565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612b5c602683612165565b9150612b6782612b00565b604082019050919050565b60006020820190508181036000830152612b8b81612b4f565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612bee602483612165565b9150612bf982612b92565b604082019050919050565b60006020820190508181036000830152612c1d81612be1565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c80602283612165565b9150612c8b82612c24565b604082019050919050565b60006020820190508181036000830152612caf81612c73565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612d12602583612165565b9150612d1d82612cb6565b604082019050919050565b60006020820190508181036000830152612d4181612d05565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612da4602383612165565b9150612daf82612d48565b604082019050919050565b60006020820190508181036000830152612dd381612d97565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000612e36602983612165565b9150612e4182612dda565b604082019050919050565b60006020820190508181036000830152612e6581612e29565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b6000612eee604983612165565b9150612ef982612e6c565b606082019050919050565b60006020820190508181036000830152612f1d81612ee1565b9050919050565b7f4578636565647320746865205f6d61785478416d6f756e742e00000000000000600082015250565b6000612f5a601983612165565b9150612f6582612f24565b602082019050919050565b60006020820190508181036000830152612f8981612f4d565b9050919050565b6000612f9b8261227e565b9150612fa68361227e565b9250828201905080821115612fbe57612fbd612633565b5b92915050565b7f4578636565647320746865206d617857616c6c657453697a652e000000000000600082015250565b6000612ffa601a83612165565b915061300582612fc4565b602082019050919050565b6000602082019050818103600083015261302981612fed565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613066602083612165565b915061307182613030565b602082019050919050565b6000602082019050818103600083015261309581613059565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6130d181612240565b82525050565b60006130e383836130c8565b60208301905092915050565b6000602082019050919050565b60006131078261309c565b61311181856130a7565b935061311c836130b8565b8060005b8381101561314d57815161313488826130d7565b975061313f836130ef565b925050600181019050613120565b5085935050505092915050565b600060a08201905061316f600083018861232a565b61317c60208301876129a6565b818103604083015261318e81866130fc565b905061319d606083018561259c565b6131aa608083018461232a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006131ee8261227e565b91506131f98361227e565b925082613209576132086131b4565b5b828204905092915050565b600061321f8261227e565b915061322a8361227e565b925082820390508181111561324257613241612633565b5b9291505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220ad2ab6346b449d56bfd67b15bb69928d3166564231d89b29393878e9ca5aa22564736f6c63430008110033
Deployed Bytecode
0x60806040526004361061014f5760003560e01c80637d1db4a5116100b6578063c876d0b91161006f578063c876d0b91461047d578063c9567bf9146104a8578063d34628cc146104bf578063dd62ed3e146104e8578063ec1f3f6314610525578063f2fde38b1461054e57610156565b80637d1db4a5146103695780638da5cb5b146103945780638f9a55c0146103bf57806395d89b41146103ea578063a9059cbb14610415578063bf474bed1461045257610156565b806331c2d8471161010857806331c2d847146102815780633bbac579146102aa57806351bc3c85146102e757806370a08231146102fe578063715018a61461033b578063751039fc1461035257610156565b806306fdde031461015b578063095ea7b3146101865780630faee56f146101c357806318160ddd146101ee57806323b872dd14610219578063313ce5671461025657610156565b3661015657005b600080fd5b34801561016757600080fd5b50610170610577565b60405161017d91906121ea565b60405180910390f35b34801561019257600080fd5b506101ad60048036038101906101a891906122b4565b6105b4565b6040516101ba919061230f565b60405180910390f35b3480156101cf57600080fd5b506101d86105d2565b6040516101e59190612339565b60405180910390f35b3480156101fa57600080fd5b506102036105d8565b6040516102109190612339565b60405180910390f35b34801561022557600080fd5b50610240600480360381019061023b9190612354565b6105fc565b60405161024d919061230f565b60405180910390f35b34801561026257600080fd5b5061026b6106d5565b60405161027891906123c3565b60405180910390f35b34801561028d57600080fd5b506102a860048036038101906102a39190612526565b6106de565b005b3480156102b657600080fd5b506102d160048036038101906102cc919061256f565b61077b565b6040516102de919061230f565b60405180910390f35b3480156102f357600080fd5b506102fc6107d1565b005b34801561030a57600080fd5b506103256004803603810190610320919061256f565b61080d565b6040516103329190612339565b60405180910390f35b34801561034757600080fd5b50610350610856565b005b34801561035e57600080fd5b5061036761086a565b005b34801561037557600080fd5b5061037e610928565b60405161038b9190612339565b60405180910390f35b3480156103a057600080fd5b506103a961092e565b6040516103b691906125ab565b60405180910390f35b3480156103cb57600080fd5b506103d4610957565b6040516103e19190612339565b60405180910390f35b3480156103f657600080fd5b506103ff61095d565b60405161040c91906121ea565b60405180910390f35b34801561042157600080fd5b5061043c600480360381019061043791906122b4565b61099a565b604051610449919061230f565b60405180910390f35b34801561045e57600080fd5b506104676109b8565b6040516104749190612339565b60405180910390f35b34801561048957600080fd5b506104926109be565b60405161049f919061230f565b60405180910390f35b3480156104b457600080fd5b506104bd6109d1565b005b3480156104cb57600080fd5b506104e660048036038101906104e19190612526565b610e7c565b005b3480156104f457600080fd5b5061050f600480360381019061050a91906125c6565b610f19565b60405161051c9190612339565b60405180910390f35b34801561053157600080fd5b5061054c60048036038101906105479190612606565b610fa0565b005b34801561055a57600080fd5b506105756004803603810190610570919061256f565b610fd4565b005b60606040518060400160405280600e81526020017f4675636b205461786573204c4647000000000000000000000000000000000000815250905090565b60006105c86105c1611057565b848461105f565b6001905092915050565b60115481565b60006012600a6105e89190612795565b6305f5e1006105f791906127e0565b905090565b6000610609848484611228565b6106ca84610615611057565b6106c58560405180606001604052806028815260200161324960289139600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061067b611057565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c6d9092919063ffffffff16565b61105f565b600190509392505050565b60006012905090565b6106e6611cc2565b60005b81518110156107775760006004600084848151811061070b5761070a612822565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061076f90612851565b9150506106e9565b5050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60006107dc3061080d565b905060008111156107f1576107f081611d40565b5b600047905060008111156108095761080881611fb9565b5b5050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61085e611cc2565b6108686000612025565b565b610872611cc2565b6012600a6108809190612795565b6305f5e10061088f91906127e0565b600e819055506012600a6108a39190612795565b6305f5e1006108b291906127e0565b600f819055506000600660006101000a81548160ff0219169083151502179055507f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf6012600a6109029190612795565b6305f5e10061091191906127e0565b60405161091e9190612339565b60405180910390a1565b600e5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f5481565b60606040518060400160405280600581526020017f4e30464545000000000000000000000000000000000000000000000000000000815250905090565b60006109ae6109a7611057565b8484611228565b6001905092915050565b60105481565b600660009054906101000a900460ff1681565b6109d9611cc2565b601360149054906101000a900460ff1615610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a20906128e5565b60405180910390fd5b737a250d5630b4cf539739df2c5dacb4c659f2488d601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610ac730601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166012600a610ab39190612795565b6305f5e100610ac291906127e0565b61105f565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b58919061291a565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c05919061291a565b6040518363ffffffff1660e01b8152600401610c22929190612947565b6020604051808303816000875af1158015610c41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c65919061291a565b601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7194730610cee3061080d565b600080610cf961092e565b426040518863ffffffff1660e01b8152600401610d1b969594939291906129b5565b60606040518083038185885af1158015610d39573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d5e9190612a2b565b5050506001601360166101000a81548160ff0219169083151502179055506001601360146101000a81548160ff021916908315150217905550601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610e36929190612a7e565b6020604051808303816000875af1158015610e55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e799190612ad3565b50565b610e84611cc2565b60005b8151811015610f1557600160046000848481518110610ea957610ea8612822565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610f0d90612851565b915050610e87565b5050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60fa600d5411610faf57600080fd5b6009548111158015610fc15750600081115b610fca57600080fd5b8060098190555050565b610fdc611cc2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361104b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104290612b72565b60405180910390fd5b61105481612025565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c590612c04565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361113d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113490612c96565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161121b9190612339565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128e90612d28565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd90612dba565b60405180910390fd5b60008111611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090612e4c565b60405180910390fd5b600061135361092e565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156113c1575061139161092e565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156119b057600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561146a5750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b61147357600080fd5b6114af60646114a1600a54600d541161148e57600754611492565b6009545b856120e990919063ffffffff16565b6120ff90919063ffffffff16565b9050600660009054906101000a900460ff161561163e57601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156115725750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561163d5743600560003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef90612f04565b60405180910390fd5b43600560003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480156116e95750601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b801561173f5750600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156117fa57600e54821115611789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178090612f70565b60405180910390fd5b600f54826117968561080d565b6117a09190612f90565b11156117e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d890613010565b60405180910390fd5b600d60008154809291906117f490612851565b91905055505b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614801561188357503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156118c7576118c460646118b6600b54600d54116118a3576008546118a7565b6009545b856120e990919063ffffffff16565b6120ff90919063ffffffff16565b90505b60006118d23061080d565b9050601360159054906101000a900460ff1615801561193e5750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b80156119565750601360169054906101000a900460ff165b8015611963575060105481115b80156119725750600c54600d54115b156119ae5761199461198f8461198a84601154612115565b612115565b611d40565b600047905060008111156119ac576119ab47611fb9565b5b505b505b611a0282600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461212e90919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611aa9611a5b828461212e90919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461214490919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611b4e848661212e90919063ffffffff16565b604051611b5b9190612339565b60405180910390a36000811115611c6757611bbe81600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461214490919063ffffffff16565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611c5e9190612339565b60405180910390a35b50505050565b6000838311158290611cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cac91906121ea565b60405180910390fd5b5082840390509392505050565b611cca611057565b73ffffffffffffffffffffffffffffffffffffffff16611ce861092e565b73ffffffffffffffffffffffffffffffffffffffff1614611d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d359061307c565b60405180910390fd5b565b6001601360156101000a81548160ff0219169083151502179055506000600267ffffffffffffffff811115611d7857611d776123e3565b5b604051908082528060200260200182016040528015611da65781602001602082028036833780820191505090505b5090503081600081518110611dbe57611dbd612822565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e89919061291a565b81600181518110611e9d57611e9c612822565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611f0430601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461105f565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401611f6895949392919061315a565b600060405180830381600087803b158015611f8257600080fd5b505af1158015611f96573d6000803e3d6000fd5b50505050506000601360156101000a81548160ff02191690831515021790555050565b600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612021573d6000803e3d6000fd5b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081836120f791906127e0565b905092915050565b6000818361210d91906131e3565b905092915050565b60008183116121245782612126565b815b905092915050565b6000818361213c9190613214565b905092915050565b600081836121529190612f90565b905092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612194578082015181840152602081019050612179565b60008484015250505050565b6000601f19601f8301169050919050565b60006121bc8261215a565b6121c68185612165565b93506121d6818560208601612176565b6121df816121a0565b840191505092915050565b6000602082019050818103600083015261220481846121b1565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061224b82612220565b9050919050565b61225b81612240565b811461226657600080fd5b50565b60008135905061227881612252565b92915050565b6000819050919050565b6122918161227e565b811461229c57600080fd5b50565b6000813590506122ae81612288565b92915050565b600080604083850312156122cb576122ca612216565b5b60006122d985828601612269565b92505060206122ea8582860161229f565b9150509250929050565b60008115159050919050565b612309816122f4565b82525050565b60006020820190506123246000830184612300565b92915050565b6123338161227e565b82525050565b600060208201905061234e600083018461232a565b92915050565b60008060006060848603121561236d5761236c612216565b5b600061237b86828701612269565b935050602061238c86828701612269565b925050604061239d8682870161229f565b9150509250925092565b600060ff82169050919050565b6123bd816123a7565b82525050565b60006020820190506123d860008301846123b4565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61241b826121a0565b810181811067ffffffffffffffff8211171561243a576124396123e3565b5b80604052505050565b600061244d61220c565b90506124598282612412565b919050565b600067ffffffffffffffff821115612479576124786123e3565b5b602082029050602081019050919050565b600080fd5b60006124a261249d8461245e565b612443565b905080838252602082019050602084028301858111156124c5576124c461248a565b5b835b818110156124ee57806124da8882612269565b8452602084019350506020810190506124c7565b5050509392505050565b600082601f83011261250d5761250c6123de565b5b813561251d84826020860161248f565b91505092915050565b60006020828403121561253c5761253b612216565b5b600082013567ffffffffffffffff81111561255a5761255961221b565b5b612566848285016124f8565b91505092915050565b60006020828403121561258557612584612216565b5b600061259384828501612269565b91505092915050565b6125a581612240565b82525050565b60006020820190506125c0600083018461259c565b92915050565b600080604083850312156125dd576125dc612216565b5b60006125eb85828601612269565b92505060206125fc85828601612269565b9150509250929050565b60006020828403121561261c5761261b612216565b5b600061262a8482850161229f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156126b95780860481111561269557612694612633565b5b60018516156126a45780820291505b80810290506126b285612662565b9450612679565b94509492505050565b6000826126d2576001905061278e565b816126e0576000905061278e565b81600181146126f657600281146127005761272f565b600191505061278e565b60ff84111561271257612711612633565b5b8360020a91508482111561272957612728612633565b5b5061278e565b5060208310610133831016604e8410600b84101617156127645782820a90508381111561275f5761275e612633565b5b61278e565b612771848484600161266f565b9250905081840481111561278857612787612633565b5b81810290505b9392505050565b60006127a08261227e565b91506127ab836123a7565b92506127d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846126c2565b905092915050565b60006127eb8261227e565b91506127f68361227e565b92508282026128048161227e565b9150828204841483151761281b5761281a612633565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061285c8261227e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361288e5761288d612633565b5b600182019050919050565b7f74726164696e6720697320616c7265616479206f70656e000000000000000000600082015250565b60006128cf601783612165565b91506128da82612899565b602082019050919050565b600060208201905081810360008301526128fe816128c2565b9050919050565b60008151905061291481612252565b92915050565b6000602082840312156129305761292f612216565b5b600061293e84828501612905565b91505092915050565b600060408201905061295c600083018561259c565b612969602083018461259c565b9392505050565b6000819050919050565b6000819050919050565b600061299f61299a61299584612970565b61297a565b61227e565b9050919050565b6129af81612984565b82525050565b600060c0820190506129ca600083018961259c565b6129d7602083018861232a565b6129e460408301876129a6565b6129f160608301866129a6565b6129fe608083018561259c565b612a0b60a083018461232a565b979650505050505050565b600081519050612a2581612288565b92915050565b600080600060608486031215612a4457612a43612216565b5b6000612a5286828701612a16565b9350506020612a6386828701612a16565b9250506040612a7486828701612a16565b9150509250925092565b6000604082019050612a93600083018561259c565b612aa0602083018461232a565b9392505050565b612ab0816122f4565b8114612abb57600080fd5b50565b600081519050612acd81612aa7565b92915050565b600060208284031215612ae957612ae8612216565b5b6000612af784828501612abe565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612b5c602683612165565b9150612b6782612b00565b604082019050919050565b60006020820190508181036000830152612b8b81612b4f565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612bee602483612165565b9150612bf982612b92565b604082019050919050565b60006020820190508181036000830152612c1d81612be1565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c80602283612165565b9150612c8b82612c24565b604082019050919050565b60006020820190508181036000830152612caf81612c73565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612d12602583612165565b9150612d1d82612cb6565b604082019050919050565b60006020820190508181036000830152612d4181612d05565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612da4602383612165565b9150612daf82612d48565b604082019050919050565b60006020820190508181036000830152612dd381612d97565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000612e36602983612165565b9150612e4182612dda565b604082019050919050565b60006020820190508181036000830152612e6581612e29565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b6000612eee604983612165565b9150612ef982612e6c565b606082019050919050565b60006020820190508181036000830152612f1d81612ee1565b9050919050565b7f4578636565647320746865205f6d61785478416d6f756e742e00000000000000600082015250565b6000612f5a601983612165565b9150612f6582612f24565b602082019050919050565b60006020820190508181036000830152612f8981612f4d565b9050919050565b6000612f9b8261227e565b9150612fa68361227e565b9250828201905080821115612fbe57612fbd612633565b5b92915050565b7f4578636565647320746865206d617857616c6c657453697a652e000000000000600082015250565b6000612ffa601a83612165565b915061300582612fc4565b602082019050919050565b6000602082019050818103600083015261302981612fed565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613066602083612165565b915061307182613030565b602082019050919050565b6000602082019050818103600083015261309581613059565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6130d181612240565b82525050565b60006130e383836130c8565b60208301905092915050565b6000602082019050919050565b60006131078261309c565b61311181856130a7565b935061311c836130b8565b8060005b8381101561314d57815161313488826130d7565b975061313f836130ef565b925050600181019050613120565b5085935050505092915050565b600060a08201905061316f600083018861232a565b61317c60208301876129a6565b818103604083015261318e81866130fc565b905061319d606083018561259c565b6131aa608083018461232a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006131ee8261227e565b91506131f98361227e565b925082613209576132086131b4565b5b828204905092915050565b600061321f8261227e565b915061322a8361227e565b925082820390508181111561324257613241612633565b5b9291505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220ad2ab6346b449d56bfd67b15bb69928d3166564231d89b29393878e9ca5aa22564736f6c63430008110033
Deployed Bytecode Sourcemap
40554:8530:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42440:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43273:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41717:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42717:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43442:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42626:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47628:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47798:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48777:304;;;;;;;;;;;;;:::i;:::-;;42820:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19457:103;;;;;;;;;;;;;:::i;:::-;;47152:196;;;;;;;;;;;;;:::i;:::-;;41531:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18809:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41593:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42531:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42947:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41655:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40941:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47889:671;;;;;;;;;;;;;:::i;:::-;;47456:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43122:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48574:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19715:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42440:83;42477:13;42510:5;;;;;;;;;;;;;;;;;42503:12;;42440:83;:::o;43273:161::-;43348:4;43365:39;43374:12;:10;:12::i;:::-;43388:7;43397:6;43365:8;:39::i;:::-;43422:4;43415:11;;43273:161;;;;:::o;41717:50::-;;;;:::o;42717:95::-;42770:7;41338:2;41394;:13;;;;:::i;:::-;41382:9;:25;;;;:::i;:::-;42790:14;;42717:95;:::o;43442:313::-;43540:4;43557:36;43567:6;43575:9;43586:6;43557:9;:36::i;:::-;43604:121;43613:6;43621:12;:10;:12::i;:::-;43635:89;43673:6;43635:89;;;;;;;;;;;;;;;;;:11;:19;43647:6;43635:19;;;;;;;;;;;;;;;:33;43655:12;:10;:12::i;:::-;43635:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;43604:8;:121::i;:::-;43743:4;43736:11;;43442:313;;;;;:::o;42626:83::-;42667:5;41338:2;42685:16;;42626:83;:::o;47628:162::-;18695:13;:11;:13::i;:::-;47701:6:::1;47696:87;47717:6;:13;47713:1;:17;47696:87;;;47768:5;47750:4;:15;47755:6;47762:1;47755:9;;;;;;;;:::i;:::-;;;;;;;;47750:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;47732:3;;;;;:::i;:::-;;;;47696:87;;;;47628:162:::0;:::o;47798:83::-;47845:4;47866;:7;47871:1;47866:7;;;;;;;;;;;;;;;;;;;;;;;;;47859:14;;47798:83;;;:::o;48777:304::-;48819:20;48840:24;48858:4;48840:9;:24::i;:::-;48819:45;;48891:1;48878:12;:14;48875:73;;;48906:30;48923:12;48906:16;:30::i;:::-;48875:73;48958:18;48977:21;48958:40;;49023:1;49012:10;:12;49009:65;;;49038:24;49051:10;49038:12;:24::i;:::-;49009:65;48808:273;;48777:304::o;42820:119::-;42886:7;42913:9;:18;42923:7;42913:18;;;;;;;;;;;;;;;;42906:25;;42820:119;;;:::o;19457:103::-;18695:13;:11;:13::i;:::-;19522:30:::1;19549:1;19522:18;:30::i;:::-;19457:103::o:0;47152:196::-;18695:13;:11;:13::i;:::-;41338:2:::1;41394;:13;;;;:::i;:::-;41382:9;:25;;;;:::i;:::-;47205:12;:22;;;;41338:2;41394;:13;;;;:::i;:::-;41382:9;:25;;;;:::i;:::-;47238:14;:22;;;;47292:5;47271:20;;:26;;;;;;;;;;;;;;;;;;47313:27;41338:2;41394;:13;;;;:::i;:::-;41382:9;:25;;;;:::i;:::-;47313:27;;;;;;:::i;:::-;;;;;;;;47152:196::o:0;41531:55::-;;;;:::o;18809:87::-;18855:7;18882:6;;;;;;;;;;;18875:13;;18809:87;:::o;41593:55::-;;;;:::o;42531:87::-;42570:13;42603:7;;;;;;;;;;;;;;;;;42596:14;;42531:87;:::o;42947:167::-;43025:4;43042:42;43052:12;:10;:12::i;:::-;43066:9;43077:6;43042:9;:42::i;:::-;43102:4;43095:11;;42947:167;;;;:::o;41655:55::-;;;;:::o;40941:39::-;;;;;;;;;;;;;:::o;47889:671::-;18695:13;:11;:13::i;:::-;47953:11:::1;;;;;;;;;;;47952:12;47944:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;48039:42;48002:15;;:80;;;;;;;;;;;;;;;;;;48093:58;48110:4;48125:15;;;;;;;;;;;41338:2;41394;:13;;;;:::i;:::-;41382:9;:25;;;;:::i;:::-;48093:8;:58::i;:::-;48196:15;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48178:55;;;48242:4;48249:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48178:94;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48162:13;;:110;;;;;;;;;;;;;;;;;;48283:15;;;;;;;;;;;:31;;;48322:21;48353:4;48359:24;48377:4;48359:9;:24::i;:::-;48384:1;48386::::0;48388:7:::1;:5;:7::i;:::-;48396:15;48283:129;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;48437:4;48423:11;;:18;;;;;;;;;;;;;;;;;;48466:4;48452:11;;:18;;;;;;;;;;;;;;;;;;48488:13;;;;;;;;;;;48481:29;;;48519:15;;;;;;;;;;;48537:14;48481:71;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;47889:671::o:0;47456:164::-;18695:13;:11;:13::i;:::-;47530:6:::1;47525:88;47546:5;:12;47542:1;:16;47525:88;;;47597:4;47580;:14;47585:5;47591:1;47585:8;;;;;;;;:::i;:::-;;;;;;;;47580:14;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;47560:3;;;;;:::i;:::-;;;;47525:88;;;;47456:164:::0;:::o;43122:143::-;43203:7;43230:11;:18;43242:5;43230:18;;;;;;;;;;;;;;;:27;43249:7;43230:27;;;;;;;;;;;;;;;;43223:34;;43122:143;;;;:::o;48574:158::-;48645:3;48635:9;;:13;48627:22;;;;;;48675:9;;48666:7;:18;;:31;;;;;48696:1;48688:7;:9;48666:31;48658:40;;;;;;48717:7;48707:9;:17;;;;48574:158;:::o;19715:201::-;18695:13;:11;:13::i;:::-;19824:1:::1;19804:22;;:8;:22;;::::0;19796:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;19880:28;19899:8;19880:18;:28::i;:::-;19715:201:::0;:::o;17307:98::-;17360:7;17387:10;17380:17;;17307:98;:::o;43763:335::-;43873:1;43856:19;;:5;:19;;;43848:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43954:1;43935:21;;:7;:21;;;43927:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44036:6;44006:11;:18;44018:5;44006:18;;;;;;;;;;;;;;;:27;44025:7;44006:27;;;;;;;;;;;;;;;:36;;;;44074:7;44058:32;;44067:5;44058:32;;;44083:6;44058:32;;;;;;:::i;:::-;;;;;;;;43763:335;;;:::o;44106:2439::-;44210:1;44194:18;;:4;:18;;;44186:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44287:1;44273:16;;:2;:16;;;44265:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;44357:1;44348:6;:10;44340:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;44415:17;44457:7;:5;:7::i;:::-;44449:15;;:4;:15;;;;:32;;;;;44474:7;:5;:7::i;:::-;44468:13;;:2;:13;;;;44449:32;44445:1744;;;44507:4;:10;44512:4;44507:10;;;;;;;;;;;;;;;;;;;;;;;;;44506:11;:24;;;;;44522:4;:8;44527:2;44522:8;;;;;;;;;;;;;;;;;;;;;;;;;44521:9;44506:24;44498:33;;;;;;44558:73;44627:3;44558:64;44580:15;;44570:9;;:25;44569:52;;44607:14;;44569:52;;;44597:9;;44569:52;44558:6;:10;;:64;;;;:::i;:::-;:68;;:73;;;;:::i;:::-;44546:85;;44652:20;;;;;;;;;;;44648:508;;;44713:15;;;;;;;;;;;44699:30;;:2;:30;;;;:62;;;;;44747:13;;;;;;;;;;;44733:28;;:2;:28;;;;44699:62;44695:444;;;44897:12;44824:28;:39;44853:9;44824:39;;;;;;;;;;;;;;;;:85;44788:250;;;;;;;;;;;;:::i;:::-;;;;;;;;;45105:12;45063:28;:39;45092:9;45063:39;;;;;;;;;;;;;;;:54;;;;44695:444;44648:508;45184:13;;;;;;;;;;;45176:21;;:4;:21;;;:55;;;;;45215:15;;;;;;;;;;;45201:30;;:2;:30;;;;45176:55;:83;;;;;45237:18;:22;45256:2;45237:22;;;;;;;;;;;;;;;;;;;;;;;;;45235:24;45176:83;45172:313;;;45299:12;;45289:6;:22;;45281:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;45394:14;;45384:6;45368:13;45378:2;45368:9;:13::i;:::-;:22;;;;:::i;:::-;:40;;45360:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;45458:9;;:11;;;;;;;;;:::i;:::-;;;;;;45172:313;45510:13;;;;;;;;;;;45504:19;;:2;:19;;;:43;;;;;45542:4;45527:20;;:4;:20;;;;45504:43;45501:170;;;45580:75;45651:3;45580:66;45602:16;;45592:9;;:26;45591:54;;45630:15;;45591:54;;;45620:9;;45591:54;45580:6;:10;;:66;;;;:::i;:::-;:70;;:75;;;;:::i;:::-;45568:87;;45501:170;45687:28;45718:24;45736:4;45718:9;:24::i;:::-;45687:55;;45762:6;;;;;;;;;;;45761:7;:32;;;;;45780:13;;;;;;;;;;;45772:21;;:2;:21;;;45761:32;:47;;;;;45797:11;;;;;;;;;;;45761:47;:89;;;;;45833:17;;45812:20;:38;45761:89;:121;;;;;45864:18;;45854:9;;:28;45761:121;45757:421;;;45903:67;45920:49;45924:6;45931:37;45935:20;45956:11;;45931:3;:37::i;:::-;45920:3;:49::i;:::-;45903:16;:67::i;:::-;45989:26;46018:21;45989:50;;46082:1;46061:18;:22;46058:105;;;46108:35;46121:21;46108:12;:35::i;:::-;46058:105;45884:294;45757:421;44483:1706;44445:1744;46217:27;46237:6;46217:9;:15;46227:4;46217:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;46201:9;:15;46211:4;46201:15;;;;;;;;;;;;;;;:43;;;;46269:40;46287:21;46298:9;46287:6;:10;;:21;;;;:::i;:::-;46269:9;:13;46279:2;46269:13;;;;;;;;;;;;;;;;:17;;:40;;;;:::i;:::-;46255:9;:13;46265:2;46255:13;;;;;;;;;;;;;;;:54;;;;46340:2;46325:41;;46334:4;46325:41;;;46344:21;46355:9;46344:6;:10;;:21;;;;:::i;:::-;46325:41;;;;;;:::i;:::-;;;;;;;;46390:1;46380:9;:11;46377:161;;;46430:39;46459:9;46430;:24;46448:4;46430:24;;;;;;;;;;;;;;;;:28;;:39;;;;:::i;:::-;46405:9;:24;46423:4;46405:24;;;;;;;;;;;;;;;:64;;;;46510:4;46487:39;;46496:4;46487:39;;;46516:9;46487:39;;;;;;:::i;:::-;;;;;;;;46377:161;44175:2370;44106:2439;;;:::o;5208:240::-;5328:7;5386:1;5381;:6;;5389:12;5373:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5428:1;5424;:5;5417:12;;5208:240;;;;;:::o;18974:132::-;19049:12;:10;:12::i;:::-;19038:23;;:7;:5;:7::i;:::-;:23;;;19030:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18974:132::o;46661:483::-;42058:4;42049:6;;:13;;;;;;;;;;;;;;;;;;46739:21:::1;46777:1;46763:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46739:40;;46808:4;46790;46795:1;46790:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;46834:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46824:4;46829:1;46824:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;::::0;::::1;46867:62;46884:4;46899:15;;;;;;;;;;;46917:11;46867:8;:62::i;:::-;46940:15;;;;;;;;;;;:66;;;47021:11;47047:1;47063:4;47090;47110:15;46940:196;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46728:416;42094:5:::0;42085:6;;:14;;;;;;;;;;;;;;;;;;46661:483;:::o;47356:92::-;47413:10;;;;;;;;;;;:19;;:27;47433:6;47413:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47356:92;:::o;20076:191::-;20150:16;20169:6;;;;;;;;;;;20150:25;;20195:8;20186:6;;:17;;;;;;;;;;;;;;;;;;20250:8;20219:40;;20240:8;20219:40;;;;;;;;;;;;20139:128;20076:191;:::o;3667:98::-;3725:7;3756:1;3752;:5;;;;:::i;:::-;3745:12;;3667:98;;;;:::o;4066:::-;4124:7;4155:1;4151;:5;;;;:::i;:::-;4144:12;;4066:98;;;;:::o;46555:::-;46612:7;46639:1;46637;:3;46636:9;;46644:1;46636:9;;;46642:1;46636:9;46629:16;;46555:98;;;;:::o;3310:::-;3368:7;3399:1;3395;:5;;;;:::i;:::-;3388:12;;3310:98;;;;:::o;2929:::-;2987:7;3018:1;3014;:5;;;;:::i;:::-;3007:12;;2929:98;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:86::-;4458:7;4498:4;4491:5;4487:16;4476:27;;4423:86;;;:::o;4515:112::-;4598:22;4614:5;4598:22;:::i;:::-;4593:3;4586:35;4515:112;;:::o;4633:214::-;4722:4;4760:2;4749:9;4745:18;4737:26;;4773:67;4837:1;4826:9;4822:17;4813:6;4773:67;:::i;:::-;4633:214;;;;:::o;4853:117::-;4962:1;4959;4952:12;4976:180;5024:77;5021:1;5014:88;5121:4;5118:1;5111:15;5145:4;5142:1;5135:15;5162:281;5245:27;5267:4;5245:27;:::i;:::-;5237:6;5233:40;5375:6;5363:10;5360:22;5339:18;5327:10;5324:34;5321:62;5318:88;;;5386:18;;:::i;:::-;5318:88;5426:10;5422:2;5415:22;5205:238;5162:281;;:::o;5449:129::-;5483:6;5510:20;;:::i;:::-;5500:30;;5539:33;5567:4;5559:6;5539:33;:::i;:::-;5449:129;;;:::o;5584:311::-;5661:4;5751:18;5743:6;5740:30;5737:56;;;5773:18;;:::i;:::-;5737:56;5823:4;5815:6;5811:17;5803:25;;5883:4;5877;5873:15;5865:23;;5584:311;;;:::o;5901:117::-;6010:1;6007;6000:12;6041:710;6137:5;6162:81;6178:64;6235:6;6178:64;:::i;:::-;6162:81;:::i;:::-;6153:90;;6263:5;6292:6;6285:5;6278:21;6326:4;6319:5;6315:16;6308:23;;6379:4;6371:6;6367:17;6359:6;6355:30;6408:3;6400:6;6397:15;6394:122;;;6427:79;;:::i;:::-;6394:122;6542:6;6525:220;6559:6;6554:3;6551:15;6525:220;;;6634:3;6663:37;6696:3;6684:10;6663:37;:::i;:::-;6658:3;6651:50;6730:4;6725:3;6721:14;6714:21;;6601:144;6585:4;6580:3;6576:14;6569:21;;6525:220;;;6529:21;6143:608;;6041:710;;;;;:::o;6774:370::-;6845:5;6894:3;6887:4;6879:6;6875:17;6871:27;6861:122;;6902:79;;:::i;:::-;6861:122;7019:6;7006:20;7044:94;7134:3;7126:6;7119:4;7111:6;7107:17;7044:94;:::i;:::-;7035:103;;6851:293;6774:370;;;;:::o;7150:539::-;7234:6;7283:2;7271:9;7262:7;7258:23;7254:32;7251:119;;;7289:79;;:::i;:::-;7251:119;7437:1;7426:9;7422:17;7409:31;7467:18;7459:6;7456:30;7453:117;;;7489:79;;:::i;:::-;7453:117;7594:78;7664:7;7655:6;7644:9;7640:22;7594:78;:::i;:::-;7584:88;;7380:302;7150:539;;;;:::o;7695:329::-;7754:6;7803:2;7791:9;7782:7;7778:23;7774:32;7771:119;;;7809:79;;:::i;:::-;7771:119;7929:1;7954:53;7999:7;7990:6;7979:9;7975:22;7954:53;:::i;:::-;7944:63;;7900:117;7695:329;;;;:::o;8030:118::-;8117:24;8135:5;8117:24;:::i;:::-;8112:3;8105:37;8030:118;;:::o;8154:222::-;8247:4;8285:2;8274:9;8270:18;8262:26;;8298:71;8366:1;8355:9;8351:17;8342:6;8298:71;:::i;:::-;8154:222;;;;:::o;8382:474::-;8450:6;8458;8507:2;8495:9;8486:7;8482:23;8478:32;8475:119;;;8513:79;;:::i;:::-;8475:119;8633:1;8658:53;8703:7;8694:6;8683:9;8679:22;8658:53;:::i;:::-;8648:63;;8604:117;8760:2;8786:53;8831:7;8822:6;8811:9;8807:22;8786:53;:::i;:::-;8776:63;;8731:118;8382:474;;;;;:::o;8862:329::-;8921:6;8970:2;8958:9;8949:7;8945:23;8941:32;8938:119;;;8976:79;;:::i;:::-;8938:119;9096:1;9121:53;9166:7;9157:6;9146:9;9142:22;9121:53;:::i;:::-;9111:63;;9067:117;8862:329;;;;:::o;9197:180::-;9245:77;9242:1;9235:88;9342:4;9339:1;9332:15;9366:4;9363:1;9356:15;9383:102;9425:8;9472:5;9469:1;9465:13;9444:34;;9383:102;;;:::o;9491:848::-;9552:5;9559:4;9583:6;9574:15;;9607:5;9598:14;;9621:712;9642:1;9632:8;9629:15;9621:712;;;9737:4;9732:3;9728:14;9722:4;9719:24;9716:50;;;9746:18;;:::i;:::-;9716:50;9796:1;9786:8;9782:16;9779:451;;;10211:4;10204:5;10200:16;10191:25;;9779:451;10261:4;10255;10251:15;10243:23;;10291:32;10314:8;10291:32;:::i;:::-;10279:44;;9621:712;;;9491:848;;;;;;;:::o;10345:1073::-;10399:5;10590:8;10580:40;;10611:1;10602:10;;10613:5;;10580:40;10639:4;10629:36;;10656:1;10647:10;;10658:5;;10629:36;10725:4;10773:1;10768:27;;;;10809:1;10804:191;;;;10718:277;;10768:27;10786:1;10777:10;;10788:5;;;10804:191;10849:3;10839:8;10836:17;10833:43;;;10856:18;;:::i;:::-;10833:43;10905:8;10902:1;10898:16;10889:25;;10940:3;10933:5;10930:14;10927:40;;;10947:18;;:::i;:::-;10927:40;10980:5;;;10718:277;;11104:2;11094:8;11091:16;11085:3;11079:4;11076:13;11072:36;11054:2;11044:8;11041:16;11036:2;11030:4;11027:12;11023:35;11007:111;11004:246;;;11160:8;11154:4;11150:19;11141:28;;11195:3;11188:5;11185:14;11182:40;;;11202:18;;:::i;:::-;11182:40;11235:5;;11004:246;11275:42;11313:3;11303:8;11297:4;11294:1;11275:42;:::i;:::-;11260:57;;;;11349:4;11344:3;11340:14;11333:5;11330:25;11327:51;;;11358:18;;:::i;:::-;11327:51;11407:4;11400:5;11396:16;11387:25;;10345:1073;;;;;;:::o;11424:281::-;11482:5;11506:23;11524:4;11506:23;:::i;:::-;11498:31;;11550:25;11566:8;11550:25;:::i;:::-;11538:37;;11594:104;11631:66;11621:8;11615:4;11594:104;:::i;:::-;11585:113;;11424:281;;;;:::o;11711:410::-;11751:7;11774:20;11792:1;11774:20;:::i;:::-;11769:25;;11808:20;11826:1;11808:20;:::i;:::-;11803:25;;11863:1;11860;11856:9;11885:30;11903:11;11885:30;:::i;:::-;11874:41;;12064:1;12055:7;12051:15;12048:1;12045:22;12025:1;12018:9;11998:83;11975:139;;12094:18;;:::i;:::-;11975:139;11759:362;11711:410;;;;:::o;12127:180::-;12175:77;12172:1;12165:88;12272:4;12269:1;12262:15;12296:4;12293:1;12286:15;12313:233;12352:3;12375:24;12393:5;12375:24;:::i;:::-;12366:33;;12421:66;12414:5;12411:77;12408:103;;12491:18;;:::i;:::-;12408:103;12538:1;12531:5;12527:13;12520:20;;12313:233;;;:::o;12552:173::-;12692:25;12688:1;12680:6;12676:14;12669:49;12552:173;:::o;12731:366::-;12873:3;12894:67;12958:2;12953:3;12894:67;:::i;:::-;12887:74;;12970:93;13059:3;12970:93;:::i;:::-;13088:2;13083:3;13079:12;13072:19;;12731:366;;;:::o;13103:419::-;13269:4;13307:2;13296:9;13292:18;13284:26;;13356:9;13350:4;13346:20;13342:1;13331:9;13327:17;13320:47;13384:131;13510:4;13384:131;:::i;:::-;13376:139;;13103:419;;;:::o;13528:143::-;13585:5;13616:6;13610:13;13601:22;;13632:33;13659:5;13632:33;:::i;:::-;13528:143;;;;:::o;13677:351::-;13747:6;13796:2;13784:9;13775:7;13771:23;13767:32;13764:119;;;13802:79;;:::i;:::-;13764:119;13922:1;13947:64;14003:7;13994:6;13983:9;13979:22;13947:64;:::i;:::-;13937:74;;13893:128;13677:351;;;;:::o;14034:332::-;14155:4;14193:2;14182:9;14178:18;14170:26;;14206:71;14274:1;14263:9;14259:17;14250:6;14206:71;:::i;:::-;14287:72;14355:2;14344:9;14340:18;14331:6;14287:72;:::i;:::-;14034:332;;;;;:::o;14372:85::-;14417:7;14446:5;14435:16;;14372:85;;;:::o;14463:60::-;14491:3;14512:5;14505:12;;14463:60;;;:::o;14529:158::-;14587:9;14620:61;14638:42;14647:32;14673:5;14647:32;:::i;:::-;14638:42;:::i;:::-;14620:61;:::i;:::-;14607:74;;14529:158;;;:::o;14693:147::-;14788:45;14827:5;14788:45;:::i;:::-;14783:3;14776:58;14693:147;;:::o;14846:807::-;15095:4;15133:3;15122:9;15118:19;15110:27;;15147:71;15215:1;15204:9;15200:17;15191:6;15147:71;:::i;:::-;15228:72;15296:2;15285:9;15281:18;15272:6;15228:72;:::i;:::-;15310:80;15386:2;15375:9;15371:18;15362:6;15310:80;:::i;:::-;15400;15476:2;15465:9;15461:18;15452:6;15400:80;:::i;:::-;15490:73;15558:3;15547:9;15543:19;15534:6;15490:73;:::i;:::-;15573;15641:3;15630:9;15626:19;15617:6;15573:73;:::i;:::-;14846:807;;;;;;;;;:::o;15659:143::-;15716:5;15747:6;15741:13;15732:22;;15763:33;15790:5;15763:33;:::i;:::-;15659:143;;;;:::o;15808:663::-;15896:6;15904;15912;15961:2;15949:9;15940:7;15936:23;15932:32;15929:119;;;15967:79;;:::i;:::-;15929:119;16087:1;16112:64;16168:7;16159:6;16148:9;16144:22;16112:64;:::i;:::-;16102:74;;16058:128;16225:2;16251:64;16307:7;16298:6;16287:9;16283:22;16251:64;:::i;:::-;16241:74;;16196:129;16364:2;16390:64;16446:7;16437:6;16426:9;16422:22;16390:64;:::i;:::-;16380:74;;16335:129;15808:663;;;;;:::o;16477:332::-;16598:4;16636:2;16625:9;16621:18;16613:26;;16649:71;16717:1;16706:9;16702:17;16693:6;16649:71;:::i;:::-;16730:72;16798:2;16787:9;16783:18;16774:6;16730:72;:::i;:::-;16477:332;;;;;:::o;16815:116::-;16885:21;16900:5;16885:21;:::i;:::-;16878:5;16875:32;16865:60;;16921:1;16918;16911:12;16865:60;16815:116;:::o;16937:137::-;16991:5;17022:6;17016:13;17007:22;;17038:30;17062:5;17038:30;:::i;:::-;16937:137;;;;:::o;17080:345::-;17147:6;17196:2;17184:9;17175:7;17171:23;17167:32;17164:119;;;17202:79;;:::i;:::-;17164:119;17322:1;17347:61;17400:7;17391:6;17380:9;17376:22;17347:61;:::i;:::-;17337:71;;17293:125;17080:345;;;;:::o;17431:225::-;17571:34;17567:1;17559:6;17555:14;17548:58;17640:8;17635:2;17627:6;17623:15;17616:33;17431:225;:::o;17662:366::-;17804:3;17825:67;17889:2;17884:3;17825:67;:::i;:::-;17818:74;;17901:93;17990:3;17901:93;:::i;:::-;18019:2;18014:3;18010:12;18003:19;;17662:366;;;:::o;18034:419::-;18200:4;18238:2;18227:9;18223:18;18215:26;;18287:9;18281:4;18277:20;18273:1;18262:9;18258:17;18251:47;18315:131;18441:4;18315:131;:::i;:::-;18307:139;;18034:419;;;:::o;18459:223::-;18599:34;18595:1;18587:6;18583:14;18576:58;18668:6;18663:2;18655:6;18651:15;18644:31;18459:223;:::o;18688:366::-;18830:3;18851:67;18915:2;18910:3;18851:67;:::i;:::-;18844:74;;18927:93;19016:3;18927:93;:::i;:::-;19045:2;19040:3;19036:12;19029:19;;18688:366;;;:::o;19060:419::-;19226:4;19264:2;19253:9;19249:18;19241:26;;19313:9;19307:4;19303:20;19299:1;19288:9;19284:17;19277:47;19341:131;19467:4;19341:131;:::i;:::-;19333:139;;19060:419;;;:::o;19485:221::-;19625:34;19621:1;19613:6;19609:14;19602:58;19694:4;19689:2;19681:6;19677:15;19670:29;19485:221;:::o;19712:366::-;19854:3;19875:67;19939:2;19934:3;19875:67;:::i;:::-;19868:74;;19951:93;20040:3;19951:93;:::i;:::-;20069:2;20064:3;20060:12;20053:19;;19712:366;;;:::o;20084:419::-;20250:4;20288:2;20277:9;20273:18;20265:26;;20337:9;20331:4;20327:20;20323:1;20312:9;20308:17;20301:47;20365:131;20491:4;20365:131;:::i;:::-;20357:139;;20084:419;;;:::o;20509:224::-;20649:34;20645:1;20637:6;20633:14;20626:58;20718:7;20713:2;20705:6;20701:15;20694:32;20509:224;:::o;20739:366::-;20881:3;20902:67;20966:2;20961:3;20902:67;:::i;:::-;20895:74;;20978:93;21067:3;20978:93;:::i;:::-;21096:2;21091:3;21087:12;21080:19;;20739:366;;;:::o;21111:419::-;21277:4;21315:2;21304:9;21300:18;21292:26;;21364:9;21358:4;21354:20;21350:1;21339:9;21335:17;21328:47;21392:131;21518:4;21392:131;:::i;:::-;21384:139;;21111:419;;;:::o;21536:222::-;21676:34;21672:1;21664:6;21660:14;21653:58;21745:5;21740:2;21732:6;21728:15;21721:30;21536:222;:::o;21764:366::-;21906:3;21927:67;21991:2;21986:3;21927:67;:::i;:::-;21920:74;;22003:93;22092:3;22003:93;:::i;:::-;22121:2;22116:3;22112:12;22105:19;;21764:366;;;:::o;22136:419::-;22302:4;22340:2;22329:9;22325:18;22317:26;;22389:9;22383:4;22379:20;22375:1;22364:9;22360:17;22353:47;22417:131;22543:4;22417:131;:::i;:::-;22409:139;;22136:419;;;:::o;22561:228::-;22701:34;22697:1;22689:6;22685:14;22678:58;22770:11;22765:2;22757:6;22753:15;22746:36;22561:228;:::o;22795:366::-;22937:3;22958:67;23022:2;23017:3;22958:67;:::i;:::-;22951:74;;23034:93;23123:3;23034:93;:::i;:::-;23152:2;23147:3;23143:12;23136:19;;22795:366;;;:::o;23167:419::-;23333:4;23371:2;23360:9;23356:18;23348:26;;23420:9;23414:4;23410:20;23406:1;23395:9;23391:17;23384:47;23448:131;23574:4;23448:131;:::i;:::-;23440:139;;23167:419;;;:::o;23592:297::-;23732:34;23728:1;23720:6;23716:14;23709:58;23801:34;23796:2;23788:6;23784:15;23777:59;23870:11;23865:2;23857:6;23853:15;23846:36;23592:297;:::o;23895:366::-;24037:3;24058:67;24122:2;24117:3;24058:67;:::i;:::-;24051:74;;24134:93;24223:3;24134:93;:::i;:::-;24252:2;24247:3;24243:12;24236:19;;23895:366;;;:::o;24267:419::-;24433:4;24471:2;24460:9;24456:18;24448:26;;24520:9;24514:4;24510:20;24506:1;24495:9;24491:17;24484:47;24548:131;24674:4;24548:131;:::i;:::-;24540:139;;24267:419;;;:::o;24692:175::-;24832:27;24828:1;24820:6;24816:14;24809:51;24692:175;:::o;24873:366::-;25015:3;25036:67;25100:2;25095:3;25036:67;:::i;:::-;25029:74;;25112:93;25201:3;25112:93;:::i;:::-;25230:2;25225:3;25221:12;25214:19;;24873:366;;;:::o;25245:419::-;25411:4;25449:2;25438:9;25434:18;25426:26;;25498:9;25492:4;25488:20;25484:1;25473:9;25469:17;25462:47;25526:131;25652:4;25526:131;:::i;:::-;25518:139;;25245:419;;;:::o;25670:191::-;25710:3;25729:20;25747:1;25729:20;:::i;:::-;25724:25;;25763:20;25781:1;25763:20;:::i;:::-;25758:25;;25806:1;25803;25799:9;25792:16;;25827:3;25824:1;25821:10;25818:36;;;25834:18;;:::i;:::-;25818:36;25670:191;;;;:::o;25867:176::-;26007:28;26003:1;25995:6;25991:14;25984:52;25867:176;:::o;26049:366::-;26191:3;26212:67;26276:2;26271:3;26212:67;:::i;:::-;26205:74;;26288:93;26377:3;26288:93;:::i;:::-;26406:2;26401:3;26397:12;26390:19;;26049:366;;;:::o;26421:419::-;26587:4;26625:2;26614:9;26610:18;26602:26;;26674:9;26668:4;26664:20;26660:1;26649:9;26645:17;26638:47;26702:131;26828:4;26702:131;:::i;:::-;26694:139;;26421:419;;;:::o;26846:182::-;26986:34;26982:1;26974:6;26970:14;26963:58;26846:182;:::o;27034:366::-;27176:3;27197:67;27261:2;27256:3;27197:67;:::i;:::-;27190:74;;27273:93;27362:3;27273:93;:::i;:::-;27391:2;27386:3;27382:12;27375:19;;27034:366;;;:::o;27406:419::-;27572:4;27610:2;27599:9;27595:18;27587:26;;27659:9;27653:4;27649:20;27645:1;27634:9;27630:17;27623:47;27687:131;27813:4;27687:131;:::i;:::-;27679:139;;27406:419;;;:::o;27831:114::-;27898:6;27932:5;27926:12;27916:22;;27831:114;;;:::o;27951:184::-;28050:11;28084:6;28079:3;28072:19;28124:4;28119:3;28115:14;28100:29;;27951:184;;;;:::o;28141:132::-;28208:4;28231:3;28223:11;;28261:4;28256:3;28252:14;28244:22;;28141:132;;;:::o;28279:108::-;28356:24;28374:5;28356:24;:::i;:::-;28351:3;28344:37;28279:108;;:::o;28393:179::-;28462:10;28483:46;28525:3;28517:6;28483:46;:::i;:::-;28561:4;28556:3;28552:14;28538:28;;28393:179;;;;:::o;28578:113::-;28648:4;28680;28675:3;28671:14;28663:22;;28578:113;;;:::o;28727:732::-;28846:3;28875:54;28923:5;28875:54;:::i;:::-;28945:86;29024:6;29019:3;28945:86;:::i;:::-;28938:93;;29055:56;29105:5;29055:56;:::i;:::-;29134:7;29165:1;29150:284;29175:6;29172:1;29169:13;29150:284;;;29251:6;29245:13;29278:63;29337:3;29322:13;29278:63;:::i;:::-;29271:70;;29364:60;29417:6;29364:60;:::i;:::-;29354:70;;29210:224;29197:1;29194;29190:9;29185:14;;29150:284;;;29154:14;29450:3;29443:10;;28851:608;;;28727:732;;;;:::o;29465:831::-;29728:4;29766:3;29755:9;29751:19;29743:27;;29780:71;29848:1;29837:9;29833:17;29824:6;29780:71;:::i;:::-;29861:80;29937:2;29926:9;29922:18;29913:6;29861:80;:::i;:::-;29988:9;29982:4;29978:20;29973:2;29962:9;29958:18;29951:48;30016:108;30119:4;30110:6;30016:108;:::i;:::-;30008:116;;30134:72;30202:2;30191:9;30187:18;30178:6;30134:72;:::i;:::-;30216:73;30284:3;30273:9;30269:19;30260:6;30216:73;:::i;:::-;29465:831;;;;;;;;:::o;30302:180::-;30350:77;30347:1;30340:88;30447:4;30444:1;30437:15;30471:4;30468:1;30461:15;30488:185;30528:1;30545:20;30563:1;30545:20;:::i;:::-;30540:25;;30579:20;30597:1;30579:20;:::i;:::-;30574:25;;30618:1;30608:35;;30623:18;;:::i;:::-;30608:35;30665:1;30662;30658:9;30653:14;;30488:185;;;;:::o;30679:194::-;30719:4;30739:20;30757:1;30739:20;:::i;:::-;30734:25;;30773:20;30791:1;30773:20;:::i;:::-;30768:25;;30817:1;30814;30810:9;30802:17;;30841:1;30835:4;30832:11;30829:37;;;30846:18;;:::i;:::-;30829:37;30679:194;;;;:::o
Swarm Source
ipfs://ad2ab6346b449d56bfd67b15bb69928d3166564231d89b29393878e9ca5aa225
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.