ERC-20
Overview
Max Total Supply
28,219,000 BNA
Holders
789
Total Transfers
-
Market
Price
$0.00 @ 0.000000 FTM
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
BananaToken
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2022-04-01 */ // SPDX-License-Identifier: MIT /* ____ _ ____ _ _ ____ | __ ) __ _| |__ _ _ / ___| |__ (_)_ __ ___ _ __ / ___| __ _ _ __ __ _ | _ \ / _` | '_ \| | | | | | '_ \| | '_ ` _ \| '_ \| | _ / _` | '_ \ / _` | | |_) | (_| | |_) | |_| | |___| | | | | | | | | | |_) | |_| | (_| | | | | (_| | |____/ \__,_|_.__/ \__, |\____|_| |_|_|_| |_| |_| .__/ \____|\__,_|_| |_|\__, | |___/ |_| |___/ */ // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } } // File: @openzeppelin/contracts/utils/Arrays.sol // OpenZeppelin Contracts v4.4.1 (utils/Arrays.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to array types. */ library Arrays { /** * @dev Searches a sorted `array` and returns the first index that contains * a value greater or equal to `element`. If no such index exists (i.e. all * values in the array are strictly less than `element`), the array length is * returned. Time complexity O(log n). * * `array` is expected to be sorted in ascending order, and to contain no * repeated elements. */ function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) { if (array.length == 0) { return 0; } uint256 low = 0; uint256 high = array.length; while (low < high) { uint256 mid = Math.average(low, high); // Note that mid will always be strictly less than high (i.e. it will be a valid array index) // because Math.average rounds down (it does integer division with truncation). if (array[mid] > element) { high = mid; } else { low = mid + 1; } } // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound. if (low > 0 && array[low - 1] == element) { return low - 1; } else { return low; } } } // File: @openzeppelin/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: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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); } // File: @openzeppelin/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: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.5.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.zeppelin.solutions/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, _allowances[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 = _allowances[owner][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * 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; } _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; _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; } _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 Spend `amount` form the allowance of `owner` toward `spender`. * * 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: @openzeppelin/contracts/token/ERC20/extensions/ERC20Snapshot.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/ERC20Snapshot.sol) pragma solidity ^0.8.0; /** * @dev This contract extends an ERC20 token with a snapshot mechanism. When a snapshot is created, the balances and * total supply at the time are recorded for later access. * * This can be used to safely create mechanisms based on token balances such as trustless dividends or weighted voting. * In naive implementations it's possible to perform a "double spend" attack by reusing the same balance from different * accounts. By using snapshots to calculate dividends or voting power, those attacks no longer apply. It can also be * used to create an efficient ERC20 forking mechanism. * * Snapshots are created by the internal {_snapshot} function, which will emit the {Snapshot} event and return a * snapshot id. To get the total supply at the time of a snapshot, call the function {totalSupplyAt} with the snapshot * id. To get the balance of an account at the time of a snapshot, call the {balanceOfAt} function with the snapshot id * and the account address. * * NOTE: Snapshot policy can be customized by overriding the {_getCurrentSnapshotId} method. For example, having it * return `block.number` will trigger the creation of snapshot at the begining of each new block. When overridding this * function, be careful about the monotonicity of its result. Non-monotonic snapshot ids will break the contract. * * Implementing snapshots for every block using this method will incur significant gas costs. For a gas-efficient * alternative consider {ERC20Votes}. * * ==== Gas Costs * * Snapshots are efficient. Snapshot creation is _O(1)_. Retrieval of balances or total supply from a snapshot is _O(log * n)_ in the number of snapshots that have been created, although _n_ for a specific account will generally be much * smaller since identical balances in subsequent snapshots are stored as a single entry. * * There is a constant overhead for normal ERC20 transfers due to the additional snapshot bookkeeping. This overhead is * only significant for the first transfer that immediately follows a snapshot for a particular account. Subsequent * transfers will have normal cost until the next snapshot, and so on. */ abstract contract ERC20Snapshot is ERC20 { // Inspired by Jordi Baylina's MiniMeToken to record historical balances: // https://github.com/Giveth/minimd/blob/ea04d950eea153a04c51fa510b068b9dded390cb/contracts/MiniMeToken.sol using Arrays for uint256[]; using Counters for Counters.Counter; // Snapshotted values have arrays of ids and the value corresponding to that id. These could be an array of a // Snapshot struct, but that would impede usage of functions that work on an array. struct Snapshots { uint256[] ids; uint256[] values; } mapping(address => Snapshots) private _accountBalanceSnapshots; Snapshots private _totalSupplySnapshots; // Snapshot ids increase monotonically, with the first value being 1. An id of 0 is invalid. Counters.Counter private _currentSnapshotId; /** * @dev Emitted by {_snapshot} when a snapshot identified by `id` is created. */ event Snapshot(uint256 id); /** * @dev Creates a new snapshot and returns its snapshot id. * * Emits a {Snapshot} event that contains the same id. * * {_snapshot} is `internal` and you have to decide how to expose it externally. Its usage may be restricted to a * set of accounts, for example using {AccessControl}, or it may be open to the public. * * [WARNING] * ==== * While an open way of calling {_snapshot} is required for certain trust minimization mechanisms such as forking, * you must consider that it can potentially be used by attackers in two ways. * * First, it can be used to increase the cost of retrieval of values from snapshots, although it will grow * logarithmically thus rendering this attack ineffective in the long term. Second, it can be used to target * specific accounts and increase the cost of ERC20 transfers for them, in the ways specified in the Gas Costs * section above. * * We haven't measured the actual numbers; if this is something you're interested in please reach out to us. * ==== */ function _snapshot() internal virtual returns (uint256) { _currentSnapshotId.increment(); uint256 currentId = _getCurrentSnapshotId(); emit Snapshot(currentId); return currentId; } /** * @dev Get the current snapshotId */ function _getCurrentSnapshotId() internal view virtual returns (uint256) { return _currentSnapshotId.current(); } /** * @dev Retrieves the balance of `account` at the time `snapshotId` was created. */ function balanceOfAt(address account, uint256 snapshotId) public view virtual returns (uint256) { (bool snapshotted, uint256 value) = _valueAt(snapshotId, _accountBalanceSnapshots[account]); return snapshotted ? value : balanceOf(account); } /** * @dev Retrieves the total supply at the time `snapshotId` was created. */ function totalSupplyAt(uint256 snapshotId) public view virtual returns (uint256) { (bool snapshotted, uint256 value) = _valueAt(snapshotId, _totalSupplySnapshots); return snapshotted ? value : totalSupply(); } // Update balance and/or total supply snapshots before the values are modified. This is implemented // in the _beforeTokenTransfer hook, which is executed for _mint, _burn, and _transfer operations. function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override { super._beforeTokenTransfer(from, to, amount); if (from == address(0)) { // mint _updateAccountSnapshot(to); _updateTotalSupplySnapshot(); } else if (to == address(0)) { // burn _updateAccountSnapshot(from); _updateTotalSupplySnapshot(); } else { // transfer _updateAccountSnapshot(from); _updateAccountSnapshot(to); } } function _valueAt(uint256 snapshotId, Snapshots storage snapshots) private view returns (bool, uint256) { require(snapshotId > 0, "ERC20Snapshot: id is 0"); require(snapshotId <= _getCurrentSnapshotId(), "ERC20Snapshot: nonexistent id"); // When a valid snapshot is queried, there are three possibilities: // a) The queried value was not modified after the snapshot was taken. Therefore, a snapshot entry was never // created for this id, and all stored snapshot ids are smaller than the requested one. The value that corresponds // to this id is the current one. // b) The queried value was modified after the snapshot was taken. Therefore, there will be an entry with the // requested id, and its value is the one to return. // c) More snapshots were created after the requested one, and the queried value was later modified. There will be // no entry for the requested id: the value that corresponds to it is that of the smallest snapshot id that is // larger than the requested one. // // In summary, we need to find an element in an array, returning the index of the smallest value that is larger if // it is not found, unless said value doesn't exist (e.g. when all values are smaller). Arrays.findUpperBound does // exactly this. uint256 index = snapshots.ids.findUpperBound(snapshotId); if (index == snapshots.ids.length) { return (false, 0); } else { return (true, snapshots.values[index]); } } function _updateAccountSnapshot(address account) private { _updateSnapshot(_accountBalanceSnapshots[account], balanceOf(account)); } function _updateTotalSupplySnapshot() private { _updateSnapshot(_totalSupplySnapshots, totalSupply()); } function _updateSnapshot(Snapshots storage snapshots, uint256 currentValue) private { uint256 currentId = _getCurrentSnapshotId(); if (_lastSnapshotId(snapshots.ids) < currentId) { snapshots.ids.push(currentId); snapshots.values.push(currentValue); } } function _lastSnapshotId(uint256[] storage ids) private view returns (uint256) { if (ids.length == 0) { return 0; } else { return ids[ids.length - 1]; } } } // File: @openzeppelin/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: banatoken.sol pragma solidity ^0.8.4; /* ____ _ ____ _ _ ____ | __ ) __ _| |__ _ _ / ___| |__ (_)_ __ ___ _ __ / ___| __ _ _ __ __ _ | _ \ / _` | '_ \| | | | | | '_ \| | '_ ` _ \| '_ \| | _ / _` | '_ \ / _` | | |_) | (_| | |_) | |_| | |___| | | | | | | | | | |_) | |_| | (_| | | | | (_| | |____/ \__,_|_.__/ \__, |\____|_| |_|_|_| |_| |_| .__/ \____|\__,_|_| |_|\__, | |___/ |_| |___/ */ contract BananaToken is ERC20, ERC20Burnable, ERC20Snapshot, Ownable { uint256 public constant MAX_TOKENS = 100000000 * 10 ** 18; // 100M constructor() ERC20("BananaToken", "BNA") { _mint(msg.sender, 10000000 * 10 ** decimals()); // 10M } function snapshot() public onlyOwner { _snapshot(); } function mint(address to, uint256 amount) public onlyOwner { require(totalSupply() + amount * 10 ** decimals() <= MAX_TOKENS, 'Would exceed max supply.'); _mint(to, amount * 10 ** decimals()); } function mint_decimals(address to, uint256 amount) public onlyOwner { require(totalSupply() + amount <= MAX_TOKENS, 'Would exceed max supply.'); _mint(to, amount); } function bulkMint(address[] calldata addresses, uint256 amount) public onlyOwner { require(totalSupply() + addresses.length * amount * 10 ** decimals() <= MAX_TOKENS, 'Would exceed max supply.'); require(addresses.length > 0, "empty address array"); uint256 index; for (index = 0; index < addresses.length; index++) { _mint(addresses[index], amount * 10 ** decimals()); } } function bulkMint_decimals(address[] calldata addresses, uint256 amount) public onlyOwner { require(totalSupply() + addresses.length * amount <= MAX_TOKENS, 'Would exceed max supply.'); require(addresses.length > 0, "empty address array"); uint256 index; for (index = 0; index < addresses.length; index++) { _mint(addresses[index], amount); } } // The following functions are overrides required by Solidity. function _beforeTokenTransfer(address from, address to, uint256 amount) internal override(ERC20, ERC20Snapshot) { super._beforeTokenTransfer(from, to, amount); } }
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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Snapshot","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":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"balanceOfAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bulkMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bulkMint_decimals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint_decimals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"totalSupplyAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","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"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600b81526020017f42616e616e61546f6b656e0000000000000000000000000000000000000000008152506040518060400160405280600381526020017f424e4100000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000969291906200066e565b508060049080519060200190620000af9291906200066e565b505050620000d2620000c66200011760201b60201c565b6200011f60201b60201c565b6200011133620000e7620001e560201b60201c565b600a620000f591906200085e565b629896806200010591906200099b565b620001ee60201b60201c565b62000b47565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000261576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002589062000756565b60405180910390fd5b62000275600083836200036760201b60201c565b8060026000828254620002899190620007a6565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620002e09190620007a6565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000347919062000778565b60405180910390a362000363600083836200038460201b60201c565b5050565b6200037f8383836200038960201b620011191760201c565b505050565b505050565b620003a18383836200048460201b620011d31760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620003fe57620003e8826200048960201b60201c565b620003f8620004ec60201b60201c565b6200047f565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200045b5762000445836200048960201b60201c565b62000455620004ec60201b60201c565b6200047e565b6200046c836200048960201b60201c565b6200047d826200048960201b60201c565b5b5b505050565b505050565b620004e9600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020620004dd836200051060201b60201c565b6200055860201b60201c565b50565b6200050e600662000502620005e460201b60201c565b6200055860201b60201c565b565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006200056a620005ee60201b60201c565b90508062000581846000016200060c60201b60201c565b1015620005df5782600001819080600181540180825580915050600190039060005260206000200160009091909190915055826001018290806001815401808255809150506001900390600052602060002001600090919091909150555b505050565b6000600254905090565b60006200060760086200066060201b620011d81760201c565b905090565b600080828054905014156200062557600090506200065b565b8160018380549050620006399190620009fc565b815481106200064d576200064c62000ae2565b5b906000526020600020015490505b919050565b600081600001549050919050565b8280546200067c9062000a4e565b90600052602060002090601f016020900481019282620006a05760008555620006ec565b82601f10620006bb57805160ff1916838001178555620006ec565b82800160010185558215620006ec579182015b82811115620006eb578251825591602001919060010190620006ce565b5b509050620006fb9190620006ff565b5090565b5b808211156200071a57600081600090555060010162000700565b5090565b60006200072d601f8362000795565b91506200073a8262000b1e565b602082019050919050565b620007508162000a37565b82525050565b6000602082019050818103600083015262000771816200071e565b9050919050565b60006020820190506200078f600083018462000745565b92915050565b600082825260208201905092915050565b6000620007b38262000a37565b9150620007c08362000a37565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620007f857620007f762000a84565b5b828201905092915050565b6000808291508390505b600185111562000855578086048111156200082d576200082c62000a84565b5b60018516156200083d5780820291505b80810290506200084d8562000b11565b94506200080d565b94509492505050565b60006200086b8262000a37565b9150620008788362000a41565b9250620008a77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620008af565b905092915050565b600082620008c1576001905062000994565b81620008d1576000905062000994565b8160018114620008ea5760028114620008f5576200092b565b600191505062000994565b60ff8411156200090a576200090962000a84565b5b8360020a91508482111562000924576200092362000a84565b5b5062000994565b5060208310610133831016604e8410600b8410161715620009655782820a9050838111156200095f576200095e62000a84565b5b62000994565b62000974848484600162000803565b925090508184048111156200098e576200098d62000a84565b5b81810290505b9392505050565b6000620009a88262000a37565b9150620009b58362000a37565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620009f157620009f062000a84565b5b828202905092915050565b600062000a098262000a37565b915062000a168362000a37565b92508282101562000a2c5762000a2b62000a84565b5b828203905092915050565b6000819050919050565b600060ff82169050919050565b6000600282049050600182168062000a6757607f821691505b6020821081141562000a7e5762000a7d62000ab3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008160011c9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b612e9c8062000b576000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806370a08231116100c3578063981b24d01161007c578063981b24d01461039f578063a457c2d7146103cf578063a9059cbb146103ff578063dd62ed3e1461042f578063f2fde38b1461045f578063f47c84c51461047b57610158565b806370a0823114610303578063715018a61461033357806379cc67901461033d5780638da5cb5b1461035957806395d89b41146103775780639711715a1461039557610158565b8063313ce56711610115578063313ce56714610231578063395093511461024f5780633cc110d81461027f57806340c10f191461029b57806342966c68146102b75780634ee2cd7e146102d357610158565b806306fdde031461015d578063095ea7b31461017b5780631751a2d6146101ab57806318160ddd146101c757806323b872dd146101e55780632dedf5b714610215575b600080fd5b610165610499565b6040516101729190612362565b60405180910390f35b61019560048036038101906101909190611fba565b61052b565b6040516101a29190612347565b60405180910390f35b6101c560048036038101906101c09190611ffa565b61054e565b005b6101cf6106d6565b6040516101dc9190612584565b60405180910390f35b6101ff60048036038101906101fa9190611f67565b6106e0565b60405161020c9190612347565b60405180910390f35b61022f600480360381019061022a9190611ffa565b61070f565b005b6102396108d3565b604051610246919061259f565b60405180910390f35b61026960048036038101906102649190611fba565b6108dc565b6040516102769190612347565b60405180910390f35b61029960048036038101906102949190611fba565b610986565b005b6102b560048036038101906102b09190611fba565b610a70565b005b6102d160048036038101906102cc919061205a565b610b96565b005b6102ed60048036038101906102e89190611fba565b610baa565b6040516102fa9190612584565b60405180910390f35b61031d60048036038101906103189190611efa565b610c1a565b60405161032a9190612584565b60405180910390f35b61033b610c62565b005b61035760048036038101906103529190611fba565b610cea565b005b610361610d0a565b60405161036e919061232c565b60405180910390f35b61037f610d34565b60405161038c9190612362565b60405180910390f35b61039d610dc6565b005b6103b960048036038101906103b4919061205a565b610e4d565b6040516103c69190612584565b60405180910390f35b6103e960048036038101906103e49190611fba565b610e7e565b6040516103f69190612347565b60405180910390f35b61041960048036038101906104149190611fba565b610f68565b6040516104269190612347565b60405180910390f35b61044960048036038101906104449190611f27565b610f8b565b6040516104569190612584565b60405180910390f35b61047960048036038101906104749190611efa565b611012565b005b61048361110a565b6040516104909190612584565b60405180910390f35b6060600380546104a8906128e4565b80601f01602080910402602001604051908101604052809291908181526020018280546104d4906128e4565b80156105215780601f106104f657610100808354040283529160200191610521565b820191906000526020600020905b81548152906001019060200180831161050457829003601f168201915b5050505050905090565b6000806105366111e6565b90506105438185856111ee565b600191505092915050565b6105566111e6565b73ffffffffffffffffffffffffffffffffffffffff16610574610d0a565b73ffffffffffffffffffffffffffffffffffffffff16146105ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c1906124a4565b60405180910390fd5b6a52b7d2dcc80cd2e400000081848490506105e591906127ce565b6105ed6106d6565b6105f791906125d6565b1115610638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062f90612464565b60405180910390fd5b6000838390501161067e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067590612484565b60405180910390fd5b60005b838390508110156106d0576106bd8484838181106106a2576106a16129ec565b5b90506020020160208101906106b79190611efa565b836113b9565b80806106c890612916565b915050610681565b50505050565b6000600254905090565b6000806106eb6111e6565b90506106f8858285611519565b6107038585856115a5565b60019150509392505050565b6107176111e6565b73ffffffffffffffffffffffffffffffffffffffff16610735610d0a565b73ffffffffffffffffffffffffffffffffffffffff161461078b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610782906124a4565b60405180910390fd5b6a52b7d2dcc80cd2e400000061079f6108d3565b600a6107ab91906126b0565b82858590506107ba91906127ce565b6107c491906127ce565b6107cc6106d6565b6107d691906125d6565b1115610817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080e90612464565b60405180910390fd5b6000838390501161085d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085490612484565b60405180910390fd5b60005b838390508110156108cd576108ba848483818110610881576108806129ec565b5b90506020020160208101906108969190611efa565b61089e6108d3565b600a6108aa91906126b0565b846108b591906127ce565b6113b9565b80806108c590612916565b915050610860565b50505050565b60006012905090565b6000806108e76111e6565b905061097b818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461097691906125d6565b6111ee565b600191505092915050565b61098e6111e6565b73ffffffffffffffffffffffffffffffffffffffff166109ac610d0a565b73ffffffffffffffffffffffffffffffffffffffff1614610a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f9906124a4565b60405180910390fd5b6a52b7d2dcc80cd2e400000081610a176106d6565b610a2191906125d6565b1115610a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5990612464565b60405180910390fd5b610a6c82826113b9565b5050565b610a786111e6565b73ffffffffffffffffffffffffffffffffffffffff16610a96610d0a565b73ffffffffffffffffffffffffffffffffffffffff1614610aec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae3906124a4565b60405180910390fd5b6a52b7d2dcc80cd2e4000000610b006108d3565b600a610b0c91906126b0565b82610b1791906127ce565b610b1f6106d6565b610b2991906125d6565b1115610b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6190612464565b60405180910390fd5b610b9282610b766108d3565b600a610b8291906126b0565b83610b8d91906127ce565b6113b9565b5050565b610ba7610ba16111e6565b82611826565b50565b6000806000610bf784600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206119fd565b9150915081610c0e57610c0985610c1a565b610c10565b805b9250505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c6a6111e6565b73ffffffffffffffffffffffffffffffffffffffff16610c88610d0a565b73ffffffffffffffffffffffffffffffffffffffff1614610cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd5906124a4565b60405180910390fd5b610ce86000611af3565b565b610cfc82610cf66111e6565b83611519565b610d068282611826565b5050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610d43906128e4565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6f906128e4565b8015610dbc5780601f10610d9157610100808354040283529160200191610dbc565b820191906000526020600020905b815481529060010190602001808311610d9f57829003601f168201915b5050505050905090565b610dce6111e6565b73ffffffffffffffffffffffffffffffffffffffff16610dec610d0a565b73ffffffffffffffffffffffffffffffffffffffff1614610e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e39906124a4565b60405180910390fd5b610e4a611bb9565b50565b6000806000610e5d8460066119fd565b9150915081610e7357610e6e6106d6565b610e75565b805b92505050919050565b600080610e896111e6565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015610f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4690612544565b60405180910390fd5b610f5c82868684036111ee565b60019250505092915050565b600080610f736111e6565b9050610f808185856115a5565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61101a6111e6565b73ffffffffffffffffffffffffffffffffffffffff16611038610d0a565b73ffffffffffffffffffffffffffffffffffffffff161461108e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611085906124a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f5906123e4565b60405180910390fd5b61110781611af3565b50565b6a52b7d2dcc80cd2e400000081565b6111248383836111d3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561116f5761116282611c0f565b61116a611c62565b6111ce565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111ba576111ad83611c0f565b6111b5611c62565b6111cd565b6111c383611c0f565b6111cc82611c0f565b5b5b505050565b505050565b600081600001549050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590612504565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c590612404565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516113ac9190612584565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142090612564565b60405180910390fd5b61143560008383611c76565b806002600082825461144791906125d6565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461149c91906125d6565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516115019190612584565b60405180910390a361151560008383611c86565b5050565b60006115258484610f8b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461159f5781811015611591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158890612424565b60405180910390fd5b61159e84848484036111ee565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160c906124e4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167c906123a4565b60405180910390fd5b611690838383611c76565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170d90612444565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117a991906125d6565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161180d9190612584565b60405180910390a3611820848484611c86565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906124c4565b60405180910390fd5b6118a282600083611c76565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f906123c4565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461197f9190612828565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119e49190612584565b60405180910390a36119f883600084611c86565b505050565b60008060008411611a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3a90612524565b60405180910390fd5b611a4b611c8b565b841115611a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8490612384565b60405180910390fd5b6000611aa58585600001611c9c90919063ffffffff16565b90508360000180549050811415611ac3576000809250925050611aec565b6001846001018281548110611adb57611ada6129ec565b5b906000526020600020015492509250505b9250929050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611bc56008611d76565b6000611bcf611c8b565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb6781604051611c009190612584565b60405180910390a18091505090565b611c5f600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611c5a83610c1a565b611d8c565b50565b611c746006611c6f6106d6565b611d8c565b565b611c81838383611119565b505050565b505050565b6000611c9760086111d8565b905090565b60008083805490501415611cb35760009050611d70565b600080848054905090505b80821015611d17576000611cd28383611e07565b905084868281548110611ce857611ce76129ec565b5b90600052602060002001541115611d0157809150611d11565b600181611d0e91906125d6565b92505b50611cbe565b600082118015611d4f57508385600184611d319190612828565b81548110611d4257611d416129ec565b5b9060005260206000200154145b15611d6a57600182611d619190612828565b92505050611d70565b81925050505b92915050565b6001816000016000828254019250508190555050565b6000611d96611c8b565b905080611da584600001611e2d565b1015611e025782600001819080600181540180825580915050600190039060005260206000200160009091909190915055826001018290806001815401808255809150506001900390600052602060002001600090919091909150555b505050565b60006002828418611e18919061262c565b828416611e2591906125d6565b905092915050565b60008082805490501415611e445760009050611e75565b8160018380549050611e569190612828565b81548110611e6757611e666129ec565b5b906000526020600020015490505b919050565b600081359050611e8981612e38565b92915050565b60008083601f840112611ea557611ea4612a20565b5b8235905067ffffffffffffffff811115611ec257611ec1612a1b565b5b602083019150836020820283011115611ede57611edd612a25565b5b9250929050565b600081359050611ef481612e4f565b92915050565b600060208284031215611f1057611f0f612a2f565b5b6000611f1e84828501611e7a565b91505092915050565b60008060408385031215611f3e57611f3d612a2f565b5b6000611f4c85828601611e7a565b9250506020611f5d85828601611e7a565b9150509250929050565b600080600060608486031215611f8057611f7f612a2f565b5b6000611f8e86828701611e7a565b9350506020611f9f86828701611e7a565b9250506040611fb086828701611ee5565b9150509250925092565b60008060408385031215611fd157611fd0612a2f565b5b6000611fdf85828601611e7a565b9250506020611ff085828601611ee5565b9150509250929050565b60008060006040848603121561201357612012612a2f565b5b600084013567ffffffffffffffff81111561203157612030612a2a565b5b61203d86828701611e8f565b9350935050602061205086828701611ee5565b9150509250925092565b6000602082840312156120705761206f612a2f565b5b600061207e84828501611ee5565b91505092915050565b6120908161285c565b82525050565b61209f8161286e565b82525050565b60006120b0826125ba565b6120ba81856125c5565b93506120ca8185602086016128b1565b6120d381612a34565b840191505092915050565b60006120eb601d836125c5565b91506120f682612a52565b602082019050919050565b600061210e6023836125c5565b915061211982612a7b565b604082019050919050565b60006121316022836125c5565b915061213c82612aca565b604082019050919050565b60006121546026836125c5565b915061215f82612b19565b604082019050919050565b60006121776022836125c5565b915061218282612b68565b604082019050919050565b600061219a601d836125c5565b91506121a582612bb7565b602082019050919050565b60006121bd6026836125c5565b91506121c882612be0565b604082019050919050565b60006121e06018836125c5565b91506121eb82612c2f565b602082019050919050565b60006122036013836125c5565b915061220e82612c58565b602082019050919050565b60006122266020836125c5565b915061223182612c81565b602082019050919050565b60006122496021836125c5565b915061225482612caa565b604082019050919050565b600061226c6025836125c5565b915061227782612cf9565b604082019050919050565b600061228f6024836125c5565b915061229a82612d48565b604082019050919050565b60006122b26016836125c5565b91506122bd82612d97565b602082019050919050565b60006122d56025836125c5565b91506122e082612dc0565b604082019050919050565b60006122f8601f836125c5565b915061230382612e0f565b602082019050919050565b6123178161289a565b82525050565b612326816128a4565b82525050565b60006020820190506123416000830184612087565b92915050565b600060208201905061235c6000830184612096565b92915050565b6000602082019050818103600083015261237c81846120a5565b905092915050565b6000602082019050818103600083015261239d816120de565b9050919050565b600060208201905081810360008301526123bd81612101565b9050919050565b600060208201905081810360008301526123dd81612124565b9050919050565b600060208201905081810360008301526123fd81612147565b9050919050565b6000602082019050818103600083015261241d8161216a565b9050919050565b6000602082019050818103600083015261243d8161218d565b9050919050565b6000602082019050818103600083015261245d816121b0565b9050919050565b6000602082019050818103600083015261247d816121d3565b9050919050565b6000602082019050818103600083015261249d816121f6565b9050919050565b600060208201905081810360008301526124bd81612219565b9050919050565b600060208201905081810360008301526124dd8161223c565b9050919050565b600060208201905081810360008301526124fd8161225f565b9050919050565b6000602082019050818103600083015261251d81612282565b9050919050565b6000602082019050818103600083015261253d816122a5565b9050919050565b6000602082019050818103600083015261255d816122c8565b9050919050565b6000602082019050818103600083015261257d816122eb565b9050919050565b6000602082019050612599600083018461230e565b92915050565b60006020820190506125b4600083018461231d565b92915050565b600081519050919050565b600082825260208201905092915050565b60006125e18261289a565b91506125ec8361289a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156126215761262061295f565b5b828201905092915050565b60006126378261289a565b91506126428361289a565b9250826126525761265161298e565b5b828204905092915050565b6000808291508390505b60018511156126a7578086048111156126835761268261295f565b5b60018516156126925780820291505b80810290506126a085612a45565b9450612667565b94509492505050565b60006126bb8261289a565b91506126c6836128a4565b92506126f37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846126fb565b905092915050565b60008261270b57600190506127c7565b8161271957600090506127c7565b816001811461272f576002811461273957612768565b60019150506127c7565b60ff84111561274b5761274a61295f565b5b8360020a9150848211156127625761276161295f565b5b506127c7565b5060208310610133831016604e8410600b841016171561279d5782820a9050838111156127985761279761295f565b5b6127c7565b6127aa848484600161265d565b925090508184048111156127c1576127c061295f565b5b81810290505b9392505050565b60006127d98261289a565b91506127e48361289a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561281d5761281c61295f565b5b828202905092915050565b60006128338261289a565b915061283e8361289a565b9250828210156128515761285061295f565b5b828203905092915050565b60006128678261287a565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156128cf5780820151818401526020810190506128b4565b838111156128de576000848401525b50505050565b600060028204905060018216806128fc57607f821691505b602082108114156129105761290f6129bd565b5b50919050565b60006129218261289a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156129545761295361295f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f4552433230536e617073686f743a206e6f6e6578697374656e74206964000000600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f576f756c6420657863656564206d617820737570706c792e0000000000000000600082015250565b7f656d707479206164647265737320617272617900000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433230536e617073686f743a206964206973203000000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b612e418161285c565b8114612e4c57600080fd5b50565b612e588161289a565b8114612e6357600080fd5b5056fea2646970667358221220c0a6058d8542e3e901ace7c134581bc85a9d91fe74a3c369dfe5e1763964128064736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101585760003560e01c806370a08231116100c3578063981b24d01161007c578063981b24d01461039f578063a457c2d7146103cf578063a9059cbb146103ff578063dd62ed3e1461042f578063f2fde38b1461045f578063f47c84c51461047b57610158565b806370a0823114610303578063715018a61461033357806379cc67901461033d5780638da5cb5b1461035957806395d89b41146103775780639711715a1461039557610158565b8063313ce56711610115578063313ce56714610231578063395093511461024f5780633cc110d81461027f57806340c10f191461029b57806342966c68146102b75780634ee2cd7e146102d357610158565b806306fdde031461015d578063095ea7b31461017b5780631751a2d6146101ab57806318160ddd146101c757806323b872dd146101e55780632dedf5b714610215575b600080fd5b610165610499565b6040516101729190612362565b60405180910390f35b61019560048036038101906101909190611fba565b61052b565b6040516101a29190612347565b60405180910390f35b6101c560048036038101906101c09190611ffa565b61054e565b005b6101cf6106d6565b6040516101dc9190612584565b60405180910390f35b6101ff60048036038101906101fa9190611f67565b6106e0565b60405161020c9190612347565b60405180910390f35b61022f600480360381019061022a9190611ffa565b61070f565b005b6102396108d3565b604051610246919061259f565b60405180910390f35b61026960048036038101906102649190611fba565b6108dc565b6040516102769190612347565b60405180910390f35b61029960048036038101906102949190611fba565b610986565b005b6102b560048036038101906102b09190611fba565b610a70565b005b6102d160048036038101906102cc919061205a565b610b96565b005b6102ed60048036038101906102e89190611fba565b610baa565b6040516102fa9190612584565b60405180910390f35b61031d60048036038101906103189190611efa565b610c1a565b60405161032a9190612584565b60405180910390f35b61033b610c62565b005b61035760048036038101906103529190611fba565b610cea565b005b610361610d0a565b60405161036e919061232c565b60405180910390f35b61037f610d34565b60405161038c9190612362565b60405180910390f35b61039d610dc6565b005b6103b960048036038101906103b4919061205a565b610e4d565b6040516103c69190612584565b60405180910390f35b6103e960048036038101906103e49190611fba565b610e7e565b6040516103f69190612347565b60405180910390f35b61041960048036038101906104149190611fba565b610f68565b6040516104269190612347565b60405180910390f35b61044960048036038101906104449190611f27565b610f8b565b6040516104569190612584565b60405180910390f35b61047960048036038101906104749190611efa565b611012565b005b61048361110a565b6040516104909190612584565b60405180910390f35b6060600380546104a8906128e4565b80601f01602080910402602001604051908101604052809291908181526020018280546104d4906128e4565b80156105215780601f106104f657610100808354040283529160200191610521565b820191906000526020600020905b81548152906001019060200180831161050457829003601f168201915b5050505050905090565b6000806105366111e6565b90506105438185856111ee565b600191505092915050565b6105566111e6565b73ffffffffffffffffffffffffffffffffffffffff16610574610d0a565b73ffffffffffffffffffffffffffffffffffffffff16146105ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c1906124a4565b60405180910390fd5b6a52b7d2dcc80cd2e400000081848490506105e591906127ce565b6105ed6106d6565b6105f791906125d6565b1115610638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062f90612464565b60405180910390fd5b6000838390501161067e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067590612484565b60405180910390fd5b60005b838390508110156106d0576106bd8484838181106106a2576106a16129ec565b5b90506020020160208101906106b79190611efa565b836113b9565b80806106c890612916565b915050610681565b50505050565b6000600254905090565b6000806106eb6111e6565b90506106f8858285611519565b6107038585856115a5565b60019150509392505050565b6107176111e6565b73ffffffffffffffffffffffffffffffffffffffff16610735610d0a565b73ffffffffffffffffffffffffffffffffffffffff161461078b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610782906124a4565b60405180910390fd5b6a52b7d2dcc80cd2e400000061079f6108d3565b600a6107ab91906126b0565b82858590506107ba91906127ce565b6107c491906127ce565b6107cc6106d6565b6107d691906125d6565b1115610817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080e90612464565b60405180910390fd5b6000838390501161085d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085490612484565b60405180910390fd5b60005b838390508110156108cd576108ba848483818110610881576108806129ec565b5b90506020020160208101906108969190611efa565b61089e6108d3565b600a6108aa91906126b0565b846108b591906127ce565b6113b9565b80806108c590612916565b915050610860565b50505050565b60006012905090565b6000806108e76111e6565b905061097b818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461097691906125d6565b6111ee565b600191505092915050565b61098e6111e6565b73ffffffffffffffffffffffffffffffffffffffff166109ac610d0a565b73ffffffffffffffffffffffffffffffffffffffff1614610a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f9906124a4565b60405180910390fd5b6a52b7d2dcc80cd2e400000081610a176106d6565b610a2191906125d6565b1115610a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5990612464565b60405180910390fd5b610a6c82826113b9565b5050565b610a786111e6565b73ffffffffffffffffffffffffffffffffffffffff16610a96610d0a565b73ffffffffffffffffffffffffffffffffffffffff1614610aec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae3906124a4565b60405180910390fd5b6a52b7d2dcc80cd2e4000000610b006108d3565b600a610b0c91906126b0565b82610b1791906127ce565b610b1f6106d6565b610b2991906125d6565b1115610b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6190612464565b60405180910390fd5b610b9282610b766108d3565b600a610b8291906126b0565b83610b8d91906127ce565b6113b9565b5050565b610ba7610ba16111e6565b82611826565b50565b6000806000610bf784600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206119fd565b9150915081610c0e57610c0985610c1a565b610c10565b805b9250505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c6a6111e6565b73ffffffffffffffffffffffffffffffffffffffff16610c88610d0a565b73ffffffffffffffffffffffffffffffffffffffff1614610cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd5906124a4565b60405180910390fd5b610ce86000611af3565b565b610cfc82610cf66111e6565b83611519565b610d068282611826565b5050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610d43906128e4565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6f906128e4565b8015610dbc5780601f10610d9157610100808354040283529160200191610dbc565b820191906000526020600020905b815481529060010190602001808311610d9f57829003601f168201915b5050505050905090565b610dce6111e6565b73ffffffffffffffffffffffffffffffffffffffff16610dec610d0a565b73ffffffffffffffffffffffffffffffffffffffff1614610e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e39906124a4565b60405180910390fd5b610e4a611bb9565b50565b6000806000610e5d8460066119fd565b9150915081610e7357610e6e6106d6565b610e75565b805b92505050919050565b600080610e896111e6565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015610f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4690612544565b60405180910390fd5b610f5c82868684036111ee565b60019250505092915050565b600080610f736111e6565b9050610f808185856115a5565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61101a6111e6565b73ffffffffffffffffffffffffffffffffffffffff16611038610d0a565b73ffffffffffffffffffffffffffffffffffffffff161461108e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611085906124a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f5906123e4565b60405180910390fd5b61110781611af3565b50565b6a52b7d2dcc80cd2e400000081565b6111248383836111d3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561116f5761116282611c0f565b61116a611c62565b6111ce565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111ba576111ad83611c0f565b6111b5611c62565b6111cd565b6111c383611c0f565b6111cc82611c0f565b5b5b505050565b505050565b600081600001549050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590612504565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c590612404565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516113ac9190612584565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142090612564565b60405180910390fd5b61143560008383611c76565b806002600082825461144791906125d6565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461149c91906125d6565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516115019190612584565b60405180910390a361151560008383611c86565b5050565b60006115258484610f8b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461159f5781811015611591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158890612424565b60405180910390fd5b61159e84848484036111ee565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160c906124e4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167c906123a4565b60405180910390fd5b611690838383611c76565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170d90612444565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117a991906125d6565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161180d9190612584565b60405180910390a3611820848484611c86565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906124c4565b60405180910390fd5b6118a282600083611c76565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f906123c4565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461197f9190612828565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119e49190612584565b60405180910390a36119f883600084611c86565b505050565b60008060008411611a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3a90612524565b60405180910390fd5b611a4b611c8b565b841115611a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8490612384565b60405180910390fd5b6000611aa58585600001611c9c90919063ffffffff16565b90508360000180549050811415611ac3576000809250925050611aec565b6001846001018281548110611adb57611ada6129ec565b5b906000526020600020015492509250505b9250929050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611bc56008611d76565b6000611bcf611c8b565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb6781604051611c009190612584565b60405180910390a18091505090565b611c5f600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611c5a83610c1a565b611d8c565b50565b611c746006611c6f6106d6565b611d8c565b565b611c81838383611119565b505050565b505050565b6000611c9760086111d8565b905090565b60008083805490501415611cb35760009050611d70565b600080848054905090505b80821015611d17576000611cd28383611e07565b905084868281548110611ce857611ce76129ec565b5b90600052602060002001541115611d0157809150611d11565b600181611d0e91906125d6565b92505b50611cbe565b600082118015611d4f57508385600184611d319190612828565b81548110611d4257611d416129ec565b5b9060005260206000200154145b15611d6a57600182611d619190612828565b92505050611d70565b81925050505b92915050565b6001816000016000828254019250508190555050565b6000611d96611c8b565b905080611da584600001611e2d565b1015611e025782600001819080600181540180825580915050600190039060005260206000200160009091909190915055826001018290806001815401808255809150506001900390600052602060002001600090919091909150555b505050565b60006002828418611e18919061262c565b828416611e2591906125d6565b905092915050565b60008082805490501415611e445760009050611e75565b8160018380549050611e569190612828565b81548110611e6757611e666129ec565b5b906000526020600020015490505b919050565b600081359050611e8981612e38565b92915050565b60008083601f840112611ea557611ea4612a20565b5b8235905067ffffffffffffffff811115611ec257611ec1612a1b565b5b602083019150836020820283011115611ede57611edd612a25565b5b9250929050565b600081359050611ef481612e4f565b92915050565b600060208284031215611f1057611f0f612a2f565b5b6000611f1e84828501611e7a565b91505092915050565b60008060408385031215611f3e57611f3d612a2f565b5b6000611f4c85828601611e7a565b9250506020611f5d85828601611e7a565b9150509250929050565b600080600060608486031215611f8057611f7f612a2f565b5b6000611f8e86828701611e7a565b9350506020611f9f86828701611e7a565b9250506040611fb086828701611ee5565b9150509250925092565b60008060408385031215611fd157611fd0612a2f565b5b6000611fdf85828601611e7a565b9250506020611ff085828601611ee5565b9150509250929050565b60008060006040848603121561201357612012612a2f565b5b600084013567ffffffffffffffff81111561203157612030612a2a565b5b61203d86828701611e8f565b9350935050602061205086828701611ee5565b9150509250925092565b6000602082840312156120705761206f612a2f565b5b600061207e84828501611ee5565b91505092915050565b6120908161285c565b82525050565b61209f8161286e565b82525050565b60006120b0826125ba565b6120ba81856125c5565b93506120ca8185602086016128b1565b6120d381612a34565b840191505092915050565b60006120eb601d836125c5565b91506120f682612a52565b602082019050919050565b600061210e6023836125c5565b915061211982612a7b565b604082019050919050565b60006121316022836125c5565b915061213c82612aca565b604082019050919050565b60006121546026836125c5565b915061215f82612b19565b604082019050919050565b60006121776022836125c5565b915061218282612b68565b604082019050919050565b600061219a601d836125c5565b91506121a582612bb7565b602082019050919050565b60006121bd6026836125c5565b91506121c882612be0565b604082019050919050565b60006121e06018836125c5565b91506121eb82612c2f565b602082019050919050565b60006122036013836125c5565b915061220e82612c58565b602082019050919050565b60006122266020836125c5565b915061223182612c81565b602082019050919050565b60006122496021836125c5565b915061225482612caa565b604082019050919050565b600061226c6025836125c5565b915061227782612cf9565b604082019050919050565b600061228f6024836125c5565b915061229a82612d48565b604082019050919050565b60006122b26016836125c5565b91506122bd82612d97565b602082019050919050565b60006122d56025836125c5565b91506122e082612dc0565b604082019050919050565b60006122f8601f836125c5565b915061230382612e0f565b602082019050919050565b6123178161289a565b82525050565b612326816128a4565b82525050565b60006020820190506123416000830184612087565b92915050565b600060208201905061235c6000830184612096565b92915050565b6000602082019050818103600083015261237c81846120a5565b905092915050565b6000602082019050818103600083015261239d816120de565b9050919050565b600060208201905081810360008301526123bd81612101565b9050919050565b600060208201905081810360008301526123dd81612124565b9050919050565b600060208201905081810360008301526123fd81612147565b9050919050565b6000602082019050818103600083015261241d8161216a565b9050919050565b6000602082019050818103600083015261243d8161218d565b9050919050565b6000602082019050818103600083015261245d816121b0565b9050919050565b6000602082019050818103600083015261247d816121d3565b9050919050565b6000602082019050818103600083015261249d816121f6565b9050919050565b600060208201905081810360008301526124bd81612219565b9050919050565b600060208201905081810360008301526124dd8161223c565b9050919050565b600060208201905081810360008301526124fd8161225f565b9050919050565b6000602082019050818103600083015261251d81612282565b9050919050565b6000602082019050818103600083015261253d816122a5565b9050919050565b6000602082019050818103600083015261255d816122c8565b9050919050565b6000602082019050818103600083015261257d816122eb565b9050919050565b6000602082019050612599600083018461230e565b92915050565b60006020820190506125b4600083018461231d565b92915050565b600081519050919050565b600082825260208201905092915050565b60006125e18261289a565b91506125ec8361289a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156126215761262061295f565b5b828201905092915050565b60006126378261289a565b91506126428361289a565b9250826126525761265161298e565b5b828204905092915050565b6000808291508390505b60018511156126a7578086048111156126835761268261295f565b5b60018516156126925780820291505b80810290506126a085612a45565b9450612667565b94509492505050565b60006126bb8261289a565b91506126c6836128a4565b92506126f37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846126fb565b905092915050565b60008261270b57600190506127c7565b8161271957600090506127c7565b816001811461272f576002811461273957612768565b60019150506127c7565b60ff84111561274b5761274a61295f565b5b8360020a9150848211156127625761276161295f565b5b506127c7565b5060208310610133831016604e8410600b841016171561279d5782820a9050838111156127985761279761295f565b5b6127c7565b6127aa848484600161265d565b925090508184048111156127c1576127c061295f565b5b81810290505b9392505050565b60006127d98261289a565b91506127e48361289a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561281d5761281c61295f565b5b828202905092915050565b60006128338261289a565b915061283e8361289a565b9250828210156128515761285061295f565b5b828203905092915050565b60006128678261287a565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156128cf5780820151818401526020810190506128b4565b838111156128de576000848401525b50505050565b600060028204905060018216806128fc57607f821691505b602082108114156129105761290f6129bd565b5b50919050565b60006129218261289a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156129545761295361295f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f4552433230536e617073686f743a206e6f6e6578697374656e74206964000000600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f576f756c6420657863656564206d617820737570706c792e0000000000000000600082015250565b7f656d707479206164647265737320617272617900000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433230536e617073686f743a206964206973203000000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b612e418161285c565b8114612e4c57600080fd5b50565b612e588161289a565b8114612e6357600080fd5b5056fea2646970667358221220c0a6058d8542e3e901ace7c134581bc85a9d91fe74a3c369dfe5e1763964128064736f6c63430008070033
Deployed Bytecode Sourcemap
35459:1905:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14033:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16384:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36678:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15153:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17165:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36235:435;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14995:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17869:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36035:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35809:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34344:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29866:266;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15324:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7456:103;;;:::i;:::-;;34754:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6805:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14252:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35734:67;;;:::i;:::-;;30236:234;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18612:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15657:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15913:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7714:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35537:58;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14033:100;14087:13;14120:5;14113:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14033:100;:::o;16384:201::-;16467:4;16484:13;16500:12;:10;:12::i;:::-;16484:28;;16523:32;16532:5;16539:7;16548:6;16523:8;:32::i;:::-;16573:4;16566:11;;;16384:201;;;;:::o;36678:407::-;7036:12;:10;:12::i;:::-;7025:23;;:7;:5;:7::i;:::-;:23;;;7017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35574:21:::1;36823:6;36804:9;;:16;;:25;;;;:::i;:::-;36787:13;:11;:13::i;:::-;:42;;;;:::i;:::-;:57;;36779:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;36911:1;36892:9;;:16;;:20;36884:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;36947:13;36971:107;36995:9;;:16;;36987:5;:24;36971:107;;;37035:31;37041:9;;37051:5;37041:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;37059:6;37035:5;:31::i;:::-;37013:7;;;;;:::i;:::-;;;;36971:107;;;36768:317;36678:407:::0;;;:::o;15153:108::-;15214:7;15241:12;;15234:19;;15153:108;:::o;17165:295::-;17296:4;17313:15;17331:12;:10;:12::i;:::-;17313:30;;17354:38;17370:4;17376:7;17385:6;17354:15;:38::i;:::-;17403:27;17413:4;17419:2;17423:6;17403:9;:27::i;:::-;17448:4;17441:11;;;17165:295;;;;;:::o;36235:435::-;7036:12;:10;:12::i;:::-;7025:23;;:7;:5;:7::i;:::-;:23;;;7017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35574:21:::1;36386:10;:8;:10::i;:::-;36380:2;:16;;;;:::i;:::-;36371:6;36352:9;;:16;;:25;;;;:::i;:::-;:44;;;;:::i;:::-;36335:13;:11;:13::i;:::-;:61;;;;:::i;:::-;:75;;36327:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;36477:1;36458:9;;:16;;:20;36450:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;36513:13;36537:126;36561:9;;:16;;36553:5;:24;36537:126;;;36601:50;36607:9;;36617:5;36607:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;36640:10;:8;:10::i;:::-;36634:2;:16;;;;:::i;:::-;36625:6;:25;;;;:::i;:::-;36601:5;:50::i;:::-;36579:7;;;;;:::i;:::-;;;;36537:126;;;36316:354;36235:435:::0;;;:::o;14995:93::-;15053:5;15078:2;15071:9;;14995:93;:::o;17869:240::-;17957:4;17974:13;17990:12;:10;:12::i;:::-;17974:28;;18013:66;18022:5;18029:7;18068:10;18038:11;:18;18050:5;18038:18;;;;;;;;;;;;;;;:27;18057:7;18038:27;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;18013:8;:66::i;:::-;18097:4;18090:11;;;17869:240;;;;:::o;36035:190::-;7036:12;:10;:12::i;:::-;7025:23;;:7;:5;:7::i;:::-;:23;;;7017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35574:21:::1;36139:6;36122:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:38;;36114:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;36200:17;36206:2;36210:6;36200:5;:17::i;:::-;36035:190:::0;;:::o;35809:218::-;7036:12;:10;:12::i;:::-;7025:23;;:7;:5;:7::i;:::-;:23;;;7017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35574:21:::1;35919:10;:8;:10::i;:::-;35913:2;:16;;;;:::i;:::-;35904:6;:25;;;;:::i;:::-;35887:13;:11;:13::i;:::-;:42;;;;:::i;:::-;:56;;35879:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;35983:36;35989:2;36008:10;:8;:10::i;:::-;36002:2;:16;;;;:::i;:::-;35993:6;:25;;;;:::i;:::-;35983:5;:36::i;:::-;35809:218:::0;;:::o;34344:91::-;34400:27;34406:12;:10;:12::i;:::-;34420:6;34400:5;:27::i;:::-;34344:91;:::o;29866:266::-;29953:7;29974:16;29992:13;30009:55;30018:10;30030:24;:33;30055:7;30030:33;;;;;;;;;;;;;;;30009:8;:55::i;:::-;29973:91;;;;30084:11;:40;;30106:18;30116:7;30106:9;:18::i;:::-;30084:40;;;30098:5;30084:40;30077:47;;;;29866:266;;;;:::o;15324:127::-;15398:7;15425:9;:18;15435:7;15425:18;;;;;;;;;;;;;;;;15418:25;;15324:127;;;:::o;7456:103::-;7036:12;:10;:12::i;:::-;7025:23;;:7;:5;:7::i;:::-;:23;;;7017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7521:30:::1;7548:1;7521:18;:30::i;:::-;7456:103::o:0;34754:164::-;34831:46;34847:7;34856:12;:10;:12::i;:::-;34870:6;34831:15;:46::i;:::-;34888:22;34894:7;34903:6;34888:5;:22::i;:::-;34754:164;;:::o;6805:87::-;6851:7;6878:6;;;;;;;;;;;6871:13;;6805:87;:::o;14252:104::-;14308:13;14341:7;14334:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14252:104;:::o;35734:67::-;7036:12;:10;:12::i;:::-;7025:23;;:7;:5;:7::i;:::-;:23;;;7017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35782:11:::1;:9;:11::i;:::-;;35734:67::o:0;30236:234::-;30308:7;30329:16;30347:13;30364:43;30373:10;30385:21;30364:8;:43::i;:::-;30328:79;;;;30427:11;:35;;30449:13;:11;:13::i;:::-;30427:35;;;30441:5;30427:35;30420:42;;;;30236:234;;;:::o;18612:438::-;18705:4;18722:13;18738:12;:10;:12::i;:::-;18722:28;;18761:24;18788:11;:18;18800:5;18788:18;;;;;;;;;;;;;;;:27;18807:7;18788:27;;;;;;;;;;;;;;;;18761:54;;18854:15;18834:16;:35;;18826:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;18947:60;18956:5;18963:7;18991:15;18972:16;:34;18947:8;:60::i;:::-;19038:4;19031:11;;;;18612:438;;;;:::o;15657:193::-;15736:4;15753:13;15769:12;:10;:12::i;:::-;15753:28;;15792;15802:5;15809:2;15813:6;15792:9;:28::i;:::-;15838:4;15831:11;;;15657:193;;;;:::o;15913:151::-;16002:7;16029:11;:18;16041:5;16029:18;;;;;;;;;;;;;;;:27;16048:7;16029:27;;;;;;;;;;;;;;;;16022:34;;15913:151;;;;:::o;7714:201::-;7036:12;:10;:12::i;:::-;7025:23;;:7;:5;:7::i;:::-;:23;;;7017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7823:1:::1;7803:22;;:8;:22;;;;7795:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7879:28;7898:8;7879:18;:28::i;:::-;7714:201:::0;:::o;35537:58::-;35574:21;35537:58;:::o;30687:622::-;30830:44;30857:4;30863:2;30867:6;30830:26;:44::i;:::-;30907:1;30891:18;;:4;:18;;;30887:415;;;30947:26;30970:2;30947:22;:26::i;:::-;30988:28;:26;:28::i;:::-;30887:415;;;31052:1;31038:16;;:2;:16;;;31034:268;;;31092:28;31115:4;31092:22;:28::i;:::-;31135;:26;:28::i;:::-;31034:268;;;31221:28;31244:4;31221:22;:28::i;:::-;31264:26;31287:2;31264:22;:26::i;:::-;31034:268;30887:415;30687:622;;;:::o;23968:125::-;;;;:::o;1386:114::-;1451:7;1478;:14;;;1471:21;;1386:114;;;:::o;5529:98::-;5582:7;5609:10;5602:17;;5529:98;:::o;22248:380::-;22401:1;22384:19;;:5;:19;;;;22376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22482:1;22463:21;;:7;:21;;;;22455:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22566:6;22536:11;:18;22548:5;22536:18;;;;;;;;;;;;;;;:27;22555:7;22536:27;;;;;;;;;;;;;;;:36;;;;22604:7;22588:32;;22597:5;22588:32;;;22613:6;22588:32;;;;;;:::i;:::-;;;;;;;;22248:380;;;:::o;20487:399::-;20590:1;20571:21;;:7;:21;;;;20563:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;20641:49;20670:1;20674:7;20683:6;20641:20;:49::i;:::-;20719:6;20703:12;;:22;;;;;;;:::i;:::-;;;;;;;;20758:6;20736:9;:18;20746:7;20736:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;20801:7;20780:37;;20797:1;20780:37;;;20810:6;20780:37;;;;;;:::i;:::-;;;;;;;;20830:48;20858:1;20862:7;20871:6;20830:19;:48::i;:::-;20487:399;;:::o;22915:453::-;23050:24;23077:25;23087:5;23094:7;23077:9;:25::i;:::-;23050:52;;23137:17;23117:16;:37;23113:248;;23199:6;23179:16;:26;;23171:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23283:51;23292:5;23299:7;23327:6;23308:16;:25;23283:8;:51::i;:::-;23113:248;23039:329;22915:453;;;:::o;19529:671::-;19676:1;19660:18;;:4;:18;;;;19652:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19753:1;19739:16;;:2;:16;;;;19731:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;19808:38;19829:4;19835:2;19839:6;19808:20;:38::i;:::-;19859:19;19881:9;:15;19891:4;19881:15;;;;;;;;;;;;;;;;19859:37;;19930:6;19915:11;:21;;19907:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;20047:6;20033:11;:20;20015:9;:15;20025:4;20015:15;;;;;;;;;;;;;;;:38;;;;20092:6;20075:9;:13;20085:2;20075:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;20131:2;20116:26;;20125:4;20116:26;;;20135:6;20116:26;;;;;;:::i;:::-;;;;;;;;20155:37;20175:4;20181:2;20185:6;20155:19;:37::i;:::-;19641:559;19529:671;;;:::o;21219:591::-;21322:1;21303:21;;:7;:21;;;;21295:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;21375:49;21396:7;21413:1;21417:6;21375:20;:49::i;:::-;21437:22;21462:9;:18;21472:7;21462:18;;;;;;;;;;;;;;;;21437:43;;21517:6;21499:14;:24;;21491:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;21636:6;21619:14;:23;21598:9;:18;21608:7;21598:18;;;;;;;;;;;;;;;:44;;;;21680:6;21664:12;;:22;;;;;;;:::i;:::-;;;;;;;;21730:1;21704:37;;21713:7;21704:37;;;21734:6;21704:37;;;;;;:::i;:::-;;;;;;;;21754:48;21774:7;21791:1;21795:6;21754:19;:48::i;:::-;21284:526;21219:591;;:::o;31317:1619::-;31406:4;31412:7;31453:1;31440:10;:14;31432:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;31514:23;:21;:23::i;:::-;31500:10;:37;;31492:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;32710:13;32726:40;32755:10;32726:9;:13;;:28;;:40;;;;:::i;:::-;32710:56;;32792:9;:13;;:20;;;;32783:5;:29;32779:150;;;32837:5;32844:1;32829:17;;;;;;;32779:150;32887:4;32893:9;:16;;32910:5;32893:23;;;;;;;;:::i;:::-;;;;;;;;;;32879:38;;;;;31317:1619;;;;;;:::o;8075:191::-;8149:16;8168:6;;;;;;;;;;;8149:25;;8194:8;8185:6;;:17;;;;;;;;;;;;;;;;;;8249:8;8218:40;;8239:8;8218:40;;;;;;;;;;;;8138:128;8075:191;:::o;29338:223::-;29385:7;29405:30;:18;:28;:30::i;:::-;29448:17;29468:23;:21;:23::i;:::-;29448:43;;29507:19;29516:9;29507:19;;;;;;:::i;:::-;;;;;;;;29544:9;29537:16;;;29338:223;:::o;32944:146::-;33012:70;33028:24;:33;33053:7;33028:33;;;;;;;;;;;;;;;33063:18;33073:7;33063:9;:18::i;:::-;33012:15;:70::i;:::-;32944:146;:::o;33098:118::-;33155:53;33171:21;33194:13;:11;:13::i;:::-;33155:15;:53::i;:::-;33098:118::o;37163:198::-;37309:44;37336:4;37342:2;37346:6;37309:26;:44::i;:::-;37163:198;;;:::o;24697:124::-;;;;:::o;29627:127::-;29691:7;29718:28;:18;:26;:28::i;:::-;29711:35;;29627:127;:::o;3925:918::-;4014:7;4054:1;4038:5;:12;;;;:17;4034:58;;;4079:1;4072:8;;;;4034:58;4104:11;4130:12;4145:5;:12;;;;4130:27;;4170:424;4183:4;4177:3;:10;4170:424;;;4204:11;4218:23;4231:3;4236:4;4218:12;:23::i;:::-;4204:37;;4475:7;4462:5;4468:3;4462:10;;;;;;;;:::i;:::-;;;;;;;;;;:20;4458:125;;;4510:3;4503:10;;4458:125;;;4566:1;4560:3;:7;;;;:::i;:::-;4554:13;;4458:125;4189:405;4170:424;;;4720:1;4714:3;:7;:36;;;;;4743:7;4725:5;4737:1;4731:3;:7;;;;:::i;:::-;4725:14;;;;;;;;:::i;:::-;;;;;;;;;;:25;4714:36;4710:126;;;4780:1;4774:3;:7;;;;:::i;:::-;4767:14;;;;;;4710:126;4821:3;4814:10;;;;3925:918;;;;;:::o;1508:127::-;1615:1;1597:7;:14;;;:19;;;;;;;;;;;1508:127;:::o;33224:310::-;33319:17;33339:23;:21;:23::i;:::-;33319:43;;33410:9;33377:30;33393:9;:13;;33377:15;:30::i;:::-;:42;33373:154;;;33436:9;:13;;33455:9;33436:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33480:9;:16;;33502:12;33480:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33373:154;33308:226;33224:310;;:::o;2709:156::-;2771:7;2856:1;2851;2847;:5;2846:11;;;;:::i;:::-;2841:1;2837;:5;2836:21;;;;:::i;:::-;2829:28;;2709:156;;;;:::o;33542:212::-;33612:7;33650:1;33636:3;:10;;;;:15;33632:115;;;33675:1;33668:8;;;;33632:115;33716:3;33733:1;33720:3;:10;;;;:14;;;;:::i;:::-;33716:19;;;;;;;;:::i;:::-;;;;;;;;;;33709:26;;33542:212;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;169:568::-;242:8;252:6;302:3;295:4;287:6;283:17;279:27;269:122;;310:79;;:::i;:::-;269:122;423:6;410:20;400:30;;453:18;445:6;442:30;439:117;;;475:79;;:::i;:::-;439:117;589:4;581:6;577:17;565:29;;643:3;635:4;627:6;623:17;613:8;609:32;606:41;603:128;;;650:79;;:::i;:::-;603:128;169:568;;;;;:::o;743:139::-;789:5;827:6;814:20;805:29;;843:33;870:5;843:33;:::i;:::-;743:139;;;;:::o;888:329::-;947:6;996:2;984:9;975:7;971:23;967:32;964:119;;;1002:79;;:::i;:::-;964:119;1122:1;1147:53;1192:7;1183:6;1172:9;1168:22;1147:53;:::i;:::-;1137:63;;1093:117;888:329;;;;:::o;1223:474::-;1291:6;1299;1348:2;1336:9;1327:7;1323:23;1319:32;1316:119;;;1354:79;;:::i;:::-;1316:119;1474:1;1499:53;1544:7;1535:6;1524:9;1520:22;1499:53;:::i;:::-;1489:63;;1445:117;1601:2;1627:53;1672:7;1663:6;1652:9;1648:22;1627:53;:::i;:::-;1617:63;;1572:118;1223:474;;;;;:::o;1703:619::-;1780:6;1788;1796;1845:2;1833:9;1824:7;1820:23;1816:32;1813:119;;;1851:79;;:::i;:::-;1813:119;1971:1;1996:53;2041:7;2032:6;2021:9;2017:22;1996:53;:::i;:::-;1986:63;;1942:117;2098:2;2124:53;2169:7;2160:6;2149:9;2145:22;2124:53;:::i;:::-;2114:63;;2069:118;2226:2;2252:53;2297:7;2288:6;2277:9;2273:22;2252:53;:::i;:::-;2242:63;;2197:118;1703:619;;;;;:::o;2328:474::-;2396:6;2404;2453:2;2441:9;2432:7;2428:23;2424:32;2421:119;;;2459:79;;:::i;:::-;2421:119;2579:1;2604:53;2649:7;2640:6;2629:9;2625:22;2604:53;:::i;:::-;2594:63;;2550:117;2706:2;2732:53;2777:7;2768:6;2757:9;2753:22;2732:53;:::i;:::-;2722:63;;2677:118;2328:474;;;;;:::o;2808:704::-;2903:6;2911;2919;2968:2;2956:9;2947:7;2943:23;2939:32;2936:119;;;2974:79;;:::i;:::-;2936:119;3122:1;3111:9;3107:17;3094:31;3152:18;3144:6;3141:30;3138:117;;;3174:79;;:::i;:::-;3138:117;3287:80;3359:7;3350:6;3339:9;3335:22;3287:80;:::i;:::-;3269:98;;;;3065:312;3416:2;3442:53;3487:7;3478:6;3467:9;3463:22;3442:53;:::i;:::-;3432:63;;3387:118;2808:704;;;;;:::o;3518:329::-;3577:6;3626:2;3614:9;3605:7;3601:23;3597:32;3594:119;;;3632:79;;:::i;:::-;3594:119;3752:1;3777:53;3822:7;3813:6;3802:9;3798:22;3777:53;:::i;:::-;3767:63;;3723:117;3518:329;;;;:::o;3853:118::-;3940:24;3958:5;3940:24;:::i;:::-;3935:3;3928:37;3853:118;;:::o;3977:109::-;4058:21;4073:5;4058:21;:::i;:::-;4053:3;4046:34;3977:109;;:::o;4092:364::-;4180:3;4208:39;4241:5;4208:39;:::i;:::-;4263:71;4327:6;4322:3;4263:71;:::i;:::-;4256:78;;4343:52;4388:6;4383:3;4376:4;4369:5;4365:16;4343:52;:::i;:::-;4420:29;4442:6;4420:29;:::i;:::-;4415:3;4411:39;4404:46;;4184:272;4092:364;;;;:::o;4462:366::-;4604:3;4625:67;4689:2;4684:3;4625:67;:::i;:::-;4618:74;;4701:93;4790:3;4701:93;:::i;:::-;4819:2;4814:3;4810:12;4803:19;;4462:366;;;:::o;4834:::-;4976:3;4997:67;5061:2;5056:3;4997:67;:::i;:::-;4990:74;;5073:93;5162:3;5073:93;:::i;:::-;5191:2;5186:3;5182:12;5175:19;;4834:366;;;:::o;5206:::-;5348:3;5369:67;5433:2;5428:3;5369:67;:::i;:::-;5362:74;;5445:93;5534:3;5445:93;:::i;:::-;5563:2;5558:3;5554:12;5547:19;;5206:366;;;:::o;5578:::-;5720:3;5741:67;5805:2;5800:3;5741:67;:::i;:::-;5734:74;;5817:93;5906:3;5817:93;:::i;:::-;5935:2;5930:3;5926:12;5919:19;;5578:366;;;:::o;5950:::-;6092:3;6113:67;6177:2;6172:3;6113:67;:::i;:::-;6106:74;;6189:93;6278:3;6189:93;:::i;:::-;6307:2;6302:3;6298:12;6291:19;;5950:366;;;:::o;6322:::-;6464:3;6485:67;6549:2;6544:3;6485:67;:::i;:::-;6478:74;;6561:93;6650:3;6561:93;:::i;:::-;6679:2;6674:3;6670:12;6663:19;;6322:366;;;:::o;6694:::-;6836:3;6857:67;6921:2;6916:3;6857:67;:::i;:::-;6850:74;;6933:93;7022:3;6933:93;:::i;:::-;7051:2;7046:3;7042:12;7035:19;;6694:366;;;:::o;7066:::-;7208:3;7229:67;7293:2;7288:3;7229:67;:::i;:::-;7222:74;;7305:93;7394:3;7305:93;:::i;:::-;7423:2;7418:3;7414:12;7407:19;;7066:366;;;:::o;7438:::-;7580:3;7601:67;7665:2;7660:3;7601:67;:::i;:::-;7594:74;;7677:93;7766:3;7677:93;:::i;:::-;7795:2;7790:3;7786:12;7779:19;;7438:366;;;:::o;7810:::-;7952:3;7973:67;8037:2;8032:3;7973:67;:::i;:::-;7966:74;;8049:93;8138:3;8049:93;:::i;:::-;8167:2;8162:3;8158:12;8151:19;;7810:366;;;:::o;8182:::-;8324:3;8345:67;8409:2;8404:3;8345:67;:::i;:::-;8338:74;;8421:93;8510:3;8421:93;:::i;:::-;8539:2;8534:3;8530:12;8523:19;;8182:366;;;:::o;8554:::-;8696:3;8717:67;8781:2;8776:3;8717:67;:::i;:::-;8710:74;;8793:93;8882:3;8793:93;:::i;:::-;8911:2;8906:3;8902:12;8895:19;;8554:366;;;:::o;8926:::-;9068:3;9089:67;9153:2;9148:3;9089:67;:::i;:::-;9082:74;;9165:93;9254:3;9165:93;:::i;:::-;9283:2;9278:3;9274:12;9267:19;;8926:366;;;:::o;9298:::-;9440:3;9461:67;9525:2;9520:3;9461:67;:::i;:::-;9454:74;;9537:93;9626:3;9537:93;:::i;:::-;9655:2;9650:3;9646:12;9639:19;;9298:366;;;:::o;9670:::-;9812:3;9833:67;9897:2;9892:3;9833:67;:::i;:::-;9826:74;;9909:93;9998:3;9909:93;:::i;:::-;10027:2;10022:3;10018:12;10011:19;;9670:366;;;:::o;10042:::-;10184:3;10205:67;10269:2;10264:3;10205:67;:::i;:::-;10198:74;;10281:93;10370:3;10281:93;:::i;:::-;10399:2;10394:3;10390:12;10383:19;;10042:366;;;:::o;10414:118::-;10501:24;10519:5;10501:24;:::i;:::-;10496:3;10489:37;10414:118;;:::o;10538:112::-;10621:22;10637:5;10621:22;:::i;:::-;10616:3;10609:35;10538:112;;:::o;10656:222::-;10749:4;10787:2;10776:9;10772:18;10764:26;;10800:71;10868:1;10857:9;10853:17;10844:6;10800:71;:::i;:::-;10656:222;;;;:::o;10884:210::-;10971:4;11009:2;10998:9;10994:18;10986:26;;11022:65;11084:1;11073:9;11069:17;11060:6;11022:65;:::i;:::-;10884:210;;;;:::o;11100:313::-;11213:4;11251:2;11240:9;11236:18;11228:26;;11300:9;11294:4;11290:20;11286:1;11275:9;11271:17;11264:47;11328:78;11401:4;11392:6;11328:78;:::i;:::-;11320:86;;11100:313;;;;:::o;11419:419::-;11585:4;11623:2;11612:9;11608:18;11600:26;;11672:9;11666:4;11662:20;11658:1;11647:9;11643:17;11636:47;11700:131;11826:4;11700:131;:::i;:::-;11692:139;;11419:419;;;:::o;11844:::-;12010:4;12048:2;12037:9;12033:18;12025:26;;12097:9;12091:4;12087:20;12083:1;12072:9;12068:17;12061:47;12125:131;12251:4;12125:131;:::i;:::-;12117:139;;11844:419;;;:::o;12269:::-;12435:4;12473:2;12462:9;12458:18;12450:26;;12522:9;12516:4;12512:20;12508:1;12497:9;12493:17;12486:47;12550:131;12676:4;12550:131;:::i;:::-;12542:139;;12269:419;;;:::o;12694:::-;12860:4;12898:2;12887:9;12883:18;12875:26;;12947:9;12941:4;12937:20;12933:1;12922:9;12918:17;12911:47;12975:131;13101:4;12975:131;:::i;:::-;12967:139;;12694:419;;;:::o;13119:::-;13285:4;13323:2;13312:9;13308:18;13300:26;;13372:9;13366:4;13362:20;13358:1;13347:9;13343:17;13336:47;13400:131;13526:4;13400:131;:::i;:::-;13392:139;;13119:419;;;:::o;13544:::-;13710:4;13748:2;13737:9;13733:18;13725:26;;13797:9;13791:4;13787:20;13783:1;13772:9;13768:17;13761:47;13825:131;13951:4;13825:131;:::i;:::-;13817:139;;13544:419;;;:::o;13969:::-;14135:4;14173:2;14162:9;14158:18;14150:26;;14222:9;14216:4;14212:20;14208:1;14197:9;14193:17;14186:47;14250:131;14376:4;14250:131;:::i;:::-;14242:139;;13969:419;;;:::o;14394:::-;14560:4;14598:2;14587:9;14583:18;14575:26;;14647:9;14641:4;14637:20;14633:1;14622:9;14618:17;14611:47;14675:131;14801:4;14675:131;:::i;:::-;14667:139;;14394:419;;;:::o;14819:::-;14985:4;15023:2;15012:9;15008:18;15000:26;;15072:9;15066:4;15062:20;15058:1;15047:9;15043:17;15036:47;15100:131;15226:4;15100:131;:::i;:::-;15092:139;;14819:419;;;:::o;15244:::-;15410:4;15448:2;15437:9;15433:18;15425:26;;15497:9;15491:4;15487:20;15483:1;15472:9;15468:17;15461:47;15525:131;15651:4;15525:131;:::i;:::-;15517:139;;15244:419;;;:::o;15669:::-;15835:4;15873:2;15862:9;15858:18;15850:26;;15922:9;15916:4;15912:20;15908:1;15897:9;15893:17;15886:47;15950:131;16076:4;15950:131;:::i;:::-;15942:139;;15669:419;;;:::o;16094:::-;16260:4;16298:2;16287:9;16283:18;16275:26;;16347:9;16341:4;16337:20;16333:1;16322:9;16318:17;16311:47;16375:131;16501:4;16375:131;:::i;:::-;16367:139;;16094:419;;;:::o;16519:::-;16685:4;16723:2;16712:9;16708:18;16700:26;;16772:9;16766:4;16762:20;16758:1;16747:9;16743:17;16736:47;16800:131;16926:4;16800:131;:::i;:::-;16792:139;;16519:419;;;:::o;16944:::-;17110:4;17148:2;17137:9;17133:18;17125:26;;17197:9;17191:4;17187:20;17183:1;17172:9;17168:17;17161:47;17225:131;17351:4;17225:131;:::i;:::-;17217:139;;16944:419;;;:::o;17369:::-;17535:4;17573:2;17562:9;17558:18;17550:26;;17622:9;17616:4;17612:20;17608:1;17597:9;17593:17;17586:47;17650:131;17776:4;17650:131;:::i;:::-;17642:139;;17369:419;;;:::o;17794:::-;17960:4;17998:2;17987:9;17983:18;17975:26;;18047:9;18041:4;18037:20;18033:1;18022:9;18018:17;18011:47;18075:131;18201:4;18075:131;:::i;:::-;18067:139;;17794:419;;;:::o;18219:222::-;18312:4;18350:2;18339:9;18335:18;18327:26;;18363:71;18431:1;18420:9;18416:17;18407:6;18363:71;:::i;:::-;18219:222;;;;:::o;18447:214::-;18536:4;18574:2;18563:9;18559:18;18551:26;;18587:67;18651:1;18640:9;18636:17;18627:6;18587:67;:::i;:::-;18447:214;;;;:::o;18748:99::-;18800:6;18834:5;18828:12;18818:22;;18748:99;;;:::o;18853:169::-;18937:11;18971:6;18966:3;18959:19;19011:4;19006:3;19002:14;18987:29;;18853:169;;;;:::o;19028:305::-;19068:3;19087:20;19105:1;19087:20;:::i;:::-;19082:25;;19121:20;19139:1;19121:20;:::i;:::-;19116:25;;19275:1;19207:66;19203:74;19200:1;19197:81;19194:107;;;19281:18;;:::i;:::-;19194:107;19325:1;19322;19318:9;19311:16;;19028:305;;;;:::o;19339:185::-;19379:1;19396:20;19414:1;19396:20;:::i;:::-;19391:25;;19430:20;19448:1;19430:20;:::i;:::-;19425:25;;19469:1;19459:35;;19474:18;;:::i;:::-;19459:35;19516:1;19513;19509:9;19504:14;;19339:185;;;;:::o;19530:848::-;19591:5;19598:4;19622:6;19613:15;;19646:5;19637:14;;19660:712;19681:1;19671:8;19668:15;19660:712;;;19776:4;19771:3;19767:14;19761:4;19758:24;19755:50;;;19785:18;;:::i;:::-;19755:50;19835:1;19825:8;19821:16;19818:451;;;20250:4;20243:5;20239:16;20230:25;;19818:451;20300:4;20294;20290:15;20282:23;;20330:32;20353:8;20330:32;:::i;:::-;20318:44;;19660:712;;;19530:848;;;;;;;:::o;20384:281::-;20442:5;20466:23;20484:4;20466:23;:::i;:::-;20458:31;;20510:25;20526:8;20510:25;:::i;:::-;20498:37;;20554:104;20591:66;20581:8;20575:4;20554:104;:::i;:::-;20545:113;;20384:281;;;;:::o;20671:1073::-;20725:5;20916:8;20906:40;;20937:1;20928:10;;20939:5;;20906:40;20965:4;20955:36;;20982:1;20973:10;;20984:5;;20955:36;21051:4;21099:1;21094:27;;;;21135:1;21130:191;;;;21044:277;;21094:27;21112:1;21103:10;;21114:5;;;21130:191;21175:3;21165:8;21162:17;21159:43;;;21182:18;;:::i;:::-;21159:43;21231:8;21228:1;21224:16;21215:25;;21266:3;21259:5;21256:14;21253:40;;;21273:18;;:::i;:::-;21253:40;21306:5;;;21044:277;;21430:2;21420:8;21417:16;21411:3;21405:4;21402:13;21398:36;21380:2;21370:8;21367:16;21362:2;21356:4;21353:12;21349:35;21333:111;21330:246;;;21486:8;21480:4;21476:19;21467:28;;21521:3;21514:5;21511:14;21508:40;;;21528:18;;:::i;:::-;21508:40;21561:5;;21330:246;21601:42;21639:3;21629:8;21623:4;21620:1;21601:42;:::i;:::-;21586:57;;;;21675:4;21670:3;21666:14;21659:5;21656:25;21653:51;;;21684:18;;:::i;:::-;21653:51;21733:4;21726:5;21722:16;21713:25;;20671:1073;;;;;;:::o;21750:348::-;21790:7;21813:20;21831:1;21813:20;:::i;:::-;21808:25;;21847:20;21865:1;21847:20;:::i;:::-;21842:25;;22035:1;21967:66;21963:74;21960:1;21957:81;21952:1;21945:9;21938:17;21934:105;21931:131;;;22042:18;;:::i;:::-;21931:131;22090:1;22087;22083:9;22072:20;;21750:348;;;;:::o;22104:191::-;22144:4;22164:20;22182:1;22164:20;:::i;:::-;22159:25;;22198:20;22216:1;22198:20;:::i;:::-;22193:25;;22237:1;22234;22231:8;22228:34;;;22242:18;;:::i;:::-;22228:34;22287:1;22284;22280:9;22272:17;;22104:191;;;;:::o;22301:96::-;22338:7;22367:24;22385:5;22367:24;:::i;:::-;22356:35;;22301:96;;;:::o;22403:90::-;22437:7;22480:5;22473:13;22466:21;22455:32;;22403:90;;;:::o;22499:126::-;22536:7;22576:42;22569:5;22565:54;22554:65;;22499:126;;;:::o;22631:77::-;22668:7;22697:5;22686:16;;22631:77;;;:::o;22714:86::-;22749:7;22789:4;22782:5;22778:16;22767:27;;22714:86;;;:::o;22806:307::-;22874:1;22884:113;22898:6;22895:1;22892:13;22884:113;;;22983:1;22978:3;22974:11;22968:18;22964:1;22959:3;22955:11;22948:39;22920:2;22917:1;22913:10;22908:15;;22884:113;;;23015:6;23012:1;23009:13;23006:101;;;23095:1;23086:6;23081:3;23077:16;23070:27;23006:101;22855:258;22806:307;;;:::o;23119:320::-;23163:6;23200:1;23194:4;23190:12;23180:22;;23247:1;23241:4;23237:12;23268:18;23258:81;;23324:4;23316:6;23312:17;23302:27;;23258:81;23386:2;23378:6;23375:14;23355:18;23352:38;23349:84;;;23405:18;;:::i;:::-;23349:84;23170:269;23119:320;;;:::o;23445:233::-;23484:3;23507:24;23525:5;23507:24;:::i;:::-;23498:33;;23553:66;23546:5;23543:77;23540:103;;;23623:18;;:::i;:::-;23540:103;23670:1;23663:5;23659:13;23652:20;;23445:233;;;:::o;23684:180::-;23732:77;23729:1;23722:88;23829:4;23826:1;23819:15;23853:4;23850:1;23843:15;23870:180;23918:77;23915:1;23908:88;24015:4;24012:1;24005:15;24039:4;24036:1;24029:15;24056:180;24104:77;24101:1;24094:88;24201:4;24198:1;24191:15;24225:4;24222:1;24215:15;24242:180;24290:77;24287:1;24280:88;24387:4;24384:1;24377:15;24411:4;24408:1;24401:15;24428:117;24537:1;24534;24527:12;24551:117;24660:1;24657;24650:12;24674:117;24783:1;24780;24773:12;24797:117;24906:1;24903;24896:12;24920:117;25029:1;25026;25019:12;25043:102;25084:6;25135:2;25131:7;25126:2;25119:5;25115:14;25111:28;25101:38;;25043:102;;;:::o;25151:::-;25193:8;25240:5;25237:1;25233:13;25212:34;;25151:102;;;:::o;25259:179::-;25399:31;25395:1;25387:6;25383:14;25376:55;25259:179;:::o;25444:222::-;25584:34;25580:1;25572:6;25568:14;25561:58;25653:5;25648:2;25640:6;25636:15;25629:30;25444:222;:::o;25672:221::-;25812:34;25808:1;25800:6;25796:14;25789:58;25881:4;25876:2;25868:6;25864:15;25857:29;25672:221;:::o;25899:225::-;26039:34;26035:1;26027:6;26023:14;26016:58;26108:8;26103:2;26095:6;26091:15;26084:33;25899:225;:::o;26130:221::-;26270:34;26266:1;26258:6;26254:14;26247:58;26339:4;26334:2;26326:6;26322:15;26315:29;26130:221;:::o;26357:179::-;26497:31;26493:1;26485:6;26481:14;26474:55;26357:179;:::o;26542:225::-;26682:34;26678:1;26670:6;26666:14;26659:58;26751:8;26746:2;26738:6;26734:15;26727:33;26542:225;:::o;26773:174::-;26913:26;26909:1;26901:6;26897:14;26890:50;26773:174;:::o;26953:169::-;27093:21;27089:1;27081:6;27077:14;27070:45;26953:169;:::o;27128:182::-;27268:34;27264:1;27256:6;27252:14;27245:58;27128:182;:::o;27316:220::-;27456:34;27452:1;27444:6;27440:14;27433:58;27525:3;27520:2;27512:6;27508:15;27501:28;27316:220;:::o;27542:224::-;27682:34;27678:1;27670:6;27666:14;27659:58;27751:7;27746:2;27738:6;27734:15;27727:32;27542:224;:::o;27772:223::-;27912:34;27908:1;27900:6;27896:14;27889:58;27981:6;27976:2;27968:6;27964:15;27957:31;27772:223;:::o;28001:172::-;28141:24;28137:1;28129:6;28125:14;28118:48;28001:172;:::o;28179:224::-;28319:34;28315:1;28307:6;28303:14;28296:58;28388:7;28383:2;28375:6;28371:15;28364:32;28179:224;:::o;28409:181::-;28549:33;28545:1;28537:6;28533:14;28526:57;28409:181;:::o;28596:122::-;28669:24;28687:5;28669:24;:::i;:::-;28662:5;28659:35;28649:63;;28708:1;28705;28698:12;28649:63;28596:122;:::o;28724:::-;28797:24;28815:5;28797:24;:::i;:::-;28790:5;28787:35;28777:63;;28836:1;28833;28826:12;28777:63;28724:122;:::o
Swarm Source
ipfs://c0a6058d8542e3e901ace7c134581bc85a9d91fe74a3c369dfe5e17639641280
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.