Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
150 YD
Holders
118
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 YDLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
YellowDuckCollection
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-05 */ // 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/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // 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/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/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/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` 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 tokenId ) 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. * - `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 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: YellowDuck.sol //SPDX-License-Identifier: Unlicense pragma solidity >=0.7.0 <0.9.0; // for whitelist and yellowlist server signatures contract YellowDuckCollection is ERC721Enumerable, Ownable { using Strings for uint256; // for whitelist and yellowlist server signatures using ECDSA for bytes32; // metadata string public baseURI; string public placeholderURI; string private baseExtension = ".json"; // cost of token // change using setCost uint256 public cost = 0.11 ether; // max total ducks uint256 public maxSupply = 999; // running supply uint256 public runningSupply = 0; // max mints per whitelisted address uint256 public maxWhitelistMintAmount = 3; // max public sale mints per address uint256 public maxPublicSaleMintAmount = 3; // number of mints per address for whitelist mapping(address => uint8) whitelistAddressMintedAmount; // number of mints per address for public sale mapping(address => uint8) publicSaleAddressMintedAmount; // 0: yellowlist // 1: whitelist // 2: public // 3: ended uint8 public saleState = 3; // yellowlist token IDs that have already been minted mapping(uint256 => bool) private mintedTokenIds; // yellowlist server signatures already used to mint a token (whitelist or yellow list) mapping(bytes => bool) private usedYellowlistBackendSignatures; // adddress for server signing for yellowlist or whitelist address private adminWalletAddress = 0x4b9F8c0c724d231401Fc5709a956a4159f48754e; // keeps track of next sequential token ID uint256 private _nextTokenId = 122; bool private isRevealed = false; constructor( string memory _name, string memory _symbol ) ERC721(_name, _symbol) { } // UTILITY FUNCTIONS // use this function to get the hash of any string function _getHash(string memory str) internal pure returns (bytes32) { string memory prefix = "\x19Ethereum Signed Message:\n"; string memory stringLength = Strings.toString(bytes(str).length); bytes memory abiPackedConcattedBytes = bytes.concat( bytes(prefix), bytes(stringLength), bytes(str) ); bytes32 ret = keccak256(abiPackedConcattedBytes); return ret; } // used to verify signature from backend for yellowlist and whitelist function _verifyBackendSignature( string memory message, bytes memory signature ) public view returns (bool) { require( !usedYellowlistBackendSignatures[signature], "Signature has already been used to mint" ); //we hash it on our side to verify the message is the one signed for bytes32 messageHash = _getHash(message); //check the signing address of the message did in fact sign that message message address signingAddress = ECDSA.recover(messageHash, signature); //verify that the message hash was signed by the admin wallet addreess bool valid = signingAddress == adminWalletAddress; require(valid, "Message not signed"); return true; } // gets the next token id to mint function _getNextTokenId() private returns (uint256) { // we start at the current nextTokenId for (uint256 i = _nextTokenId; i <= maxSupply; i++) { // this begins token IDs at 1 _nextTokenId++; // inject solidity // if the token has already been minted (via yellowlist), we keep going if (!mintedTokenIds[_nextTokenId]) { // otherwise, that's the ID we are gonna mint! return _nextTokenId; } } // there are no more tokens! require(false, "All tokens have been minted"); return 0; } // ADMIN FUNCTIONS // requires yellowlist state modifier requireYellowlistState() { require(saleState == 0, "Not in yellowlist sale"); _; } // requires yellowlist state modifier requireWhitelistState() { require(saleState == 1, "Not in whitelist sale"); _; } // requires yellowlist state modifier _requirePublicSaleState() { require(saleState == 2, "Not in public sale"); _; } // transition to yellowlist state function reveal() public onlyOwner { isRevealed = true; } // end sale function endSale() public onlyOwner { saleState = 3; } // transition to yellowlist state function enableYellowlistState() public onlyOwner { saleState = 0; cost = 0.11 ether; } // transition to whitelist state function enableWhitelistState() public onlyOwner { saleState = 1; cost = 0.11 ether; } // transition to public sale state function enablePublicSaleState() public onlyOwner { saleState = 2; cost = 0.12 ether; } // change the cost of the token function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; } // set new base URI for metadata function setBaseURI(string memory _uri) public onlyOwner { baseURI = _uri; } // set new base URI for metadata function setPlaceholderURI(string memory _uri) public onlyOwner { placeholderURI = _uri; } // BUYER FUNCTIONS // used by buyer to mint a specific token if they are on yellowlist // must provide a signature from the backend function yellowlistMint(uint256 tokenId, bytes memory signature) public payable requireYellowlistState { // fails if signature is invalid _verifyBackendSignature(Strings.toString(tokenId), signature); require(msg.value == cost, "You must pay for your duck"); // mint the specified tokenId _safeMint(msg.sender, tokenId); runningSupply++; mintedTokenIds[tokenId] = true; // use up the signature so that it can no longer be used to mint usedYellowlistBackendSignatures[signature] = true; } function toAsciiString(address x) internal pure returns (string memory) { bytes memory s = new bytes(40); for (uint i = 0; i < 20; i++) { bytes1 b = bytes1(uint8(uint(uint160(x)) / (2**(8*(19 - i))))); bytes1 hi = bytes1(uint8(b) / 16); bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi)); s[2*i] = char(hi); s[2*i+1] = char(lo); } return string(bytes.concat(bytes("0x"), s)); } function char(bytes1 b) internal pure returns (bytes1 c) { if (uint8(b) < 10) return bytes1(uint8(b) + 0x30); else return bytes1(uint8(b) + 0x57); } // used by buyer to mint if they're on the whitelist function whitelistMint(bytes memory signature, uint8 numberOfTokens) public payable requireWhitelistState { require(numberOfTokens > 0, "You must mint at least one duck."); // 111 is max yellowlist supply, so we'll remove these from the supply require(runningSupply + numberOfTokens <= (maxSupply - 122), "Purchase would exceed max supply."); require( whitelistAddressMintedAmount[msg.sender] + numberOfTokens <= maxWhitelistMintAmount, "You may mint up to 3 ducks." ); require(msg.value == cost * numberOfTokens, "You must pay for your duck"); string memory sender = toAsciiString(msg.sender); // fails if signature is invalid (message is the sender wallet address) _verifyBackendSignature(sender, signature); for (uint i = 0; i < numberOfTokens; i++) { // mint the next avaialble token id _safeMint(msg.sender, _getNextTokenId()); runningSupply++; // track that the wallet minted another token whitelistAddressMintedAmount[msg.sender]++; } } // public function publicMint(uint8 numberOfTokens) public payable _requirePublicSaleState { require(numberOfTokens > 0, "You must mint at least one duck for public sale."); // 114 is max yellowlist supply, so we'll remove these from the supply require(runningSupply + numberOfTokens <= (maxSupply - 122), "Purchase would exceed max supply."); require( publicSaleAddressMintedAmount[msg.sender] + numberOfTokens <= maxPublicSaleMintAmount, "You may mint up to 3 ducks on the public list sale." ); require(msg.value == cost * numberOfTokens, "You must pay for your duck"); for (uint i = 0; i < numberOfTokens; i++) { // mint the next avaialble token id _safeMint(msg.sender, _getNextTokenId()); runningSupply++; // track that the wallet minted another token! publicSaleAddressMintedAmount[msg.sender]++; } } // for OpenSea function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); return string( abi.encodePacked( isRevealed ? baseURI : placeholderURI, "/", tokenId.toString(), baseExtension ) ); } function withdraw() onlyOwner public { payable(msg.sender).transfer(address(this).balance); } function whitelistMintedByAddress() public view returns (uint8) { return whitelistAddressMintedAmount[msg.sender]; } function publicMintedByAddress() public view returns (uint8) { return publicSaleAddressMintedAmount[msg.sender]; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"string","name":"message","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"_verifyBackendSignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enablePublicSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableWhitelistState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableYellowlistState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicSaleMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWhitelistMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"placeholderURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintedByAddress","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"runningSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setPlaceholderURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintedByAddress","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"yellowlistMint","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90805190602001906200005192919062000263565b50670186cc6acd4b0000600e556103e7600f556000601055600360115560036012556003601560006101000a81548160ff021916908360ff160217905550734b9f8c0c724d231401fc5709a956a4159f48754e601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550607a6019556000601a60006101000a81548160ff0219169083151502179055503480156200011157600080fd5b506040516200652238038062006522833981810160405281019062000137919062000391565b818181600090805190602001906200015192919062000263565b5080600190805190602001906200016a92919062000263565b5050506200018d620001816200019560201b60201c565b6200019d60201b60201c565b50506200059a565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200027190620004ab565b90600052602060002090601f016020900481019282620002955760008555620002e1565b82601f10620002b057805160ff1916838001178555620002e1565b82800160010185558215620002e1579182015b82811115620002e0578251825591602001919060010190620002c3565b5b509050620002f09190620002f4565b5090565b5b808211156200030f576000816000905550600101620002f5565b5090565b60006200032a62000324846200043f565b62000416565b9050828152602081018484840111156200034957620003486200057a565b5b6200035684828562000475565b509392505050565b600082601f83011262000376576200037562000575565b5b81516200038884826020860162000313565b91505092915050565b60008060408385031215620003ab57620003aa62000584565b5b600083015167ffffffffffffffff811115620003cc57620003cb6200057f565b5b620003da858286016200035e565b925050602083015167ffffffffffffffff811115620003fe57620003fd6200057f565b5b6200040c858286016200035e565b9150509250929050565b60006200042262000435565b9050620004308282620004e1565b919050565b6000604051905090565b600067ffffffffffffffff8211156200045d576200045c62000546565b5b620004688262000589565b9050602081019050919050565b60005b838110156200049557808201518184015260208101905062000478565b83811115620004a5576000848401525b50505050565b60006002820490506001821680620004c457607f821691505b60208210811415620004db57620004da62000517565b5b50919050565b620004ec8262000589565b810181811067ffffffffffffffff821117156200050e576200050d62000546565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b615f7880620005aa6000396000f3fe6080604052600436106102515760003560e01c806370a0823111610139578063a475b5dd116100b6578063d5abeb011161007a578063d5abeb0114610829578063da947a3714610854578063e985e9c51461087f578063f2fde38b146108bc578063f3eda8c4146108e5578063f96407fa1461091057610251565b8063a475b5dd1461077e578063b88d4fde14610795578063c87b56dd146107be578063caba7ffa146107fb578063d3aed92a1461081257610251565b80638da5cb5b116100fd5780638da5cb5b146106a95780638e1ed66d146106d457806395d89b41146106ff5780639b9896941461072a578063a22cb4651461075557610251565b806370a08231146105f2578063715018a61461062f5780637313cba91461064657806381cf0c6314610671578063858e83b51461068d57610251565b80633574a2dd116101d257806344a0d68a1161019657806344a0d68a146104d05780634f6ccce7146104f957806355f804b314610536578063603f4d521461055f5780636352211e1461058a5780636c0360eb146105c757610251565b80633574a2dd14610439578063380d831b1461046257806338af5fa3146104795780633ccfd60b1461049057806342842e0e146104a757610251565b806318160ddd1161021957806318160ddd1461034f57806323b872dd1461037a5780632f745c59146103a35780632fad121a146103e0578063328ae7a1146103fc57610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb57806313faede614610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613f77565b61093b565b60405161028a9190614999565b60405180910390f35b34801561029f57600080fd5b506102a86109b5565b6040516102b591906149f9565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e091906140ee565b610a47565b6040516102f29190614932565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d9190613f37565b610acc565b005b34801561033057600080fd5b50610339610be4565b6040516103469190614e5b565b60405180910390f35b34801561035b57600080fd5b50610364610bea565b6040516103719190614e5b565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c9190613e21565b610bf7565b005b3480156103af57600080fd5b506103ca60048036038101906103c59190613f37565b610c57565b6040516103d79190614e5b565b60405180910390f35b6103fa60048036038101906103f59190613fd1565b610cfc565b005b34801561040857600080fd5b50610423600480360381019061041e9190614076565b610fc6565b6040516104309190614999565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b919061402d565b6110f1565b005b34801561046e57600080fd5b50610477611187565b005b34801561048557600080fd5b5061048e611221565b005b34801561049c57600080fd5b506104a56112ca565b005b3480156104b357600080fd5b506104ce60048036038101906104c99190613e21565b61138f565b005b3480156104dc57600080fd5b506104f760048036038101906104f291906140ee565b6113af565b005b34801561050557600080fd5b50610520600480360381019061051b91906140ee565b611435565b60405161052d9190614e5b565b60405180910390f35b34801561054257600080fd5b5061055d6004803603810190610558919061402d565b6114a6565b005b34801561056b57600080fd5b5061057461153c565b6040516105819190614e76565b60405180910390f35b34801561059657600080fd5b506105b160048036038101906105ac91906140ee565b61154f565b6040516105be9190614932565b60405180910390f35b3480156105d357600080fd5b506105dc611601565b6040516105e991906149f9565b60405180910390f35b3480156105fe57600080fd5b5061061960048036038101906106149190613db4565b61168f565b6040516106269190614e5b565b60405180910390f35b34801561063b57600080fd5b50610644611747565b005b34801561065257600080fd5b5061065b6117cf565b60405161066891906149f9565b60405180910390f35b61068b6004803603810190610686919061411b565b61185d565b005b6106a760048036038101906106a29190614177565b611992565b005b3480156106b557600080fd5b506106be611c42565b6040516106cb9190614932565b60405180910390f35b3480156106e057600080fd5b506106e9611c6c565b6040516106f69190614e76565b60405180910390f35b34801561070b57600080fd5b50610714611cc0565b60405161072191906149f9565b60405180910390f35b34801561073657600080fd5b5061073f611d52565b60405161074c9190614e76565b60405180910390f35b34801561076157600080fd5b5061077c60048036038101906107779190613ef7565b611da6565b005b34801561078a57600080fd5b50610793611dbc565b005b3480156107a157600080fd5b506107bc60048036038101906107b79190613e74565b611e55565b005b3480156107ca57600080fd5b506107e560048036038101906107e091906140ee565b611eb7565b6040516107f291906149f9565b60405180910390f35b34801561080757600080fd5b50610810611f52565b005b34801561081e57600080fd5b50610827611ffb565b005b34801561083557600080fd5b5061083e6120a4565b60405161084b9190614e5b565b60405180910390f35b34801561086057600080fd5b506108696120aa565b6040516108769190614e5b565b60405180910390f35b34801561088b57600080fd5b506108a660048036038101906108a19190613de1565b6120b0565b6040516108b39190614999565b60405180910390f35b3480156108c857600080fd5b506108e360048036038101906108de9190613db4565b612144565b005b3480156108f157600080fd5b506108fa61223c565b6040516109079190614e5b565b60405180910390f35b34801561091c57600080fd5b50610925612242565b6040516109329190614e5b565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ae57506109ad82612248565b5b9050919050565b6060600080546109c4906153ba565b80601f01602080910402602001604051908101604052809291908181526020018280546109f0906153ba565b8015610a3d5780601f10610a1257610100808354040283529160200191610a3d565b820191906000526020600020905b815481529060010190602001808311610a2057829003601f168201915b5050505050905090565b6000610a528261232a565b610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890614cfb565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ad78261154f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3f90614d7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b67612396565b73ffffffffffffffffffffffffffffffffffffffff161480610b965750610b9581610b90612396565b6120b0565b5b610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc90614c3b565b60405180910390fd5b610bdf838361239e565b505050565b600e5481565b6000600880549050905090565b610c08610c02612396565b82612457565b610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90614dbb565b60405180910390fd5b610c52838383612535565b505050565b6000610c628361168f565b8210610ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9a90614a7b565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6001601560009054906101000a900460ff1660ff1614610d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4890614d9b565b60405180910390fd5b60008160ff1611610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90614c1b565b60405180910390fd5b607a600f54610da69190615285565b8160ff16601054610db79190614f90565b1115610df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610def90614d3b565b60405180910390fd5b60115481601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e539190614fe6565b60ff161115610e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8e90614bbb565b60405180910390fd5b8060ff16600e54610ea891906151f0565b3414610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee090614cbb565b60405180910390fd5b6000610ef43361279c565b9050610f008184610fc6565b5060005b8260ff16811015610fc057610f2033610f1b6129b5565b612a6e565b60106000815480929190610f339061541d565b9190505550601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff1680929190610f9490615466565b91906101000a81548160ff021916908360ff160217905550508080610fb89061541d565b915050610f04565b50505050565b6000601782604051610fd8919061488a565b908152602001604051809103902060009054906101000a900460ff1615611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102b90614a3b565b60405180910390fd5b600061103f84612a8c565b9050600061104d8285612b15565b90506000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050806110e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110db90614b1b565b60405180910390fd5b6001935050505092915050565b6110f9612396565b73ffffffffffffffffffffffffffffffffffffffff16611117611c42565b73ffffffffffffffffffffffffffffffffffffffff161461116d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116490614d1b565b60405180910390fd5b80600c9080519060200190611183929190613bb3565b5050565b61118f612396565b73ffffffffffffffffffffffffffffffffffffffff166111ad611c42565b73ffffffffffffffffffffffffffffffffffffffff1614611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa90614d1b565b60405180910390fd5b6003601560006101000a81548160ff021916908360ff160217905550565b611229612396565b73ffffffffffffffffffffffffffffffffffffffff16611247611c42565b73ffffffffffffffffffffffffffffffffffffffff161461129d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129490614d1b565b60405180910390fd5b6000601560006101000a81548160ff021916908360ff160217905550670186cc6acd4b0000600e81905550565b6112d2612396565b73ffffffffffffffffffffffffffffffffffffffff166112f0611c42565b73ffffffffffffffffffffffffffffffffffffffff1614611346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133d90614d1b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561138c573d6000803e3d6000fd5b50565b6113aa83838360405180602001604052806000815250611e55565b505050565b6113b7612396565b73ffffffffffffffffffffffffffffffffffffffff166113d5611c42565b73ffffffffffffffffffffffffffffffffffffffff161461142b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142290614d1b565b60405180910390fd5b80600e8190555050565b600061143f610bea565b8210611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147790614ddb565b60405180910390fd5b60088281548110611494576114936155ac565b5b90600052602060002001549050919050565b6114ae612396565b73ffffffffffffffffffffffffffffffffffffffff166114cc611c42565b73ffffffffffffffffffffffffffffffffffffffff1614611522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151990614d1b565b60405180910390fd5b80600b9080519060200190611538929190613bb3565b5050565b601560009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef90614c7b565b60405180910390fd5b80915050919050565b600b805461160e906153ba565b80601f016020809104026020016040519081016040528092919081815260200182805461163a906153ba565b80156116875780601f1061165c57610100808354040283529160200191611687565b820191906000526020600020905b81548152906001019060200180831161166a57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f790614c5b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61174f612396565b73ffffffffffffffffffffffffffffffffffffffff1661176d611c42565b73ffffffffffffffffffffffffffffffffffffffff16146117c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ba90614d1b565b60405180910390fd5b6117cd6000612b3c565b565b600c80546117dc906153ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611808906153ba565b80156118555780601f1061182a57610100808354040283529160200191611855565b820191906000526020600020905b81548152906001019060200180831161183857829003601f168201915b505050505081565b6000601560009054906101000a900460ff1660ff16146118b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a990614b5b565b60405180910390fd5b6118c46118be83612c02565b82610fc6565b50600e543414611909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190090614cbb565b60405180910390fd5b6119133383612a6e565b601060008154809291906119269061541d565b919050555060016016600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601782604051611969919061488a565b908152602001604051809103902060006101000a81548160ff0219169083151502179055505050565b6002601560009054906101000a900460ff1660ff16146119e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119de90614dfb565b60405180910390fd5b60008160ff1611611a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2490614e1b565b60405180910390fd5b607a600f54611a3c9190615285565b8160ff16601054611a4d9190614f90565b1115611a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8590614d3b565b60405180910390fd5b60125481601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611ae99190614fe6565b60ff161115611b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2490614b3b565b60405180910390fd5b8060ff16600e54611b3e91906151f0565b3414611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7690614cbb565b60405180910390fd5b60005b8160ff16811015611c3e57611b9e33611b996129b5565b612a6e565b60106000815480929190611bb19061541d565b9190505550601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff1680929190611c1290615466565b91906101000a81548160ff021916908360ff160217905550508080611c369061541d565b915050611b82565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905090565b606060018054611ccf906153ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611cfb906153ba565b8015611d485780601f10611d1d57610100808354040283529160200191611d48565b820191906000526020600020905b815481529060010190602001808311611d2b57829003601f168201915b5050505050905090565b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905090565b611db8611db1612396565b8383612d63565b5050565b611dc4612396565b73ffffffffffffffffffffffffffffffffffffffff16611de2611c42565b73ffffffffffffffffffffffffffffffffffffffff1614611e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2f90614d1b565b60405180910390fd5b6001601a60006101000a81548160ff021916908315150217905550565b611e66611e60612396565b83612457565b611ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9c90614dbb565b60405180910390fd5b611eb184848484612ed0565b50505050565b6060611ec28261232a565b611f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef890614d5b565b60405180910390fd5b601a60009054906101000a900460ff16611f1c57600c611f1f565b600b5b611f2883612c02565b600d604051602001611f3c939291906148f6565b6040516020818303038152906040529050919050565b611f5a612396565b73ffffffffffffffffffffffffffffffffffffffff16611f78611c42565b73ffffffffffffffffffffffffffffffffffffffff1614611fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc590614d1b565b60405180910390fd5b6002601560006101000a81548160ff021916908360ff1602179055506701aa535d3d0c0000600e81905550565b612003612396565b73ffffffffffffffffffffffffffffffffffffffff16612021611c42565b73ffffffffffffffffffffffffffffffffffffffff1614612077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206e90614d1b565b60405180910390fd5b6001601560006101000a81548160ff021916908360ff160217905550670186cc6acd4b0000600e81905550565b600f5481565b60105481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61214c612396565b73ffffffffffffffffffffffffffffffffffffffff1661216a611c42565b73ffffffffffffffffffffffffffffffffffffffff16146121c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b790614d1b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222790614abb565b60405180910390fd5b61223981612b3c565b50565b60125481565b60115481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061231357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612323575061232282612f2c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124118361154f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006124628261232a565b6124a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249890614bfb565b60405180910390fd5b60006124ac8361154f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061251b57508373ffffffffffffffffffffffffffffffffffffffff1661250384610a47565b73ffffffffffffffffffffffffffffffffffffffff16145b8061252c575061252b81856120b0565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166125558261154f565b73ffffffffffffffffffffffffffffffffffffffff16146125ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a290614adb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561261b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261290614b7b565b60405180910390fd5b612626838383612f96565b61263160008261239e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126819190615285565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126d89190614f90565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127978383836130aa565b505050565b60606000602867ffffffffffffffff8111156127bb576127ba6155db565b5b6040519080825280601f01601f1916602001820160405280156127ed5781602001600182028036833780820191505090505b50905060005b601481101561295557600081601361280b9190615285565b600861281791906151f0565b600261282391906150d2565b8573ffffffffffffffffffffffffffffffffffffffff16612844919061501d565b60f81b9050600060108260f81c61285b919061504e565b60f81b905060008160f81c6010612872919061524a565b8360f81c61288091906152b9565b60f81b905061288e826130af565b8585600261289c91906151f0565b815181106128ad576128ac6155ac565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506128e5816130af565b8560018660026128f591906151f0565b6128ff9190614f90565b815181106129105761290f6155ac565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350505050808061294d9061541d565b9150506127f3565b506040518060400160405280600281526020017f30780000000000000000000000000000000000000000000000000000000000008152508160405160200161299e9291906148a1565b604051602081830303815290604052915050919050565b60008060195490505b600f548111612a2457601960008154809291906129da9061541d565b919050555060166000601954815260200190815260200160002060009054906101000a900460ff16612a1157601954915050612a6b565b8080612a1c9061541d565b9150506129be565b506000612a66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5d90614e3b565b60405180910390fd5b600090505b90565b612a888282604051806020016040528060008152506130f5565b5050565b6000806040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a00000000000081525090506000612ad38451612c02565b90506000828286604051602001612aec939291906148c5565b604051602081830303815290604052905060008180519060200120905080945050505050919050565b6000806000612b248585613150565b91509150612b31816131d3565b819250505092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000821415612c4a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d5e565b600082905060005b60008214612c7c578080612c659061541d565b915050600a82612c75919061501d565b9150612c52565b60008167ffffffffffffffff811115612c9857612c976155db565b5b6040519080825280601f01601f191660200182016040528015612cca5781602001600182028036833780820191505090505b5090505b60008514612d5757600182612ce39190615285565b9150600a85612cf29190615490565b6030612cfe9190614f90565b60f81b818381518110612d1457612d136155ac565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d50919061501d565b9450612cce565b8093505050505b919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc990614b9b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ec39190614999565b60405180910390a3505050565b612edb848484612535565b612ee7848484846133a8565b612f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1d90614a9b565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612fa183838361353f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fe457612fdf81613544565b613023565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461302257613021838261358d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561306657613061816136fa565b6130a5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130a4576130a382826137cb565b5b5b505050565b505050565b6000600a8260f81c60ff1610156130da5760308260f81c6130d09190614fe6565b60f81b90506130f0565b60578260f81c6130ea9190614fe6565b60f81b90505b919050565b6130ff838361384a565b61310c60008484846133a8565b61314b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314290614a9b565b60405180910390fd5b505050565b6000806041835114156131925760008060006020860151925060408601519150606086015160001a905061318687828585613a24565b945094505050506131cc565b6040835114156131c35760008060208501519150604085015190506131b8868383613b31565b9350935050506131cc565b60006002915091505b9250929050565b600060048111156131e7576131e661551f565b5b8160048111156131fa576131f961551f565b5b1415613205576133a5565b600160048111156132195761321861551f565b5b81600481111561322c5761322b61551f565b5b141561326d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326490614a1b565b60405180910390fd5b600260048111156132815761328061551f565b5b8160048111156132945761329361551f565b5b14156132d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132cc90614a5b565b60405180910390fd5b600360048111156132e9576132e861551f565b5b8160048111156132fc576132fb61551f565b5b141561333d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333490614bdb565b60405180910390fd5b6004808111156133505761334f61551f565b5b8160048111156133635761336261551f565b5b14156133a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339b90614c9b565b60405180910390fd5b5b50565b60006133c98473ffffffffffffffffffffffffffffffffffffffff16613b90565b15613532578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133f2612396565b8786866040518563ffffffff1660e01b8152600401613414949392919061494d565b602060405180830381600087803b15801561342e57600080fd5b505af192505050801561345f57506040513d601f19601f8201168201806040525081019061345c9190613fa4565b60015b6134e2573d806000811461348f576040519150601f19603f3d011682016040523d82523d6000602084013e613494565b606091505b506000815114156134da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d190614a9b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613537565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161359a8461168f565b6135a49190615285565b9050600060076000848152602001908152602001600020549050818114613689576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061370e9190615285565b905060006009600084815260200190815260200160002054905060006008838154811061373e5761373d6155ac565b5b9060005260206000200154905080600883815481106137605761375f6155ac565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806137af576137ae61557d565b5b6001900381819060005260206000200160009055905550505050565b60006137d68361168f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156138ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b190614cdb565b60405180910390fd5b6138c38161232a565b15613903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138fa90614afb565b60405180910390fd5b61390f60008383612f96565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461395f9190614f90565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613a20600083836130aa565b5050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613a5f576000600391509150613b28565b601b8560ff1614158015613a775750601c8560ff1614155b15613a89576000600491509150613b28565b600060018787878760405160008152602001604052604051613aae94939291906149b4565b6020604051602081039080840390855afa158015613ad0573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b1f57600060019250925050613b28565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c613b749190614f90565b9050613b8287828885613a24565b935093505050935093915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613bbf906153ba565b90600052602060002090601f016020900481019282613be15760008555613c28565b82601f10613bfa57805160ff1916838001178555613c28565b82800160010185558215613c28579182015b82811115613c27578251825591602001919060010190613c0c565b5b509050613c359190613c39565b5090565b5b80821115613c52576000816000905550600101613c3a565b5090565b6000613c69613c6484614eb6565b614e91565b905082815260208101848484011115613c8557613c8461560f565b5b613c90848285615378565b509392505050565b6000613cab613ca684614ee7565b614e91565b905082815260208101848484011115613cc757613cc661560f565b5b613cd2848285615378565b509392505050565b600081359050613ce981615ecf565b92915050565b600081359050613cfe81615ee6565b92915050565b600081359050613d1381615efd565b92915050565b600081519050613d2881615efd565b92915050565b600082601f830112613d4357613d4261560a565b5b8135613d53848260208601613c56565b91505092915050565b600082601f830112613d7157613d7061560a565b5b8135613d81848260208601613c98565b91505092915050565b600081359050613d9981615f14565b92915050565b600081359050613dae81615f2b565b92915050565b600060208284031215613dca57613dc9615619565b5b6000613dd884828501613cda565b91505092915050565b60008060408385031215613df857613df7615619565b5b6000613e0685828601613cda565b9250506020613e1785828601613cda565b9150509250929050565b600080600060608486031215613e3a57613e39615619565b5b6000613e4886828701613cda565b9350506020613e5986828701613cda565b9250506040613e6a86828701613d8a565b9150509250925092565b60008060008060808587031215613e8e57613e8d615619565b5b6000613e9c87828801613cda565b9450506020613ead87828801613cda565b9350506040613ebe87828801613d8a565b925050606085013567ffffffffffffffff811115613edf57613ede615614565b5b613eeb87828801613d2e565b91505092959194509250565b60008060408385031215613f0e57613f0d615619565b5b6000613f1c85828601613cda565b9250506020613f2d85828601613cef565b9150509250929050565b60008060408385031215613f4e57613f4d615619565b5b6000613f5c85828601613cda565b9250506020613f6d85828601613d8a565b9150509250929050565b600060208284031215613f8d57613f8c615619565b5b6000613f9b84828501613d04565b91505092915050565b600060208284031215613fba57613fb9615619565b5b6000613fc884828501613d19565b91505092915050565b60008060408385031215613fe857613fe7615619565b5b600083013567ffffffffffffffff81111561400657614005615614565b5b61401285828601613d2e565b925050602061402385828601613d9f565b9150509250929050565b60006020828403121561404357614042615619565b5b600082013567ffffffffffffffff81111561406157614060615614565b5b61406d84828501613d5c565b91505092915050565b6000806040838503121561408d5761408c615619565b5b600083013567ffffffffffffffff8111156140ab576140aa615614565b5b6140b785828601613d5c565b925050602083013567ffffffffffffffff8111156140d8576140d7615614565b5b6140e485828601613d2e565b9150509250929050565b60006020828403121561410457614103615619565b5b600061411284828501613d8a565b91505092915050565b6000806040838503121561413257614131615619565b5b600061414085828601613d8a565b925050602083013567ffffffffffffffff81111561416157614160615614565b5b61416d85828601613d2e565b9150509250929050565b60006020828403121561418d5761418c615619565b5b600061419b84828501613d9f565b91505092915050565b6141ad816152ed565b82525050565b6141bc816152ff565b82525050565b6141cb8161530b565b82525050565b60006141dc82614f42565b6141e68185614f58565b93506141f6818560208601615387565b6141ff8161561e565b840191505092915050565b600061421582614f42565b61421f8185614f69565b935061422f818560208601615387565b80840191505092915050565b600061424682614f4d565b6142508185614f74565b9350614260818560208601615387565b6142698161561e565b840191505092915050565b600061427f82614f4d565b6142898185614f85565b9350614299818560208601615387565b80840191505092915050565b600081546142b2816153ba565b6142bc8186614f85565b945060018216600081146142d757600181146142e85761431b565b60ff1983168652818601935061431b565b6142f185614f2d565b60005b83811015614313578154818901526001820191506020810190506142f4565b838801955050505b50505092915050565b60008154614331816153ba565b61433b8186614f85565b9450600182166000811461435657600181146143675761439a565b60ff1983168652818601935061439a565b61437085614f18565b60005b8381101561439257815481890152600182019150602081019050614373565b838801955050505b50505092915050565b60006143b0601883614f74565b91506143bb8261563c565b602082019050919050565b60006143d3602783614f74565b91506143de82615665565b604082019050919050565b60006143f6601f83614f74565b9150614401826156b4565b602082019050919050565b6000614419602b83614f74565b9150614424826156dd565b604082019050919050565b600061443c603283614f74565b91506144478261572c565b604082019050919050565b600061445f602683614f74565b915061446a8261577b565b604082019050919050565b6000614482602583614f74565b915061448d826157ca565b604082019050919050565b60006144a5601c83614f74565b91506144b082615819565b602082019050919050565b60006144c8601283614f74565b91506144d382615842565b602082019050919050565b60006144eb603383614f74565b91506144f68261586b565b604082019050919050565b600061450e601683614f74565b9150614519826158ba565b602082019050919050565b6000614531602483614f74565b915061453c826158e3565b604082019050919050565b6000614554601983614f74565b915061455f82615932565b602082019050919050565b6000614577601b83614f74565b91506145828261595b565b602082019050919050565b600061459a602283614f74565b91506145a582615984565b604082019050919050565b60006145bd602c83614f74565b91506145c8826159d3565b604082019050919050565b60006145e0602083614f74565b91506145eb82615a22565b602082019050919050565b6000614603603883614f74565b915061460e82615a4b565b604082019050919050565b6000614626602a83614f74565b915061463182615a9a565b604082019050919050565b6000614649602983614f74565b915061465482615ae9565b604082019050919050565b600061466c602283614f74565b915061467782615b38565b604082019050919050565b600061468f601a83614f74565b915061469a82615b87565b602082019050919050565b60006146b2602083614f74565b91506146bd82615bb0565b602082019050919050565b60006146d5602c83614f74565b91506146e082615bd9565b604082019050919050565b60006146f8602083614f74565b915061470382615c28565b602082019050919050565b600061471b602183614f74565b915061472682615c51565b604082019050919050565b600061473e602f83614f74565b915061474982615ca0565b604082019050919050565b6000614761602183614f74565b915061476c82615cef565b604082019050919050565b6000614784601583614f74565b915061478f82615d3e565b602082019050919050565b60006147a7603183614f74565b91506147b282615d67565b604082019050919050565b60006147ca602c83614f74565b91506147d582615db6565b604082019050919050565b60006147ed601283614f74565b91506147f882615e05565b602082019050919050565b6000614810603083614f74565b915061481b82615e2e565b604082019050919050565b6000614833601b83614f74565b915061483e82615e7d565b602082019050919050565b6000614856600183614f85565b915061486182615ea6565b600182019050919050565b61487581615361565b82525050565b6148848161536b565b82525050565b6000614896828461420a565b915081905092915050565b60006148ad828561420a565b91506148b9828461420a565b91508190509392505050565b60006148d1828661420a565b91506148dd828561420a565b91506148e9828461420a565b9150819050949350505050565b600061490282866142a5565b915061490d82614849565b91506149198285614274565b91506149258284614324565b9150819050949350505050565b600060208201905061494760008301846141a4565b92915050565b600060808201905061496260008301876141a4565b61496f60208301866141a4565b61497c604083018561486c565b818103606083015261498e81846141d1565b905095945050505050565b60006020820190506149ae60008301846141b3565b92915050565b60006080820190506149c960008301876141c2565b6149d6602083018661487b565b6149e360408301856141c2565b6149f060608301846141c2565b95945050505050565b60006020820190508181036000830152614a13818461423b565b905092915050565b60006020820190508181036000830152614a34816143a3565b9050919050565b60006020820190508181036000830152614a54816143c6565b9050919050565b60006020820190508181036000830152614a74816143e9565b9050919050565b60006020820190508181036000830152614a948161440c565b9050919050565b60006020820190508181036000830152614ab48161442f565b9050919050565b60006020820190508181036000830152614ad481614452565b9050919050565b60006020820190508181036000830152614af481614475565b9050919050565b60006020820190508181036000830152614b1481614498565b9050919050565b60006020820190508181036000830152614b34816144bb565b9050919050565b60006020820190508181036000830152614b54816144de565b9050919050565b60006020820190508181036000830152614b7481614501565b9050919050565b60006020820190508181036000830152614b9481614524565b9050919050565b60006020820190508181036000830152614bb481614547565b9050919050565b60006020820190508181036000830152614bd48161456a565b9050919050565b60006020820190508181036000830152614bf48161458d565b9050919050565b60006020820190508181036000830152614c14816145b0565b9050919050565b60006020820190508181036000830152614c34816145d3565b9050919050565b60006020820190508181036000830152614c54816145f6565b9050919050565b60006020820190508181036000830152614c7481614619565b9050919050565b60006020820190508181036000830152614c948161463c565b9050919050565b60006020820190508181036000830152614cb48161465f565b9050919050565b60006020820190508181036000830152614cd481614682565b9050919050565b60006020820190508181036000830152614cf4816146a5565b9050919050565b60006020820190508181036000830152614d14816146c8565b9050919050565b60006020820190508181036000830152614d34816146eb565b9050919050565b60006020820190508181036000830152614d548161470e565b9050919050565b60006020820190508181036000830152614d7481614731565b9050919050565b60006020820190508181036000830152614d9481614754565b9050919050565b60006020820190508181036000830152614db481614777565b9050919050565b60006020820190508181036000830152614dd48161479a565b9050919050565b60006020820190508181036000830152614df4816147bd565b9050919050565b60006020820190508181036000830152614e14816147e0565b9050919050565b60006020820190508181036000830152614e3481614803565b9050919050565b60006020820190508181036000830152614e5481614826565b9050919050565b6000602082019050614e70600083018461486c565b92915050565b6000602082019050614e8b600083018461487b565b92915050565b6000614e9b614eac565b9050614ea782826153ec565b919050565b6000604051905090565b600067ffffffffffffffff821115614ed157614ed06155db565b5b614eda8261561e565b9050602081019050919050565b600067ffffffffffffffff821115614f0257614f016155db565b5b614f0b8261561e565b9050602081019050919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f9b82615361565b9150614fa683615361565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614fdb57614fda6154c1565b5b828201905092915050565b6000614ff18261536b565b9150614ffc8361536b565b92508260ff03821115615012576150116154c1565b5b828201905092915050565b600061502882615361565b915061503383615361565b925082615043576150426154f0565b5b828204905092915050565b60006150598261536b565b91506150648361536b565b925082615074576150736154f0565b5b828204905092915050565b6000808291508390505b60018511156150c9578086048111156150a5576150a46154c1565b5b60018516156150b45780820291505b80810290506150c28561562f565b9450615089565b94509492505050565b60006150dd82615361565b91506150e883615361565b92506151157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461511d565b905092915050565b60008261512d57600190506151e9565b8161513b57600090506151e9565b8160018114615151576002811461515b5761518a565b60019150506151e9565b60ff84111561516d5761516c6154c1565b5b8360020a915084821115615184576151836154c1565b5b506151e9565b5060208310610133831016604e8410600b84101617156151bf5782820a9050838111156151ba576151b96154c1565b5b6151e9565b6151cc848484600161507f565b925090508184048111156151e3576151e26154c1565b5b81810290505b9392505050565b60006151fb82615361565b915061520683615361565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561523f5761523e6154c1565b5b828202905092915050565b60006152558261536b565b91506152608361536b565b92508160ff048311821515161561527a576152796154c1565b5b828202905092915050565b600061529082615361565b915061529b83615361565b9250828210156152ae576152ad6154c1565b5b828203905092915050565b60006152c48261536b565b91506152cf8361536b565b9250828210156152e2576152e16154c1565b5b828203905092915050565b60006152f882615341565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156153a557808201518184015260208101905061538a565b838111156153b4576000848401525b50505050565b600060028204905060018216806153d257607f821691505b602082108114156153e6576153e561554e565b5b50919050565b6153f58261561e565b810181811067ffffffffffffffff82111715615414576154136155db565b5b80604052505050565b600061542882615361565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561545b5761545a6154c1565b5b600182019050919050565b60006154718261536b565b915060ff821415615485576154846154c1565b5b600182019050919050565b600061549b82615361565b91506154a683615361565b9250826154b6576154b56154f0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f5369676e61747572652068617320616c7265616479206265656e20757365642060008201527f746f206d696e7400000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d657373616765206e6f74207369676e65640000000000000000000000000000600082015250565b7f596f75206d6179206d696e7420757020746f2033206475636b73206f6e20746860008201527f65207075626c6963206c6973742073616c652e00000000000000000000000000602082015250565b7f4e6f7420696e2079656c6c6f776c6973742073616c6500000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f596f75206d6179206d696e7420757020746f2033206475636b732e0000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f596f75206d757374206d696e74206174206c65617374206f6e65206475636b2e600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f75206d7573742070617920666f7220796f7572206475636b000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420696e2077686974656c6973742073616c650000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f7420696e207075626c69632073616c650000000000000000000000000000600082015250565b7f596f75206d757374206d696e74206174206c65617374206f6e65206475636b2060008201527f666f72207075626c69632073616c652e00000000000000000000000000000000602082015250565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b615ed8816152ed565b8114615ee357600080fd5b50565b615eef816152ff565b8114615efa57600080fd5b50565b615f0681615315565b8114615f1157600080fd5b50565b615f1d81615361565b8114615f2857600080fd5b50565b615f348161536b565b8114615f3f57600080fd5b5056fea26469706673582212207f18dab74654ebed567cbf4d6809a020b704d6e8537717919007b015c4b3397f64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a59656c6c6f774475636b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025944000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102515760003560e01c806370a0823111610139578063a475b5dd116100b6578063d5abeb011161007a578063d5abeb0114610829578063da947a3714610854578063e985e9c51461087f578063f2fde38b146108bc578063f3eda8c4146108e5578063f96407fa1461091057610251565b8063a475b5dd1461077e578063b88d4fde14610795578063c87b56dd146107be578063caba7ffa146107fb578063d3aed92a1461081257610251565b80638da5cb5b116100fd5780638da5cb5b146106a95780638e1ed66d146106d457806395d89b41146106ff5780639b9896941461072a578063a22cb4651461075557610251565b806370a08231146105f2578063715018a61461062f5780637313cba91461064657806381cf0c6314610671578063858e83b51461068d57610251565b80633574a2dd116101d257806344a0d68a1161019657806344a0d68a146104d05780634f6ccce7146104f957806355f804b314610536578063603f4d521461055f5780636352211e1461058a5780636c0360eb146105c757610251565b80633574a2dd14610439578063380d831b1461046257806338af5fa3146104795780633ccfd60b1461049057806342842e0e146104a757610251565b806318160ddd1161021957806318160ddd1461034f57806323b872dd1461037a5780632f745c59146103a35780632fad121a146103e0578063328ae7a1146103fc57610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb57806313faede614610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613f77565b61093b565b60405161028a9190614999565b60405180910390f35b34801561029f57600080fd5b506102a86109b5565b6040516102b591906149f9565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e091906140ee565b610a47565b6040516102f29190614932565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d9190613f37565b610acc565b005b34801561033057600080fd5b50610339610be4565b6040516103469190614e5b565b60405180910390f35b34801561035b57600080fd5b50610364610bea565b6040516103719190614e5b565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c9190613e21565b610bf7565b005b3480156103af57600080fd5b506103ca60048036038101906103c59190613f37565b610c57565b6040516103d79190614e5b565b60405180910390f35b6103fa60048036038101906103f59190613fd1565b610cfc565b005b34801561040857600080fd5b50610423600480360381019061041e9190614076565b610fc6565b6040516104309190614999565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b919061402d565b6110f1565b005b34801561046e57600080fd5b50610477611187565b005b34801561048557600080fd5b5061048e611221565b005b34801561049c57600080fd5b506104a56112ca565b005b3480156104b357600080fd5b506104ce60048036038101906104c99190613e21565b61138f565b005b3480156104dc57600080fd5b506104f760048036038101906104f291906140ee565b6113af565b005b34801561050557600080fd5b50610520600480360381019061051b91906140ee565b611435565b60405161052d9190614e5b565b60405180910390f35b34801561054257600080fd5b5061055d6004803603810190610558919061402d565b6114a6565b005b34801561056b57600080fd5b5061057461153c565b6040516105819190614e76565b60405180910390f35b34801561059657600080fd5b506105b160048036038101906105ac91906140ee565b61154f565b6040516105be9190614932565b60405180910390f35b3480156105d357600080fd5b506105dc611601565b6040516105e991906149f9565b60405180910390f35b3480156105fe57600080fd5b5061061960048036038101906106149190613db4565b61168f565b6040516106269190614e5b565b60405180910390f35b34801561063b57600080fd5b50610644611747565b005b34801561065257600080fd5b5061065b6117cf565b60405161066891906149f9565b60405180910390f35b61068b6004803603810190610686919061411b565b61185d565b005b6106a760048036038101906106a29190614177565b611992565b005b3480156106b557600080fd5b506106be611c42565b6040516106cb9190614932565b60405180910390f35b3480156106e057600080fd5b506106e9611c6c565b6040516106f69190614e76565b60405180910390f35b34801561070b57600080fd5b50610714611cc0565b60405161072191906149f9565b60405180910390f35b34801561073657600080fd5b5061073f611d52565b60405161074c9190614e76565b60405180910390f35b34801561076157600080fd5b5061077c60048036038101906107779190613ef7565b611da6565b005b34801561078a57600080fd5b50610793611dbc565b005b3480156107a157600080fd5b506107bc60048036038101906107b79190613e74565b611e55565b005b3480156107ca57600080fd5b506107e560048036038101906107e091906140ee565b611eb7565b6040516107f291906149f9565b60405180910390f35b34801561080757600080fd5b50610810611f52565b005b34801561081e57600080fd5b50610827611ffb565b005b34801561083557600080fd5b5061083e6120a4565b60405161084b9190614e5b565b60405180910390f35b34801561086057600080fd5b506108696120aa565b6040516108769190614e5b565b60405180910390f35b34801561088b57600080fd5b506108a660048036038101906108a19190613de1565b6120b0565b6040516108b39190614999565b60405180910390f35b3480156108c857600080fd5b506108e360048036038101906108de9190613db4565b612144565b005b3480156108f157600080fd5b506108fa61223c565b6040516109079190614e5b565b60405180910390f35b34801561091c57600080fd5b50610925612242565b6040516109329190614e5b565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ae57506109ad82612248565b5b9050919050565b6060600080546109c4906153ba565b80601f01602080910402602001604051908101604052809291908181526020018280546109f0906153ba565b8015610a3d5780601f10610a1257610100808354040283529160200191610a3d565b820191906000526020600020905b815481529060010190602001808311610a2057829003601f168201915b5050505050905090565b6000610a528261232a565b610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890614cfb565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ad78261154f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3f90614d7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b67612396565b73ffffffffffffffffffffffffffffffffffffffff161480610b965750610b9581610b90612396565b6120b0565b5b610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc90614c3b565b60405180910390fd5b610bdf838361239e565b505050565b600e5481565b6000600880549050905090565b610c08610c02612396565b82612457565b610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90614dbb565b60405180910390fd5b610c52838383612535565b505050565b6000610c628361168f565b8210610ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9a90614a7b565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6001601560009054906101000a900460ff1660ff1614610d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4890614d9b565b60405180910390fd5b60008160ff1611610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90614c1b565b60405180910390fd5b607a600f54610da69190615285565b8160ff16601054610db79190614f90565b1115610df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610def90614d3b565b60405180910390fd5b60115481601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e539190614fe6565b60ff161115610e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8e90614bbb565b60405180910390fd5b8060ff16600e54610ea891906151f0565b3414610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee090614cbb565b60405180910390fd5b6000610ef43361279c565b9050610f008184610fc6565b5060005b8260ff16811015610fc057610f2033610f1b6129b5565b612a6e565b60106000815480929190610f339061541d565b9190505550601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff1680929190610f9490615466565b91906101000a81548160ff021916908360ff160217905550508080610fb89061541d565b915050610f04565b50505050565b6000601782604051610fd8919061488a565b908152602001604051809103902060009054906101000a900460ff1615611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102b90614a3b565b60405180910390fd5b600061103f84612a8c565b9050600061104d8285612b15565b90506000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050806110e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110db90614b1b565b60405180910390fd5b6001935050505092915050565b6110f9612396565b73ffffffffffffffffffffffffffffffffffffffff16611117611c42565b73ffffffffffffffffffffffffffffffffffffffff161461116d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116490614d1b565b60405180910390fd5b80600c9080519060200190611183929190613bb3565b5050565b61118f612396565b73ffffffffffffffffffffffffffffffffffffffff166111ad611c42565b73ffffffffffffffffffffffffffffffffffffffff1614611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa90614d1b565b60405180910390fd5b6003601560006101000a81548160ff021916908360ff160217905550565b611229612396565b73ffffffffffffffffffffffffffffffffffffffff16611247611c42565b73ffffffffffffffffffffffffffffffffffffffff161461129d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129490614d1b565b60405180910390fd5b6000601560006101000a81548160ff021916908360ff160217905550670186cc6acd4b0000600e81905550565b6112d2612396565b73ffffffffffffffffffffffffffffffffffffffff166112f0611c42565b73ffffffffffffffffffffffffffffffffffffffff1614611346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133d90614d1b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561138c573d6000803e3d6000fd5b50565b6113aa83838360405180602001604052806000815250611e55565b505050565b6113b7612396565b73ffffffffffffffffffffffffffffffffffffffff166113d5611c42565b73ffffffffffffffffffffffffffffffffffffffff161461142b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142290614d1b565b60405180910390fd5b80600e8190555050565b600061143f610bea565b8210611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147790614ddb565b60405180910390fd5b60088281548110611494576114936155ac565b5b90600052602060002001549050919050565b6114ae612396565b73ffffffffffffffffffffffffffffffffffffffff166114cc611c42565b73ffffffffffffffffffffffffffffffffffffffff1614611522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151990614d1b565b60405180910390fd5b80600b9080519060200190611538929190613bb3565b5050565b601560009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef90614c7b565b60405180910390fd5b80915050919050565b600b805461160e906153ba565b80601f016020809104026020016040519081016040528092919081815260200182805461163a906153ba565b80156116875780601f1061165c57610100808354040283529160200191611687565b820191906000526020600020905b81548152906001019060200180831161166a57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f790614c5b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61174f612396565b73ffffffffffffffffffffffffffffffffffffffff1661176d611c42565b73ffffffffffffffffffffffffffffffffffffffff16146117c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ba90614d1b565b60405180910390fd5b6117cd6000612b3c565b565b600c80546117dc906153ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611808906153ba565b80156118555780601f1061182a57610100808354040283529160200191611855565b820191906000526020600020905b81548152906001019060200180831161183857829003601f168201915b505050505081565b6000601560009054906101000a900460ff1660ff16146118b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a990614b5b565b60405180910390fd5b6118c46118be83612c02565b82610fc6565b50600e543414611909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190090614cbb565b60405180910390fd5b6119133383612a6e565b601060008154809291906119269061541d565b919050555060016016600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601782604051611969919061488a565b908152602001604051809103902060006101000a81548160ff0219169083151502179055505050565b6002601560009054906101000a900460ff1660ff16146119e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119de90614dfb565b60405180910390fd5b60008160ff1611611a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2490614e1b565b60405180910390fd5b607a600f54611a3c9190615285565b8160ff16601054611a4d9190614f90565b1115611a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8590614d3b565b60405180910390fd5b60125481601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611ae99190614fe6565b60ff161115611b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2490614b3b565b60405180910390fd5b8060ff16600e54611b3e91906151f0565b3414611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7690614cbb565b60405180910390fd5b60005b8160ff16811015611c3e57611b9e33611b996129b5565b612a6e565b60106000815480929190611bb19061541d565b9190505550601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff1680929190611c1290615466565b91906101000a81548160ff021916908360ff160217905550508080611c369061541d565b915050611b82565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905090565b606060018054611ccf906153ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611cfb906153ba565b8015611d485780601f10611d1d57610100808354040283529160200191611d48565b820191906000526020600020905b815481529060010190602001808311611d2b57829003601f168201915b5050505050905090565b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905090565b611db8611db1612396565b8383612d63565b5050565b611dc4612396565b73ffffffffffffffffffffffffffffffffffffffff16611de2611c42565b73ffffffffffffffffffffffffffffffffffffffff1614611e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2f90614d1b565b60405180910390fd5b6001601a60006101000a81548160ff021916908315150217905550565b611e66611e60612396565b83612457565b611ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9c90614dbb565b60405180910390fd5b611eb184848484612ed0565b50505050565b6060611ec28261232a565b611f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef890614d5b565b60405180910390fd5b601a60009054906101000a900460ff16611f1c57600c611f1f565b600b5b611f2883612c02565b600d604051602001611f3c939291906148f6565b6040516020818303038152906040529050919050565b611f5a612396565b73ffffffffffffffffffffffffffffffffffffffff16611f78611c42565b73ffffffffffffffffffffffffffffffffffffffff1614611fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc590614d1b565b60405180910390fd5b6002601560006101000a81548160ff021916908360ff1602179055506701aa535d3d0c0000600e81905550565b612003612396565b73ffffffffffffffffffffffffffffffffffffffff16612021611c42565b73ffffffffffffffffffffffffffffffffffffffff1614612077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206e90614d1b565b60405180910390fd5b6001601560006101000a81548160ff021916908360ff160217905550670186cc6acd4b0000600e81905550565b600f5481565b60105481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61214c612396565b73ffffffffffffffffffffffffffffffffffffffff1661216a611c42565b73ffffffffffffffffffffffffffffffffffffffff16146121c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b790614d1b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222790614abb565b60405180910390fd5b61223981612b3c565b50565b60125481565b60115481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061231357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612323575061232282612f2c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124118361154f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006124628261232a565b6124a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249890614bfb565b60405180910390fd5b60006124ac8361154f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061251b57508373ffffffffffffffffffffffffffffffffffffffff1661250384610a47565b73ffffffffffffffffffffffffffffffffffffffff16145b8061252c575061252b81856120b0565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166125558261154f565b73ffffffffffffffffffffffffffffffffffffffff16146125ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a290614adb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561261b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261290614b7b565b60405180910390fd5b612626838383612f96565b61263160008261239e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126819190615285565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126d89190614f90565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127978383836130aa565b505050565b60606000602867ffffffffffffffff8111156127bb576127ba6155db565b5b6040519080825280601f01601f1916602001820160405280156127ed5781602001600182028036833780820191505090505b50905060005b601481101561295557600081601361280b9190615285565b600861281791906151f0565b600261282391906150d2565b8573ffffffffffffffffffffffffffffffffffffffff16612844919061501d565b60f81b9050600060108260f81c61285b919061504e565b60f81b905060008160f81c6010612872919061524a565b8360f81c61288091906152b9565b60f81b905061288e826130af565b8585600261289c91906151f0565b815181106128ad576128ac6155ac565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506128e5816130af565b8560018660026128f591906151f0565b6128ff9190614f90565b815181106129105761290f6155ac565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350505050808061294d9061541d565b9150506127f3565b506040518060400160405280600281526020017f30780000000000000000000000000000000000000000000000000000000000008152508160405160200161299e9291906148a1565b604051602081830303815290604052915050919050565b60008060195490505b600f548111612a2457601960008154809291906129da9061541d565b919050555060166000601954815260200190815260200160002060009054906101000a900460ff16612a1157601954915050612a6b565b8080612a1c9061541d565b9150506129be565b506000612a66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5d90614e3b565b60405180910390fd5b600090505b90565b612a888282604051806020016040528060008152506130f5565b5050565b6000806040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a00000000000081525090506000612ad38451612c02565b90506000828286604051602001612aec939291906148c5565b604051602081830303815290604052905060008180519060200120905080945050505050919050565b6000806000612b248585613150565b91509150612b31816131d3565b819250505092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000821415612c4a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d5e565b600082905060005b60008214612c7c578080612c659061541d565b915050600a82612c75919061501d565b9150612c52565b60008167ffffffffffffffff811115612c9857612c976155db565b5b6040519080825280601f01601f191660200182016040528015612cca5781602001600182028036833780820191505090505b5090505b60008514612d5757600182612ce39190615285565b9150600a85612cf29190615490565b6030612cfe9190614f90565b60f81b818381518110612d1457612d136155ac565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d50919061501d565b9450612cce565b8093505050505b919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc990614b9b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ec39190614999565b60405180910390a3505050565b612edb848484612535565b612ee7848484846133a8565b612f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1d90614a9b565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612fa183838361353f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fe457612fdf81613544565b613023565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461302257613021838261358d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561306657613061816136fa565b6130a5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130a4576130a382826137cb565b5b5b505050565b505050565b6000600a8260f81c60ff1610156130da5760308260f81c6130d09190614fe6565b60f81b90506130f0565b60578260f81c6130ea9190614fe6565b60f81b90505b919050565b6130ff838361384a565b61310c60008484846133a8565b61314b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314290614a9b565b60405180910390fd5b505050565b6000806041835114156131925760008060006020860151925060408601519150606086015160001a905061318687828585613a24565b945094505050506131cc565b6040835114156131c35760008060208501519150604085015190506131b8868383613b31565b9350935050506131cc565b60006002915091505b9250929050565b600060048111156131e7576131e661551f565b5b8160048111156131fa576131f961551f565b5b1415613205576133a5565b600160048111156132195761321861551f565b5b81600481111561322c5761322b61551f565b5b141561326d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326490614a1b565b60405180910390fd5b600260048111156132815761328061551f565b5b8160048111156132945761329361551f565b5b14156132d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132cc90614a5b565b60405180910390fd5b600360048111156132e9576132e861551f565b5b8160048111156132fc576132fb61551f565b5b141561333d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333490614bdb565b60405180910390fd5b6004808111156133505761334f61551f565b5b8160048111156133635761336261551f565b5b14156133a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339b90614c9b565b60405180910390fd5b5b50565b60006133c98473ffffffffffffffffffffffffffffffffffffffff16613b90565b15613532578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133f2612396565b8786866040518563ffffffff1660e01b8152600401613414949392919061494d565b602060405180830381600087803b15801561342e57600080fd5b505af192505050801561345f57506040513d601f19601f8201168201806040525081019061345c9190613fa4565b60015b6134e2573d806000811461348f576040519150601f19603f3d011682016040523d82523d6000602084013e613494565b606091505b506000815114156134da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d190614a9b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613537565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161359a8461168f565b6135a49190615285565b9050600060076000848152602001908152602001600020549050818114613689576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061370e9190615285565b905060006009600084815260200190815260200160002054905060006008838154811061373e5761373d6155ac565b5b9060005260206000200154905080600883815481106137605761375f6155ac565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806137af576137ae61557d565b5b6001900381819060005260206000200160009055905550505050565b60006137d68361168f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156138ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b190614cdb565b60405180910390fd5b6138c38161232a565b15613903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138fa90614afb565b60405180910390fd5b61390f60008383612f96565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461395f9190614f90565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613a20600083836130aa565b5050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613a5f576000600391509150613b28565b601b8560ff1614158015613a775750601c8560ff1614155b15613a89576000600491509150613b28565b600060018787878760405160008152602001604052604051613aae94939291906149b4565b6020604051602081039080840390855afa158015613ad0573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b1f57600060019250925050613b28565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c613b749190614f90565b9050613b8287828885613a24565b935093505050935093915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613bbf906153ba565b90600052602060002090601f016020900481019282613be15760008555613c28565b82601f10613bfa57805160ff1916838001178555613c28565b82800160010185558215613c28579182015b82811115613c27578251825591602001919060010190613c0c565b5b509050613c359190613c39565b5090565b5b80821115613c52576000816000905550600101613c3a565b5090565b6000613c69613c6484614eb6565b614e91565b905082815260208101848484011115613c8557613c8461560f565b5b613c90848285615378565b509392505050565b6000613cab613ca684614ee7565b614e91565b905082815260208101848484011115613cc757613cc661560f565b5b613cd2848285615378565b509392505050565b600081359050613ce981615ecf565b92915050565b600081359050613cfe81615ee6565b92915050565b600081359050613d1381615efd565b92915050565b600081519050613d2881615efd565b92915050565b600082601f830112613d4357613d4261560a565b5b8135613d53848260208601613c56565b91505092915050565b600082601f830112613d7157613d7061560a565b5b8135613d81848260208601613c98565b91505092915050565b600081359050613d9981615f14565b92915050565b600081359050613dae81615f2b565b92915050565b600060208284031215613dca57613dc9615619565b5b6000613dd884828501613cda565b91505092915050565b60008060408385031215613df857613df7615619565b5b6000613e0685828601613cda565b9250506020613e1785828601613cda565b9150509250929050565b600080600060608486031215613e3a57613e39615619565b5b6000613e4886828701613cda565b9350506020613e5986828701613cda565b9250506040613e6a86828701613d8a565b9150509250925092565b60008060008060808587031215613e8e57613e8d615619565b5b6000613e9c87828801613cda565b9450506020613ead87828801613cda565b9350506040613ebe87828801613d8a565b925050606085013567ffffffffffffffff811115613edf57613ede615614565b5b613eeb87828801613d2e565b91505092959194509250565b60008060408385031215613f0e57613f0d615619565b5b6000613f1c85828601613cda565b9250506020613f2d85828601613cef565b9150509250929050565b60008060408385031215613f4e57613f4d615619565b5b6000613f5c85828601613cda565b9250506020613f6d85828601613d8a565b9150509250929050565b600060208284031215613f8d57613f8c615619565b5b6000613f9b84828501613d04565b91505092915050565b600060208284031215613fba57613fb9615619565b5b6000613fc884828501613d19565b91505092915050565b60008060408385031215613fe857613fe7615619565b5b600083013567ffffffffffffffff81111561400657614005615614565b5b61401285828601613d2e565b925050602061402385828601613d9f565b9150509250929050565b60006020828403121561404357614042615619565b5b600082013567ffffffffffffffff81111561406157614060615614565b5b61406d84828501613d5c565b91505092915050565b6000806040838503121561408d5761408c615619565b5b600083013567ffffffffffffffff8111156140ab576140aa615614565b5b6140b785828601613d5c565b925050602083013567ffffffffffffffff8111156140d8576140d7615614565b5b6140e485828601613d2e565b9150509250929050565b60006020828403121561410457614103615619565b5b600061411284828501613d8a565b91505092915050565b6000806040838503121561413257614131615619565b5b600061414085828601613d8a565b925050602083013567ffffffffffffffff81111561416157614160615614565b5b61416d85828601613d2e565b9150509250929050565b60006020828403121561418d5761418c615619565b5b600061419b84828501613d9f565b91505092915050565b6141ad816152ed565b82525050565b6141bc816152ff565b82525050565b6141cb8161530b565b82525050565b60006141dc82614f42565b6141e68185614f58565b93506141f6818560208601615387565b6141ff8161561e565b840191505092915050565b600061421582614f42565b61421f8185614f69565b935061422f818560208601615387565b80840191505092915050565b600061424682614f4d565b6142508185614f74565b9350614260818560208601615387565b6142698161561e565b840191505092915050565b600061427f82614f4d565b6142898185614f85565b9350614299818560208601615387565b80840191505092915050565b600081546142b2816153ba565b6142bc8186614f85565b945060018216600081146142d757600181146142e85761431b565b60ff1983168652818601935061431b565b6142f185614f2d565b60005b83811015614313578154818901526001820191506020810190506142f4565b838801955050505b50505092915050565b60008154614331816153ba565b61433b8186614f85565b9450600182166000811461435657600181146143675761439a565b60ff1983168652818601935061439a565b61437085614f18565b60005b8381101561439257815481890152600182019150602081019050614373565b838801955050505b50505092915050565b60006143b0601883614f74565b91506143bb8261563c565b602082019050919050565b60006143d3602783614f74565b91506143de82615665565b604082019050919050565b60006143f6601f83614f74565b9150614401826156b4565b602082019050919050565b6000614419602b83614f74565b9150614424826156dd565b604082019050919050565b600061443c603283614f74565b91506144478261572c565b604082019050919050565b600061445f602683614f74565b915061446a8261577b565b604082019050919050565b6000614482602583614f74565b915061448d826157ca565b604082019050919050565b60006144a5601c83614f74565b91506144b082615819565b602082019050919050565b60006144c8601283614f74565b91506144d382615842565b602082019050919050565b60006144eb603383614f74565b91506144f68261586b565b604082019050919050565b600061450e601683614f74565b9150614519826158ba565b602082019050919050565b6000614531602483614f74565b915061453c826158e3565b604082019050919050565b6000614554601983614f74565b915061455f82615932565b602082019050919050565b6000614577601b83614f74565b91506145828261595b565b602082019050919050565b600061459a602283614f74565b91506145a582615984565b604082019050919050565b60006145bd602c83614f74565b91506145c8826159d3565b604082019050919050565b60006145e0602083614f74565b91506145eb82615a22565b602082019050919050565b6000614603603883614f74565b915061460e82615a4b565b604082019050919050565b6000614626602a83614f74565b915061463182615a9a565b604082019050919050565b6000614649602983614f74565b915061465482615ae9565b604082019050919050565b600061466c602283614f74565b915061467782615b38565b604082019050919050565b600061468f601a83614f74565b915061469a82615b87565b602082019050919050565b60006146b2602083614f74565b91506146bd82615bb0565b602082019050919050565b60006146d5602c83614f74565b91506146e082615bd9565b604082019050919050565b60006146f8602083614f74565b915061470382615c28565b602082019050919050565b600061471b602183614f74565b915061472682615c51565b604082019050919050565b600061473e602f83614f74565b915061474982615ca0565b604082019050919050565b6000614761602183614f74565b915061476c82615cef565b604082019050919050565b6000614784601583614f74565b915061478f82615d3e565b602082019050919050565b60006147a7603183614f74565b91506147b282615d67565b604082019050919050565b60006147ca602c83614f74565b91506147d582615db6565b604082019050919050565b60006147ed601283614f74565b91506147f882615e05565b602082019050919050565b6000614810603083614f74565b915061481b82615e2e565b604082019050919050565b6000614833601b83614f74565b915061483e82615e7d565b602082019050919050565b6000614856600183614f85565b915061486182615ea6565b600182019050919050565b61487581615361565b82525050565b6148848161536b565b82525050565b6000614896828461420a565b915081905092915050565b60006148ad828561420a565b91506148b9828461420a565b91508190509392505050565b60006148d1828661420a565b91506148dd828561420a565b91506148e9828461420a565b9150819050949350505050565b600061490282866142a5565b915061490d82614849565b91506149198285614274565b91506149258284614324565b9150819050949350505050565b600060208201905061494760008301846141a4565b92915050565b600060808201905061496260008301876141a4565b61496f60208301866141a4565b61497c604083018561486c565b818103606083015261498e81846141d1565b905095945050505050565b60006020820190506149ae60008301846141b3565b92915050565b60006080820190506149c960008301876141c2565b6149d6602083018661487b565b6149e360408301856141c2565b6149f060608301846141c2565b95945050505050565b60006020820190508181036000830152614a13818461423b565b905092915050565b60006020820190508181036000830152614a34816143a3565b9050919050565b60006020820190508181036000830152614a54816143c6565b9050919050565b60006020820190508181036000830152614a74816143e9565b9050919050565b60006020820190508181036000830152614a948161440c565b9050919050565b60006020820190508181036000830152614ab48161442f565b9050919050565b60006020820190508181036000830152614ad481614452565b9050919050565b60006020820190508181036000830152614af481614475565b9050919050565b60006020820190508181036000830152614b1481614498565b9050919050565b60006020820190508181036000830152614b34816144bb565b9050919050565b60006020820190508181036000830152614b54816144de565b9050919050565b60006020820190508181036000830152614b7481614501565b9050919050565b60006020820190508181036000830152614b9481614524565b9050919050565b60006020820190508181036000830152614bb481614547565b9050919050565b60006020820190508181036000830152614bd48161456a565b9050919050565b60006020820190508181036000830152614bf48161458d565b9050919050565b60006020820190508181036000830152614c14816145b0565b9050919050565b60006020820190508181036000830152614c34816145d3565b9050919050565b60006020820190508181036000830152614c54816145f6565b9050919050565b60006020820190508181036000830152614c7481614619565b9050919050565b60006020820190508181036000830152614c948161463c565b9050919050565b60006020820190508181036000830152614cb48161465f565b9050919050565b60006020820190508181036000830152614cd481614682565b9050919050565b60006020820190508181036000830152614cf4816146a5565b9050919050565b60006020820190508181036000830152614d14816146c8565b9050919050565b60006020820190508181036000830152614d34816146eb565b9050919050565b60006020820190508181036000830152614d548161470e565b9050919050565b60006020820190508181036000830152614d7481614731565b9050919050565b60006020820190508181036000830152614d9481614754565b9050919050565b60006020820190508181036000830152614db481614777565b9050919050565b60006020820190508181036000830152614dd48161479a565b9050919050565b60006020820190508181036000830152614df4816147bd565b9050919050565b60006020820190508181036000830152614e14816147e0565b9050919050565b60006020820190508181036000830152614e3481614803565b9050919050565b60006020820190508181036000830152614e5481614826565b9050919050565b6000602082019050614e70600083018461486c565b92915050565b6000602082019050614e8b600083018461487b565b92915050565b6000614e9b614eac565b9050614ea782826153ec565b919050565b6000604051905090565b600067ffffffffffffffff821115614ed157614ed06155db565b5b614eda8261561e565b9050602081019050919050565b600067ffffffffffffffff821115614f0257614f016155db565b5b614f0b8261561e565b9050602081019050919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f9b82615361565b9150614fa683615361565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614fdb57614fda6154c1565b5b828201905092915050565b6000614ff18261536b565b9150614ffc8361536b565b92508260ff03821115615012576150116154c1565b5b828201905092915050565b600061502882615361565b915061503383615361565b925082615043576150426154f0565b5b828204905092915050565b60006150598261536b565b91506150648361536b565b925082615074576150736154f0565b5b828204905092915050565b6000808291508390505b60018511156150c9578086048111156150a5576150a46154c1565b5b60018516156150b45780820291505b80810290506150c28561562f565b9450615089565b94509492505050565b60006150dd82615361565b91506150e883615361565b92506151157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461511d565b905092915050565b60008261512d57600190506151e9565b8161513b57600090506151e9565b8160018114615151576002811461515b5761518a565b60019150506151e9565b60ff84111561516d5761516c6154c1565b5b8360020a915084821115615184576151836154c1565b5b506151e9565b5060208310610133831016604e8410600b84101617156151bf5782820a9050838111156151ba576151b96154c1565b5b6151e9565b6151cc848484600161507f565b925090508184048111156151e3576151e26154c1565b5b81810290505b9392505050565b60006151fb82615361565b915061520683615361565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561523f5761523e6154c1565b5b828202905092915050565b60006152558261536b565b91506152608361536b565b92508160ff048311821515161561527a576152796154c1565b5b828202905092915050565b600061529082615361565b915061529b83615361565b9250828210156152ae576152ad6154c1565b5b828203905092915050565b60006152c48261536b565b91506152cf8361536b565b9250828210156152e2576152e16154c1565b5b828203905092915050565b60006152f882615341565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156153a557808201518184015260208101905061538a565b838111156153b4576000848401525b50505050565b600060028204905060018216806153d257607f821691505b602082108114156153e6576153e561554e565b5b50919050565b6153f58261561e565b810181811067ffffffffffffffff82111715615414576154136155db565b5b80604052505050565b600061542882615361565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561545b5761545a6154c1565b5b600182019050919050565b60006154718261536b565b915060ff821415615485576154846154c1565b5b600182019050919050565b600061549b82615361565b91506154a683615361565b9250826154b6576154b56154f0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f5369676e61747572652068617320616c7265616479206265656e20757365642060008201527f746f206d696e7400000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d657373616765206e6f74207369676e65640000000000000000000000000000600082015250565b7f596f75206d6179206d696e7420757020746f2033206475636b73206f6e20746860008201527f65207075626c6963206c6973742073616c652e00000000000000000000000000602082015250565b7f4e6f7420696e2079656c6c6f776c6973742073616c6500000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f596f75206d6179206d696e7420757020746f2033206475636b732e0000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f596f75206d757374206d696e74206174206c65617374206f6e65206475636b2e600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f75206d7573742070617920666f7220796f7572206475636b000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420696e2077686974656c6973742073616c650000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f7420696e207075626c69632073616c650000000000000000000000000000600082015250565b7f596f75206d757374206d696e74206174206c65617374206f6e65206475636b2060008201527f666f72207075626c69632073616c652e00000000000000000000000000000000602082015250565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b615ed8816152ed565b8114615ee357600080fd5b50565b615eef816152ff565b8114615efa57600080fd5b50565b615f0681615315565b8114615f1157600080fd5b50565b615f1d81615361565b8114615f2857600080fd5b50565b615f348161536b565b8114615f3f57600080fd5b5056fea26469706673582212207f18dab74654ebed567cbf4d6809a020b704d6e8537717919007b015c4b3397f64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a59656c6c6f774475636b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025944000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): YellowDuck
Arg [1] : _symbol (string): YD
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [3] : 59656c6c6f774475636b00000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [5] : 5944000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
71716:10081:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65403:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52223:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53782:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53305:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72089:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66043:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54532:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65711:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78700:1182;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74102:793;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77081:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76230:68;;;;;;;;;;;;;:::i;:::-;;76345:110;;;;;;;;;;;;;:::i;:::-;;81413:107;;;;;;;;;;;;;:::i;:::-;;54942:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76813:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66233:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76945:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72747:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51917:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71920:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51647:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30819:103;;;;;;;;;;;;;:::i;:::-;;71954:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77342:615;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79905:972;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30168:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81528:130;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52392:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81666:128;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54075:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76134:71;;;;;;;;;;;;;:::i;:::-;;55198:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80905:500;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76658:110;;;;;;;;;;;;;:::i;:::-;;76501:109;;;;;;;;;;;;;:::i;:::-;;72154:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72216:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54301:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31077:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72391:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72299:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65403:224;65505:4;65544:35;65529:50;;;:11;:50;;;;:90;;;;65583:36;65607:11;65583:23;:36::i;:::-;65529:90;65522:97;;65403:224;;;:::o;52223:100::-;52277:13;52310:5;52303:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52223:100;:::o;53782:221::-;53858:7;53886:16;53894:7;53886;:16::i;:::-;53878:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53971:15;:24;53987:7;53971:24;;;;;;;;;;;;;;;;;;;;;53964:31;;53782:221;;;:::o;53305:411::-;53386:13;53402:23;53417:7;53402:14;:23::i;:::-;53386:39;;53450:5;53444:11;;:2;:11;;;;53436:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;53544:5;53528:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;53553:37;53570:5;53577:12;:10;:12::i;:::-;53553:16;:37::i;:::-;53528:62;53506:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;53687:21;53696:2;53700:7;53687:8;:21::i;:::-;53375:341;53305:411;;:::o;72089:32::-;;;;:::o;66043:113::-;66104:7;66131:10;:17;;;;66124:24;;66043:113;:::o;54532:339::-;54727:41;54746:12;:10;:12::i;:::-;54760:7;54727:18;:41::i;:::-;54719:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;54835:28;54845:4;54851:2;54855:7;54835:9;:28::i;:::-;54532:339;;;:::o;65711:256::-;65808:7;65844:23;65861:5;65844:16;:23::i;:::-;65836:5;:31;65828:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;65933:12;:19;65946:5;65933:19;;;;;;;;;;;;;;;:26;65953:5;65933:26;;;;;;;;;;;;65926:33;;65711:256;;;;:::o;78700:1182::-;75887:1;75874:9;;;;;;;;;;;:14;;;75866:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;78876:1:::1;78859:14;:18;;;78851:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;79060:3;79048:9;;:15;;;;:::i;:::-;79029:14;79013:30;;:13;;:30;;;;:::i;:::-;:51;;79005:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;79196:22;;79178:14;79135:28;:40;79164:10;79135:40;;;;;;;;;;;;;;;;;;;;;;;;;:57;;;;:::i;:::-;:83;;;;79113:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;79314:14;79307:21;;:4;;:21;;;;:::i;:::-;79294:9;:34;79286:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;79372:20;79395:25;79409:10;79395:13;:25::i;:::-;79372:48;;79514:42;79538:6;79546:9;79514:23;:42::i;:::-;;79574:6;79569:306;79590:14;79586:18;;:1;:18;79569:306;;;79675:40;79685:10;79697:17;:15;:17::i;:::-;79675:9;:40::i;:::-;79732:13;;:15;;;;;;;;;:::i;:::-;;;;;;79821:28;:40;79850:10;79821:40;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;79606:3;;;;;:::i;:::-;;;;79569:306;;;;78840:1042;78700:1182:::0;;:::o;74102:793::-;74228:4;74268:31;74300:9;74268:42;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;74267:43;74245:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;74468:19;74490:17;74499:7;74490:8;:17::i;:::-;74468:39;;74610:22;74635:37;74649:11;74662:9;74635:13;:37::i;:::-;74610:62;;74765:10;74796:18;;;;;;;;;;;74778:36;;:14;:36;;;74765:49;;74835:5;74827:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;74883:4;74876:11;;;;;74102:793;;;;:::o;77081:104::-;30399:12;:10;:12::i;:::-;30388:23;;:7;:5;:7::i;:::-;:23;;;30380:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77173:4:::1;77156:14;:21;;;;;;;;;;;;:::i;:::-;;77081:104:::0;:::o;76230:68::-;30399:12;:10;:12::i;:::-;30388:23;;:7;:5;:7::i;:::-;:23;;;30380:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76289:1:::1;76277:9;;:13;;;;;;;;;;;;;;;;;;76230:68::o:0;76345:110::-;30399:12;:10;:12::i;:::-;30388:23;;:7;:5;:7::i;:::-;:23;;;30380:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76418:1:::1;76406:9;;:13;;;;;;;;;;;;;;;;;;76437:10;76430:4;:17;;;;76345:110::o:0;81413:107::-;30399:12;:10;:12::i;:::-;30388:23;;:7;:5;:7::i;:::-;:23;;;30380:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;81469:10:::1;81461:28;;:51;81490:21;81461:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;81413:107::o:0;54942:185::-;55080:39;55097:4;55103:2;55107:7;55080:39;;;;;;;;;;;;:16;:39::i;:::-;54942:185;;;:::o;76813:86::-;30399:12;:10;:12::i;:::-;30388:23;;:7;:5;:7::i;:::-;:23;;;30380:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76883:8:::1;76876:4;:15;;;;76813:86:::0;:::o;66233:233::-;66308:7;66344:30;:28;:30::i;:::-;66336:5;:38;66328:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;66441:10;66452:5;66441:17;;;;;;;;:::i;:::-;;;;;;;;;;66434:24;;66233:233;;;:::o;76945:90::-;30399:12;:10;:12::i;:::-;30388:23;;:7;:5;:7::i;:::-;:23;;;30380:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77023:4:::1;77013:7;:14;;;;;;;;;;;;:::i;:::-;;76945:90:::0;:::o;72747:26::-;;;;;;;;;;;;;:::o;51917:239::-;51989:7;52009:13;52025:7;:16;52033:7;52025:16;;;;;;;;;;;;;;;;;;;;;52009:32;;52077:1;52060:19;;:5;:19;;;;52052:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52143:5;52136:12;;;51917:239;;;:::o;71920:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51647:208::-;51719:7;51764:1;51747:19;;:5;:19;;;;51739:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;51831:9;:16;51841:5;51831:16;;;;;;;;;;;;;;;;51824:23;;51647:208;;;:::o;30819:103::-;30399:12;:10;:12::i;:::-;30388:23;;:7;:5;:7::i;:::-;:23;;;30380:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30884:30:::1;30911:1;30884:18;:30::i;:::-;30819:103::o:0;71954:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;77342:615::-;75732:1;75719:9;;;;;;;;;;;:14;;;75711:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;77530:61:::1;77554:25;77571:7;77554:16;:25::i;:::-;77581:9;77530:23;:61::i;:::-;;77625:4;;77612:9;:17;77604:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;77712:30;77722:10;77734:7;77712:9;:30::i;:::-;77755:13;;:15;;;;;;;;;:::i;:::-;;;;;;77809:4;77783:14;:23;77798:7;77783:23;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;77945:4;77900:31;77932:9;77900:42;;;;;;:::i;:::-;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;77342:615:::0;;:::o;79905:972::-;76043:1;76030:9;;;;;;;;;;;:14;;;76022:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;80022:1:::1;80005:14;:18;;;79997:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;80222:3;80210:9;;:15;;;;:::i;:::-;80191:14;80175:30;;:13;;:30;;;;:::i;:::-;:51;;80167:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;80359:23;;80341:14;80297:29;:41;80327:10;80297:41;;;;;;;;;;;;;;;;;;;;;;;;;:58;;;;:::i;:::-;:85;;;;80275:186;;;;;;;;;;;;:::i;:::-;;;;;;;;;80502:14;80495:21;;:4;;:21;;;;:::i;:::-;80482:9;:34;80474:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;80565:6;80560:310;80581:14;80577:18;;:1;:18;80560:310;;;80666:40;80676:10;80688:17;:15;:17::i;:::-;80666:9;:40::i;:::-;80723:13;;:15;;;;;;;;;:::i;:::-;;;;;;80815:29;:41;80845:10;80815:41;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;80597:3;;;;;:::i;:::-;;;;80560:310;;;;79905:972:::0;:::o;30168:87::-;30214:7;30241:6;;;;;;;;;;;30234:13;;30168:87;:::o;81528:130::-;81585:5;81610:28;:40;81639:10;81610:40;;;;;;;;;;;;;;;;;;;;;;;;;81603:47;;81528:130;:::o;52392:104::-;52448:13;52481:7;52474:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52392:104;:::o;81666:128::-;81720:5;81745:29;:41;81775:10;81745:41;;;;;;;;;;;;;;;;;;;;;;;;;81738:48;;81666:128;:::o;54075:155::-;54170:52;54189:12;:10;:12::i;:::-;54203:8;54213;54170:18;:52::i;:::-;54075:155;;:::o;76134:71::-;30399:12;:10;:12::i;:::-;30388:23;;:7;:5;:7::i;:::-;:23;;;30380:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76193:4:::1;76180:10;;:17;;;;;;;;;;;;;;;;;;76134:71::o:0;55198:328::-;55373:41;55392:12;:10;:12::i;:::-;55406:7;55373:18;:41::i;:::-;55365:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;55479:39;55493:4;55499:2;55503:7;55512:5;55479:13;:39::i;:::-;55198:328;;;;:::o;80905:500::-;81023:13;81076:16;81084:7;81076;:16::i;:::-;81054:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;81243:10;;;;;;;;;;;:37;;81266:14;81243:37;;;81256:7;81243:37;81321:18;:7;:16;:18::i;:::-;81358:13;81208:178;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;81180:217;;80905:500;;;:::o;76658:110::-;30399:12;:10;:12::i;:::-;30388:23;;:7;:5;:7::i;:::-;:23;;;30380:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76731:1:::1;76719:9;;:13;;;;;;;;;;;;;;;;;;76750:10;76743:4;:17;;;;76658:110::o:0;76501:109::-;30399:12;:10;:12::i;:::-;30388:23;;:7;:5;:7::i;:::-;:23;;;30380:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76573:1:::1;76561:9;;:13;;;;;;;;;;;;;;;;;;76592:10;76585:4;:17;;;;76501:109::o:0;72154:30::-;;;;:::o;72216:32::-;;;;:::o;54301:164::-;54398:4;54422:18;:25;54441:5;54422:25;;;;;;;;;;;;;;;:35;54448:8;54422:35;;;;;;;;;;;;;;;;;;;;;;;;;54415:42;;54301:164;;;;:::o;31077:201::-;30399:12;:10;:12::i;:::-;30388:23;;:7;:5;:7::i;:::-;:23;;;30380:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31186:1:::1;31166:22;;:8;:22;;;;31158:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31242:28;31261:8;31242:18;:28::i;:::-;31077:201:::0;:::o;72391:42::-;;;;:::o;72299:41::-;;;;:::o;51278:305::-;51380:4;51432:25;51417:40;;;:11;:40;;;;:105;;;;51489:33;51474:48;;;:11;:48;;;;51417:105;:158;;;;51539:36;51563:11;51539:23;:36::i;:::-;51417:158;51397:178;;51278:305;;;:::o;57036:127::-;57101:4;57153:1;57125:30;;:7;:16;57133:7;57125:16;;;;;;;;;;;;;;;;;;;;;:30;;;;57118:37;;57036:127;;;:::o;15951:98::-;16004:7;16031:10;16024:17;;15951:98;:::o;61182:174::-;61284:2;61257:15;:24;61273:7;61257:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;61340:7;61336:2;61302:46;;61311:23;61326:7;61311:14;:23::i;:::-;61302:46;;;;;;;;;;;;61182:174;;:::o;57330:348::-;57423:4;57448:16;57456:7;57448;:16::i;:::-;57440:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;57524:13;57540:23;57555:7;57540:14;:23::i;:::-;57524:39;;57593:5;57582:16;;:7;:16;;;:51;;;;57626:7;57602:31;;:20;57614:7;57602:11;:20::i;:::-;:31;;;57582:51;:87;;;;57637:32;57654:5;57661:7;57637:16;:32::i;:::-;57582:87;57574:96;;;57330:348;;;;:::o;60439:625::-;60598:4;60571:31;;:23;60586:7;60571:14;:23::i;:::-;:31;;;60563:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;60677:1;60663:16;;:2;:16;;;;60655:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;60733:39;60754:4;60760:2;60764:7;60733:20;:39::i;:::-;60837:29;60854:1;60858:7;60837:8;:29::i;:::-;60898:1;60879:9;:15;60889:4;60879:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;60927:1;60910:9;:13;60920:2;60910:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;60958:2;60939:7;:16;60947:7;60939:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;60997:7;60993:2;60978:27;;60987:4;60978:27;;;;;;;;;;;;61018:38;61038:4;61044:2;61048:7;61018:19;:38::i;:::-;60439:625;;;:::o;77965:490::-;78022:13;78048:14;78075:2;78065:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78048:30;;78094:6;78089:305;78110:2;78106:1;:6;78089:305;;;78134:8;78190:1;78185:2;:6;;;;:::i;:::-;78182:1;:10;;;;:::i;:::-;78178:1;:15;;;;:::i;:::-;78171:1;78158:16;;:36;;;;:::i;:::-;78145:51;;78134:62;;78211:9;78241:2;78236:1;78230:8;;:13;;;;:::i;:::-;78223:21;;78211:33;;78259:9;78300:2;78294:9;;78289:2;:14;;;;:::i;:::-;78284:1;78278:8;;:25;;;;:::i;:::-;78271:33;;78259:45;;78328:8;78333:2;78328:4;:8::i;:::-;78319:1;78323;78321;:3;;;;:::i;:::-;78319:6;;;;;;;;:::i;:::-;;;;;:17;;;;;;;;;;;78362:8;78367:2;78362:4;:8::i;:::-;78351:1;78357;78355;78353;:3;;;;:::i;:::-;:5;;;;:::i;:::-;78351:8;;;;;;;;:::i;:::-;;;;;:19;;;;;;;;;;;78119:275;;;78114:3;;;;;:::i;:::-;;;;78089:305;;;;78431:11;;;;;;;;;;;;;;;;;78444:1;78418:28;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78404:43;;;77965:490;;;:::o;74942:656::-;74986:7;75059:9;75071:12;;75059:24;;75054:422;75090:9;;75085:1;:14;75054:422;;75164:12;;:14;;;;;;;;;:::i;:::-;;;;;;75317;:28;75332:12;;75317:28;;;;;;;;;;;;;;;;;;;;;75312:153;;75437:12;;75430:19;;;;;75312:153;75101:3;;;;;:::i;:::-;;;;75054:422;;;;75534:5;75526:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;75589:1;75582:8;;74942:656;;:::o;58020:110::-;58096:26;58106:2;58110:7;58096:26;;;;;;;;;;;;:9;:26::i;:::-;58020:110;;:::o;73557:462::-;73617:7;73637:20;:55;;;;;;;;;;;;;;;;;;;73703:26;73732:35;73755:3;73749:17;73732:16;:35::i;:::-;73703:64;;73780:36;73852:6;73880:12;73914:3;73819:110;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73780:149;;73942:11;73966:23;73956:34;;;;;;73942:48;;74008:3;74001:10;;;;;;73557:462;;;:::o;10155:231::-;10233:7;10254:17;10273:18;10295:27;10306:4;10312:9;10295:10;:27::i;:::-;10253:69;;;;10333:18;10345:5;10333:11;:18::i;:::-;10369:9;10362:16;;;;10155:231;;;;:::o;31438:191::-;31512:16;31531:6;;;;;;;;;;;31512:25;;31557:8;31548:6;;:17;;;;;;;;;;;;;;;;;;31612:8;31581:40;;31602:8;31581:40;;;;;;;;;;;;31501:128;31438:191;:::o;3979:723::-;4035:13;4265:1;4256:5;:10;4252:53;;;4283:10;;;;;;;;;;;;;;;;;;;;;4252:53;4315:12;4330:5;4315:20;;4346:14;4371:78;4386:1;4378:4;:9;4371:78;;4404:8;;;;;:::i;:::-;;;;4435:2;4427:10;;;;;:::i;:::-;;;4371:78;;;4459:19;4491:6;4481:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4459:39;;4509:154;4525:1;4516:5;:10;4509:154;;4553:1;4543:11;;;;;:::i;:::-;;;4620:2;4612:5;:10;;;;:::i;:::-;4599:2;:24;;;;:::i;:::-;4586:39;;4569:6;4576;4569:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;4649:2;4640:11;;;;;:::i;:::-;;;4509:154;;;4687:6;4673:21;;;;;3979:723;;;;:::o;61498:315::-;61653:8;61644:17;;:5;:17;;;;61636:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;61740:8;61702:18;:25;61721:5;61702:25;;;;;;;;;;;;;;;:35;61728:8;61702:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;61786:8;61764:41;;61779:5;61764:41;;;61796:8;61764:41;;;;;;:::i;:::-;;;;;;;;61498:315;;;:::o;56408:::-;56565:28;56575:4;56581:2;56585:7;56565:9;:28::i;:::-;56612:48;56635:4;56641:2;56645:7;56654:5;56612:22;:48::i;:::-;56604:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;56408:315;;;;:::o;42952:157::-;43037:4;43076:25;43061:40;;;:11;:40;;;;43054:47;;42952:157;;;:::o;67079:589::-;67223:45;67250:4;67256:2;67260:7;67223:26;:45::i;:::-;67301:1;67285:18;;:4;:18;;;67281:187;;;67320:40;67352:7;67320:31;:40::i;:::-;67281:187;;;67390:2;67382:10;;:4;:10;;;67378:90;;67409:47;67442:4;67448:7;67409:32;:47::i;:::-;67378:90;67281:187;67496:1;67482:16;;:2;:16;;;67478:183;;;67515:45;67552:7;67515:36;:45::i;:::-;67478:183;;;67588:4;67582:10;;:2;:10;;;67578:83;;67609:40;67637:2;67641:7;67609:27;:40::i;:::-;67578:83;67478:183;67079:589;;;:::o;64260:125::-;;;;:::o;78463:171::-;78510:8;78546:2;78541:1;78535:8;;:13;;;78531:95;;;78575:4;78570:1;78564:8;;:15;;;;:::i;:::-;78557:23;;78550:30;;;;78531:95;78621:4;78616:1;78610:8;;:15;;;;:::i;:::-;78603:23;;78596:30;;78463:171;;;;:::o;58357:321::-;58487:18;58493:2;58497:7;58487:5;:18::i;:::-;58538:54;58569:1;58573:2;58577:7;58586:5;58538:22;:54::i;:::-;58516:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;58357:321;;;:::o;8045:1308::-;8126:7;8135:12;8380:2;8360:9;:16;:22;8356:990;;;8399:9;8423;8447:7;8656:4;8645:9;8641:20;8635:27;8630:32;;8706:4;8695:9;8691:20;8685:27;8680:32;;8764:4;8753:9;8749:20;8743:27;8740:1;8735:36;8730:41;;8807:25;8818:4;8824:1;8827;8830;8807:10;:25::i;:::-;8800:32;;;;;;;;;8356:990;8874:2;8854:9;:16;:22;8850:496;;;8893:9;8917:10;9129:4;9118:9;9114:20;9108:27;9103:32;;9180:4;9169:9;9165:20;9159:27;9153:33;;9222:23;9233:4;9239:1;9242:2;9222:10;:23::i;:::-;9215:30;;;;;;;;8850:496;9294:1;9298:35;9278:56;;;;8045:1308;;;;;;:::o;6316:643::-;6394:20;6385:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;6381:571;;;6431:7;;6381:571;6492:29;6483:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;6479:473;;;6538:34;;;;;;;;;;:::i;:::-;;;;;;;;6479:473;6603:35;6594:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;6590:362;;;6655:41;;;;;;;;;;:::i;:::-;;;;;;;;6590:362;6727:30;6718:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;6714:238;;;6774:44;;;;;;;;;;:::i;:::-;;;;;;;;6714:238;6849:30;6840:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;6836:116;;;6896:44;;;;;;;;;;:::i;:::-;;;;;;;;6836:116;6316:643;;:::o;62378:799::-;62533:4;62554:15;:2;:13;;;:15::i;:::-;62550:620;;;62606:2;62590:36;;;62627:12;:10;:12::i;:::-;62641:4;62647:7;62656:5;62590:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;62586:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62849:1;62832:6;:13;:18;62828:272;;;62875:60;;;;;;;;;;:::i;:::-;;;;;;;;62828:272;63050:6;63044:13;63035:6;63031:2;63027:15;63020:38;62586:529;62723:41;;;62713:51;;;:6;:51;;;;62706:58;;;;;62550:620;63154:4;63147:11;;62378:799;;;;;;;:::o;63749:126::-;;;;:::o;68391:164::-;68495:10;:17;;;;68468:15;:24;68484:7;68468:24;;;;;;;;;;;:44;;;;68523:10;68539:7;68523:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68391:164;:::o;69182:988::-;69448:22;69498:1;69473:22;69490:4;69473:16;:22::i;:::-;:26;;;;:::i;:::-;69448:51;;69510:18;69531:17;:26;69549:7;69531:26;;;;;;;;;;;;69510:47;;69678:14;69664:10;:28;69660:328;;69709:19;69731:12;:18;69744:4;69731:18;;;;;;;;;;;;;;;:34;69750:14;69731:34;;;;;;;;;;;;69709:56;;69815:11;69782:12;:18;69795:4;69782:18;;;;;;;;;;;;;;;:30;69801:10;69782:30;;;;;;;;;;;:44;;;;69932:10;69899:17;:30;69917:11;69899:30;;;;;;;;;;;:43;;;;69694:294;69660:328;70084:17;:26;70102:7;70084:26;;;;;;;;;;;70077:33;;;70128:12;:18;70141:4;70128:18;;;;;;;;;;;;;;;:34;70147:14;70128:34;;;;;;;;;;;70121:41;;;69263:907;;69182:988;;:::o;70465:1079::-;70718:22;70763:1;70743:10;:17;;;;:21;;;;:::i;:::-;70718:46;;70775:18;70796:15;:24;70812:7;70796:24;;;;;;;;;;;;70775:45;;71147:19;71169:10;71180:14;71169:26;;;;;;;;:::i;:::-;;;;;;;;;;71147:48;;71233:11;71208:10;71219;71208:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;71344:10;71313:15;:28;71329:11;71313:28;;;;;;;;;;;:41;;;;71485:15;:24;71501:7;71485:24;;;;;;;;;;;71478:31;;;71520:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;70536:1008;;;70465:1079;:::o;67969:221::-;68054:14;68071:20;68088:2;68071:16;:20::i;:::-;68054:37;;68129:7;68102:12;:16;68115:2;68102:16;;;;;;;;;;;;;;;:24;68119:6;68102:24;;;;;;;;;;;:34;;;;68176:6;68147:17;:26;68165:7;68147:26;;;;;;;;;;;:35;;;;68043:147;67969:221;;:::o;59014:439::-;59108:1;59094:16;;:2;:16;;;;59086:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;59167:16;59175:7;59167;:16::i;:::-;59166:17;59158:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;59229:45;59258:1;59262:2;59266:7;59229:20;:45::i;:::-;59304:1;59287:9;:13;59297:2;59287:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;59335:2;59316:7;:16;59324:7;59316:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;59380:7;59376:2;59355:33;;59372:1;59355:33;;;;;;;;;;;;59401:44;59429:1;59433:2;59437:7;59401:19;:44::i;:::-;59014:439;;:::o;11607:1632::-;11738:7;11747:12;12672:66;12667:1;12659:10;;:79;12655:163;;;12771:1;12775:30;12755:51;;;;;;12655:163;12837:2;12832:1;:7;;;;:18;;;;;12848:2;12843:1;:7;;;;12832:18;12828:102;;;12883:1;12887:30;12867:51;;;;;;12828:102;13027:14;13044:24;13054:4;13060:1;13063;13066;13044:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13027:41;;13101:1;13083:20;;:6;:20;;;13079:103;;;13136:1;13140:29;13120:50;;;;;;;13079:103;13202:6;13210:20;13194:37;;;;;11607:1632;;;;;;;;:::o;10649:344::-;10763:7;10772:12;10797:9;10822:66;10814:75;;10809:2;:80;10797:92;;10900:7;10939:2;10932:3;10925:2;10917:11;;:18;;10916:25;;;;:::i;:::-;10900:42;;10960:25;10971:4;10977:1;10980;10983;10960:10;:25::i;:::-;10953:32;;;;;;10649:344;;;;;;:::o;32869:326::-;32929:4;33186:1;33164:7;:19;;;:23;33157:30;;32869:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:135::-;2321:5;2359:6;2346:20;2337:29;;2375:31;2400:5;2375:31;:::i;:::-;2277:135;;;;:::o;2418:329::-;2477:6;2526:2;2514:9;2505:7;2501:23;2497:32;2494:119;;;2532:79;;:::i;:::-;2494:119;2652:1;2677:53;2722:7;2713:6;2702:9;2698:22;2677:53;:::i;:::-;2667:63;;2623:117;2418:329;;;;:::o;2753:474::-;2821:6;2829;2878:2;2866:9;2857:7;2853:23;2849:32;2846:119;;;2884:79;;:::i;:::-;2846:119;3004:1;3029:53;3074:7;3065:6;3054:9;3050:22;3029:53;:::i;:::-;3019:63;;2975:117;3131:2;3157:53;3202:7;3193:6;3182:9;3178:22;3157:53;:::i;:::-;3147:63;;3102:118;2753:474;;;;;:::o;3233:619::-;3310:6;3318;3326;3375:2;3363:9;3354:7;3350:23;3346:32;3343:119;;;3381:79;;:::i;:::-;3343:119;3501:1;3526:53;3571:7;3562:6;3551:9;3547:22;3526:53;:::i;:::-;3516:63;;3472:117;3628:2;3654:53;3699:7;3690:6;3679:9;3675:22;3654:53;:::i;:::-;3644:63;;3599:118;3756:2;3782:53;3827:7;3818:6;3807:9;3803:22;3782:53;:::i;:::-;3772:63;;3727:118;3233:619;;;;;:::o;3858:943::-;3953:6;3961;3969;3977;4026:3;4014:9;4005:7;4001:23;3997:33;3994:120;;;4033:79;;:::i;:::-;3994:120;4153:1;4178:53;4223:7;4214:6;4203:9;4199:22;4178:53;:::i;:::-;4168:63;;4124:117;4280:2;4306:53;4351:7;4342:6;4331:9;4327:22;4306:53;:::i;:::-;4296:63;;4251:118;4408:2;4434:53;4479:7;4470:6;4459:9;4455:22;4434:53;:::i;:::-;4424:63;;4379:118;4564:2;4553:9;4549:18;4536:32;4595:18;4587:6;4584:30;4581:117;;;4617:79;;:::i;:::-;4581:117;4722:62;4776:7;4767:6;4756:9;4752:22;4722:62;:::i;:::-;4712:72;;4507:287;3858:943;;;;;;;:::o;4807:468::-;4872:6;4880;4929:2;4917:9;4908:7;4904:23;4900:32;4897:119;;;4935:79;;:::i;:::-;4897:119;5055:1;5080:53;5125:7;5116:6;5105:9;5101:22;5080:53;:::i;:::-;5070:63;;5026:117;5182:2;5208:50;5250:7;5241:6;5230:9;5226:22;5208:50;:::i;:::-;5198:60;;5153:115;4807:468;;;;;:::o;5281:474::-;5349:6;5357;5406:2;5394:9;5385:7;5381:23;5377:32;5374:119;;;5412:79;;:::i;:::-;5374:119;5532:1;5557:53;5602:7;5593:6;5582:9;5578:22;5557:53;:::i;:::-;5547:63;;5503:117;5659:2;5685:53;5730:7;5721:6;5710:9;5706:22;5685:53;:::i;:::-;5675:63;;5630:118;5281:474;;;;;:::o;5761:327::-;5819:6;5868:2;5856:9;5847:7;5843:23;5839:32;5836:119;;;5874:79;;:::i;:::-;5836:119;5994:1;6019:52;6063:7;6054:6;6043:9;6039:22;6019:52;:::i;:::-;6009:62;;5965:116;5761:327;;;;:::o;6094:349::-;6163:6;6212:2;6200:9;6191:7;6187:23;6183:32;6180:119;;;6218:79;;:::i;:::-;6180:119;6338:1;6363:63;6418:7;6409:6;6398:9;6394:22;6363:63;:::i;:::-;6353:73;;6309:127;6094:349;;;;:::o;6449:648::-;6524:6;6532;6581:2;6569:9;6560:7;6556:23;6552:32;6549:119;;;6587:79;;:::i;:::-;6549:119;6735:1;6724:9;6720:17;6707:31;6765:18;6757:6;6754:30;6751:117;;;6787:79;;:::i;:::-;6751:117;6892:62;6946:7;6937:6;6926:9;6922:22;6892:62;:::i;:::-;6882:72;;6678:286;7003:2;7029:51;7072:7;7063:6;7052:9;7048:22;7029:51;:::i;:::-;7019:61;;6974:116;6449:648;;;;;:::o;7103:509::-;7172:6;7221:2;7209:9;7200:7;7196:23;7192:32;7189:119;;;7227:79;;:::i;:::-;7189:119;7375:1;7364:9;7360:17;7347:31;7405:18;7397:6;7394:30;7391:117;;;7427:79;;:::i;:::-;7391:117;7532:63;7587:7;7578:6;7567:9;7563:22;7532:63;:::i;:::-;7522:73;;7318:287;7103:509;;;;:::o;7618:832::-;7705:6;7713;7762:2;7750:9;7741:7;7737:23;7733:32;7730:119;;;7768:79;;:::i;:::-;7730:119;7916:1;7905:9;7901:17;7888:31;7946:18;7938:6;7935:30;7932:117;;;7968:79;;:::i;:::-;7932:117;8073:63;8128:7;8119:6;8108:9;8104:22;8073:63;:::i;:::-;8063:73;;7859:287;8213:2;8202:9;8198:18;8185:32;8244:18;8236:6;8233:30;8230:117;;;8266:79;;:::i;:::-;8230:117;8371:62;8425:7;8416:6;8405:9;8401:22;8371:62;:::i;:::-;8361:72;;8156:287;7618:832;;;;;:::o;8456:329::-;8515:6;8564:2;8552:9;8543:7;8539:23;8535:32;8532:119;;;8570:79;;:::i;:::-;8532:119;8690:1;8715:53;8760:7;8751:6;8740:9;8736:22;8715:53;:::i;:::-;8705:63;;8661:117;8456:329;;;;:::o;8791:652::-;8868:6;8876;8925:2;8913:9;8904:7;8900:23;8896:32;8893:119;;;8931:79;;:::i;:::-;8893:119;9051:1;9076:53;9121:7;9112:6;9101:9;9097:22;9076:53;:::i;:::-;9066:63;;9022:117;9206:2;9195:9;9191:18;9178:32;9237:18;9229:6;9226:30;9223:117;;;9259:79;;:::i;:::-;9223:117;9364:62;9418:7;9409:6;9398:9;9394:22;9364:62;:::i;:::-;9354:72;;9149:287;8791:652;;;;;:::o;9449:325::-;9506:6;9555:2;9543:9;9534:7;9530:23;9526:32;9523:119;;;9561:79;;:::i;:::-;9523:119;9681:1;9706:51;9749:7;9740:6;9729:9;9725:22;9706:51;:::i;:::-;9696:61;;9652:115;9449:325;;;;:::o;9780:118::-;9867:24;9885:5;9867:24;:::i;:::-;9862:3;9855:37;9780:118;;:::o;9904:109::-;9985:21;10000:5;9985:21;:::i;:::-;9980:3;9973:34;9904:109;;:::o;10019:118::-;10106:24;10124:5;10106:24;:::i;:::-;10101:3;10094:37;10019:118;;:::o;10143:360::-;10229:3;10257:38;10289:5;10257:38;:::i;:::-;10311:70;10374:6;10369:3;10311:70;:::i;:::-;10304:77;;10390:52;10435:6;10430:3;10423:4;10416:5;10412:16;10390:52;:::i;:::-;10467:29;10489:6;10467:29;:::i;:::-;10462:3;10458:39;10451:46;;10233:270;10143:360;;;;:::o;10509:373::-;10613:3;10641:38;10673:5;10641:38;:::i;:::-;10695:88;10776:6;10771:3;10695:88;:::i;:::-;10688:95;;10792:52;10837:6;10832:3;10825:4;10818:5;10814:16;10792:52;:::i;:::-;10869:6;10864:3;10860:16;10853:23;;10617:265;10509:373;;;;:::o;10888:364::-;10976:3;11004:39;11037:5;11004:39;:::i;:::-;11059:71;11123:6;11118:3;11059:71;:::i;:::-;11052:78;;11139:52;11184:6;11179:3;11172:4;11165:5;11161:16;11139:52;:::i;:::-;11216:29;11238:6;11216:29;:::i;:::-;11211:3;11207:39;11200:46;;10980:272;10888:364;;;;:::o;11258:377::-;11364:3;11392:39;11425:5;11392:39;:::i;:::-;11447:89;11529:6;11524:3;11447:89;:::i;:::-;11440:96;;11545:52;11590:6;11585:3;11578:4;11571:5;11567:16;11545:52;:::i;:::-;11622:6;11617:3;11613:16;11606:23;;11368:267;11258:377;;;;:::o;11665:853::-;11772:3;11809:5;11803:12;11838:36;11864:9;11838:36;:::i;:::-;11890:89;11972:6;11967:3;11890:89;:::i;:::-;11883:96;;12010:1;11999:9;11995:17;12026:1;12021:137;;;;12172:1;12167:345;;;;11988:524;;12021:137;12105:4;12101:9;12090;12086:25;12081:3;12074:38;12141:6;12136:3;12132:16;12125:23;;12021:137;;12167:345;12234:42;12270:5;12234:42;:::i;:::-;12298:1;12312:154;12326:6;12323:1;12320:13;12312:154;;;12400:7;12394:14;12390:1;12385:3;12381:11;12374:35;12450:1;12441:7;12437:15;12426:26;;12348:4;12345:1;12341:12;12336:17;;12312:154;;;12495:6;12490:3;12486:16;12479:23;;12174:338;;11988:524;;11776:742;;11665:853;;;;:::o;12548:845::-;12651:3;12688:5;12682:12;12717:36;12743:9;12717:36;:::i;:::-;12769:89;12851:6;12846:3;12769:89;:::i;:::-;12762:96;;12889:1;12878:9;12874:17;12905:1;12900:137;;;;13051:1;13046:341;;;;12867:520;;12900:137;12984:4;12980:9;12969;12965:25;12960:3;12953:38;13020:6;13015:3;13011:16;13004:23;;12900:137;;13046:341;13113:38;13145:5;13113:38;:::i;:::-;13173:1;13187:154;13201:6;13198:1;13195:13;13187:154;;;13275:7;13269:14;13265:1;13260:3;13256:11;13249:35;13325:1;13316:7;13312:15;13301:26;;13223:4;13220:1;13216:12;13211:17;;13187:154;;;13370:6;13365:3;13361:16;13354:23;;13053:334;;12867:520;;12655:738;;12548:845;;;;:::o;13399:366::-;13541:3;13562:67;13626:2;13621:3;13562:67;:::i;:::-;13555:74;;13638:93;13727:3;13638:93;:::i;:::-;13756:2;13751:3;13747:12;13740:19;;13399:366;;;:::o;13771:::-;13913:3;13934:67;13998:2;13993:3;13934:67;:::i;:::-;13927:74;;14010:93;14099:3;14010:93;:::i;:::-;14128:2;14123:3;14119:12;14112:19;;13771:366;;;:::o;14143:::-;14285:3;14306:67;14370:2;14365:3;14306:67;:::i;:::-;14299:74;;14382:93;14471:3;14382:93;:::i;:::-;14500:2;14495:3;14491:12;14484:19;;14143:366;;;:::o;14515:::-;14657:3;14678:67;14742:2;14737:3;14678:67;:::i;:::-;14671:74;;14754:93;14843:3;14754:93;:::i;:::-;14872:2;14867:3;14863:12;14856:19;;14515:366;;;:::o;14887:::-;15029:3;15050:67;15114:2;15109:3;15050:67;:::i;:::-;15043:74;;15126:93;15215:3;15126:93;:::i;:::-;15244:2;15239:3;15235:12;15228:19;;14887:366;;;:::o;15259:::-;15401:3;15422:67;15486:2;15481:3;15422:67;:::i;:::-;15415:74;;15498:93;15587:3;15498:93;:::i;:::-;15616:2;15611:3;15607:12;15600:19;;15259:366;;;:::o;15631:::-;15773:3;15794:67;15858:2;15853:3;15794:67;:::i;:::-;15787:74;;15870:93;15959:3;15870:93;:::i;:::-;15988:2;15983:3;15979:12;15972:19;;15631:366;;;:::o;16003:::-;16145:3;16166:67;16230:2;16225:3;16166:67;:::i;:::-;16159:74;;16242:93;16331:3;16242:93;:::i;:::-;16360:2;16355:3;16351:12;16344:19;;16003:366;;;:::o;16375:::-;16517:3;16538:67;16602:2;16597:3;16538:67;:::i;:::-;16531:74;;16614:93;16703:3;16614:93;:::i;:::-;16732:2;16727:3;16723:12;16716:19;;16375:366;;;:::o;16747:::-;16889:3;16910:67;16974:2;16969:3;16910:67;:::i;:::-;16903:74;;16986:93;17075:3;16986:93;:::i;:::-;17104:2;17099:3;17095:12;17088:19;;16747:366;;;:::o;17119:::-;17261:3;17282:67;17346:2;17341:3;17282:67;:::i;:::-;17275:74;;17358:93;17447:3;17358:93;:::i;:::-;17476:2;17471:3;17467:12;17460:19;;17119:366;;;:::o;17491:::-;17633:3;17654:67;17718:2;17713:3;17654:67;:::i;:::-;17647:74;;17730:93;17819:3;17730:93;:::i;:::-;17848:2;17843:3;17839:12;17832:19;;17491:366;;;:::o;17863:::-;18005:3;18026:67;18090:2;18085:3;18026:67;:::i;:::-;18019:74;;18102:93;18191:3;18102:93;:::i;:::-;18220:2;18215:3;18211:12;18204:19;;17863:366;;;:::o;18235:::-;18377:3;18398:67;18462:2;18457:3;18398:67;:::i;:::-;18391:74;;18474:93;18563:3;18474:93;:::i;:::-;18592:2;18587:3;18583:12;18576:19;;18235:366;;;:::o;18607:::-;18749:3;18770:67;18834:2;18829:3;18770:67;:::i;:::-;18763:74;;18846:93;18935:3;18846:93;:::i;:::-;18964:2;18959:3;18955:12;18948:19;;18607:366;;;:::o;18979:::-;19121:3;19142:67;19206:2;19201:3;19142:67;:::i;:::-;19135:74;;19218:93;19307:3;19218:93;:::i;:::-;19336:2;19331:3;19327:12;19320:19;;18979:366;;;:::o;19351:::-;19493:3;19514:67;19578:2;19573:3;19514:67;:::i;:::-;19507:74;;19590:93;19679:3;19590:93;:::i;:::-;19708:2;19703:3;19699:12;19692:19;;19351:366;;;:::o;19723:::-;19865:3;19886:67;19950:2;19945:3;19886:67;:::i;:::-;19879:74;;19962:93;20051:3;19962:93;:::i;:::-;20080:2;20075:3;20071:12;20064:19;;19723:366;;;:::o;20095:::-;20237:3;20258:67;20322:2;20317:3;20258:67;:::i;:::-;20251:74;;20334:93;20423:3;20334:93;:::i;:::-;20452:2;20447:3;20443:12;20436:19;;20095:366;;;:::o;20467:::-;20609:3;20630:67;20694:2;20689:3;20630:67;:::i;:::-;20623:74;;20706:93;20795:3;20706:93;:::i;:::-;20824:2;20819:3;20815:12;20808:19;;20467:366;;;:::o;20839:::-;20981:3;21002:67;21066:2;21061:3;21002:67;:::i;:::-;20995:74;;21078:93;21167:3;21078:93;:::i;:::-;21196:2;21191:3;21187:12;21180:19;;20839:366;;;:::o;21211:::-;21353:3;21374:67;21438:2;21433:3;21374:67;:::i;:::-;21367:74;;21450:93;21539:3;21450:93;:::i;:::-;21568:2;21563:3;21559:12;21552:19;;21211:366;;;:::o;21583:::-;21725:3;21746:67;21810:2;21805:3;21746:67;:::i;:::-;21739:74;;21822:93;21911:3;21822:93;:::i;:::-;21940:2;21935:3;21931:12;21924:19;;21583:366;;;:::o;21955:::-;22097:3;22118:67;22182:2;22177:3;22118:67;:::i;:::-;22111:74;;22194:93;22283:3;22194:93;:::i;:::-;22312:2;22307:3;22303:12;22296:19;;21955:366;;;:::o;22327:::-;22469:3;22490:67;22554:2;22549:3;22490:67;:::i;:::-;22483:74;;22566:93;22655:3;22566:93;:::i;:::-;22684:2;22679:3;22675:12;22668:19;;22327:366;;;:::o;22699:::-;22841:3;22862:67;22926:2;22921:3;22862:67;:::i;:::-;22855:74;;22938:93;23027:3;22938:93;:::i;:::-;23056:2;23051:3;23047:12;23040:19;;22699:366;;;:::o;23071:::-;23213:3;23234:67;23298:2;23293:3;23234:67;:::i;:::-;23227:74;;23310:93;23399:3;23310:93;:::i;:::-;23428:2;23423:3;23419:12;23412:19;;23071:366;;;:::o;23443:::-;23585:3;23606:67;23670:2;23665:3;23606:67;:::i;:::-;23599:74;;23682:93;23771:3;23682:93;:::i;:::-;23800:2;23795:3;23791:12;23784:19;;23443:366;;;:::o;23815:::-;23957:3;23978:67;24042:2;24037:3;23978:67;:::i;:::-;23971:74;;24054:93;24143:3;24054:93;:::i;:::-;24172:2;24167:3;24163:12;24156:19;;23815:366;;;:::o;24187:::-;24329:3;24350:67;24414:2;24409:3;24350:67;:::i;:::-;24343:74;;24426:93;24515:3;24426:93;:::i;:::-;24544:2;24539:3;24535:12;24528:19;;24187:366;;;:::o;24559:::-;24701:3;24722:67;24786:2;24781:3;24722:67;:::i;:::-;24715:74;;24798:93;24887:3;24798:93;:::i;:::-;24916:2;24911:3;24907:12;24900:19;;24559:366;;;:::o;24931:::-;25073:3;25094:67;25158:2;25153:3;25094:67;:::i;:::-;25087:74;;25170:93;25259:3;25170:93;:::i;:::-;25288:2;25283:3;25279:12;25272:19;;24931:366;;;:::o;25303:::-;25445:3;25466:67;25530:2;25525:3;25466:67;:::i;:::-;25459:74;;25542:93;25631:3;25542:93;:::i;:::-;25660:2;25655:3;25651:12;25644:19;;25303:366;;;:::o;25675:::-;25817:3;25838:67;25902:2;25897:3;25838:67;:::i;:::-;25831:74;;25914:93;26003:3;25914:93;:::i;:::-;26032:2;26027:3;26023:12;26016:19;;25675:366;;;:::o;26047:400::-;26207:3;26228:84;26310:1;26305:3;26228:84;:::i;:::-;26221:91;;26321:93;26410:3;26321:93;:::i;:::-;26439:1;26434:3;26430:11;26423:18;;26047:400;;;:::o;26453:118::-;26540:24;26558:5;26540:24;:::i;:::-;26535:3;26528:37;26453:118;;:::o;26577:112::-;26660:22;26676:5;26660:22;:::i;:::-;26655:3;26648:35;26577:112;;:::o;26695:271::-;26825:3;26847:93;26936:3;26927:6;26847:93;:::i;:::-;26840:100;;26957:3;26950:10;;26695:271;;;;:::o;26972:427::-;27148:3;27170:93;27259:3;27250:6;27170:93;:::i;:::-;27163:100;;27280:93;27369:3;27360:6;27280:93;:::i;:::-;27273:100;;27390:3;27383:10;;26972:427;;;;;:::o;27405:583::-;27627:3;27649:93;27738:3;27729:6;27649:93;:::i;:::-;27642:100;;27759:93;27848:3;27839:6;27759:93;:::i;:::-;27752:100;;27869:93;27958:3;27949:6;27869:93;:::i;:::-;27862:100;;27979:3;27972:10;;27405:583;;;;;;:::o;27994:857::-;28321:3;28343:96;28435:3;28426:6;28343:96;:::i;:::-;28336:103;;28456:148;28600:3;28456:148;:::i;:::-;28449:155;;28621:95;28712:3;28703:6;28621:95;:::i;:::-;28614:102;;28733:92;28821:3;28812:6;28733:92;:::i;:::-;28726:99;;28842:3;28835:10;;27994:857;;;;;;:::o;28857:222::-;28950:4;28988:2;28977:9;28973:18;28965:26;;29001:71;29069:1;29058:9;29054:17;29045:6;29001:71;:::i;:::-;28857:222;;;;:::o;29085:640::-;29280:4;29318:3;29307:9;29303:19;29295:27;;29332:71;29400:1;29389:9;29385:17;29376:6;29332:71;:::i;:::-;29413:72;29481:2;29470:9;29466:18;29457:6;29413:72;:::i;:::-;29495;29563:2;29552:9;29548:18;29539:6;29495:72;:::i;:::-;29614:9;29608:4;29604:20;29599:2;29588:9;29584:18;29577:48;29642:76;29713:4;29704:6;29642:76;:::i;:::-;29634:84;;29085:640;;;;;;;:::o;29731:210::-;29818:4;29856:2;29845:9;29841:18;29833:26;;29869:65;29931:1;29920:9;29916:17;29907:6;29869:65;:::i;:::-;29731:210;;;;:::o;29947:545::-;30120:4;30158:3;30147:9;30143:19;30135:27;;30172:71;30240:1;30229:9;30225:17;30216:6;30172:71;:::i;:::-;30253:68;30317:2;30306:9;30302:18;30293:6;30253:68;:::i;:::-;30331:72;30399:2;30388:9;30384:18;30375:6;30331:72;:::i;:::-;30413;30481:2;30470:9;30466:18;30457:6;30413:72;:::i;:::-;29947:545;;;;;;;:::o;30498:313::-;30611:4;30649:2;30638:9;30634:18;30626:26;;30698:9;30692:4;30688:20;30684:1;30673:9;30669:17;30662:47;30726:78;30799:4;30790:6;30726:78;:::i;:::-;30718:86;;30498:313;;;;:::o;30817:419::-;30983:4;31021:2;31010:9;31006:18;30998:26;;31070:9;31064:4;31060:20;31056:1;31045:9;31041:17;31034:47;31098:131;31224:4;31098:131;:::i;:::-;31090:139;;30817:419;;;:::o;31242:::-;31408:4;31446:2;31435:9;31431:18;31423:26;;31495:9;31489:4;31485:20;31481:1;31470:9;31466:17;31459:47;31523:131;31649:4;31523:131;:::i;:::-;31515:139;;31242:419;;;:::o;31667:::-;31833:4;31871:2;31860:9;31856:18;31848:26;;31920:9;31914:4;31910:20;31906:1;31895:9;31891:17;31884:47;31948:131;32074:4;31948:131;:::i;:::-;31940:139;;31667:419;;;:::o;32092:::-;32258:4;32296:2;32285:9;32281:18;32273:26;;32345:9;32339:4;32335:20;32331:1;32320:9;32316:17;32309:47;32373:131;32499:4;32373:131;:::i;:::-;32365:139;;32092:419;;;:::o;32517:::-;32683:4;32721:2;32710:9;32706:18;32698:26;;32770:9;32764:4;32760:20;32756:1;32745:9;32741:17;32734:47;32798:131;32924:4;32798:131;:::i;:::-;32790:139;;32517:419;;;:::o;32942:::-;33108:4;33146:2;33135:9;33131:18;33123:26;;33195:9;33189:4;33185:20;33181:1;33170:9;33166:17;33159:47;33223:131;33349:4;33223:131;:::i;:::-;33215:139;;32942:419;;;:::o;33367:::-;33533:4;33571:2;33560:9;33556:18;33548:26;;33620:9;33614:4;33610:20;33606:1;33595:9;33591:17;33584:47;33648:131;33774:4;33648:131;:::i;:::-;33640:139;;33367:419;;;:::o;33792:::-;33958:4;33996:2;33985:9;33981:18;33973:26;;34045:9;34039:4;34035:20;34031:1;34020:9;34016:17;34009:47;34073:131;34199:4;34073:131;:::i;:::-;34065:139;;33792:419;;;:::o;34217:::-;34383:4;34421:2;34410:9;34406:18;34398:26;;34470:9;34464:4;34460:20;34456:1;34445:9;34441:17;34434:47;34498:131;34624:4;34498:131;:::i;:::-;34490:139;;34217:419;;;:::o;34642:::-;34808:4;34846:2;34835:9;34831:18;34823:26;;34895:9;34889:4;34885:20;34881:1;34870:9;34866:17;34859:47;34923:131;35049:4;34923:131;:::i;:::-;34915:139;;34642:419;;;:::o;35067:::-;35233:4;35271:2;35260:9;35256:18;35248:26;;35320:9;35314:4;35310:20;35306:1;35295:9;35291:17;35284:47;35348:131;35474:4;35348:131;:::i;:::-;35340:139;;35067:419;;;:::o;35492:::-;35658:4;35696:2;35685:9;35681:18;35673:26;;35745:9;35739:4;35735:20;35731:1;35720:9;35716:17;35709:47;35773:131;35899:4;35773:131;:::i;:::-;35765:139;;35492:419;;;:::o;35917:::-;36083:4;36121:2;36110:9;36106:18;36098:26;;36170:9;36164:4;36160:20;36156:1;36145:9;36141:17;36134:47;36198:131;36324:4;36198:131;:::i;:::-;36190:139;;35917:419;;;:::o;36342:::-;36508:4;36546:2;36535:9;36531:18;36523:26;;36595:9;36589:4;36585:20;36581:1;36570:9;36566:17;36559:47;36623:131;36749:4;36623:131;:::i;:::-;36615:139;;36342:419;;;:::o;36767:::-;36933:4;36971:2;36960:9;36956:18;36948:26;;37020:9;37014:4;37010:20;37006:1;36995:9;36991:17;36984:47;37048:131;37174:4;37048:131;:::i;:::-;37040:139;;36767:419;;;:::o;37192:::-;37358:4;37396:2;37385:9;37381:18;37373:26;;37445:9;37439:4;37435:20;37431:1;37420:9;37416:17;37409:47;37473:131;37599:4;37473:131;:::i;:::-;37465:139;;37192:419;;;:::o;37617:::-;37783:4;37821:2;37810:9;37806:18;37798:26;;37870:9;37864:4;37860:20;37856:1;37845:9;37841:17;37834:47;37898:131;38024:4;37898:131;:::i;:::-;37890:139;;37617:419;;;:::o;38042:::-;38208:4;38246:2;38235:9;38231:18;38223:26;;38295:9;38289:4;38285:20;38281:1;38270:9;38266:17;38259:47;38323:131;38449:4;38323:131;:::i;:::-;38315:139;;38042:419;;;:::o;38467:::-;38633:4;38671:2;38660:9;38656:18;38648:26;;38720:9;38714:4;38710:20;38706:1;38695:9;38691:17;38684:47;38748:131;38874:4;38748:131;:::i;:::-;38740:139;;38467:419;;;:::o;38892:::-;39058:4;39096:2;39085:9;39081:18;39073:26;;39145:9;39139:4;39135:20;39131:1;39120:9;39116:17;39109:47;39173:131;39299:4;39173:131;:::i;:::-;39165:139;;38892:419;;;:::o;39317:::-;39483:4;39521:2;39510:9;39506:18;39498:26;;39570:9;39564:4;39560:20;39556:1;39545:9;39541:17;39534:47;39598:131;39724:4;39598:131;:::i;:::-;39590:139;;39317:419;;;:::o;39742:::-;39908:4;39946:2;39935:9;39931:18;39923:26;;39995:9;39989:4;39985:20;39981:1;39970:9;39966:17;39959:47;40023:131;40149:4;40023:131;:::i;:::-;40015:139;;39742:419;;;:::o;40167:::-;40333:4;40371:2;40360:9;40356:18;40348:26;;40420:9;40414:4;40410:20;40406:1;40395:9;40391:17;40384:47;40448:131;40574:4;40448:131;:::i;:::-;40440:139;;40167:419;;;:::o;40592:::-;40758:4;40796:2;40785:9;40781:18;40773:26;;40845:9;40839:4;40835:20;40831:1;40820:9;40816:17;40809:47;40873:131;40999:4;40873:131;:::i;:::-;40865:139;;40592:419;;;:::o;41017:::-;41183:4;41221:2;41210:9;41206:18;41198:26;;41270:9;41264:4;41260:20;41256:1;41245:9;41241:17;41234:47;41298:131;41424:4;41298:131;:::i;:::-;41290:139;;41017:419;;;:::o;41442:::-;41608:4;41646:2;41635:9;41631:18;41623:26;;41695:9;41689:4;41685:20;41681:1;41670:9;41666:17;41659:47;41723:131;41849:4;41723:131;:::i;:::-;41715:139;;41442:419;;;:::o;41867:::-;42033:4;42071:2;42060:9;42056:18;42048:26;;42120:9;42114:4;42110:20;42106:1;42095:9;42091:17;42084:47;42148:131;42274:4;42148:131;:::i;:::-;42140:139;;41867:419;;;:::o;42292:::-;42458:4;42496:2;42485:9;42481:18;42473:26;;42545:9;42539:4;42535:20;42531:1;42520:9;42516:17;42509:47;42573:131;42699:4;42573:131;:::i;:::-;42565:139;;42292:419;;;:::o;42717:::-;42883:4;42921:2;42910:9;42906:18;42898:26;;42970:9;42964:4;42960:20;42956:1;42945:9;42941:17;42934:47;42998:131;43124:4;42998:131;:::i;:::-;42990:139;;42717:419;;;:::o;43142:::-;43308:4;43346:2;43335:9;43331:18;43323:26;;43395:9;43389:4;43385:20;43381:1;43370:9;43366:17;43359:47;43423:131;43549:4;43423:131;:::i;:::-;43415:139;;43142:419;;;:::o;43567:::-;43733:4;43771:2;43760:9;43756:18;43748:26;;43820:9;43814:4;43810:20;43806:1;43795:9;43791:17;43784:47;43848:131;43974:4;43848:131;:::i;:::-;43840:139;;43567:419;;;:::o;43992:::-;44158:4;44196:2;44185:9;44181:18;44173:26;;44245:9;44239:4;44235:20;44231:1;44220:9;44216:17;44209:47;44273:131;44399:4;44273:131;:::i;:::-;44265:139;;43992:419;;;:::o;44417:::-;44583:4;44621:2;44610:9;44606:18;44598:26;;44670:9;44664:4;44660:20;44656:1;44645:9;44641:17;44634:47;44698:131;44824:4;44698:131;:::i;:::-;44690:139;;44417:419;;;:::o;44842:::-;45008:4;45046:2;45035:9;45031:18;45023:26;;45095:9;45089:4;45085:20;45081:1;45070:9;45066:17;45059:47;45123:131;45249:4;45123:131;:::i;:::-;45115:139;;44842:419;;;:::o;45267:222::-;45360:4;45398:2;45387:9;45383:18;45375:26;;45411:71;45479:1;45468:9;45464:17;45455:6;45411:71;:::i;:::-;45267:222;;;;:::o;45495:214::-;45584:4;45622:2;45611:9;45607:18;45599:26;;45635:67;45699:1;45688:9;45684:17;45675:6;45635:67;:::i;:::-;45495:214;;;;:::o;45715:129::-;45749:6;45776:20;;:::i;:::-;45766:30;;45805:33;45833:4;45825:6;45805:33;:::i;:::-;45715:129;;;:::o;45850:75::-;45883:6;45916:2;45910:9;45900:19;;45850:75;:::o;45931:307::-;45992:4;46082:18;46074:6;46071:30;46068:56;;;46104:18;;:::i;:::-;46068:56;46142:29;46164:6;46142:29;:::i;:::-;46134:37;;46226:4;46220;46216:15;46208:23;;45931:307;;;:::o;46244:308::-;46306:4;46396:18;46388:6;46385:30;46382:56;;;46418:18;;:::i;:::-;46382:56;46456:29;46478:6;46456:29;:::i;:::-;46448:37;;46540:4;46534;46530:15;46522:23;;46244:308;;;:::o;46558:141::-;46607:4;46630:3;46622:11;;46653:3;46650:1;46643:14;46687:4;46684:1;46674:18;46666:26;;46558:141;;;:::o;46705:145::-;46758:4;46781:3;46773:11;;46804:3;46801:1;46794:14;46838:4;46835:1;46825:18;46817:26;;46705:145;;;:::o;46856:98::-;46907:6;46941:5;46935:12;46925:22;;46856:98;;;:::o;46960:99::-;47012:6;47046:5;47040:12;47030:22;;46960:99;;;:::o;47065:168::-;47148:11;47182:6;47177:3;47170:19;47222:4;47217:3;47213:14;47198:29;;47065:168;;;;:::o;47239:147::-;47340:11;47377:3;47362:18;;47239:147;;;;:::o;47392:169::-;47476:11;47510:6;47505:3;47498:19;47550:4;47545:3;47541:14;47526:29;;47392:169;;;;:::o;47567:148::-;47669:11;47706:3;47691:18;;47567:148;;;;:::o;47721:305::-;47761:3;47780:20;47798:1;47780:20;:::i;:::-;47775:25;;47814:20;47832:1;47814:20;:::i;:::-;47809:25;;47968:1;47900:66;47896:74;47893:1;47890:81;47887:107;;;47974:18;;:::i;:::-;47887:107;48018:1;48015;48011:9;48004:16;;47721:305;;;;:::o;48032:237::-;48070:3;48089:18;48105:1;48089:18;:::i;:::-;48084:23;;48121:18;48137:1;48121:18;:::i;:::-;48116:23;;48211:1;48205:4;48201:12;48198:1;48195:19;48192:45;;;48217:18;;:::i;:::-;48192:45;48261:1;48258;48254:9;48247:16;;48032:237;;;;:::o;48275:185::-;48315:1;48332:20;48350:1;48332:20;:::i;:::-;48327:25;;48366:20;48384:1;48366:20;:::i;:::-;48361:25;;48405:1;48395:35;;48410:18;;:::i;:::-;48395:35;48452:1;48449;48445:9;48440:14;;48275:185;;;;:::o;48466:179::-;48504:1;48521:18;48537:1;48521:18;:::i;:::-;48516:23;;48553:18;48569:1;48553:18;:::i;:::-;48548:23;;48590:1;48580:35;;48595:18;;:::i;:::-;48580:35;48637:1;48634;48630:9;48625:14;;48466:179;;;;:::o;48651:848::-;48712:5;48719:4;48743:6;48734:15;;48767:5;48758:14;;48781:712;48802:1;48792:8;48789:15;48781:712;;;48897:4;48892:3;48888:14;48882:4;48879:24;48876:50;;;48906:18;;:::i;:::-;48876:50;48956:1;48946:8;48942:16;48939:451;;;49371:4;49364:5;49360:16;49351:25;;48939:451;49421:4;49415;49411:15;49403:23;;49451:32;49474:8;49451:32;:::i;:::-;49439:44;;48781:712;;;48651:848;;;;;;;:::o;49505:285::-;49565:5;49589:23;49607:4;49589:23;:::i;:::-;49581:31;;49633:27;49651:8;49633:27;:::i;:::-;49621:39;;49679:104;49716:66;49706:8;49700:4;49679:104;:::i;:::-;49670:113;;49505:285;;;;:::o;49796:1073::-;49850:5;50041:8;50031:40;;50062:1;50053:10;;50064:5;;50031:40;50090:4;50080:36;;50107:1;50098:10;;50109:5;;50080:36;50176:4;50224:1;50219:27;;;;50260:1;50255:191;;;;50169:277;;50219:27;50237:1;50228:10;;50239:5;;;50255:191;50300:3;50290:8;50287:17;50284:43;;;50307:18;;:::i;:::-;50284:43;50356:8;50353:1;50349:16;50340:25;;50391:3;50384:5;50381:14;50378:40;;;50398:18;;:::i;:::-;50378:40;50431:5;;;50169:277;;50555:2;50545:8;50542:16;50536:3;50530:4;50527:13;50523:36;50505:2;50495:8;50492:16;50487:2;50481:4;50478:12;50474:35;50458:111;50455:246;;;50611:8;50605:4;50601:19;50592:28;;50646:3;50639:5;50636:14;50633:40;;;50653:18;;:::i;:::-;50633:40;50686:5;;50455:246;50726:42;50764:3;50754:8;50748:4;50745:1;50726:42;:::i;:::-;50711:57;;;;50800:4;50795:3;50791:14;50784:5;50781:25;50778:51;;;50809:18;;:::i;:::-;50778:51;50858:4;50851:5;50847:16;50838:25;;49796:1073;;;;;;:::o;50875:348::-;50915:7;50938:20;50956:1;50938:20;:::i;:::-;50933:25;;50972:20;50990:1;50972:20;:::i;:::-;50967:25;;51160:1;51092:66;51088:74;51085:1;51082:81;51077:1;51070:9;51063:17;51059:105;51056:131;;;51167:18;;:::i;:::-;51056:131;51215:1;51212;51208:9;51197:20;;50875:348;;;;:::o;51229:280::-;51267:7;51290:18;51306:1;51290:18;:::i;:::-;51285:23;;51322:18;51338:1;51322:18;:::i;:::-;51317:23;;51446:1;51440:4;51436:12;51433:1;51430:19;51425:1;51418:9;51411:17;51407:43;51404:69;;;51453:18;;:::i;:::-;51404:69;51501:1;51498;51494:9;51483:20;;51229:280;;;;:::o;51515:191::-;51555:4;51575:20;51593:1;51575:20;:::i;:::-;51570:25;;51609:20;51627:1;51609:20;:::i;:::-;51604:25;;51648:1;51645;51642:8;51639:34;;;51653:18;;:::i;:::-;51639:34;51698:1;51695;51691:9;51683:17;;51515:191;;;;:::o;51712:185::-;51750:4;51770:18;51786:1;51770:18;:::i;:::-;51765:23;;51802:18;51818:1;51802:18;:::i;:::-;51797:23;;51839:1;51836;51833:8;51830:34;;;51844:18;;:::i;:::-;51830:34;51889:1;51886;51882:9;51874:17;;51712:185;;;;:::o;51903:96::-;51940:7;51969:24;51987:5;51969:24;:::i;:::-;51958:35;;51903:96;;;:::o;52005:90::-;52039:7;52082:5;52075:13;52068:21;52057:32;;52005:90;;;:::o;52101:77::-;52138:7;52167:5;52156:16;;52101:77;;;:::o;52184:149::-;52220:7;52260:66;52253:5;52249:78;52238:89;;52184:149;;;:::o;52339:126::-;52376:7;52416:42;52409:5;52405:54;52394:65;;52339:126;;;:::o;52471:77::-;52508:7;52537:5;52526:16;;52471:77;;;:::o;52554:86::-;52589:7;52629:4;52622:5;52618:16;52607:27;;52554:86;;;:::o;52646:154::-;52730:6;52725:3;52720;52707:30;52792:1;52783:6;52778:3;52774:16;52767:27;52646:154;;;:::o;52806:307::-;52874:1;52884:113;52898:6;52895:1;52892:13;52884:113;;;52983:1;52978:3;52974:11;52968:18;52964:1;52959:3;52955:11;52948:39;52920:2;52917:1;52913:10;52908:15;;52884:113;;;53015:6;53012:1;53009:13;53006:101;;;53095:1;53086:6;53081:3;53077:16;53070:27;53006:101;52855:258;52806:307;;;:::o;53119:320::-;53163:6;53200:1;53194:4;53190:12;53180:22;;53247:1;53241:4;53237:12;53268:18;53258:81;;53324:4;53316:6;53312:17;53302:27;;53258:81;53386:2;53378:6;53375:14;53355:18;53352:38;53349:84;;;53405:18;;:::i;:::-;53349:84;53170:269;53119:320;;;:::o;53445:281::-;53528:27;53550:4;53528:27;:::i;:::-;53520:6;53516:40;53658:6;53646:10;53643:22;53622:18;53610:10;53607:34;53604:62;53601:88;;;53669:18;;:::i;:::-;53601:88;53709:10;53705:2;53698:22;53488:238;53445:281;;:::o;53732:233::-;53771:3;53794:24;53812:5;53794:24;:::i;:::-;53785:33;;53840:66;53833:5;53830:77;53827:103;;;53910:18;;:::i;:::-;53827:103;53957:1;53950:5;53946:13;53939:20;;53732:233;;;:::o;53971:167::-;54008:3;54031:22;54047:5;54031:22;:::i;:::-;54022:31;;54075:4;54068:5;54065:15;54062:41;;;54083:18;;:::i;:::-;54062:41;54130:1;54123:5;54119:13;54112:20;;53971:167;;;:::o;54144:176::-;54176:1;54193:20;54211:1;54193:20;:::i;:::-;54188:25;;54227:20;54245:1;54227:20;:::i;:::-;54222:25;;54266:1;54256:35;;54271:18;;:::i;:::-;54256:35;54312:1;54309;54305:9;54300:14;;54144:176;;;;:::o;54326:180::-;54374:77;54371:1;54364:88;54471:4;54468:1;54461:15;54495:4;54492:1;54485:15;54512:180;54560:77;54557:1;54550:88;54657:4;54654:1;54647:15;54681:4;54678:1;54671:15;54698:180;54746:77;54743:1;54736:88;54843:4;54840:1;54833:15;54867:4;54864:1;54857:15;54884:180;54932:77;54929:1;54922:88;55029:4;55026:1;55019:15;55053:4;55050:1;55043:15;55070:180;55118:77;55115:1;55108:88;55215:4;55212:1;55205:15;55239:4;55236:1;55229:15;55256:180;55304:77;55301:1;55294:88;55401:4;55398:1;55391:15;55425:4;55422:1;55415:15;55442:180;55490:77;55487:1;55480:88;55587:4;55584:1;55577:15;55611:4;55608:1;55601:15;55628:117;55737:1;55734;55727:12;55751:117;55860:1;55857;55850:12;55874:117;55983:1;55980;55973:12;55997:117;56106:1;56103;56096:12;56120:102;56161:6;56212:2;56208:7;56203:2;56196:5;56192:14;56188:28;56178:38;;56120:102;;;:::o;56228:::-;56270:8;56317:5;56314:1;56310:13;56289:34;;56228:102;;;:::o;56336:174::-;56476:26;56472:1;56464:6;56460:14;56453:50;56336:174;:::o;56516:226::-;56656:34;56652:1;56644:6;56640:14;56633:58;56725:9;56720:2;56712:6;56708:15;56701:34;56516:226;:::o;56748:181::-;56888:33;56884:1;56876:6;56872:14;56865:57;56748:181;:::o;56935:230::-;57075:34;57071:1;57063:6;57059:14;57052:58;57144:13;57139:2;57131:6;57127:15;57120:38;56935:230;:::o;57171:237::-;57311:34;57307:1;57299:6;57295:14;57288:58;57380:20;57375:2;57367:6;57363:15;57356:45;57171:237;:::o;57414:225::-;57554:34;57550:1;57542:6;57538:14;57531:58;57623:8;57618:2;57610:6;57606:15;57599:33;57414:225;:::o;57645:224::-;57785:34;57781:1;57773:6;57769:14;57762:58;57854:7;57849:2;57841:6;57837:15;57830:32;57645:224;:::o;57875:178::-;58015:30;58011:1;58003:6;57999:14;57992:54;57875:178;:::o;58059:168::-;58199:20;58195:1;58187:6;58183:14;58176:44;58059:168;:::o;58233:238::-;58373:34;58369:1;58361:6;58357:14;58350:58;58442:21;58437:2;58429:6;58425:15;58418:46;58233:238;:::o;58477:172::-;58617:24;58613:1;58605:6;58601:14;58594:48;58477:172;:::o;58655:223::-;58795:34;58791:1;58783:6;58779:14;58772:58;58864:6;58859:2;58851:6;58847:15;58840:31;58655:223;:::o;58884:175::-;59024:27;59020:1;59012:6;59008:14;59001:51;58884:175;:::o;59065:177::-;59205:29;59201:1;59193:6;59189:14;59182:53;59065:177;:::o;59248:221::-;59388:34;59384:1;59376:6;59372:14;59365:58;59457:4;59452:2;59444:6;59440:15;59433:29;59248:221;:::o;59475:231::-;59615:34;59611:1;59603:6;59599:14;59592:58;59684:14;59679:2;59671:6;59667:15;59660:39;59475:231;:::o;59712:182::-;59852:34;59848:1;59840:6;59836:14;59829:58;59712:182;:::o;59900:243::-;60040:34;60036:1;60028:6;60024:14;60017:58;60109:26;60104:2;60096:6;60092:15;60085:51;59900:243;:::o;60149:229::-;60289:34;60285:1;60277:6;60273:14;60266:58;60358:12;60353:2;60345:6;60341:15;60334:37;60149:229;:::o;60384:228::-;60524:34;60520:1;60512:6;60508:14;60501:58;60593:11;60588:2;60580:6;60576:15;60569:36;60384:228;:::o;60618:221::-;60758:34;60754:1;60746:6;60742:14;60735:58;60827:4;60822:2;60814:6;60810:15;60803:29;60618:221;:::o;60845:176::-;60985:28;60981:1;60973:6;60969:14;60962:52;60845:176;:::o;61027:182::-;61167:34;61163:1;61155:6;61151:14;61144:58;61027:182;:::o;61215:231::-;61355:34;61351:1;61343:6;61339:14;61332:58;61424:14;61419:2;61411:6;61407:15;61400:39;61215:231;:::o;61452:182::-;61592:34;61588:1;61580:6;61576:14;61569:58;61452:182;:::o;61640:220::-;61780:34;61776:1;61768:6;61764:14;61757:58;61849:3;61844:2;61836:6;61832:15;61825:28;61640:220;:::o;61866:234::-;62006:34;62002:1;61994:6;61990:14;61983:58;62075:17;62070:2;62062:6;62058:15;62051:42;61866:234;:::o;62106:220::-;62246:34;62242:1;62234:6;62230:14;62223:58;62315:3;62310:2;62302:6;62298:15;62291:28;62106:220;:::o;62332:171::-;62472:23;62468:1;62460:6;62456:14;62449:47;62332:171;:::o;62509:236::-;62649:34;62645:1;62637:6;62633:14;62626:58;62718:19;62713:2;62705:6;62701:15;62694:44;62509:236;:::o;62751:231::-;62891:34;62887:1;62879:6;62875:14;62868:58;62960:14;62955:2;62947:6;62943:15;62936:39;62751:231;:::o;62988:168::-;63128:20;63124:1;63116:6;63112:14;63105:44;62988:168;:::o;63162:235::-;63302:34;63298:1;63290:6;63286:14;63279:58;63371:18;63366:2;63358:6;63354:15;63347:43;63162:235;:::o;63403:177::-;63543:29;63539:1;63531:6;63527:14;63520:53;63403:177;:::o;63586:151::-;63726:3;63722:1;63714:6;63710:14;63703:27;63586:151;:::o;63743:122::-;63816:24;63834:5;63816:24;:::i;:::-;63809:5;63806:35;63796:63;;63855:1;63852;63845:12;63796:63;63743:122;:::o;63871:116::-;63941:21;63956:5;63941:21;:::i;:::-;63934:5;63931:32;63921:60;;63977:1;63974;63967:12;63921:60;63871:116;:::o;63993:120::-;64065:23;64082:5;64065:23;:::i;:::-;64058:5;64055:34;64045:62;;64103:1;64100;64093:12;64045:62;63993:120;:::o;64119:122::-;64192:24;64210:5;64192:24;:::i;:::-;64185:5;64182:35;64172:63;;64231:1;64228;64221:12;64172:63;64119:122;:::o;64247:118::-;64318:22;64334:5;64318:22;:::i;:::-;64311:5;64308:33;64298:61;;64355:1;64352;64345:12;64298:61;64247:118;:::o
Swarm Source
ipfs://7f18dab74654ebed567cbf4d6809a020b704d6e8537717919007b015c4b3397f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.