Feature Tip: Add private address tag to any address under My Name Tag !
Overview
Max Total Supply
629,566,122,259.677983796 AGFI
Holders
1,136 ( -0.088%)
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
143,215,458.026745 AGFIValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AggregatedFinance
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-05 */ // File: contracts/IUniswapV2Factory.sol pragma solidity 0.8.13; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // File: contracts/utils/SafeCast.sol // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) pragma solidity ^0.8.0; /** * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow * checks. * * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can * easily result in undesired exploitation or bugs, since developers usually * assume that overflows raise errors. `SafeCast` restores this intuition by * reverting the transaction when such an operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. * * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing * all math on `uint256` and `int256` and then downcasting. */ library SafeCast { /** * @dev Returns the downcasted uint224 from uint256, reverting on * overflow (when the input is greater than largest uint224). * * Counterpart to Solidity's `uint224` operator. * * Requirements: * * - input must fit into 224 bits */ function toUint224(uint256 value) internal pure returns (uint224) { require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); return uint224(value); } /** * @dev Returns the downcasted uint128 from uint256, reverting on * overflow (when the input is greater than largest uint128). * * Counterpart to Solidity's `uint128` operator. * * Requirements: * * - input must fit into 128 bits */ function toUint128(uint256 value) internal pure returns (uint128) { require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); return uint128(value); } /** * @dev Returns the downcasted uint96 from uint256, reverting on * overflow (when the input is greater than largest uint96). * * Counterpart to Solidity's `uint96` operator. * * Requirements: * * - input must fit into 96 bits */ function toUint96(uint256 value) internal pure returns (uint96) { require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); return uint96(value); } /** * @dev Returns the downcasted uint64 from uint256, reverting on * overflow (when the input is greater than largest uint64). * * Counterpart to Solidity's `uint64` operator. * * Requirements: * * - input must fit into 64 bits */ function toUint64(uint256 value) internal pure returns (uint64) { require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); return uint64(value); } /** * @dev Returns the downcasted uint32 from uint256, reverting on * overflow (when the input is greater than largest uint32). * * Counterpart to Solidity's `uint32` operator. * * Requirements: * * - input must fit into 32 bits */ function toUint32(uint256 value) internal pure returns (uint32) { require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); return uint32(value); } /** * @dev Returns the downcasted uint16 from uint256, reverting on * overflow (when the input is greater than largest uint16). * * Counterpart to Solidity's `uint16` operator. * * Requirements: * * - input must fit into 16 bits */ function toUint16(uint256 value) internal pure returns (uint16) { require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); return uint16(value); } /** * @dev Returns the downcasted uint8 from uint256, reverting on * overflow (when the input is greater than largest uint8). * * Counterpart to Solidity's `uint8` operator. * * Requirements: * * - input must fit into 8 bits. */ function toUint8(uint256 value) internal pure returns (uint8) { require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); return uint8(value); } /** * @dev Converts a signed int256 into an unsigned uint256. * * Requirements: * * - input must be greater than or equal to 0. */ function toUint256(int256 value) internal pure returns (uint256) { require(value >= 0, "SafeCast: value must be positive"); return uint256(value); } /** * @dev Returns the downcasted int128 from int256, reverting on * overflow (when the input is less than smallest int128 or * greater than largest int128). * * Counterpart to Solidity's `int128` operator. * * Requirements: * * - input must fit into 128 bits * * _Available since v3.1._ */ function toInt128(int256 value) internal pure returns (int128) { require(value >= type(int128).min && value <= type(int128).max, "SafeCast: value doesn't fit in 128 bits"); return int128(value); } /** * @dev Returns the downcasted int64 from int256, reverting on * overflow (when the input is less than smallest int64 or * greater than largest int64). * * Counterpart to Solidity's `int64` operator. * * Requirements: * * - input must fit into 64 bits * * _Available since v3.1._ */ function toInt64(int256 value) internal pure returns (int64) { require(value >= type(int64).min && value <= type(int64).max, "SafeCast: value doesn't fit in 64 bits"); return int64(value); } /** * @dev Returns the downcasted int32 from int256, reverting on * overflow (when the input is less than smallest int32 or * greater than largest int32). * * Counterpart to Solidity's `int32` operator. * * Requirements: * * - input must fit into 32 bits * * _Available since v3.1._ */ function toInt32(int256 value) internal pure returns (int32) { require(value >= type(int32).min && value <= type(int32).max, "SafeCast: value doesn't fit in 32 bits"); return int32(value); } /** * @dev Returns the downcasted int16 from int256, reverting on * overflow (when the input is less than smallest int16 or * greater than largest int16). * * Counterpart to Solidity's `int16` operator. * * Requirements: * * - input must fit into 16 bits * * _Available since v3.1._ */ function toInt16(int256 value) internal pure returns (int16) { require(value >= type(int16).min && value <= type(int16).max, "SafeCast: value doesn't fit in 16 bits"); return int16(value); } /** * @dev Returns the downcasted int8 from int256, reverting on * overflow (when the input is less than smallest int8 or * greater than largest int8). * * Counterpart to Solidity's `int8` operator. * * Requirements: * * - input must fit into 8 bits. * * _Available since v3.1._ */ function toInt8(int256 value) internal pure returns (int8) { require(value >= type(int8).min && value <= type(int8).max, "SafeCast: value doesn't fit in 8 bits"); return int8(value); } /** * @dev Converts an unsigned uint256 into a signed int256. * * Requirements: * * - input must be less than or equal to maxInt256. */ function toInt256(uint256 value) internal pure returns (int256) { // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); return int256(value); } } // File: contracts/extensions/IVotes.sol // OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol) pragma solidity ^0.8.0; /** * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts. * * _Available since v4.5._ */ interface IVotes { /** * @dev Emitted when an account changes their delegate. */ event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /** * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes. */ event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance); /** * @dev Returns the current amount of votes that `account` has. */ function getVotes(address account) external view returns (uint256); /** * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`). */ function getPastVotes(address account, uint256 blockNumber) external view returns (uint256); /** * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`). * * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. * Votes that have not been delegated are still part of total supply, even though they would not participate in a * vote. */ function getPastTotalSupply(uint256 blockNumber) external view returns (uint256); /** * @dev Returns the delegate that `account` has chosen. */ function delegates(address account) external view returns (address); /** * @dev Delegates votes from the sender to `delegatee`. */ function delegate(address delegatee) external; /** * @dev Delegates votes from signer to `delegatee`. */ function delegateBySig( address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) external; } // File: 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: contracts/utils/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: contracts/utils/draft-EIP712.sol // OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } // File: contracts/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: contracts/utils/Math.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } } // File: contracts/utils/Arrays.sol // OpenZeppelin Contracts v4.4.1 (utils/Arrays.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to array types. */ library Arrays { /** * @dev Searches a sorted `array` and returns the first index that contains * a value greater or equal to `element`. If no such index exists (i.e. all * values in the array are strictly less than `element`), the array length is * returned. Time complexity O(log n). * * `array` is expected to be sorted in ascending order, and to contain no * repeated elements. */ function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) { if (array.length == 0) { return 0; } uint256 low = 0; uint256 high = array.length; while (low < high) { uint256 mid = Math.average(low, high); // Note that mid will always be strictly less than high (i.e. it will be a valid array index) // because Math.average rounds down (it does integer division with truncation). if (array[mid] > element) { high = mid; } else { low = mid + 1; } } // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound. if (low > 0 && array[low - 1] == element) { return low - 1; } else { return low; } } } // File: contracts/extensions/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: contracts/extensions/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: contracts/extensions/IUniswapV2Router01.sol pragma solidity ^0.8.0; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // File: contracts/extensions/IUniswapV2Router02.sol pragma solidity ^0.8.0; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // File: contracts/extensions/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: contracts/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: contracts/extensions/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: contracts/extensions/draft-ERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-ERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * _Available since v3.4._ */ abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 { using Counters for Counters.Counter; mapping(address => Counters.Counter) private _nonces; // solhint-disable-next-line var-name-mixedcase bytes32 private immutable _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); /** * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. * * It's a good idea to use the same `name` that is defined as the ERC20 token name. */ constructor(string memory name) EIP712(name, "1") {} /** * @dev See {IERC20Permit-permit}. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)); bytes32 hash = _hashTypedDataV4(structHash); address signer = ECDSA.recover(hash, v, r, s); require(signer == owner, "ERC20Permit: invalid signature"); _approve(owner, spender, value); } /** * @dev See {IERC20Permit-nonces}. */ function nonces(address owner) public view virtual override returns (uint256) { return _nonces[owner].current(); } /** * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view override returns (bytes32) { return _domainSeparatorV4(); } /** * @dev "Consume a nonce": return the current value and increment. * * _Available since v4.1._ */ function _useNonce(address owner) internal virtual returns (uint256 current) { Counters.Counter storage nonce = _nonces[owner]; current = nonce.current(); nonce.increment(); } } // File: contracts/extensions/ERC20Votes.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol) pragma solidity ^0.8.0; /** * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's, * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1. * * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module. * * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting * power can be queried through the public accessors {getVotes} and {getPastVotes}. * * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked. * * _Available since v4.2._ */ abstract contract ERC20Votes is IVotes, ERC20Permit { struct Checkpoint { uint32 fromBlock; uint224 votes; } bytes32 private constant _DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); mapping(address => address) private _delegates; mapping(address => Checkpoint[]) private _checkpoints; Checkpoint[] private _totalSupplyCheckpoints; /** * @dev Get the `pos`-th checkpoint for `account`. */ function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) { return _checkpoints[account][pos]; } /** * @dev Get number of checkpoints for `account`. */ function numCheckpoints(address account) public view virtual returns (uint32) { return SafeCast.toUint32(_checkpoints[account].length); } /** * @dev Get the address `account` is currently delegating to. */ function delegates(address account) public view virtual override returns (address) { return _delegates[account]; } /** * @dev Gets the current votes balance for `account` */ function getVotes(address account) public view virtual override returns (uint256) { uint256 pos = _checkpoints[account].length; return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes; } /** * @dev Retrieve the number of votes for `account` at the end of `blockNumber`. * * Requirements: * * - `blockNumber` must have been already mined */ function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) { require(blockNumber < block.number, "ERC20Votes: block not yet mined"); return _checkpointsLookup(_checkpoints[account], blockNumber); } /** * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. * It is but NOT the sum of all the delegated votes! * * Requirements: * * - `blockNumber` must have been already mined */ function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) { require(blockNumber < block.number, "ERC20Votes: block not yet mined"); return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber); } /** * @dev Lookup a value in a list of (sorted) checkpoints. */ function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) { // We run a binary search to look for the earliest checkpoint taken after `blockNumber`. // // During the loop, the index of the wanted checkpoint remains in the range [low-1, high). // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant. // - If the middle checkpoint is after `blockNumber`, we look in [low, mid) // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high) // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not // out of bounds (in which case we're looking too far in the past and the result is 0). // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out // the same. uint256 high = ckpts.length; uint256 low = 0; while (low < high) { uint256 mid = Math.average(low, high); if (ckpts[mid].fromBlock > blockNumber) { high = mid; } else { low = mid + 1; } } return high == 0 ? 0 : ckpts[high - 1].votes; } /** * @dev Delegate votes from the sender to `delegatee`. */ function delegate(address delegatee) public virtual override { _delegate(_msgSender(), delegatee); } /** * @dev Delegates votes from signer to `delegatee` */ function delegateBySig( address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= expiry, "ERC20Votes: signature expired"); address signer = ECDSA.recover( _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))), v, r, s ); require(nonce == _useNonce(signer), "ERC20Votes: invalid nonce"); _delegate(signer, delegatee); } /** * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1). */ function _maxSupply() internal view virtual returns (uint224) { return type(uint224).max; } /** * @dev Snapshots the totalSupply after it has been increased. */ function _mint(address account, uint256 amount) internal virtual override { super._mint(account, amount); require(totalSupply() <= _maxSupply(), "ERC20Votes: total supply risks overflowing votes"); _writeCheckpoint(_totalSupplyCheckpoints, _add, amount); } /** * @dev Snapshots the totalSupply after it has been decreased. */ function _burn(address account, uint256 amount) internal virtual override { super._burn(account, amount); _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount); } /** * @dev Move voting power when tokens are transferred. * * Emits a {DelegateVotesChanged} event. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual override { super._afterTokenTransfer(from, to, amount); _moveVotingPower(delegates(from), delegates(to), amount); } /** * @dev Change delegation for `delegator` to `delegatee`. * * Emits events {DelegateChanged} and {DelegateVotesChanged}. */ function _delegate(address delegator, address delegatee) internal virtual { address currentDelegate = delegates(delegator); uint256 delegatorBalance = balanceOf(delegator); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveVotingPower(currentDelegate, delegatee, delegatorBalance); } function _moveVotingPower( address src, address dst, uint256 amount ) private { if (src != dst && amount > 0) { if (src != address(0)) { (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount); emit DelegateVotesChanged(src, oldWeight, newWeight); } if (dst != address(0)) { (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount); emit DelegateVotesChanged(dst, oldWeight, newWeight); } } } function _writeCheckpoint( Checkpoint[] storage ckpts, function(uint256, uint256) view returns (uint256) op, uint256 delta ) private returns (uint256 oldWeight, uint256 newWeight) { uint256 pos = ckpts.length; oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes; newWeight = op(oldWeight, delta); if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) { ckpts[pos - 1].votes = SafeCast.toUint224(newWeight); } else { ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)})); } } function _add(uint256 a, uint256 b) private pure returns (uint256) { return a + b; } function _subtract(uint256 a, uint256 b) private pure returns (uint256) { return a - b; } } // File: contracts/extensions/ERC20Snapshot.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/ERC20Snapshot.sol) pragma solidity ^0.8.0; /** * @dev This contract extends an ERC20 token with a snapshot mechanism. When a snapshot is created, the balances and * total supply at the time are recorded for later access. * * This can be used to safely create mechanisms based on token balances such as trustless dividends or weighted voting. * In naive implementations it's possible to perform a "double spend" attack by reusing the same balance from different * accounts. By using snapshots to calculate dividends or voting power, those attacks no longer apply. It can also be * used to create an efficient ERC20 forking mechanism. * * Snapshots are created by the internal {_snapshot} function, which will emit the {Snapshot} event and return a * snapshot id. To get the total supply at the time of a snapshot, call the function {totalSupplyAt} with the snapshot * id. To get the balance of an account at the time of a snapshot, call the {balanceOfAt} function with the snapshot id * and the account address. * * NOTE: Snapshot policy can be customized by overriding the {_getCurrentSnapshotId} method. For example, having it * return `block.number` will trigger the creation of snapshot at the begining of each new block. When overridding this * function, be careful about the monotonicity of its result. Non-monotonic snapshot ids will break the contract. * * Implementing snapshots for every block using this method will incur significant gas costs. For a gas-efficient * alternative consider {ERC20Votes}. * * ==== Gas Costs * * Snapshots are efficient. Snapshot creation is _O(1)_. Retrieval of balances or total supply from a snapshot is _O(log * n)_ in the number of snapshots that have been created, although _n_ for a specific account will generally be much * smaller since identical balances in subsequent snapshots are stored as a single entry. * * There is a constant overhead for normal ERC20 transfers due to the additional snapshot bookkeeping. This overhead is * only significant for the first transfer that immediately follows a snapshot for a particular account. Subsequent * transfers will have normal cost until the next snapshot, and so on. */ abstract contract ERC20Snapshot is ERC20 { // Inspired by Jordi Baylina's MiniMeToken to record historical balances: // https://github.com/Giveth/minimd/blob/ea04d950eea153a04c51fa510b068b9dded390cb/contracts/MiniMeToken.sol using Arrays for uint256[]; using Counters for Counters.Counter; // Snapshotted values have arrays of ids and the value corresponding to that id. These could be an array of a // Snapshot struct, but that would impede usage of functions that work on an array. struct Snapshots { uint256[] ids; uint256[] values; } mapping(address => Snapshots) private _accountBalanceSnapshots; Snapshots private _totalSupplySnapshots; // Snapshot ids increase monotonically, with the first value being 1. An id of 0 is invalid. Counters.Counter private _currentSnapshotId; /** * @dev Emitted by {_snapshot} when a snapshot identified by `id` is created. */ event Snapshot(uint256 id); /** * @dev Creates a new snapshot and returns its snapshot id. * * Emits a {Snapshot} event that contains the same id. * * {_snapshot} is `internal` and you have to decide how to expose it externally. Its usage may be restricted to a * set of accounts, for example using {AccessControl}, or it may be open to the public. * * [WARNING] * ==== * While an open way of calling {_snapshot} is required for certain trust minimization mechanisms such as forking, * you must consider that it can potentially be used by attackers in two ways. * * First, it can be used to increase the cost of retrieval of values from snapshots, although it will grow * logarithmically thus rendering this attack ineffective in the long term. Second, it can be used to target * specific accounts and increase the cost of ERC20 transfers for them, in the ways specified in the Gas Costs * section above. * * We haven't measured the actual numbers; if this is something you're interested in please reach out to us. * ==== */ function _snapshot() internal virtual returns (uint256) { _currentSnapshotId.increment(); uint256 currentId = _getCurrentSnapshotId(); emit Snapshot(currentId); return currentId; } /** * @dev Get the current snapshotId */ function _getCurrentSnapshotId() internal view virtual returns (uint256) { return _currentSnapshotId.current(); } /** * @dev Retrieves the balance of `account` at the time `snapshotId` was created. */ function balanceOfAt(address account, uint256 snapshotId) public view virtual returns (uint256) { (bool snapshotted, uint256 value) = _valueAt(snapshotId, _accountBalanceSnapshots[account]); return snapshotted ? value : balanceOf(account); } /** * @dev Retrieves the total supply at the time `snapshotId` was created. */ function totalSupplyAt(uint256 snapshotId) public view virtual returns (uint256) { (bool snapshotted, uint256 value) = _valueAt(snapshotId, _totalSupplySnapshots); return snapshotted ? value : totalSupply(); } // Update balance and/or total supply snapshots before the values are modified. This is implemented // in the _beforeTokenTransfer hook, which is executed for _mint, _burn, and _transfer operations. function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override { super._beforeTokenTransfer(from, to, amount); if (from == address(0)) { // mint _updateAccountSnapshot(to); _updateTotalSupplySnapshot(); } else if (to == address(0)) { // burn _updateAccountSnapshot(from); _updateTotalSupplySnapshot(); } else { // transfer _updateAccountSnapshot(from); _updateAccountSnapshot(to); } } function _valueAt(uint256 snapshotId, Snapshots storage snapshots) private view returns (bool, uint256) { require(snapshotId > 0, "ERC20Snapshot: id is 0"); require(snapshotId <= _getCurrentSnapshotId(), "ERC20Snapshot: nonexistent id"); // When a valid snapshot is queried, there are three possibilities: // a) The queried value was not modified after the snapshot was taken. Therefore, a snapshot entry was never // created for this id, and all stored snapshot ids are smaller than the requested one. The value that corresponds // to this id is the current one. // b) The queried value was modified after the snapshot was taken. Therefore, there will be an entry with the // requested id, and its value is the one to return. // c) More snapshots were created after the requested one, and the queried value was later modified. There will be // no entry for the requested id: the value that corresponds to it is that of the smallest snapshot id that is // larger than the requested one. // // In summary, we need to find an element in an array, returning the index of the smallest value that is larger if // it is not found, unless said value doesn't exist (e.g. when all values are smaller). Arrays.findUpperBound does // exactly this. uint256 index = snapshots.ids.findUpperBound(snapshotId); if (index == snapshots.ids.length) { return (false, 0); } else { return (true, snapshots.values[index]); } } function _updateAccountSnapshot(address account) private { _updateSnapshot(_accountBalanceSnapshots[account], balanceOf(account)); } function _updateTotalSupplySnapshot() private { _updateSnapshot(_totalSupplySnapshots, totalSupply()); } function _updateSnapshot(Snapshots storage snapshots, uint256 currentValue) private { uint256 currentId = _getCurrentSnapshotId(); if (_lastSnapshotId(snapshots.ids) < currentId) { snapshots.ids.push(currentId); snapshots.values.push(currentValue); } } function _lastSnapshotId(uint256[] storage ids) private view returns (uint256) { if (ids.length == 0) { return 0; } else { return ids[ids.length - 1]; } } } // File: contracts/extensions/ERC20Burnable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } } // File: contracts/extensions/IRewardTracker.sol pragma solidity ^0.8.13; interface IRewardTracker is IERC20 { event RewardsDistributed(address indexed from, uint256 weiAmount); event RewardWithdrawn(address indexed to, uint256 weiAmount); event ExcludeFromRewards(address indexed account, bool excluded); event Claim(address indexed account, uint256 amount); event Compound(address indexed account, uint256 amount, uint256 tokens); event LogErrorString(string message); struct AccountInfo { address account; uint256 withdrawableRewards; uint256 totalRewards; uint256 lastClaimTime; } receive() external payable; function distributeRewards() external payable; function setBalance(address payable account, uint256 newBalance) external; function excludeFromRewards(address account, bool excluded) external; function isExcludedFromRewards(address account) external view returns (bool); function manualSendReward(uint256 amount, address holder) external; function processAccount(address payable account) external returns (bool); function compoundAccount(address payable account) external returns (bool); function withdrawableRewardOf(address account) external view returns (uint256); function withdrawnRewardOf(address account) external view returns (uint256); function accumulativeRewardOf(address account) external view returns (uint256); function getAccountInfo(address account) external view returns (address, uint256, uint256, uint256, uint256); function getLastClaimTime(address account) external view returns (uint256); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view override returns (uint256); function balanceOf(address account) external view override returns (uint256); function transfer(address, uint256) external pure override returns (bool); function allowance(address, address) external pure override returns (uint256); function approve(address, uint256) external pure override returns (bool); function transferFrom(address, address, uint256) external pure override returns (bool); } // File: contracts/RewardTracker.sol pragma solidity ^0.8.13; contract RewardTracker is IRewardTracker, Ownable { address immutable UNISWAPROUTER; string private constant _name = "AGFI_RewardTracker"; string private constant _symbol = "AGFI_RewardTracker"; uint256 public lastProcessedIndex; uint256 private _totalSupply; mapping(address => uint256) private _balances; uint256 private constant magnitude = 2**128; uint256 public immutable minTokenBalanceForRewards; uint256 private magnifiedRewardPerShare; uint256 public totalRewardsDistributed; uint256 public totalRewardsWithdrawn; address public immutable tokenAddress; mapping(address => bool) public excludedFromRewards; mapping(address => int256) private magnifiedRewardCorrections; mapping(address => uint256) private withdrawnRewards; mapping(address => uint256) private lastClaimTimes; constructor(address _tokenAddress, address _uniswapRouter) { minTokenBalanceForRewards = 1 * (10**9); tokenAddress = _tokenAddress; UNISWAPROUTER = _uniswapRouter; } receive() external override payable { distributeRewards(); } function distributeRewards() public override payable { require(_totalSupply > 0, "Total supply invalid"); if (msg.value > 0) { magnifiedRewardPerShare = magnifiedRewardPerShare + ((msg.value * magnitude) / _totalSupply); emit RewardsDistributed(msg.sender, msg.value); totalRewardsDistributed += msg.value; } } function setBalance(address payable account, uint256 newBalance) external override onlyOwner { if (excludedFromRewards[account]) { return; } if (newBalance >= minTokenBalanceForRewards) { _setBalance(account, newBalance); } else { _setBalance(account, 0); } } function excludeFromRewards(address account, bool excluded) external override onlyOwner { require( excludedFromRewards[account] != excluded, "AGFI_RewardTracker: account already set to requested state" ); excludedFromRewards[account] = excluded; if (excluded) { _setBalance(account, 0); } else { uint256 newBalance = IERC20(tokenAddress).balanceOf(account); if (newBalance >= minTokenBalanceForRewards) { _setBalance(account, newBalance); } else { _setBalance(account, 0); } } emit ExcludeFromRewards(account, excluded); } function isExcludedFromRewards(address account) public override view returns (bool) { return excludedFromRewards[account]; } function manualSendReward(uint256 amount, address holder) external override onlyOwner { uint256 contractETHBalance = address(this).balance; (bool success, ) = payable(holder).call{ value: amount > 0 ? amount : contractETHBalance }(""); require(success, "Manual send failed."); } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = _balances[account]; if (newBalance > currentBalance) { uint256 addAmount = newBalance - currentBalance; _mint(account, addAmount); } else if (newBalance < currentBalance) { uint256 subAmount = currentBalance - newBalance; _burn(account, subAmount); } } function _mint(address account, uint256 amount) private { require( account != address(0), "AGFI_RewardTracker: mint to the zero address" ); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); magnifiedRewardCorrections[account] = magnifiedRewardCorrections[account] - int256(magnifiedRewardPerShare * amount); } function _burn(address account, uint256 amount) private { require( account != address(0), "AGFI_RewardTracker: burn from the zero address" ); uint256 accountBalance = _balances[account]; require( accountBalance >= amount, "AGFI_RewardTracker: burn amount exceeds balance" ); _balances[account] = accountBalance - amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); magnifiedRewardCorrections[account] = magnifiedRewardCorrections[account] + int256(magnifiedRewardPerShare * amount); } function processAccount(address payable account) public override onlyOwner returns (bool) { uint256 amount = _withdrawRewardOfUser(account); if (amount > 0) { lastClaimTimes[account] = block.timestamp; emit Claim(account, amount); return true; } return false; } function _withdrawRewardOfUser(address payable account) private returns (uint256) { uint256 _withdrawableReward = withdrawableRewardOf(account); if (_withdrawableReward > 0) { withdrawnRewards[account] += _withdrawableReward; totalRewardsWithdrawn += _withdrawableReward; (bool success, ) = account.call{value: _withdrawableReward}(""); if (!success) { withdrawnRewards[account] -= _withdrawableReward; totalRewardsWithdrawn -= _withdrawableReward; emit LogErrorString("Withdraw failed"); return 0; } emit RewardWithdrawn(account, _withdrawableReward); return _withdrawableReward; } return 0; } function compoundAccount(address payable account) public override onlyOwner returns (bool) { (uint256 amount, uint256 tokens) = _compoundRewardOfUser(account); if (amount > 0) { lastClaimTimes[account] = block.timestamp; emit Compound(account, amount, tokens); return true; } return false; } function _compoundRewardOfUser(address payable account) private returns (uint256, uint256) { uint256 _withdrawableReward = withdrawableRewardOf(account); if (_withdrawableReward > 0) { withdrawnRewards[account] += _withdrawableReward; totalRewardsWithdrawn += _withdrawableReward; IUniswapV2Router02 uniswapV2Router = IUniswapV2Router02( UNISWAPROUTER ); address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = address(tokenAddress); bool success; uint256 tokens; uint256 initTokenBal = IERC20(tokenAddress).balanceOf(account); try uniswapV2Router .swapExactETHForTokensSupportingFeeOnTransferTokens{ value: _withdrawableReward }(0, path, address(account), block.timestamp) { success = true; tokens = IERC20(tokenAddress).balanceOf(account) - initTokenBal; } catch Error( string memory reason /*err*/ ) { emit LogErrorString(reason); success = false; } if (!success) { withdrawnRewards[account] -= _withdrawableReward; totalRewardsWithdrawn -= _withdrawableReward; emit LogErrorString("Withdraw failed"); return (0, 0); } emit RewardWithdrawn(account, _withdrawableReward); return (_withdrawableReward, tokens); } return (0, 0); } function withdrawableRewardOf(address account) public override view returns (uint256) { return accumulativeRewardOf(account) - withdrawnRewards[account]; } function withdrawnRewardOf(address account) public view returns (uint256) { return withdrawnRewards[account]; } function accumulativeRewardOf(address account) public override view returns (uint256) { int256 a = int256(magnifiedRewardPerShare * balanceOf(account)); int256 b = magnifiedRewardCorrections[account]; // this is an explicit int256 (signed) return uint256(a + b) / magnitude; } function getAccountInfo(address account) public override view returns ( address, uint256, uint256, uint256, uint256 ) { AccountInfo memory info; info.account = account; info.withdrawableRewards = withdrawableRewardOf(account); info.totalRewards = accumulativeRewardOf(account); info.lastClaimTime = lastClaimTimes[account]; return ( info.account, info.withdrawableRewards, info.totalRewards, info.lastClaimTime, totalRewardsWithdrawn ); } function getLastClaimTime(address account) public override view returns (uint256) { return lastClaimTimes[account]; } function name() public override pure returns (string memory) { return _name; } function symbol() public override pure returns (string memory) { return _symbol; } function decimals() public override pure returns (uint8) { return 9; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } function transfer(address, uint256) public pure override returns (bool) { revert("AGFI_RewardTracker: method not implemented"); } function allowance(address, address) public pure override returns (uint256) { revert("AGFI_RewardTracker: method not implemented"); } function approve(address, uint256) public pure override returns (bool) { revert("AGFI_RewardTracker: method not implemented"); } function transferFrom( address, address, uint256 ) public pure override returns (bool) { revert("AGFI_RewardTracker: method not implemented"); } } // File: contracts/AggregatedFinance.sol pragma solidity ^0.8.13; /// @custom:security-contact [email protected] contract AggregatedFinance is ERC20, ERC20Burnable, ERC20Snapshot, Ownable, ERC20Permit, ERC20Votes { address constant UNISWAPROUTER = address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // non-immutable reward tracker so it can be upgraded if needed IRewardTracker public rewardTracker; IUniswapV2Router02 public immutable uniswapV2Router; address public immutable uniswapV2Pair; mapping (address => uint256) private _balances; mapping (address => mapping(address => uint256)) private _allowances; mapping (address => bool) public _blacklist; mapping (address => bool) private _isExcludedFromFees; mapping (address => uint256) private _holderLastTransferTimestamp; mapping (address => bool) public automatedMarketMakerPairs; bool public limitsInEffect = true; bool public transferDelayEnabled = true; bool private swapping; uint8 public swapIndex; // tracks which fee is being sold off bool private isCompounding; bool public transferTaxEnabled = false; bool public swapEnabled = false; bool public compoundingEnabled = true; uint256 public lastSwapTime; uint256 private launchedAt; // Fee channel definitions. Enable each individually, and define tax rates for each. bool public buyFeeC1Enabled = true; bool public buyFeeC2Enabled = false; bool public buyFeeC3Enabled = true; bool public buyFeeC4Enabled = true; bool public buyFeeC5Enabled = true; bool public sellFeeC1Enabled = true; bool public sellFeeC2Enabled = true; bool public sellFeeC3Enabled = true; bool public sellFeeC4Enabled = true; bool public sellFeeC5Enabled = true; bool public swapC1Enabled = true; bool public swapC2Enabled = true; bool public swapC3Enabled = true; bool public swapC4Enabled = true; bool public swapC5Enabled = true; bool public c2BurningEnabled = true; bool public c3RewardsEnabled = true; uint256 public tokensForC1; uint256 public tokensForC2; uint256 public tokensForC3; uint256 public tokensForC4; uint256 public tokensForC5; // treasury wallet, default to 0x3e822d55e79eA9F53C744BD9179d89dDec081556 address public c1Wallet; // burning wallet, default to the staking rewards wallet, but when burning is enabled // it will just burn them. The wallet still needs to be defined to function: // 0x16cc620dBBACc751DAB85d7Fc1164C62858d9b9f address public c2Wallet; // rewards wallet, default to the rewards contract itself, not a wallet. But // if rewards are disabled then they'll fall back to the staking rewards wallet: // 0x16cc620dBBACc751DAB85d7Fc1164C62858d9b9f address public c3Wallet; // staking rewards wallet, default to 0x16cc620dBBACc751DAB85d7Fc1164C62858d9b9f address public c4Wallet; // operations wallet, default to 0xf05E5AeFeCd9c370fbfFff94c6c4614E6c165b78 address public c5Wallet; uint256 public buyTotalFees = 1200; // 12% default uint256 public buyC1Fee = 400; // 4% Treasury uint256 public buyC2Fee = 0; // Nothing uint256 public buyC3Fee = 300; // 3% Eth Rewards uint256 public buyC4Fee = 300; // 3% Eth Staking Pool uint256 public buyC5Fee = 200; // 2% Operations uint256 public sellTotalFees = 1300; // 13% default uint256 public sellC1Fee = 400; // 4% Treasury uint256 public sellC2Fee = 100; // 1% Auto Burn uint256 public sellC3Fee = 300; // 3% Eth Rewards uint256 public sellC4Fee = 300; // 3% Eth Staking Pool uint256 public sellC5Fee = 200; // 2% Operations event LogErrorString(string message); event SwapEnabled(bool enabled); event TaxEnabled(bool enabled); event TransferTaxEnabled(bool enabled); event CompoundingEnabled(bool enabled); event ChangeSwapTokensAtAmount(uint256 amount); event LimitsReinstated(); event LimitsRemoved(); event C2BurningModified(bool enabled); event C3RewardsModified(bool enabled); event ChannelWalletsModified(address indexed newAddress, uint8 idx); event BoughtEarly(address indexed sniper); event ExcludeFromFees(address indexed account, bool isExcluded); event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event SetRewardTracker(address indexed newAddress); event FeesUpdated(); event SendChannel1(uint256 amount); event SendChannel2(uint256 amount); event SendChannel3(uint256 amount); event SendChannel4(uint256 amount); event SendChannel5(uint256 amount); event TokensBurned(uint256 amountBurned); event NativeWithdrawn(); event FeesWithdrawn(); constructor() ERC20("Aggregated Finance", "AGFI") ERC20Permit("Aggregated Finance") { c1Wallet = address(0x3e822d55e79eA9F53C744BD9179d89dDec081556); c2Wallet = address(0x16cc620dBBACc751DAB85d7Fc1164C62858d9b9f); c3Wallet = address(0x16cc620dBBACc751DAB85d7Fc1164C62858d9b9f); c4Wallet = address(0x16cc620dBBACc751DAB85d7Fc1164C62858d9b9f); c5Wallet = address(0xf05E5AeFeCd9c370fbfFff94c6c4614E6c165b78); rewardTracker = new RewardTracker(address(this), UNISWAPROUTER); IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(UNISWAPROUTER); address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH()); uniswapV2Router = _uniswapV2Router; uniswapV2Pair = _uniswapV2Pair; _setAutomatedMarketMakerPair(_uniswapV2Pair, true); rewardTracker.excludeFromRewards(address(rewardTracker), true); rewardTracker.excludeFromRewards(address(this), true); rewardTracker.excludeFromRewards(owner(), true); rewardTracker.excludeFromRewards(address(_uniswapV2Router), true); rewardTracker.excludeFromRewards(address(0xdead), true); // we won't use the dead address as we can burn, but just in case someone burns their tokens excludeFromFees(owner(), true); excludeFromFees(address(rewardTracker), true); excludeFromFees(address(this), true); excludeFromFees(address(0xdead), true); _mint(owner(), 1000000000000 * (1e9)); // 1,000,000,000,000 tokens with 9 decimal places } receive() external payable {} function decimals() override public pure returns (uint8) { return 9; } function excludeFromFees(address account, bool excluded) public onlyOwner { _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function isExcludedFromFees(address account) public view returns (bool) { return _isExcludedFromFees[account]; } function blacklistAccount(address account, bool isBlacklisted) public onlyOwner { _blacklist[account] = isBlacklisted; } function setAutomatedMarketMakerPair(address pair, bool enabled) public onlyOwner { require(pair != uniswapV2Pair, "AGFI: The pair cannot be removed from automatedMarketMakerPairs"); _setAutomatedMarketMakerPair(pair, enabled); } function _setAutomatedMarketMakerPair(address pair, bool enabled) private { automatedMarketMakerPairs[pair] = enabled; emit SetAutomatedMarketMakerPair(pair, enabled); } function setRewardTracker(address payable newTracker) public onlyOwner { require(newTracker != address(0), "AGFI: newTracker cannot be zero address"); rewardTracker = IRewardTracker(newTracker); emit SetRewardTracker(newTracker); } function claim() public { rewardTracker.processAccount(payable(_msgSender())); } function compound() public { require(compoundingEnabled, "AGFI: compounding is not enabled"); isCompounding = true; rewardTracker.compoundAccount(payable(_msgSender())); isCompounding = false; } function withdrawableRewardOf(address account) public view returns (uint256) { return rewardTracker.withdrawableRewardOf(account); } function withdrawnRewardOf(address account) public view returns (uint256) { return rewardTracker.withdrawnRewardOf(account); } function accumulativeRewardOf(address account) public view returns (uint256) { return rewardTracker.accumulativeRewardOf(account); } function getAccountInfo(address account) public view returns ( address, uint256, uint256, uint256, uint256 ) { return rewardTracker.getAccountInfo(account); } function enableTrading() external onlyOwner { swapEnabled = true; transferTaxEnabled = true; launchedAt = block.number; } function getLastClaimTime(address account) public view returns (uint256) { return rewardTracker.getLastClaimTime(account); } function setCompoundingEnabled(bool enabled) external onlyOwner { compoundingEnabled = enabled; emit CompoundingEnabled(enabled); } function setSwapEnabled(bool enabled) external onlyOwner { swapEnabled = enabled; emit SwapEnabled(enabled); } function setSwapChannels(bool c1, bool c2, bool c3, bool c4, bool c5) external onlyOwner { swapC1Enabled = c1; swapC2Enabled = c2; swapC3Enabled = c3; swapC4Enabled = c4; swapC5Enabled = c5; } function setTransferTaxEnabled(bool enabled) external onlyOwner { transferTaxEnabled = enabled; emit TransferTaxEnabled(enabled); } function removeLimits() external onlyOwner { limitsInEffect = false; emit LimitsRemoved(); } function reinstateLimits() external onlyOwner { limitsInEffect = true; emit LimitsReinstated(); } function modifyC2Burning(bool enabled) external onlyOwner { c2BurningEnabled = enabled; emit C2BurningModified(enabled); } function modifyC3Rewards(bool enabled) external onlyOwner { c3RewardsEnabled = enabled; emit C3RewardsModified(enabled); } function modifyChannelWallet(address newAddress, uint8 idx) external onlyOwner { require(newAddress != address(0), "AGFI: newAddress can not be zero address."); if (idx == 1) { c1Wallet = newAddress; } else if (idx == 2) { c2Wallet = newAddress; } else if (idx == 3) { c3Wallet = newAddress; } else if (idx == 4) { c4Wallet = newAddress; } else if (idx == 5) { c5Wallet = newAddress; } emit ChannelWalletsModified(newAddress, idx); } // disable Transfer delay - cannot be reenabled function disableTransferDelay() external onlyOwner returns (bool) { transferDelayEnabled = false; // not bothering with an event emission, as it's only called once return true; } function updateBuyFees( bool _enableC1, uint256 _c1Fee, bool _enableC2, uint256 _c2Fee, bool _enableC3, uint256 _c3Fee, bool _enableC4, uint256 _c4Fee, bool _enableC5, uint256 _c5Fee ) external onlyOwner { buyFeeC1Enabled = _enableC1; buyC1Fee = _c1Fee; buyFeeC2Enabled = _enableC2; buyC2Fee = _c2Fee; buyFeeC3Enabled = _enableC3; buyC3Fee = _c3Fee; buyFeeC4Enabled = _enableC4; buyC4Fee = _c4Fee; buyFeeC5Enabled = _enableC5; buyC5Fee = _c5Fee; buyTotalFees = _c1Fee + _c2Fee + _c3Fee + _c4Fee + _c5Fee; require(buyTotalFees <= 3000, "AGFI: Must keep fees at 30% or less"); emit FeesUpdated(); } function updateSellFees( bool _enableC1, uint256 _c1Fee, bool _enableC2, uint256 _c2Fee, bool _enableC3, uint256 _c3Fee, bool _enableC4, uint256 _c4Fee, bool _enableC5, uint256 _c5Fee ) external onlyOwner { sellFeeC1Enabled = _enableC1; sellC1Fee = _c1Fee; sellFeeC2Enabled = _enableC2; sellC2Fee = _c2Fee; sellFeeC3Enabled = _enableC3; sellC3Fee = _c3Fee; sellFeeC4Enabled = _enableC4; sellC4Fee = _c4Fee; sellFeeC5Enabled = _enableC5; sellC5Fee = _c5Fee; sellTotalFees = _c1Fee + _c2Fee + _c3Fee + _c4Fee + _c5Fee; require(sellTotalFees <= 3000, "AGFI: Must keep fees at 30% or less"); emit FeesUpdated(); } function snapshot() public onlyOwner { _snapshot(); } function _beforeTokenTransfer(address from, address to, uint256 amount) internal override(ERC20, ERC20Snapshot) { super._beforeTokenTransfer(from, to, amount); } function _afterTokenTransfer(address from, address to, uint256 amount) internal override(ERC20, ERC20Votes) { super._afterTokenTransfer(from, to, amount); } function _mint(address to, uint256 amount) internal override(ERC20, ERC20Votes) { super._mint(to, amount); } function _burn(address account, uint256 amount) internal override(ERC20, ERC20Votes) { super._burn(account, amount); } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "_transfer: transfer from the zero address"); require(to != address(0), "_transfer: transfer to the zero address"); require(!_blacklist[from], "_transfer: Sender is blacklisted"); require(!_blacklist[to], "_transfer: Recipient is blacklisted"); if (amount == 0) { _executeTransfer(from, to, 0); return; } if (limitsInEffect) { if ( from != owner() && to != owner() && to != address(0) && to != address(0xdead) && !swapping ) { if (!swapEnabled) { require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "_transfer: Trading is not active."); } // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch. if (transferDelayEnabled){ if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)) { require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer: Transfer Delay enabled. Only one purchase per block allowed."); _holderLastTransferTimestamp[tx.origin] = block.number; } } } } // anti bot logic if (block.number <= (launchedAt + 3) && to != uniswapV2Pair && to != address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D) ) { _blacklist[to] = true; emit BoughtEarly(to); } if ( swapEnabled && // only executeSwap when enabled !swapping && // and its not currently swapping (no reentry) !automatedMarketMakerPairs[from] && // no swap on remove liquidity step 1 or DEX buy from != address(uniswapV2Router) && // no swap on remove liquidity step 2 from != owner() && // and not the contract owner to != owner() ) { swapping = true; _executeSwap(); lastSwapTime = block.timestamp; swapping = false; } bool takeFee; if ( from == address(uniswapV2Pair) || to == address(uniswapV2Pair) || automatedMarketMakerPairs[to] || automatedMarketMakerPairs[from] || transferTaxEnabled ) { takeFee = true; } if (_isExcludedFromFees[from] || _isExcludedFromFees[to] || swapping || isCompounding || !transferTaxEnabled) { takeFee = false; } // only take fees on buys/sells, do not take on wallet transfers if (takeFee) { uint256 fees; // on sell if (automatedMarketMakerPairs[to] && sellTotalFees > 0) { fees = (amount * sellTotalFees) / 10000; if (sellFeeC1Enabled) { tokensForC1 += fees * sellC1Fee / sellTotalFees; } if (sellFeeC2Enabled) { tokensForC2 += fees * sellC2Fee / sellTotalFees; } if (sellFeeC3Enabled) { tokensForC3 += fees * sellC3Fee / sellTotalFees; } if (sellFeeC4Enabled) { tokensForC4 += fees * sellC4Fee / sellTotalFees; } if (sellFeeC5Enabled) { tokensForC5 += fees * sellC5Fee / sellTotalFees; } // on buy } else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) { fees = (amount * buyTotalFees) / 10000; if (buyFeeC1Enabled) { tokensForC1 += fees * buyC1Fee / buyTotalFees; } if (buyFeeC2Enabled) { tokensForC2 += fees * buyC2Fee / buyTotalFees; } if (buyFeeC3Enabled) { tokensForC3 += fees * buyC3Fee / buyTotalFees; } if (buyFeeC4Enabled) { tokensForC4 += fees * buyC4Fee / buyTotalFees; } if (buyFeeC5Enabled) { tokensForC5 += fees * buyC5Fee / buyTotalFees; } } amount -= fees; if (fees > 0){ _executeTransfer(from, address(this), fees); } } _executeTransfer(from, to, amount); rewardTracker.setBalance(payable(from), balanceOf(from)); rewardTracker.setBalance(payable(to), balanceOf(to)); } function _executeSwap() private { uint256 contractTokenBalance = balanceOf(address(this)); if (contractTokenBalance <= 0) { return; } if (swapIndex == 0 && swapC1Enabled && tokensForC1 > 0) { // channel 1 (treasury) swapTokensForNative(tokensForC1); (bool success, ) = payable(c1Wallet).call{value: address(this).balance}(""); if (success) { emit SendChannel1(tokensForC1); } else { emit LogErrorString("Wallet failed to receive channel 1 tokens"); } tokensForC1 = 0; } else if (swapIndex == 1 && swapC2Enabled && tokensForC2 > 0) { // channel 2 (burning) if (c2BurningEnabled) { _burn(address(this), tokensForC2); emit TokensBurned(tokensForC2); } else { swapTokensForNative(tokensForC2); (bool success, ) = payable(c2Wallet).call{value: address(this).balance}(""); if (success) { emit SendChannel2(tokensForC2); } else { emit LogErrorString("Wallet failed to receive channel 1 tokens"); } } tokensForC2 = 0; } else if (swapIndex == 2 && swapC3Enabled && tokensForC3 > 0) { // channel 3 (rewards) if (c3RewardsEnabled) { swapTokensForNative(tokensForC3); (bool success, ) = payable(rewardTracker).call{value: address(this).balance}(""); if (success) { emit SendChannel3(tokensForC3); } else { emit LogErrorString("Wallet failed to receive channel 3 tokens"); } } else { _executeTransfer(address(this), c3Wallet, tokensForC3); emit SendChannel3(tokensForC3); } tokensForC3 = 0; } else if (swapIndex == 3 && swapC4Enabled && tokensForC4 > 0) { // channel 4 (staking rewards) _executeTransfer(address(this), c4Wallet, tokensForC4); emit SendChannel4(tokensForC4); tokensForC4 = 0; } else if (swapIndex == 4 && swapC5Enabled && tokensForC5 > 0) { // channel 5 (operations funds) swapTokensForNative(tokensForC5); (bool success, ) = payable(c5Wallet).call{value: address(this).balance}(""); if (success) { emit SendChannel5(tokensForC5); } else { emit LogErrorString("Wallet failed to receive channel 5 tokens"); } tokensForC5 = 0; } if (swapIndex == 4) { swapIndex = 0; // reset back to the start } else { swapIndex++; // advance for the next swap call } } // withdraw tokens function withdrawCollectedFees() public onlyOwner { _executeTransfer(address(this), msg.sender, balanceOf(address(this))); tokensForC1 = 0; tokensForC2 = 0; tokensForC3 = 0; tokensForC4 = 0; tokensForC5 = 0; emit FeesWithdrawn(); } function _executeTransfer(address sender, address recipient, uint256 amount) private { super._transfer(sender, recipient, amount); } // withdraw native function withdrawCollectedNative() public onlyOwner { (bool success, ) = payable(msg.sender).call{value: address(this).balance}(""); if (success) { emit NativeWithdrawn(); } else { emit LogErrorString("Wallet failed to receive channel 5 tokens"); } } // swap the tokens back to ETH function swapTokensForNative(uint256 tokens) private { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokens); uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokens, 0, // accept any amount of native path, address(this), block.timestamp ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sniper","type":"address"}],"name":"BoughtEarly","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"C2BurningModified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"C3RewardsModified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ChangeSwapTokensAtAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":false,"internalType":"uint8","name":"idx","type":"uint8"}],"name":"ChannelWalletsModified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"CompoundingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"FeesWithdrawn","type":"event"},{"anonymous":false,"inputs":[],"name":"LimitsReinstated","type":"event"},{"anonymous":false,"inputs":[],"name":"LimitsRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"LogErrorString","type":"event"},{"anonymous":false,"inputs":[],"name":"NativeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendChannel1","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendChannel2","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendChannel3","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendChannel4","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendChannel5","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetRewardTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Snapshot","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TaxEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountBurned","type":"uint256"}],"name":"TokensBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TransferTaxEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"accumulativeRewardOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"balanceOfAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isBlacklisted","type":"bool"}],"name":"blacklistAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyC1Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyC2Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyC3Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyC4Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyC5Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeeC1Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeeC2Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeeC3Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeeC4Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeeC5Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"c1Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"c2BurningEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"c2Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"c3RewardsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"c3Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"c4Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"c5Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint32","name":"pos","type":"uint32"}],"name":"checkpoints","outputs":[{"components":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint224","name":"votes","type":"uint224"}],"internalType":"struct ERC20Votes.Checkpoint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compoundingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getLastClaimTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSwapTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"modifyC2Burning","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"modifyC3Rewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"},{"internalType":"uint8","name":"idx","type":"uint8"}],"name":"modifyChannelWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reinstateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardTracker","outputs":[{"internalType":"contract IRewardTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellC1Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellC2Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellC3Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellC4Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellC5Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeeC1Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeeC2Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeeC3Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeeC4Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeeC5Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setCompoundingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newTracker","type":"address"}],"name":"setRewardTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"c1","type":"bool"},{"internalType":"bool","name":"c2","type":"bool"},{"internalType":"bool","name":"c3","type":"bool"},{"internalType":"bool","name":"c4","type":"bool"},{"internalType":"bool","name":"c5","type":"bool"}],"name":"setSwapChannels","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setTransferTaxEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapC1Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapC2Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapC3Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapC4Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapC5Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapIndex","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForC1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForC2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForC3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForC4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForC5","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"totalSupplyAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferTaxEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enableC1","type":"bool"},{"internalType":"uint256","name":"_c1Fee","type":"uint256"},{"internalType":"bool","name":"_enableC2","type":"bool"},{"internalType":"uint256","name":"_c2Fee","type":"uint256"},{"internalType":"bool","name":"_enableC3","type":"bool"},{"internalType":"uint256","name":"_c3Fee","type":"uint256"},{"internalType":"bool","name":"_enableC4","type":"bool"},{"internalType":"uint256","name":"_c4Fee","type":"uint256"},{"internalType":"bool","name":"_enableC5","type":"bool"},{"internalType":"uint256","name":"_c5Fee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enableC1","type":"bool"},{"internalType":"uint256","name":"_c1Fee","type":"uint256"},{"internalType":"bool","name":"_enableC2","type":"bool"},{"internalType":"uint256","name":"_c2Fee","type":"uint256"},{"internalType":"bool","name":"_enableC3","type":"bool"},{"internalType":"uint256","name":"_c3Fee","type":"uint256"},{"internalType":"bool","name":"_enableC4","type":"bool"},{"internalType":"uint256","name":"_c4Fee","type":"uint256"},{"internalType":"bool","name":"_enableC5","type":"bool"},{"internalType":"uint256","name":"_c5Fee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawCollectedFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawCollectedNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableRewardOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawnRewardOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101a06040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610140526015805467ffffff000000ffff1916670100000000000101179055601880546001600160881b0319167001010101010101010101010101010100011790556104b06023556101906024819055600060255561012c6026819055602781905560c86028819055610514602955602a929092556064602b55602c819055602d55602e55348015620000b857600080fd5b5060405180604001604052806012815260200171416767726567617465642046696e616e636560701b81525080604051806040016040528060018152602001603160f81b81525060405180604001604052806012815260200171416767726567617465642046696e616e636560701b815250604051806040016040528060048152602001634147464960e01b81525081600390805190602001906200015f9291906200107d565b508051620001759060049060208401906200107d565b505050620001926200018c6200075b60201b60201c565b6200075f565b815160208084019190912082518383012060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81880181905281830187905260608201869052608082019490945230818401528151808203909301835260c00190528051940193909320919290916080523060c081905261012091909152601e80546001600160a01b0319908116733e822d55e79ea9f53c744bd9179d89ddec08155617909155601f805482167316cc620dbbacc751dab85d7fc1164c62858d9b9f9081179091556020805483168217905560218054831690911790556022805490911673f05e5aefecd9c370fbffff94c6c4614e6c165b78179055604051909550737a250d5630b4cf539739df2c5dacb4c659f2488d9450620002cf93509150620011089050565b6001600160a01b03928316815291166020820152604001604051809103906000f08015801562000303573d6000803e3d6000fd5b50600e60006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000384573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003aa91906200112d565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003f8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200041e91906200112d565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200046c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200049291906200112d565b6001600160a01b03808416610160528116610180529050620004b6816001620007b1565b600e54604051632ad4cab760e01b81526001600160a01b03909116600482018190526001602483015290632ad4cab790604401600060405180830381600087803b1580156200050457600080fd5b505af115801562000519573d6000803e3d6000fd5b5050600e54604051632ad4cab760e01b8152306004820152600160248201526001600160a01b039091169250632ad4cab79150604401600060405180830381600087803b1580156200056a57600080fd5b505af11580156200057f573d6000803e3d6000fd5b5050600e546001600160a01b03169150632ad4cab79050620005a96009546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260016024820152604401600060405180830381600087803b158015620005f257600080fd5b505af115801562000607573d6000803e3d6000fd5b5050600e54604051632ad4cab760e01b81526001600160a01b038681166004830152600160248301529091169250632ad4cab79150604401600060405180830381600087803b1580156200065a57600080fd5b505af11580156200066f573d6000803e3d6000fd5b5050600e54604051632ad4cab760e01b815261dead6004820152600160248201526001600160a01b039091169250632ad4cab79150604401600060405180830381600087803b158015620006c257600080fd5b505af1158015620006d7573d6000803e3d6000fd5b50505050620006f7620006ef6200080560201b60201c565b600162000814565b600e5462000710906001600160a01b0316600162000814565b6200071d30600162000814565b6200072c61dead600162000814565b62000753620007436009546001600160a01b031690565b683635c9adc5dea00000620008d3565b5050620011f5565b3390565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600081815260146020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6009546001600160a01b031690565b6009546001600160a01b03163314620008745760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b620008ea8282620008ee60201b62002baa1760201c565b5050565b620009058282620009a160201b62002c3a1760201c565b6001600160e01b036200091962000a9e8216565b1115620009825760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b60648201526084016200086b565b6200099b600d62002d2d62000aa460201b178362000ab9565b50505050565b6001600160a01b038216620009f95760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200086b565b62000a076000838362000c6b565b806002600082825462000a1b91906200116e565b90915550506001600160a01b0382166000908152602081905260408120805483929062000a4a9084906200116e565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3620008ea6000838362000c88565b60025490565b600062000ab282846200116e565b9392505050565b82546000908190801562000b0b578562000ad560018362001189565b8154811062000ae85762000ae8620011a3565b60009182526020909120015464010000000090046001600160e01b031662000b0e565b60005b6001600160e01b0316925062000b2583858760201c565b915060008111801562000b695750438662000b4260018462001189565b8154811062000b555762000b55620011a3565b60009182526020909120015463ffffffff16145b1562000bdd5762000b858262000ca060201b62002d391760201c565b8662000b9360018462001189565b8154811062000ba65762000ba6620011a3565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b0316021790555062000c62565b85604051806040016040528062000bff4362000d0f60201b62002da61760201c565b63ffffffff16815260200162000c208562000ca060201b62002d391760201c565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b62000c8383838362000d7660201b62002e0b1760201c565b505050565b62000c8383838362000de260201b62002e581760201c565b60006001600160e01b0382111562000d0b5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016200086b565b5090565b600063ffffffff82111562000d0b5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016200086b565b62000d8e83838362000c8360201b62002e2a1760201c565b6001600160a01b03831662000db25762000da88262000e2e565b62000c8362000e66565b6001600160a01b03821662000dcc5762000da88362000e2e565b62000dd78362000e2e565b62000c838262000e2e565b62000dfa83838362000c8360201b62002e2a1760201c565b6001600160a01b038381166000908152600b602052604080822054858416835291205462000c839291821691168362000e78565b6001600160a01b0381166000908152600560209081526040808320918390529091205462000e63919062000fb3565b62000fb3565b50565b62000e76600662000e5d60025490565b565b816001600160a01b0316836001600160a01b03161415801562000e9b5750600081115b1562000c83576001600160a01b0383161562000f28576001600160a01b0383166000908152600c602090815260408220829162000ee5919062001002901b62002e8a178562000ab9565b91509150846001600160a01b031660008051602062008b9c833981519152838360405162000f1d929190918252602082015260400190565b60405180910390a250505b6001600160a01b0382161562000c83576001600160a01b0382166000908152600c602090815260408220829162000f6c919062000aa4901b62002d2d178562000ab9565b91509150836001600160a01b031660008051602062008b9c833981519152838360405162000fa4929190918252602082015260400190565b60405180910390a25050505050565b600062000fbf62001010565b90508062000fcd846200102e565b101562000c83578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b600062000ab2828462001189565b60006200102960086200107960201b62002e961760201c565b905090565b805460009081036200104257506000919050565b81548290620010549060019062001189565b81548110620010675762001067620011a3565b90600052602060002001549050919050565b5490565b8280546200108b90620011b9565b90600052602060002090601f016020900481019282620010af5760008555620010fa565b82601f10620010ca57805160ff1916838001178555620010fa565b82800160010185558215620010fa579182015b82811115620010fa578251825591602001919060010190620010dd565b5062000d0b92915062001116565b611e008062006d9c83390190565b5b8082111562000d0b576000815560010162001117565b6000602082840312156200114057600080fd5b81516001600160a01b038116811462000ab257600080fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111562001184576200118462001158565b500190565b6000828210156200119e576200119e62001158565b500390565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680620011ce57607f821691505b602082108103620011ef57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051610140516101605161018051615af0620012ac60003960008181610a8001528181611da301528181613395015281816134910152818161362a01526136650152600081816107e7015281816133570152818161358e015281816150720152818161512b0152615167015260006122d801526000613c6701526000613cb601526000613c9101526000613bea01526000613c1401526000613c3e0152615af06000f3fe60806040526004361061066a5760003560e01c806376ac933011610344578063b3a65147116101b6578063dd62ed3e11610102578063f1127ed8116100a0578063f69e20461161007a578063f69e20461461139b578063f8d3d2c1146113b0578063f93d8701146113c6578063fc8783b4146113e757600080fd5b8063f1127ed814611311578063f2293bb01461135b578063f2fde38b1461137b57600080fd5b8063e4956ce2116100dc578063e4956ce21461129c578063e884f260146112bc578063eaf37db3146112d1578063efe1c78e146112f157600080fd5b8063dd62ed3e14611216578063e01af92c1461125c578063e3f1149c1461127c57600080fd5b8063c9df69bc1161016f578063d5fdb5a811610149578063d5fdb5a8146111b5578063d7a7b1bc146111d5578063d85ba063146111eb578063dd47050f1461120157600080fd5b8063c9df69bc14611153578063d123201514611174578063d505accf1461119557600080fd5b8063b3a651471461108d578063b62496f5146110ae578063c0246668146110de578063c3cda520146110fe578063c876d0b91461111e578063c91ea1511461113d57600080fd5b806395d89b4111610290578063a20623ce1161022e578063a680e0bc11610208578063a680e0bc1461100d578063a88d178f1461102d578063a9059cbb1461104d578063ad76d6861461106d57600080fd5b8063a20623ce14610f9d578063a2bfb7a214610fcd578063a457c2d714610fed57600080fd5b8063981b24d01161026a578063981b24d014610f1c57806399eb1b1614610f3c5780639a7a23d614610f5d5780639ab24eb014610f7d57600080fd5b806395d89b4114610ed157806396f9e9be14610ee65780639711715a14610f0757600080fd5b80637ecebe00116102fd5780638a8c523c116102d75780638a8c523c14610e695780638da5cb5b14610e7e5780638e539e8c14610e9c5780638e72697e14610ebc57600080fd5b80637ecebe0014610e1d57806383f7bf8c14610e3d57806385c366f414610e5357600080fd5b806376ac933014610d4a57806377cae33e14610d6a57806377d3eaad14610d7f57806379cc679014610d955780637b510fe814610db55780637ca8664714610e0757600080fd5b80633a46b1a8116104dd578063587cde1e116104295780636ddd1713116103c757806370a08231116103a157806370a0823114610cea578063715018a614610d0a578063751039fc14610d1f578063760f54cc14610d3457600080fd5b80636ddd171314610c7e5780636fc7e2cd14610c9f5780636fcfff4514610cb557600080fd5b80635c19a95c116104035780635c19a95c14610c125780636a486a8e14610c325780636bcb411a14610c485780636c49697f14610c6857600080fd5b8063587cde1e14610ba257806359463e0214610bdb5780635b5509cf14610bf157600080fd5b80634d9051ef116104965780634eeb4262116104705780634eeb426214610b125780634fbee19314610b2857806352d9f17514610b6157806356981c2814610b8257600080fd5b80634d9051ef14610abc5780634e71d92d14610add5780634ee2cd7e14610af257600080fd5b80633a46b1a8146109ed57806342966c6814610a0d57806343f4146b14610a2d578063491ca9fb14610a4d57806349bd5a5e14610a6e5780634a62bb6514610aa257600080fd5b8063248cc4a3116105b75780632f4504ae11610555578063363c4b291161052f578063363c4b291461097d5780633644e5151461099e578063372c0235146109b357806339509351146109cd57600080fd5b80632f4504ae1461091a578063313ce5671461093b57806332fa2df41461095d57600080fd5b80632814d5d2116105915780632814d5d2146108a05780632b54bebc146108c15780632d5a5d34146108d75780632e3fc9e2146108f957600080fd5b8063248cc4a31461083e578063248f20481461085e57806324dfa3831461087f57600080fd5b80630c70754e11610624578063159241d5116105fe578063159241d51461079d5780631694505e146107d557806318160ddd1461080957806323b872dd1461081e57600080fd5b80630c70754e146107515780630dd87157146107715780630f4507c11461078757600080fd5b806207dfb714610676578063010765ee146106ac57806305b3ccb4146106cb57806306fdde03146106f9578063095ea7b31461071b5780630c4bcbd11461073b57600080fd5b3661067157005b600080fd5b34801561068257600080fd5b5060185461069790600160281b900460ff1681565b60405190151581526020015b60405180910390f35b3480156106b857600080fd5b5060185461069790610100900460ff1681565b3480156106d757600080fd5b506106eb6106e636600461539b565b611407565b6040519081526020016106a3565b34801561070557600080fd5b5061070e61147d565b6040516106a391906153b8565b34801561072757600080fd5b5061069761073636600461540d565b61150f565b34801561074757600080fd5b506106eb601c5481565b34801561075d57600080fd5b506106eb61076c36600461539b565b611527565b34801561077d57600080fd5b506106eb60165481565b34801561079357600080fd5b506106eb602e5481565b3480156107a957600080fd5b50601e546107bd906001600160a01b031681565b6040516001600160a01b0390911681526020016106a3565b3480156107e157600080fd5b506107bd7f000000000000000000000000000000000000000000000000000000000000000081565b34801561081557600080fd5b506002546106eb565b34801561082a57600080fd5b50610697610839366004615439565b61155a565b34801561084a57600080fd5b506022546107bd906001600160a01b031681565b34801561086a57600080fd5b5060185461069790600160481b900460ff1681565b34801561088b57600080fd5b5060185461069790600160501b900460ff1681565b3480156108ac57600080fd5b5060185461069790600160201b900460ff1681565b3480156108cd57600080fd5b506106eb60245481565b3480156108e357600080fd5b506108f76108f2366004615488565b61157e565b005b34801561090557600080fd5b5060185461069790600160801b900460ff1681565b34801561092657600080fd5b5060155461069790600160381b900460ff1681565b34801561094757600080fd5b5060095b60405160ff90911681526020016106a3565b34801561096957600080fd5b506108f76109783660046154c1565b6115dc565b34801561098957600080fd5b5060185461069790600160301b900460ff1681565b3480156109aa57600080fd5b506106eb611660565b3480156109bf57600080fd5b506018546106979060ff1681565b3480156109d957600080fd5b506106976109e836600461540d565b61166f565b3480156109f957600080fd5b506106eb610a0836600461540d565b6116ae565b348015610a1957600080fd5b506108f7610a283660046154de565b611728565b348015610a3957600080fd5b50601f546107bd906001600160a01b031681565b348015610a5957600080fd5b5060185461069790600160781b900460ff1681565b348015610a7a57600080fd5b506107bd7f000000000000000000000000000000000000000000000000000000000000000081565b348015610aae57600080fd5b506015546106979060ff1681565b348015610ac857600080fd5b5060185461069790600160381b900460ff1681565b348015610ae957600080fd5b506108f7611735565b348015610afe57600080fd5b506106eb610b0d36600461540d565b6117b1565b348015610b1e57600080fd5b506106eb602a5481565b348015610b3457600080fd5b50610697610b4336600461539b565b6001600160a01b031660009081526012602052604090205460ff1690565b348015610b6d57600080fd5b50601854610697906301000000900460ff1681565b348015610b8e57600080fd5b506108f7610b9d366004615508565b6117fa565b348015610bae57600080fd5b506107bd610bbd36600461539b565b6001600160a01b039081166000908152600b60205260409020541690565b348015610be757600080fd5b506106eb60255481565b348015610bfd57600080fd5b5060185461069790600160681b900460ff1681565b348015610c1e57600080fd5b506108f7610c2d36600461539b565b6119a5565b348015610c3e57600080fd5b506106eb60295481565b348015610c5457600080fd5b50600e546107bd906001600160a01b031681565b348015610c7457600080fd5b506106eb602d5481565b348015610c8a57600080fd5b5060155461069790600160301b900460ff1681565b348015610cab57600080fd5b506106eb602c5481565b348015610cc157600080fd5b50610cd5610cd036600461539b565b6119af565b60405163ffffffff90911681526020016106a3565b348015610cf657600080fd5b506106eb610d0536600461539b565b6119d1565b348015610d1657600080fd5b506108f76119ec565b348015610d2b57600080fd5b506108f7611a22565b348015610d4057600080fd5b506106eb601a5481565b348015610d5657600080fd5b506021546107bd906001600160a01b031681565b348015610d7657600080fd5b506108f7611a81565b348015610d8b57600080fd5b506106eb601b5481565b348015610da157600080fd5b506108f7610db036600461540d565b611b43565b348015610dc157600080fd5b50610dd5610dd036600461539b565b611b5c565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a0016106a3565b348015610e1357600080fd5b506106eb60265481565b348015610e2957600080fd5b506106eb610e3836600461539b565b611be6565b348015610e4957600080fd5b506106eb60195481565b348015610e5f57600080fd5b506106eb601d5481565b348015610e7557600080fd5b506108f7611c04565b348015610e8a57600080fd5b506009546001600160a01b03166107bd565b348015610ea857600080fd5b506106eb610eb73660046154de565b611c4d565b348015610ec857600080fd5b506108f7611ca9565b348015610edd57600080fd5b5061070e611d0b565b348015610ef257600080fd5b5060155461069790600160281b900460ff1681565b348015610f1357600080fd5b506108f7611d1a565b348015610f2857600080fd5b506106eb610f373660046154de565b611d4c565b348015610f4857600080fd5b5060185461069790600160581b900460ff1681565b348015610f6957600080fd5b506108f7610f78366004615488565b611d77565b348015610f8957600080fd5b506106eb610f9836600461539b565b611e52565b348015610fa957600080fd5b50610697610fb836600461539b565b60116020526000908152604090205460ff1681565b348015610fd957600080fd5b506108f7610fe83660046154c1565b611ed8565b348015610ff957600080fd5b5061069761100836600461540d565b611f4f565b34801561101957600080fd5b506106eb61102836600461539b565b611fe1565b34801561103957600080fd5b506108f76110483660046154c1565b612014565b34801561105957600080fd5b5061069761106836600461540d565b61208b565b34801561107957600080fd5b506106eb61108836600461539b565b612099565b34801561109957600080fd5b5060155461094b906301000000900460ff1681565b3480156110ba57600080fd5b506106976110c936600461539b565b60146020526000908152604090205460ff1681565b3480156110ea57600080fd5b506108f76110f9366004615488565b6120cc565b34801561110a57600080fd5b506108f761111936600461553d565b61214e565b34801561112a57600080fd5b5060155461069790610100900460ff1681565b34801561114957600080fd5b506106eb60285481565b34801561115f57600080fd5b5060185461069790600160701b900460ff1681565b34801561118057600080fd5b5060185461069790600160401b900460ff1681565b3480156111a157600080fd5b506108f76111b0366004615597565b612284565b3480156111c157600080fd5b506108f76111d0366004615605565b6123e8565b3480156111e157600080fd5b506106eb602b5481565b3480156111f757600080fd5b506106eb60235481565b34801561120d57600080fd5b506108f761253f565b34801561122257600080fd5b506106eb6112313660046156a8565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561126857600080fd5b506108f76112773660046154c1565b6125c0565b34801561128857600080fd5b506108f7611297366004615605565b61263a565b3480156112a857600080fd5b506108f76112b73660046154c1565b61275c565b3480156112c857600080fd5b506106976127d7565b3480156112dd57600080fd5b506020546107bd906001600160a01b031681565b3480156112fd57600080fd5b506108f761130c3660046156d6565b612815565b34801561131d57600080fd5b5061133161132c366004615747565b6128b5565b60408051825163ffffffff1681526020928301516001600160e01b031692810192909252016106a3565b34801561136757600080fd5b506108f761137636600461539b565b612938565b34801561138757600080fd5b506108f761139636600461539b565b612a12565b3480156113a757600080fd5b506108f7612aaa565b3480156113bc57600080fd5b506106eb60275481565b3480156113d257600080fd5b5060185461069790600160601b900460ff1681565b3480156113f357600080fd5b506018546106979062010000900460ff1681565b600e5460405163016cf32d60e21b81526001600160a01b03838116600483015260009216906305b3ccb4906024015b602060405180830381865afa158015611453573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611477919061577e565b92915050565b60606003805461148c90615797565b80601f01602080910402602001604051908101604052809291908181526020018280546114b890615797565b80156115055780601f106114da57610100808354040283529160200191611505565b820191906000526020600020905b8154815290600101906020018083116114e857829003601f168201915b5050505050905090565b60003361151d818585612e9a565b5060019392505050565b600e546040516306383aa760e11b81526001600160a01b0383811660048301526000921690630c70754e90602401611436565b600033611568858285612fbe565b61157385858561304a565b506001949350505050565b6009546001600160a01b031633146115b15760405162461bcd60e51b81526004016115a8906157cb565b60405180910390fd5b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6009546001600160a01b031633146116065760405162461bcd60e51b81526004016115a8906157cb565b60158054821515600160281b0265ff0000000000199091161790556040517fc7d978b78e876fea3ff1cb54617b34636eafef663e201877549e8644ae29495f9061165590831515815260200190565b60405180910390a150565b600061166a613bdd565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061151d90829086906116a9908790615816565b612e9a565b60004382106116ff5760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e65640060448201526064016115a8565b6001600160a01b0383166000908152600c602052604090206117219083613d04565b9392505050565b6117323382613dc0565b50565b600e546001600160a01b031663807ab4f7336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af115801561178d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611732919061582e565b6001600160a01b0382166000908152600560205260408120819081906117d8908590613dca565b91509150816117ef576117ea856119d1565b6117f1565b805b95945050505050565b6009546001600160a01b031633146118245760405162461bcd60e51b81526004016115a8906157cb565b6001600160a01b03821661188c5760405162461bcd60e51b815260206004820152602960248201527f414746493a206e6577416464726573732063616e206e6f74206265207a65726f6044820152681030b2323932b9b99760b91b60648201526084016115a8565b8060ff166001036118b757601e80546001600160a01b0319166001600160a01b03841617905561195f565b8060ff166002036118e257601f80546001600160a01b0319166001600160a01b03841617905561195f565b8060ff1660030361190d57602080546001600160a01b0319166001600160a01b03841617905561195f565b8060ff1660040361193857602180546001600160a01b0319166001600160a01b03841617905561195f565b8060ff1660050361195f57602280546001600160a01b0319166001600160a01b0384161790555b60405160ff821681526001600160a01b038316907f44b4b43f7790513a495050ad13d875e38a4e8b7f68d8040dc33384d1f104ce11906020015b60405180910390a25050565b6117323382613ec0565b6001600160a01b0381166000908152600c602052604081205461147790612da6565b6001600160a01b031660009081526020819052604090205490565b6009546001600160a01b03163314611a165760405162461bcd60e51b81526004016115a8906157cb565b611a206000613f4f565b565b6009546001600160a01b03163314611a4c5760405162461bcd60e51b81526004016115a8906157cb565b6015805460ff191690556040517f7bfa7bacf025baa75e5308bf15bcf2948f406c7ebe3eb1a8bb611862b9d647ef90600090a1565b6009546001600160a01b03163314611aab5760405162461bcd60e51b81526004016115a8906157cb565b604051600090339047908381818185875af1925050503d8060008114611aed576040519150601f19603f3d011682016040523d82523d6000602084013e611af2565b606091505b505090508015611b28576040517f6b1863c66ca9fdf97b12fdcb00f3da82a54631b0d9729bbd23e0b056dba51d1f90600090a150565b600080516020615a9b8339815191526040516116559061584b565b611b4e823383612fbe565b611b588282613dc0565b5050565b600e54604051630f6a21fd60e31b81526001600160a01b0383811660048301526000928392839283928392911690637b510fe89060240160a060405180830381865afa158015611bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd49190615894565b939a9299509097509550909350915050565b6001600160a01b0381166000908152600a6020526040812054611477565b6009546001600160a01b03163314611c2e5760405162461bcd60e51b81526004016115a8906157cb565b6015805466ffff00000000001916660101000000000017905543601755565b6000438210611c9e5760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e65640060448201526064016115a8565b611477600d83613d04565b6009546001600160a01b03163314611cd35760405162461bcd60e51b81526004016115a8906157cb565b6015805460ff191660011790556040517fecd28d2c242feaa9f2efc5f2be891506d477b6836d1b969ccd5aa735fd5b38b190600090a1565b60606004805461148c90615797565b6009546001600160a01b03163314611d445760405162461bcd60e51b81526004016115a8906157cb565b611732613fa1565b6000806000611d5c846006613dca565b9150915081611d6d57600254611d6f565b805b949350505050565b6009546001600160a01b03163314611da15760405162461bcd60e51b81526004016115a8906157cb565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611e485760405162461bcd60e51b815260206004820152603f60248201527f414746493a2054686520706169722063616e6e6f742062652072656d6f76656460448201527f2066726f6d206175746f6d617465644d61726b65744d616b657250616972730060648201526084016115a8565b611b588282613ffb565b6001600160a01b0381166000908152600c60205260408120548015611ec5576001600160a01b0383166000908152600c60205260409020611e946001836158dd565b81548110611ea457611ea46158f4565b600091825260209091200154600160201b90046001600160e01b0316611ec8565b60005b6001600160e01b03169392505050565b6009546001600160a01b03163314611f025760405162461bcd60e51b81526004016115a8906157cb565b60188054821515600160801b0260ff60801b199091161790556040517f83283493c4a2ebc90693caf32194d32af62a993bb93a63c84ff55e325e4e97ee9061165590831515815260200190565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015611fd45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016115a8565b6115738286868403612e9a565b600e546040516329a0382f60e21b81526001600160a01b038381166004830152600092169063a680e0bc90602401611436565b6009546001600160a01b0316331461203e5760405162461bcd60e51b81526004016115a8906157cb565b60188054821515600160781b0260ff60781b199091161790556040517fd00f811311c98e2690397eeab86ca3288488a82a6c28c3ad8008c028ec4ed1b89061165590831515815260200190565b60003361151d81858561304a565b600e546040516356bb6b4360e11b81526001600160a01b038381166004830152600092169063ad76d68690602401611436565b6009546001600160a01b031633146120f65760405162461bcd60e51b81526004016115a8906157cb565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101611999565b8342111561219e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e6174757265206578706972656400000060448201526064016115a8565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090612218906122109060a0016040516020818303038152906040528051906020012061404f565b85858561409d565b9050612223816140c5565b86146122715760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e63650000000000000060448201526064016115a8565b61227b8188613ec0565b50505050505050565b834211156122d45760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016115a8565b60007f00000000000000000000000000000000000000000000000000000000000000008888886123038c6140c5565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061235e8261404f565b9050600061236e8287878761409d565b9050896001600160a01b0316816001600160a01b0316146123d15760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e6174757265000060448201526064016115a8565b6123dc8a8a8a612e9a565b50505050505050505050565b6009546001600160a01b031633146124125760405162461bcd60e51b81526004016115a8906157cb565b89601860006101000a81548160ff0219169083151502179055508860248190555087601860016101000a81548160ff0219169083151502179055508660258190555085601860026101000a81548160ff0219169083151502179055508460268190555083601860036101000a81548160ff0219169083151502179055508260278190555081601860046101000a81548160ff02191690831515021790555080602881905550808386898c6124c69190615816565b6124d09190615816565b6124da9190615816565b6124e49190615816565b6023819055610bb8101561250a5760405162461bcd60e51b81526004016115a89061590a565b6040517f6d58c6dc772669fca481506571330f160785469830c3888c824e5ff2e81c47d790600090a150505050505050505050565b6009546001600160a01b031633146125695760405162461bcd60e51b81526004016115a8906157cb565b61257c3033612577306119d1565b6140ed565b60006019819055601a819055601b819055601c819055601d8190556040517f63c585e69c20e5f8328de80a8e1deda016020c6dfa24ec58c7d89a748967f0309190a1565b6009546001600160a01b031633146125ea5760405162461bcd60e51b81526004016115a8906157cb565b60158054821515600160301b0266ff000000000000199091161790556040517fb9bbb15e341600c8d067a0cadeba219905d5ba6d422b193c9c32265d26fc51c89061165590831515815260200190565b6009546001600160a01b031633146126645760405162461bcd60e51b81526004016115a8906157cb565b89601860056101000a81548160ff02191690831515021790555088602a8190555087601860066101000a81548160ff02191690831515021790555086602b8190555085601860076101000a81548160ff02191690831515021790555084602c8190555083601860086101000a81548160ff02191690831515021790555082602d8190555081601860096101000a81548160ff02191690831515021790555080602e81905550808386898c6127189190615816565b6127229190615816565b61272c9190615816565b6127369190615816565b6029819055610bb8101561250a5760405162461bcd60e51b81526004016115a89061590a565b6009546001600160a01b031633146127865760405162461bcd60e51b81526004016115a8906157cb565b60158054821515600160381b0267ff00000000000000199091161790556040517f341322866a3a2c26c27efa4c270c5ba86f6963257118897dd8196f224c002d439061165590831515815260200190565b6009546000906001600160a01b031633146128045760405162461bcd60e51b81526004016115a8906157cb565b506015805461ff0019169055600190565b6009546001600160a01b0316331461283f5760405162461bcd60e51b81526004016115a8906157cb565b60188054911515600160701b0260ff60701b19931515600160681b0260ff60681b19951515600160601b029590951661ffff60601b19961515600160581b0260ff60581b19981515600160501b029890981661ffff60501b19909416939093179690961794909416179190911716919091179055565b60408051808201909152600080825260208201526001600160a01b0383166000908152600c60205260409020805463ffffffff84169081106128f9576128f96158f4565b60009182526020918290206040805180820190915291015463ffffffff81168252600160201b90046001600160e01b0316918101919091529392505050565b6009546001600160a01b031633146129625760405162461bcd60e51b81526004016115a8906157cb565b6001600160a01b0381166129c85760405162461bcd60e51b815260206004820152602760248201527f414746493a206e6577547261636b65722063616e6e6f74206265207a65726f206044820152666164647265737360c81b60648201526084016115a8565b600e80546001600160a01b0319166001600160a01b0383169081179091556040517f27d252e570592a130198f8a8e4fb0c66776ddd3c44cbff2e13059b63d8421a9390600090a250565b6009546001600160a01b03163314612a3c5760405162461bcd60e51b81526004016115a8906157cb565b6001600160a01b038116612aa15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016115a8565b61173281613f4f565b601554600160381b900460ff16612b035760405162461bcd60e51b815260206004820181905260248201527f414746493a20636f6d706f756e64696e67206973206e6f7420656e61626c656460448201526064016115a8565b6015805464ff000000001916600160201b179055600e546001600160a01b0316636de1a5a9612b2f3390565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af1158015612b75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b99919061582e565b506015805464ff0000000019169055565b612bb48282612c3a565b6002546001600160e01b031015612c265760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b60648201526084016115a8565b612c34600d612d2d836140f8565b50505050565b6001600160a01b038216612c905760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016115a8565b612c9c6000838361426f565b8060026000828254612cae9190615816565b90915550506001600160a01b03821660009081526020819052604081208054839290612cdb908490615816565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3611b586000838361427a565b60006117218284615816565b60006001600160e01b03821115612da25760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016115a8565b5090565b600063ffffffff821115612da25760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016115a8565b6001600160a01b038316612e2f57612e2282614285565b612e2a6142af565b505050565b6001600160a01b038216612e4657612e2283614285565b612e4f83614285565b612e2a82614285565b6001600160a01b038381166000908152600b6020526040808220548584168352912054612e2a929182169116836142bd565b600061172182846158dd565b5490565b6001600160a01b038316612efc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016115a8565b6001600160a01b038216612f5d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016115a8565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114612c34578181101561303d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016115a8565b612c348484848403612e9a565b6001600160a01b0383166130b25760405162461bcd60e51b815260206004820152602960248201527f5f7472616e736665723a207472616e736665722066726f6d20746865207a65726044820152686f206164647265737360b81b60648201526084016115a8565b6001600160a01b0382166131185760405162461bcd60e51b815260206004820152602760248201527f5f7472616e736665723a207472616e7366657220746f20746865207a65726f206044820152666164647265737360c81b60648201526084016115a8565b6001600160a01b03831660009081526011602052604090205460ff16156131815760405162461bcd60e51b815260206004820181905260248201527f5f7472616e736665723a2053656e64657220697320626c61636b6c697374656460448201526064016115a8565b6001600160a01b03821660009081526011602052604090205460ff16156131f65760405162461bcd60e51b815260206004820152602360248201527f5f7472616e736665723a20526563697069656e7420697320626c61636b6c69736044820152621d195960ea1b60648201526084016115a8565b8060000361320a57612e2a838360006140ed565b60155460ff1615613477576009546001600160a01b0384811691161480159061324157506009546001600160a01b03838116911614155b801561325557506001600160a01b03821615155b801561326c57506001600160a01b03821661dead14155b8015613281575060155462010000900460ff16155b1561347757601554600160301b900460ff1661332c576001600160a01b03831660009081526012602052604090205460ff16806132d657506001600160a01b03821660009081526012602052604090205460ff165b61332c5760405162461bcd60e51b815260206004820152602160248201527f5f7472616e736665723a2054726164696e67206973206e6f74206163746976656044820152601760f91b60648201526084016115a8565b601554610100900460ff1615613477576009546001600160a01b0383811691161480159061338c57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b80156133ca57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b15613477573260009081526013602052604090205443116134645760405162461bcd60e51b815260206004820152604860248201527f5f7472616e736665723a205472616e736665722044656c617920656e61626c6560448201527f642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b2060648201526730b63637bbb2b21760c11b608482015260a4016115a8565b3260009081526013602052604090204390555b601754613485906003615816565b43111580156134c657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b80156134ef57506001600160a01b038216737a250d5630b4cf539739df2c5dacb4c659f2488d14155b1561353e576001600160a01b038216600081815260116020526040808220805460ff19166001179055517fb90badc1cf1c52268f4fa9afb5276aebf640bcca3300cdfc9cf37db17daa13e29190a25b601554600160301b900460ff168015613560575060155462010000900460ff16155b801561358557506001600160a01b03831660009081526014602052604090205460ff16155b80156135c357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614155b80156135dd57506009546001600160a01b03848116911614155b80156135f757506009546001600160a01b03838116911614155b15613626576015805462ff00001916620100001790556136156143fa565b426016556015805462ff0000191690555b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316148061369957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316145b806136bc57506001600160a01b03831660009081526014602052604090205460ff165b806136df57506001600160a01b03841660009081526014602052604090205460ff165b806136f35750601554600160281b900460ff165b156136fc575060015b6001600160a01b03841660009081526012602052604090205460ff168061373b57506001600160a01b03831660009081526012602052604090205460ff165b8061374e575060155462010000900460ff165b806137625750601554600160201b900460ff165b806137775750601554600160281b900460ff16155b15613780575060005b8015613ad8576001600160a01b03831660009081526014602052604081205460ff1680156137b057506000602954115b1561392757612710602954846137c6919061594d565b6137d0919061596c565b601854909150600160281b900460ff161561381657602954602a546137f5908361594d565b6137ff919061596c565b601960008282546138109190615816565b90915550505b601854600160301b900460ff161561385957602954602b54613838908361594d565b613842919061596c565b601a60008282546138539190615816565b90915550505b601854600160381b900460ff161561389c57602954602c5461387b908361594d565b613885919061596c565b601b60008282546138969190615816565b90915550505b601854600160401b900460ff16156138df57602954602d546138be908361594d565b6138c8919061596c565b601c60008282546138d99190615816565b90915550505b601854600160481b900460ff161561392257602954602e54613901908361594d565b61390b919061596c565b601d600082825461391c9190615816565b90915550505b613ab9565b6001600160a01b03851660009081526014602052604090205460ff16801561395157506000602354115b15613ab95761271060235484613967919061594d565b613971919061596c565b60185490915060ff16156139b05760235460245461398f908361594d565b613999919061596c565b601960008282546139aa9190615816565b90915550505b601854610100900460ff16156139f1576023546025546139d0908361594d565b6139da919061596c565b601a60008282546139eb9190615816565b90915550505b60185462010000900460ff1615613a3357602354602654613a12908361594d565b613a1c919061596c565b601b6000828254613a2d9190615816565b90915550505b6018546301000000900460ff1615613a7657602354602754613a55908361594d565b613a5f919061596c565b601c6000828254613a709190615816565b90915550505b601854600160201b900460ff1615613ab957602354602854613a98908361594d565b613aa2919061596c565b601d6000828254613ab39190615816565b90915550505b613ac381846158dd565b92508015613ad657613ad68530836140ed565b505b613ae38484846140ed565b600e546001600160a01b031663e30443bc85613afe816119d1565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613b4457600080fd5b505af1158015613b58573d6000803e3d6000fd5b5050600e546001600160a01b0316915063e30443bc905084613b79816119d1565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613bbf57600080fd5b505af1158015613bd3573d6000803e3d6000fd5b5050505050505050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015613c3657507f000000000000000000000000000000000000000000000000000000000000000046145b15613c6057507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b81811015613d68576000613d1f8284614a4c565b905084868281548110613d3457613d346158f4565b60009182526020909120015463ffffffff161115613d5457809250613d62565b613d5f816001615816565b91505b50613d0b565b8115613dab5784613d7a6001846158dd565b81548110613d8a57613d8a6158f4565b600091825260209091200154600160201b90046001600160e01b0316613dae565b60005b6001600160e01b031695945050505050565b611b588282614a67565b60008060008411613e165760405162461bcd60e51b815260206004820152601660248201527504552433230536e617073686f743a20696420697320360541b60448201526064016115a8565b613e1e614a7f565b841115613e6d5760405162461bcd60e51b815260206004820152601d60248201527f4552433230536e617073686f743a206e6f6e6578697374656e7420696400000060448201526064016115a8565b6000613e798486614a8a565b84549091508103613e91576000809250925050613eb9565b6001846001018281548110613ea857613ea86158f4565b906000526020600020015492509250505b9250929050565b6001600160a01b038281166000908152600b602052604081205490911690613ee7846119d1565b6001600160a01b038581166000818152600b602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4612c348284836142bd565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000613fb1600880546001019055565b6000613fbb614a7f565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb6781604051613fee91815260200190565b60405180910390a1919050565b6001600160a01b038216600081815260146020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b600061147761405c613bdd565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006140ae87878787614b4f565b915091506140bb81614c3c565b5095945050505050565b6001600160a01b0381166000908152600a602052604090208054600181018255905b50919050565b612e2a838383614df2565b82546000908190801561414257856141116001836158dd565b81548110614121576141216158f4565b600091825260209091200154600160201b90046001600160e01b0316614145565b60005b6001600160e01b0316925061415e83858763ffffffff16565b915060008111801561419c575043866141786001846158dd565b81548110614188576141886158f4565b60009182526020909120015463ffffffff16145b156141fc576141aa82612d39565b866141b66001846158dd565b815481106141c6576141c66158f4565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b03160217905550614266565b85604051806040016040528061421143612da6565b63ffffffff16815260200161422585612d39565b6001600160e01b039081169091528254600181018455600093845260209384902083519490930151909116600160201b0263ffffffff909316929092179101555b50935093915050565b612e2a838383612e0b565b612e2a838383612e58565b6001600160a01b0381166000908152600560205260409020611732906142aa836119d1565b614fd1565b611a2060066142aa60025490565b816001600160a01b0316836001600160a01b0316141580156142df5750600081115b15612e2a576001600160a01b0383161561436d576001600160a01b0383166000908152600c60205260408120819061431a90612e8a856140f8565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051614362929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615612e2a576001600160a01b0382166000908152600c6020526040812081906143a390612d2d856140f8565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516143eb929190918252602082015260400190565b60405180910390a25050505050565b6000614405306119d1565b9050600081116144125750565b6015546301000000900460ff161580156144355750601854600160501b900460ff165b801561444357506000601954115b1561451e5761445360195461501b565b601e546040516000916001600160a01b03169047908381818185875af1925050503d80600081146144a0576040519150601f19603f3d011682016040523d82523d6000602084013e6144a5565b606091505b5050905080156144ef577fc8c35e282910145df6fa4ba7ef6cbd35b815836b54a4fc1d12022e89429eb9ce6019546040516144e291815260200190565b60405180910390a1614513565b600080516020615a9b83398151915260405161450a9061598e565b60405180910390a15b5060006019556149f2565b6015546301000000900460ff1660011480156145435750601854600160581b900460ff165b801561455157506000601a54115b1561468b57601854600160781b900460ff16156145b45761457430601a54613dc0565b7f6ef4855b666dcc7884561072e4358b28dfe01feb1b7f4dcebc00e62d50394ac7601a546040516145a791815260200190565b60405180910390a1614681565b6145bf601a5461501b565b601f546040516000916001600160a01b03169047908381818185875af1925050503d806000811461460c576040519150601f19603f3d011682016040523d82523d6000602084013e614611565b606091505b50509050801561465b577f445ad4c2896a7934aded290a8b2788b7bf9f30eddd5cd2cc37afd511a982440d601a5460405161464e91815260200190565b60405180910390a161467f565b600080516020615a9b8339815191526040516146769061598e565b60405180910390a15b505b6000601a556149f2565b6015546301000000900460ff1660021480156146b05750601854600160601b900460ff165b80156146be57506000601b54115b1561484d57601854600160801b900460ff16156147ea576146e0601b5461501b565b600e546040516000916001600160a01b03169047908381818185875af1925050503d806000811461472d576040519150601f19603f3d011682016040523d82523d6000602084013e614732565b606091505b50509050801561477c577f385335e8f2d93554f1e948d10df62c08f64d919eb4c750388917bd23027f6104601b5460405161476f91815260200190565b60405180910390a16147e4565b600080516020615a9b8339815191526040516147db9060208082526029908201527f57616c6c6574206661696c656420746f2072656365697665206368616e6e656c604082015268203320746f6b656e7360b81b606082015260800190565b60405180910390a15b50614843565b602054601b546148079130916001600160a01b03909116906140ed565b7f385335e8f2d93554f1e948d10df62c08f64d919eb4c750388917bd23027f6104601b5460405161483a91815260200190565b60405180910390a15b6000601b556149f2565b60155460ff63010000009091041660031480156148735750601854600160681b900460ff165b801561488157506000601c54115b156148e857602154601c546148a39130916001600160a01b03909116906140ed565b7f8ab07c09b14c48c645c26beb0ade80e983ae51912b8a1e2779bf19912dbe318f601c546040516148d691815260200190565b60405180910390a16000601c556149f2565b6015546301000000900460ff16600414801561490d5750601854600160701b900460ff165b801561491b57506000601d54115b156149f25761492b601d5461501b565b6022546040516000916001600160a01b03169047908381818185875af1925050503d8060008114614978576040519150601f19603f3d011682016040523d82523d6000602084013e61497d565b606091505b5050905080156149c7577ff66341b84052339b019e40d3b0fa2d0e140d7303ad384ad3aad95a667ecc219f601d546040516149ba91815260200190565b60405180910390a16149eb565b600080516020615a9b8339815191526040516149e29061584b565b60405180910390a15b506000601d555b6015546301000000900460ff16600403614a16576015805463ff0000001916905550565b601580546301000000900460ff16906003614a30836159d7565b91906101000a81548160ff021916908360ff1602179055505050565b6000614a5b600284841861596c565b61172190848416615816565b614a7182826151db565b612c34600d612e8a836140f8565b600061166a60085490565b81546000908103614a9d57506000611477565b82546000905b80821015614af9576000614ab78383614a4c565b905084868281548110614acc57614acc6158f4565b90600052602060002001541115614ae557809150614af3565b614af0816001615816565b92505b50614aa3565b600082118015614b2e57508385614b116001856158dd565b81548110614b2157614b216158f4565b9060005260206000200154145b15614b4757614b3e6001836158dd565b92505050611477565b509050611477565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115614b865750600090506003614c33565b8460ff16601b14158015614b9e57508460ff16601c14155b15614baf5750600090506004614c33565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614c03573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614c2c57600060019250925050614c33565b9150600090505b94509492505050565b6000816004811115614c5057614c506159f6565b03614c585750565b6001816004811115614c6c57614c6c6159f6565b03614cb95760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016115a8565b6002816004811115614ccd57614ccd6159f6565b03614d1a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016115a8565b6003816004811115614d2e57614d2e6159f6565b03614d865760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016115a8565b6004816004811115614d9a57614d9a6159f6565b036117325760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016115a8565b6001600160a01b038316614e565760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016115a8565b6001600160a01b038216614eb85760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016115a8565b614ec383838361426f565b6001600160a01b03831660009081526020819052604090205481811015614f3b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016115a8565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290614f72908490615816565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051614fbe91815260200190565b60405180910390a3612c3484848461427a565b6000614fdb614a7f565b905080614fe78461533c565b1015612e2a578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110615050576150506158f4565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156150ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150f29190615a0c565b81600181518110615105576151056158f4565b60200260200101906001600160a01b031690816001600160a01b031681525050615150307f000000000000000000000000000000000000000000000000000000000000000084612e9a565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906151a5908590600090869030904290600401615a29565b600060405180830381600087803b1580156151bf57600080fd5b505af11580156151d3573d6000803e3d6000fd5b505050505050565b6001600160a01b03821661523b5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016115a8565b6152478260008361426f565b6001600160a01b038216600090815260208190526040902054818110156152bb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016115a8565b6001600160a01b03831660009081526020819052604081208383039055600280548492906152ea9084906158dd565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3612e2a8360008461427a565b8054600090810361534f57506000919050565b8154829061535f906001906158dd565b8154811061536f5761536f6158f4565b90600052602060002001549050919050565b919050565b6001600160a01b038116811461173257600080fd5b6000602082840312156153ad57600080fd5b813561172181615386565b600060208083528351808285015260005b818110156153e5578581018301518582016040015282016153c9565b818111156153f7576000604083870101525b50601f01601f1916929092016040019392505050565b6000806040838503121561542057600080fd5b823561542b81615386565b946020939093013593505050565b60008060006060848603121561544e57600080fd5b833561545981615386565b9250602084013561546981615386565b929592945050506040919091013590565b801515811461173257600080fd5b6000806040838503121561549b57600080fd5b82356154a681615386565b915060208301356154b68161547a565b809150509250929050565b6000602082840312156154d357600080fd5b81356117218161547a565b6000602082840312156154f057600080fd5b5035919050565b803560ff8116811461538157600080fd5b6000806040838503121561551b57600080fd5b823561552681615386565b9150615534602084016154f7565b90509250929050565b60008060008060008060c0878903121561555657600080fd5b863561556181615386565b9550602087013594506040870135935061557d606088016154f7565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a0312156155b257600080fd5b87356155bd81615386565b965060208801356155cd81615386565b955060408801359450606088013593506155e9608089016154f7565b925060a0880135915060c0880135905092959891949750929550565b6000806000806000806000806000806101408b8d03121561562557600080fd5b8a356156308161547a565b995060208b0135985060408b01356156478161547a565b975060608b0135965060808b013561565e8161547a565b955060a08b0135945060c08b01356156758161547a565b935060e08b013592506101008b013561568d8161547a565b809250506101208b013590509295989b9194979a5092959850565b600080604083850312156156bb57600080fd5b82356156c681615386565b915060208301356154b681615386565b600080600080600060a086880312156156ee57600080fd5b85356156f98161547a565b945060208601356157098161547a565b935060408601356157198161547a565b925060608601356157298161547a565b915060808601356157398161547a565b809150509295509295909350565b6000806040838503121561575a57600080fd5b823561576581615386565b9150602083013563ffffffff811681146154b657600080fd5b60006020828403121561579057600080fd5b5051919050565b600181811c908216806157ab57607f821691505b6020821081036140e757634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561582957615829615800565b500190565b60006020828403121561584057600080fd5b81516117218161547a565b60208082526029908201527f57616c6c6574206661696c656420746f2072656365697665206368616e6e656c604082015268203520746f6b656e7360b81b606082015260800190565b600080600080600060a086880312156158ac57600080fd5b85516158b781615386565b602087015160408801516060890151608090990151929a91995097965090945092505050565b6000828210156158ef576158ef615800565b500390565b634e487b7160e01b600052603260045260246000fd5b60208082526023908201527f414746493a204d757374206b656570206665657320617420333025206f72206c60408201526265737360e81b606082015260800190565b600081600019048311821515161561596757615967615800565b500290565b60008261598957634e487b7160e01b600052601260045260246000fd5b500490565b60208082526029908201527f57616c6c6574206661696c656420746f2072656365697665206368616e6e656c604082015268203120746f6b656e7360b81b606082015260800190565b600060ff821660ff81036159ed576159ed615800565b60010192915050565b634e487b7160e01b600052602160045260246000fd5b600060208284031215615a1e57600080fd5b815161172181615386565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015615a795784516001600160a01b031683529383019391830191600101615a54565b50506001600160a01b0396909616606085015250505060800152939250505056fe551303dd5f39cbfe6daba6b3e27754b8a7d72f519756a2cde2b92c2bbde159a7a2646970667358221220d2b14285345d102843e0efaff3a24fc30a234f4b8a2f8e7a74c7fad78c04a85c64736f6c634300080d003360e06040523480156200001157600080fd5b5060405162001e0038038062001e008339810160408190526200003491620000cc565b6200003f336200005f565b633b9aca0060a0526001600160a01b0391821660c0521660805262000104565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620000c757600080fd5b919050565b60008060408385031215620000e057600080fd5b620000eb83620000af565b9150620000fb60208401620000af565b90509250929050565b60805160a05160c051611ca26200015e600039600081816104ad0152818161090701528181610fbb01528181611021015261118a01526000818161054d015281816109780152610d4c01526000610ef00152611ca26000f3fe6080604052600436106101d15760003560e01c8063807ab4f7116100f7578063ad76d68611610095578063eb53e21411610064578063eb53e214146105aa578063ee172546146105c0578063f2fde38b146105d6578063f82f235f146105f657600080fd5b8063ad76d68614610505578063c25907091461053b578063dd62ed3e1461056f578063e30443bc1461058a57600080fd5b806395d89b41116100d157806395d89b41146102185780639d76ea581461049b578063a680e0bc146104cf578063a9059cbb1461025957600080fd5b8063807ab4f7146104295780638357d0bb146104495780638da5cb5b1461046957600080fd5b80632ad4cab71161016f5780636f4a2cd01161013e5780636f4a2cd01461038457806370a082311461038c578063715018a6146103c25780637b510fe8146103d757600080fd5b80632ad4cab7146103125780633009a60914610332578063313ce567146103485780636de1a5a91461036457600080fd5b80630c70754e116101ab5780630c70754e146102895780630e832273146102a957806318160ddd146102e257806323b872dd146102f757600080fd5b806305b3ccb4146101e557806306fdde0314610218578063095ea7b31461025957600080fd5b366101e0576101de610626565b005b600080fd5b3480156101f157600080fd5b50610205610200366004611823565b6106f4565b6040519081526020015b60405180910390f35b34801561022457600080fd5b50604080518082018252601281527120a3a324afa932bbb0b9322a3930b1b5b2b960711b6020820152905161020f9190611847565b34801561026557600080fd5b5061027961027436600461189c565b610758565b604051901515815260200161020f565b34801561029557600080fd5b506102056102a4366004611823565b6107b6565b3480156102b557600080fd5b506102796102c4366004611823565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156102ee57600080fd5b50600254610205565b34801561030357600080fd5b506102796102743660046118c8565b34801561031e57600080fd5b506101de61032d366004611909565b6107e8565b34801561033e57600080fd5b5061020560015481565b34801561035457600080fd5b506040516009815260200161020f565b34801561037057600080fd5b5061027961037f366004611823565b610a02565b6101de610626565b34801561039857600080fd5b506102056103a7366004611823565b6001600160a01b031660009081526003602052604090205490565b3480156103ce57600080fd5b506101de610aad565b3480156103e357600080fd5b506103f76103f2366004611823565b610ae1565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a00161020f565b34801561043557600080fd5b50610279610444366004611823565b610b89565b34801561045557600080fd5b506101de610464366004611947565b610c2e565b34801561047557600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161020f565b3480156104a757600080fd5b506104837f000000000000000000000000000000000000000000000000000000000000000081565b3480156104db57600080fd5b506102056104ea366004611823565b6001600160a01b03166000908152600a602052604090205490565b34801561051157600080fd5b50610205610520366004611823565b6001600160a01b031660009081526009602052604090205490565b34801561054757600080fd5b506102057f000000000000000000000000000000000000000000000000000000000000000081565b34801561057b57600080fd5b5061020561027436600461196c565b34801561059657600080fd5b506101de6105a536600461189c565b610d00565b3480156105b657600080fd5b5061020560065481565b3480156105cc57600080fd5b5061020560055481565b3480156105e257600080fd5b506101de6105f1366004611823565b610d8a565b34801561060257600080fd5b50610279610611366004611823565b60076020526000908152604090205460ff1681565b6000600254116106745760405162461bcd60e51b8152602060048201526014602482015273151bdd185b081cdd5c1c1b1e481a5b9d985b1a5960621b60448201526064015b60405180910390fd5b34156106f25760025461068b600160801b346119b0565b61069591906119cf565b6004546106a291906119f1565b60045560405134815233907fdf29796aad820e4bb192f3a8d631b76519bcd2cbe77cc85af20e9df53cece0869060200160405180910390a234600560008282546106ec91906119f1565b90915550505b565b6001600160a01b038116600090815260036020526040812054600454829161071b916119b0565b6001600160a01b038416600090815260086020526040902054909150600160801b6107468284611a09565b61075091906119cf565b949350505050565b60405162461bcd60e51b815260206004820152602a60248201527f414746495f526577617264547261636b65723a206d6574686f64206e6f7420696044820152691b5c1b195b595b9d195960b21b606482015260009060840161066b565b6001600160a01b0381166000908152600960205260408120546107d8836106f4565b6107e29190611a4a565b92915050565b6000546001600160a01b031633146108125760405162461bcd60e51b815260040161066b90611a61565b6001600160a01b03821660009081526007602052604090205481151560ff9091161515036108a85760405162461bcd60e51b815260206004820152603a60248201527f414746495f526577617264547261636b65723a206163636f756e7420616c726560448201527f6164792073657420746f20726571756573746564207374617465000000000000606482015260840161066b565b6001600160a01b0382166000908152600760205260409020805460ff191682158015919091179091556108e5576108e0826000610e25565b6109b9565b6040516370a0823160e01b81526001600160a01b0383811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610950573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109749190611a96565b90507f000000000000000000000000000000000000000000000000000000000000000081106109ac576109a78382610e25565b6109b7565b6109b7836000610e25565b505b816001600160a01b03167facf40045c9516ed93201cbb27e9656cc33f8636b026b0e20b4f6ddcfccf404aa826040516109f6911515815260200190565b60405180910390a25050565b600080546001600160a01b03163314610a2d5760405162461bcd60e51b815260040161066b90611a61565b600080610a3984610e83565b90925090508115610aa3576001600160a01b0384166000818152600a602090815260409182902042905581518581529081018490527f0e311a2c6dbfb0153ec3a8a5bdca09070b3e5f60768fdc10a20453f38d186873910160405180910390a25060019392505050565b5060009392505050565b6000546001600160a01b03163314610ad75760405162461bcd60e51b815260040161066b90611a61565b6106f26000611318565b6000806000806000610b1d604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b6001600160a01b0387168152610b32876107b6565b6020820152610b40876106f4565b60408281019182526001600160a01b03989098166000908152600a6020908152989020546060830181905282519890920151905160065498999198909750919550909350915050565b600080546001600160a01b03163314610bb45760405162461bcd60e51b815260040161066b90611a61565b6000610bbf83611368565b90508015610c25576001600160a01b0383166000818152600a602052604090819020429055517f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d490610c149084815260200190565b60405180910390a250600192915050565b50600092915050565b6000546001600160a01b03163314610c585760405162461bcd60e51b815260040161066b90611a61565b4760006001600160a01b03831684610c705782610c72565b845b604051600081818185875af1925050503d8060008114610cae576040519150601f19603f3d011682016040523d82523d6000602084013e610cb3565b606091505b5050905080610cfa5760405162461bcd60e51b815260206004820152601360248201527226b0b73ab0b61039b2b732103330b4b632b21760691b604482015260640161066b565b50505050565b6000546001600160a01b03163314610d2a5760405162461bcd60e51b815260040161066b90611a61565b6001600160a01b03821660009081526007602052604090205460ff16610d7b577f00000000000000000000000000000000000000000000000000000000000000008110610d7f57610d7b8282610e25565b5050565b610d7b826000610e25565b6000546001600160a01b03163314610db45760405162461bcd60e51b815260040161066b90611a61565b6001600160a01b038116610e195760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161066b565b610e2281611318565b50565b6001600160a01b03821660009081526003602052604090205480821115610e5e576000610e528284611a4a565b9050610cfa848261150f565b80821015610e7e576000610e728383611a4a565b9050610cfa8482611650565b505050565b6000806000610e91846107b6565b9050801561130c576001600160a01b03841660009081526009602052604081208054839290610ec19084906119f1565b925050819055508060066000828254610eda91906119f1565b90915550506040805160028082526060820183527f0000000000000000000000000000000000000000000000000000000000000000926000929190602083019080368337019050509050816001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f869190611aaf565b81600081518110610f9957610f99611acc565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610fed57610fed611acc565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b81528782166004820152600091829182917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611068573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108c9190611a96565b9050846001600160a01b031663b6f9de95876000878d426040518663ffffffff1660e01b81526004016110c29493929190611ae2565b6000604051808303818588803b1580156110db57600080fd5b505af1935050505080156110ed575060015b611165576110f9611b4c565b806308c379a003611159575061110d611ba3565b80611118575061115b565b7f551303dd5f39cbfe6daba6b3e27754b8a7d72f519756a2cde2b92c2bbde159a7816040516111479190611847565b60405180910390a16000935050611204565b505b3d6000803e3d6000fd5b6040516370a0823160e01b81526001600160a01b038a811660048301526001945082917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156111d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f79190611a96565b6112019190611a4a565b91505b826112ba576001600160a01b03891660009081526009602052604081208054889290611231908490611a4a565b92505081905550856006600082825461124a9190611a4a565b90915550506040517f551303dd5f39cbfe6daba6b3e27754b8a7d72f519756a2cde2b92c2bbde159a7906112a1906020808252600f908201526e15da5d1a191c985dc819985a5b1959608a1b604082015260600190565b60405180910390a1506000988998509650505050505050565b886001600160a01b03167f1d3eee4ca001cff39eec6ec7615aacf2f2bd61791273830728ba00ccbd6e1337876040516112f591815260200190565b60405180910390a250939793965092945050505050565b50600093849350915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080611374836107b6565b90508015610c25576001600160a01b038316600090815260096020526040812080548392906113a49084906119f1565b9250508190555080600660008282546113bd91906119f1565b90915550506040516000906001600160a01b0385169083908381818185875af1925050503d806000811461140d576040519150601f19603f3d011682016040523d82523d6000602084013e611412565b606091505b50509050806114c5576001600160a01b03841660009081526009602052604081208054849290611443908490611a4a565b92505081905550816006600082825461145c9190611a4a565b90915550506040517f551303dd5f39cbfe6daba6b3e27754b8a7d72f519756a2cde2b92c2bbde159a7906114b3906020808252600f908201526e15da5d1a191c985dc819985a5b1959608a1b604082015260600190565b60405180910390a15060009392505050565b836001600160a01b03167f1d3eee4ca001cff39eec6ec7615aacf2f2bd61791273830728ba00ccbd6e13378360405161150091815260200190565b60405180910390a25092915050565b6001600160a01b03821661157a5760405162461bcd60e51b815260206004820152602c60248201527f414746495f526577617264547261636b65723a206d696e7420746f207468652060448201526b7a65726f206164647265737360a01b606482015260840161066b565b806002600082825461158c91906119f1565b90915550506001600160a01b038216600090815260036020526040812080548392906115b99084906119f1565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a38060045461160d91906119b0565b6001600160a01b0383166000908152600860205260409020546116309190611c2d565b6001600160a01b0390921660009081526008602052604090209190915550565b6001600160a01b0382166116bd5760405162461bcd60e51b815260206004820152602e60248201527f414746495f526577617264547261636b65723a206275726e2066726f6d20746860448201526d65207a65726f206164647265737360901b606482015260840161066b565b6001600160a01b0382166000908152600360205260409020548181101561173e5760405162461bcd60e51b815260206004820152602f60248201527f414746495f526577617264547261636b65723a206275726e20616d6f756e742060448201526e657863656564732062616c616e636560881b606482015260840161066b565b6117488282611a4a565b6001600160a01b03841660009081526003602052604081209190915560028054849290611776908490611a4a565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3816004546117ca91906119b0565b6001600160a01b0384166000908152600860205260409020546117ed9190611a09565b6001600160a01b039093166000908152600860205260409020929092555050565b6001600160a01b0381168114610e2257600080fd5b60006020828403121561183557600080fd5b81356118408161180e565b9392505050565b600060208083528351808285015260005b8181101561187457858101830151858201604001528201611858565b81811115611886576000604083870101525b50601f01601f1916929092016040019392505050565b600080604083850312156118af57600080fd5b82356118ba8161180e565b946020939093013593505050565b6000806000606084860312156118dd57600080fd5b83356118e88161180e565b925060208401356118f88161180e565b929592945050506040919091013590565b6000806040838503121561191c57600080fd5b82356119278161180e565b91506020830135801515811461193c57600080fd5b809150509250929050565b6000806040838503121561195a57600080fd5b82359150602083013561193c8161180e565b6000806040838503121561197f57600080fd5b823561198a8161180e565b9150602083013561193c8161180e565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156119ca576119ca61199a565b500290565b6000826119ec57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115611a0457611a0461199a565b500190565b600080821280156001600160ff1b0384900385131615611a2b57611a2b61199a565b600160ff1b8390038412811615611a4457611a4461199a565b50500190565b600082821015611a5c57611a5c61199a565b500390565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611aa857600080fd5b5051919050565b600060208284031215611ac157600080fd5b81516118408161180e565b634e487b7160e01b600052603260045260246000fd5b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015611b2c5784516001600160a01b031683529383019391830191600101611b07565b50506001600160a01b039690961660408501525050506060015292915050565b600060033d1115611b655760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff81118282101715611b9c57634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d1015611bb15790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715611be157505050505090565b8285019150815181811115611bf95750505050505090565b843d8701016020828501011115611c135750505050505090565b611c2260208286010187611b68565b509095945050505050565b60008083128015600160ff1b850184121615611c4b57611c4b61199a565b6001600160ff1b0384018313811615611c6657611c6661199a565b5050039056fea2646970667358221220f77d010c149c6bd02e88b843a6d6bbc01ffd386ddde250c77fa06b778ccf7d7764736f6c634300080d0033dec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724
Deployed Bytecode
0x60806040526004361061066a5760003560e01c806376ac933011610344578063b3a65147116101b6578063dd62ed3e11610102578063f1127ed8116100a0578063f69e20461161007a578063f69e20461461139b578063f8d3d2c1146113b0578063f93d8701146113c6578063fc8783b4146113e757600080fd5b8063f1127ed814611311578063f2293bb01461135b578063f2fde38b1461137b57600080fd5b8063e4956ce2116100dc578063e4956ce21461129c578063e884f260146112bc578063eaf37db3146112d1578063efe1c78e146112f157600080fd5b8063dd62ed3e14611216578063e01af92c1461125c578063e3f1149c1461127c57600080fd5b8063c9df69bc1161016f578063d5fdb5a811610149578063d5fdb5a8146111b5578063d7a7b1bc146111d5578063d85ba063146111eb578063dd47050f1461120157600080fd5b8063c9df69bc14611153578063d123201514611174578063d505accf1461119557600080fd5b8063b3a651471461108d578063b62496f5146110ae578063c0246668146110de578063c3cda520146110fe578063c876d0b91461111e578063c91ea1511461113d57600080fd5b806395d89b4111610290578063a20623ce1161022e578063a680e0bc11610208578063a680e0bc1461100d578063a88d178f1461102d578063a9059cbb1461104d578063ad76d6861461106d57600080fd5b8063a20623ce14610f9d578063a2bfb7a214610fcd578063a457c2d714610fed57600080fd5b8063981b24d01161026a578063981b24d014610f1c57806399eb1b1614610f3c5780639a7a23d614610f5d5780639ab24eb014610f7d57600080fd5b806395d89b4114610ed157806396f9e9be14610ee65780639711715a14610f0757600080fd5b80637ecebe00116102fd5780638a8c523c116102d75780638a8c523c14610e695780638da5cb5b14610e7e5780638e539e8c14610e9c5780638e72697e14610ebc57600080fd5b80637ecebe0014610e1d57806383f7bf8c14610e3d57806385c366f414610e5357600080fd5b806376ac933014610d4a57806377cae33e14610d6a57806377d3eaad14610d7f57806379cc679014610d955780637b510fe814610db55780637ca8664714610e0757600080fd5b80633a46b1a8116104dd578063587cde1e116104295780636ddd1713116103c757806370a08231116103a157806370a0823114610cea578063715018a614610d0a578063751039fc14610d1f578063760f54cc14610d3457600080fd5b80636ddd171314610c7e5780636fc7e2cd14610c9f5780636fcfff4514610cb557600080fd5b80635c19a95c116104035780635c19a95c14610c125780636a486a8e14610c325780636bcb411a14610c485780636c49697f14610c6857600080fd5b8063587cde1e14610ba257806359463e0214610bdb5780635b5509cf14610bf157600080fd5b80634d9051ef116104965780634eeb4262116104705780634eeb426214610b125780634fbee19314610b2857806352d9f17514610b6157806356981c2814610b8257600080fd5b80634d9051ef14610abc5780634e71d92d14610add5780634ee2cd7e14610af257600080fd5b80633a46b1a8146109ed57806342966c6814610a0d57806343f4146b14610a2d578063491ca9fb14610a4d57806349bd5a5e14610a6e5780634a62bb6514610aa257600080fd5b8063248cc4a3116105b75780632f4504ae11610555578063363c4b291161052f578063363c4b291461097d5780633644e5151461099e578063372c0235146109b357806339509351146109cd57600080fd5b80632f4504ae1461091a578063313ce5671461093b57806332fa2df41461095d57600080fd5b80632814d5d2116105915780632814d5d2146108a05780632b54bebc146108c15780632d5a5d34146108d75780632e3fc9e2146108f957600080fd5b8063248cc4a31461083e578063248f20481461085e57806324dfa3831461087f57600080fd5b80630c70754e11610624578063159241d5116105fe578063159241d51461079d5780631694505e146107d557806318160ddd1461080957806323b872dd1461081e57600080fd5b80630c70754e146107515780630dd87157146107715780630f4507c11461078757600080fd5b806207dfb714610676578063010765ee146106ac57806305b3ccb4146106cb57806306fdde03146106f9578063095ea7b31461071b5780630c4bcbd11461073b57600080fd5b3661067157005b600080fd5b34801561068257600080fd5b5060185461069790600160281b900460ff1681565b60405190151581526020015b60405180910390f35b3480156106b857600080fd5b5060185461069790610100900460ff1681565b3480156106d757600080fd5b506106eb6106e636600461539b565b611407565b6040519081526020016106a3565b34801561070557600080fd5b5061070e61147d565b6040516106a391906153b8565b34801561072757600080fd5b5061069761073636600461540d565b61150f565b34801561074757600080fd5b506106eb601c5481565b34801561075d57600080fd5b506106eb61076c36600461539b565b611527565b34801561077d57600080fd5b506106eb60165481565b34801561079357600080fd5b506106eb602e5481565b3480156107a957600080fd5b50601e546107bd906001600160a01b031681565b6040516001600160a01b0390911681526020016106a3565b3480156107e157600080fd5b506107bd7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561081557600080fd5b506002546106eb565b34801561082a57600080fd5b50610697610839366004615439565b61155a565b34801561084a57600080fd5b506022546107bd906001600160a01b031681565b34801561086a57600080fd5b5060185461069790600160481b900460ff1681565b34801561088b57600080fd5b5060185461069790600160501b900460ff1681565b3480156108ac57600080fd5b5060185461069790600160201b900460ff1681565b3480156108cd57600080fd5b506106eb60245481565b3480156108e357600080fd5b506108f76108f2366004615488565b61157e565b005b34801561090557600080fd5b5060185461069790600160801b900460ff1681565b34801561092657600080fd5b5060155461069790600160381b900460ff1681565b34801561094757600080fd5b5060095b60405160ff90911681526020016106a3565b34801561096957600080fd5b506108f76109783660046154c1565b6115dc565b34801561098957600080fd5b5060185461069790600160301b900460ff1681565b3480156109aa57600080fd5b506106eb611660565b3480156109bf57600080fd5b506018546106979060ff1681565b3480156109d957600080fd5b506106976109e836600461540d565b61166f565b3480156109f957600080fd5b506106eb610a0836600461540d565b6116ae565b348015610a1957600080fd5b506108f7610a283660046154de565b611728565b348015610a3957600080fd5b50601f546107bd906001600160a01b031681565b348015610a5957600080fd5b5060185461069790600160781b900460ff1681565b348015610a7a57600080fd5b506107bd7f000000000000000000000000070218af9447906761047c8a1391a342d6d3064881565b348015610aae57600080fd5b506015546106979060ff1681565b348015610ac857600080fd5b5060185461069790600160381b900460ff1681565b348015610ae957600080fd5b506108f7611735565b348015610afe57600080fd5b506106eb610b0d36600461540d565b6117b1565b348015610b1e57600080fd5b506106eb602a5481565b348015610b3457600080fd5b50610697610b4336600461539b565b6001600160a01b031660009081526012602052604090205460ff1690565b348015610b6d57600080fd5b50601854610697906301000000900460ff1681565b348015610b8e57600080fd5b506108f7610b9d366004615508565b6117fa565b348015610bae57600080fd5b506107bd610bbd36600461539b565b6001600160a01b039081166000908152600b60205260409020541690565b348015610be757600080fd5b506106eb60255481565b348015610bfd57600080fd5b5060185461069790600160681b900460ff1681565b348015610c1e57600080fd5b506108f7610c2d36600461539b565b6119a5565b348015610c3e57600080fd5b506106eb60295481565b348015610c5457600080fd5b50600e546107bd906001600160a01b031681565b348015610c7457600080fd5b506106eb602d5481565b348015610c8a57600080fd5b5060155461069790600160301b900460ff1681565b348015610cab57600080fd5b506106eb602c5481565b348015610cc157600080fd5b50610cd5610cd036600461539b565b6119af565b60405163ffffffff90911681526020016106a3565b348015610cf657600080fd5b506106eb610d0536600461539b565b6119d1565b348015610d1657600080fd5b506108f76119ec565b348015610d2b57600080fd5b506108f7611a22565b348015610d4057600080fd5b506106eb601a5481565b348015610d5657600080fd5b506021546107bd906001600160a01b031681565b348015610d7657600080fd5b506108f7611a81565b348015610d8b57600080fd5b506106eb601b5481565b348015610da157600080fd5b506108f7610db036600461540d565b611b43565b348015610dc157600080fd5b50610dd5610dd036600461539b565b611b5c565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a0016106a3565b348015610e1357600080fd5b506106eb60265481565b348015610e2957600080fd5b506106eb610e3836600461539b565b611be6565b348015610e4957600080fd5b506106eb60195481565b348015610e5f57600080fd5b506106eb601d5481565b348015610e7557600080fd5b506108f7611c04565b348015610e8a57600080fd5b506009546001600160a01b03166107bd565b348015610ea857600080fd5b506106eb610eb73660046154de565b611c4d565b348015610ec857600080fd5b506108f7611ca9565b348015610edd57600080fd5b5061070e611d0b565b348015610ef257600080fd5b5060155461069790600160281b900460ff1681565b348015610f1357600080fd5b506108f7611d1a565b348015610f2857600080fd5b506106eb610f373660046154de565b611d4c565b348015610f4857600080fd5b5060185461069790600160581b900460ff1681565b348015610f6957600080fd5b506108f7610f78366004615488565b611d77565b348015610f8957600080fd5b506106eb610f9836600461539b565b611e52565b348015610fa957600080fd5b50610697610fb836600461539b565b60116020526000908152604090205460ff1681565b348015610fd957600080fd5b506108f7610fe83660046154c1565b611ed8565b348015610ff957600080fd5b5061069761100836600461540d565b611f4f565b34801561101957600080fd5b506106eb61102836600461539b565b611fe1565b34801561103957600080fd5b506108f76110483660046154c1565b612014565b34801561105957600080fd5b5061069761106836600461540d565b61208b565b34801561107957600080fd5b506106eb61108836600461539b565b612099565b34801561109957600080fd5b5060155461094b906301000000900460ff1681565b3480156110ba57600080fd5b506106976110c936600461539b565b60146020526000908152604090205460ff1681565b3480156110ea57600080fd5b506108f76110f9366004615488565b6120cc565b34801561110a57600080fd5b506108f761111936600461553d565b61214e565b34801561112a57600080fd5b5060155461069790610100900460ff1681565b34801561114957600080fd5b506106eb60285481565b34801561115f57600080fd5b5060185461069790600160701b900460ff1681565b34801561118057600080fd5b5060185461069790600160401b900460ff1681565b3480156111a157600080fd5b506108f76111b0366004615597565b612284565b3480156111c157600080fd5b506108f76111d0366004615605565b6123e8565b3480156111e157600080fd5b506106eb602b5481565b3480156111f757600080fd5b506106eb60235481565b34801561120d57600080fd5b506108f761253f565b34801561122257600080fd5b506106eb6112313660046156a8565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561126857600080fd5b506108f76112773660046154c1565b6125c0565b34801561128857600080fd5b506108f7611297366004615605565b61263a565b3480156112a857600080fd5b506108f76112b73660046154c1565b61275c565b3480156112c857600080fd5b506106976127d7565b3480156112dd57600080fd5b506020546107bd906001600160a01b031681565b3480156112fd57600080fd5b506108f761130c3660046156d6565b612815565b34801561131d57600080fd5b5061133161132c366004615747565b6128b5565b60408051825163ffffffff1681526020928301516001600160e01b031692810192909252016106a3565b34801561136757600080fd5b506108f761137636600461539b565b612938565b34801561138757600080fd5b506108f761139636600461539b565b612a12565b3480156113a757600080fd5b506108f7612aaa565b3480156113bc57600080fd5b506106eb60275481565b3480156113d257600080fd5b5060185461069790600160601b900460ff1681565b3480156113f357600080fd5b506018546106979062010000900460ff1681565b600e5460405163016cf32d60e21b81526001600160a01b03838116600483015260009216906305b3ccb4906024015b602060405180830381865afa158015611453573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611477919061577e565b92915050565b60606003805461148c90615797565b80601f01602080910402602001604051908101604052809291908181526020018280546114b890615797565b80156115055780601f106114da57610100808354040283529160200191611505565b820191906000526020600020905b8154815290600101906020018083116114e857829003601f168201915b5050505050905090565b60003361151d818585612e9a565b5060019392505050565b600e546040516306383aa760e11b81526001600160a01b0383811660048301526000921690630c70754e90602401611436565b600033611568858285612fbe565b61157385858561304a565b506001949350505050565b6009546001600160a01b031633146115b15760405162461bcd60e51b81526004016115a8906157cb565b60405180910390fd5b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6009546001600160a01b031633146116065760405162461bcd60e51b81526004016115a8906157cb565b60158054821515600160281b0265ff0000000000199091161790556040517fc7d978b78e876fea3ff1cb54617b34636eafef663e201877549e8644ae29495f9061165590831515815260200190565b60405180910390a150565b600061166a613bdd565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061151d90829086906116a9908790615816565b612e9a565b60004382106116ff5760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e65640060448201526064016115a8565b6001600160a01b0383166000908152600c602052604090206117219083613d04565b9392505050565b6117323382613dc0565b50565b600e546001600160a01b031663807ab4f7336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af115801561178d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611732919061582e565b6001600160a01b0382166000908152600560205260408120819081906117d8908590613dca565b91509150816117ef576117ea856119d1565b6117f1565b805b95945050505050565b6009546001600160a01b031633146118245760405162461bcd60e51b81526004016115a8906157cb565b6001600160a01b03821661188c5760405162461bcd60e51b815260206004820152602960248201527f414746493a206e6577416464726573732063616e206e6f74206265207a65726f6044820152681030b2323932b9b99760b91b60648201526084016115a8565b8060ff166001036118b757601e80546001600160a01b0319166001600160a01b03841617905561195f565b8060ff166002036118e257601f80546001600160a01b0319166001600160a01b03841617905561195f565b8060ff1660030361190d57602080546001600160a01b0319166001600160a01b03841617905561195f565b8060ff1660040361193857602180546001600160a01b0319166001600160a01b03841617905561195f565b8060ff1660050361195f57602280546001600160a01b0319166001600160a01b0384161790555b60405160ff821681526001600160a01b038316907f44b4b43f7790513a495050ad13d875e38a4e8b7f68d8040dc33384d1f104ce11906020015b60405180910390a25050565b6117323382613ec0565b6001600160a01b0381166000908152600c602052604081205461147790612da6565b6001600160a01b031660009081526020819052604090205490565b6009546001600160a01b03163314611a165760405162461bcd60e51b81526004016115a8906157cb565b611a206000613f4f565b565b6009546001600160a01b03163314611a4c5760405162461bcd60e51b81526004016115a8906157cb565b6015805460ff191690556040517f7bfa7bacf025baa75e5308bf15bcf2948f406c7ebe3eb1a8bb611862b9d647ef90600090a1565b6009546001600160a01b03163314611aab5760405162461bcd60e51b81526004016115a8906157cb565b604051600090339047908381818185875af1925050503d8060008114611aed576040519150601f19603f3d011682016040523d82523d6000602084013e611af2565b606091505b505090508015611b28576040517f6b1863c66ca9fdf97b12fdcb00f3da82a54631b0d9729bbd23e0b056dba51d1f90600090a150565b600080516020615a9b8339815191526040516116559061584b565b611b4e823383612fbe565b611b588282613dc0565b5050565b600e54604051630f6a21fd60e31b81526001600160a01b0383811660048301526000928392839283928392911690637b510fe89060240160a060405180830381865afa158015611bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd49190615894565b939a9299509097509550909350915050565b6001600160a01b0381166000908152600a6020526040812054611477565b6009546001600160a01b03163314611c2e5760405162461bcd60e51b81526004016115a8906157cb565b6015805466ffff00000000001916660101000000000017905543601755565b6000438210611c9e5760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e65640060448201526064016115a8565b611477600d83613d04565b6009546001600160a01b03163314611cd35760405162461bcd60e51b81526004016115a8906157cb565b6015805460ff191660011790556040517fecd28d2c242feaa9f2efc5f2be891506d477b6836d1b969ccd5aa735fd5b38b190600090a1565b60606004805461148c90615797565b6009546001600160a01b03163314611d445760405162461bcd60e51b81526004016115a8906157cb565b611732613fa1565b6000806000611d5c846006613dca565b9150915081611d6d57600254611d6f565b805b949350505050565b6009546001600160a01b03163314611da15760405162461bcd60e51b81526004016115a8906157cb565b7f000000000000000000000000070218af9447906761047c8a1391a342d6d306486001600160a01b0316826001600160a01b031603611e485760405162461bcd60e51b815260206004820152603f60248201527f414746493a2054686520706169722063616e6e6f742062652072656d6f76656460448201527f2066726f6d206175746f6d617465644d61726b65744d616b657250616972730060648201526084016115a8565b611b588282613ffb565b6001600160a01b0381166000908152600c60205260408120548015611ec5576001600160a01b0383166000908152600c60205260409020611e946001836158dd565b81548110611ea457611ea46158f4565b600091825260209091200154600160201b90046001600160e01b0316611ec8565b60005b6001600160e01b03169392505050565b6009546001600160a01b03163314611f025760405162461bcd60e51b81526004016115a8906157cb565b60188054821515600160801b0260ff60801b199091161790556040517f83283493c4a2ebc90693caf32194d32af62a993bb93a63c84ff55e325e4e97ee9061165590831515815260200190565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015611fd45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016115a8565b6115738286868403612e9a565b600e546040516329a0382f60e21b81526001600160a01b038381166004830152600092169063a680e0bc90602401611436565b6009546001600160a01b0316331461203e5760405162461bcd60e51b81526004016115a8906157cb565b60188054821515600160781b0260ff60781b199091161790556040517fd00f811311c98e2690397eeab86ca3288488a82a6c28c3ad8008c028ec4ed1b89061165590831515815260200190565b60003361151d81858561304a565b600e546040516356bb6b4360e11b81526001600160a01b038381166004830152600092169063ad76d68690602401611436565b6009546001600160a01b031633146120f65760405162461bcd60e51b81526004016115a8906157cb565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101611999565b8342111561219e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e6174757265206578706972656400000060448201526064016115a8565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090612218906122109060a0016040516020818303038152906040528051906020012061404f565b85858561409d565b9050612223816140c5565b86146122715760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e63650000000000000060448201526064016115a8565b61227b8188613ec0565b50505050505050565b834211156122d45760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016115a8565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886123038c6140c5565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061235e8261404f565b9050600061236e8287878761409d565b9050896001600160a01b0316816001600160a01b0316146123d15760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e6174757265000060448201526064016115a8565b6123dc8a8a8a612e9a565b50505050505050505050565b6009546001600160a01b031633146124125760405162461bcd60e51b81526004016115a8906157cb565b89601860006101000a81548160ff0219169083151502179055508860248190555087601860016101000a81548160ff0219169083151502179055508660258190555085601860026101000a81548160ff0219169083151502179055508460268190555083601860036101000a81548160ff0219169083151502179055508260278190555081601860046101000a81548160ff02191690831515021790555080602881905550808386898c6124c69190615816565b6124d09190615816565b6124da9190615816565b6124e49190615816565b6023819055610bb8101561250a5760405162461bcd60e51b81526004016115a89061590a565b6040517f6d58c6dc772669fca481506571330f160785469830c3888c824e5ff2e81c47d790600090a150505050505050505050565b6009546001600160a01b031633146125695760405162461bcd60e51b81526004016115a8906157cb565b61257c3033612577306119d1565b6140ed565b60006019819055601a819055601b819055601c819055601d8190556040517f63c585e69c20e5f8328de80a8e1deda016020c6dfa24ec58c7d89a748967f0309190a1565b6009546001600160a01b031633146125ea5760405162461bcd60e51b81526004016115a8906157cb565b60158054821515600160301b0266ff000000000000199091161790556040517fb9bbb15e341600c8d067a0cadeba219905d5ba6d422b193c9c32265d26fc51c89061165590831515815260200190565b6009546001600160a01b031633146126645760405162461bcd60e51b81526004016115a8906157cb565b89601860056101000a81548160ff02191690831515021790555088602a8190555087601860066101000a81548160ff02191690831515021790555086602b8190555085601860076101000a81548160ff02191690831515021790555084602c8190555083601860086101000a81548160ff02191690831515021790555082602d8190555081601860096101000a81548160ff02191690831515021790555080602e81905550808386898c6127189190615816565b6127229190615816565b61272c9190615816565b6127369190615816565b6029819055610bb8101561250a5760405162461bcd60e51b81526004016115a89061590a565b6009546001600160a01b031633146127865760405162461bcd60e51b81526004016115a8906157cb565b60158054821515600160381b0267ff00000000000000199091161790556040517f341322866a3a2c26c27efa4c270c5ba86f6963257118897dd8196f224c002d439061165590831515815260200190565b6009546000906001600160a01b031633146128045760405162461bcd60e51b81526004016115a8906157cb565b506015805461ff0019169055600190565b6009546001600160a01b0316331461283f5760405162461bcd60e51b81526004016115a8906157cb565b60188054911515600160701b0260ff60701b19931515600160681b0260ff60681b19951515600160601b029590951661ffff60601b19961515600160581b0260ff60581b19981515600160501b029890981661ffff60501b19909416939093179690961794909416179190911716919091179055565b60408051808201909152600080825260208201526001600160a01b0383166000908152600c60205260409020805463ffffffff84169081106128f9576128f96158f4565b60009182526020918290206040805180820190915291015463ffffffff81168252600160201b90046001600160e01b0316918101919091529392505050565b6009546001600160a01b031633146129625760405162461bcd60e51b81526004016115a8906157cb565b6001600160a01b0381166129c85760405162461bcd60e51b815260206004820152602760248201527f414746493a206e6577547261636b65722063616e6e6f74206265207a65726f206044820152666164647265737360c81b60648201526084016115a8565b600e80546001600160a01b0319166001600160a01b0383169081179091556040517f27d252e570592a130198f8a8e4fb0c66776ddd3c44cbff2e13059b63d8421a9390600090a250565b6009546001600160a01b03163314612a3c5760405162461bcd60e51b81526004016115a8906157cb565b6001600160a01b038116612aa15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016115a8565b61173281613f4f565b601554600160381b900460ff16612b035760405162461bcd60e51b815260206004820181905260248201527f414746493a20636f6d706f756e64696e67206973206e6f7420656e61626c656460448201526064016115a8565b6015805464ff000000001916600160201b179055600e546001600160a01b0316636de1a5a9612b2f3390565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af1158015612b75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b99919061582e565b506015805464ff0000000019169055565b612bb48282612c3a565b6002546001600160e01b031015612c265760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b60648201526084016115a8565b612c34600d612d2d836140f8565b50505050565b6001600160a01b038216612c905760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016115a8565b612c9c6000838361426f565b8060026000828254612cae9190615816565b90915550506001600160a01b03821660009081526020819052604081208054839290612cdb908490615816565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3611b586000838361427a565b60006117218284615816565b60006001600160e01b03821115612da25760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016115a8565b5090565b600063ffffffff821115612da25760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016115a8565b6001600160a01b038316612e2f57612e2282614285565b612e2a6142af565b505050565b6001600160a01b038216612e4657612e2283614285565b612e4f83614285565b612e2a82614285565b6001600160a01b038381166000908152600b6020526040808220548584168352912054612e2a929182169116836142bd565b600061172182846158dd565b5490565b6001600160a01b038316612efc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016115a8565b6001600160a01b038216612f5d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016115a8565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114612c34578181101561303d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016115a8565b612c348484848403612e9a565b6001600160a01b0383166130b25760405162461bcd60e51b815260206004820152602960248201527f5f7472616e736665723a207472616e736665722066726f6d20746865207a65726044820152686f206164647265737360b81b60648201526084016115a8565b6001600160a01b0382166131185760405162461bcd60e51b815260206004820152602760248201527f5f7472616e736665723a207472616e7366657220746f20746865207a65726f206044820152666164647265737360c81b60648201526084016115a8565b6001600160a01b03831660009081526011602052604090205460ff16156131815760405162461bcd60e51b815260206004820181905260248201527f5f7472616e736665723a2053656e64657220697320626c61636b6c697374656460448201526064016115a8565b6001600160a01b03821660009081526011602052604090205460ff16156131f65760405162461bcd60e51b815260206004820152602360248201527f5f7472616e736665723a20526563697069656e7420697320626c61636b6c69736044820152621d195960ea1b60648201526084016115a8565b8060000361320a57612e2a838360006140ed565b60155460ff1615613477576009546001600160a01b0384811691161480159061324157506009546001600160a01b03838116911614155b801561325557506001600160a01b03821615155b801561326c57506001600160a01b03821661dead14155b8015613281575060155462010000900460ff16155b1561347757601554600160301b900460ff1661332c576001600160a01b03831660009081526012602052604090205460ff16806132d657506001600160a01b03821660009081526012602052604090205460ff165b61332c5760405162461bcd60e51b815260206004820152602160248201527f5f7472616e736665723a2054726164696e67206973206e6f74206163746976656044820152601760f91b60648201526084016115a8565b601554610100900460ff1615613477576009546001600160a01b0383811691161480159061338c57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b031614155b80156133ca57507f000000000000000000000000070218af9447906761047c8a1391a342d6d306486001600160a01b0316826001600160a01b031614155b15613477573260009081526013602052604090205443116134645760405162461bcd60e51b815260206004820152604860248201527f5f7472616e736665723a205472616e736665722044656c617920656e61626c6560448201527f642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b2060648201526730b63637bbb2b21760c11b608482015260a4016115a8565b3260009081526013602052604090204390555b601754613485906003615816565b43111580156134c657507f000000000000000000000000070218af9447906761047c8a1391a342d6d306486001600160a01b0316826001600160a01b031614155b80156134ef57506001600160a01b038216737a250d5630b4cf539739df2c5dacb4c659f2488d14155b1561353e576001600160a01b038216600081815260116020526040808220805460ff19166001179055517fb90badc1cf1c52268f4fa9afb5276aebf640bcca3300cdfc9cf37db17daa13e29190a25b601554600160301b900460ff168015613560575060155462010000900460ff16155b801561358557506001600160a01b03831660009081526014602052604090205460ff16155b80156135c357507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316836001600160a01b031614155b80156135dd57506009546001600160a01b03848116911614155b80156135f757506009546001600160a01b03838116911614155b15613626576015805462ff00001916620100001790556136156143fa565b426016556015805462ff0000191690555b60007f000000000000000000000000070218af9447906761047c8a1391a342d6d306486001600160a01b0316846001600160a01b0316148061369957507f000000000000000000000000070218af9447906761047c8a1391a342d6d306486001600160a01b0316836001600160a01b0316145b806136bc57506001600160a01b03831660009081526014602052604090205460ff165b806136df57506001600160a01b03841660009081526014602052604090205460ff165b806136f35750601554600160281b900460ff165b156136fc575060015b6001600160a01b03841660009081526012602052604090205460ff168061373b57506001600160a01b03831660009081526012602052604090205460ff165b8061374e575060155462010000900460ff165b806137625750601554600160201b900460ff165b806137775750601554600160281b900460ff16155b15613780575060005b8015613ad8576001600160a01b03831660009081526014602052604081205460ff1680156137b057506000602954115b1561392757612710602954846137c6919061594d565b6137d0919061596c565b601854909150600160281b900460ff161561381657602954602a546137f5908361594d565b6137ff919061596c565b601960008282546138109190615816565b90915550505b601854600160301b900460ff161561385957602954602b54613838908361594d565b613842919061596c565b601a60008282546138539190615816565b90915550505b601854600160381b900460ff161561389c57602954602c5461387b908361594d565b613885919061596c565b601b60008282546138969190615816565b90915550505b601854600160401b900460ff16156138df57602954602d546138be908361594d565b6138c8919061596c565b601c60008282546138d99190615816565b90915550505b601854600160481b900460ff161561392257602954602e54613901908361594d565b61390b919061596c565b601d600082825461391c9190615816565b90915550505b613ab9565b6001600160a01b03851660009081526014602052604090205460ff16801561395157506000602354115b15613ab95761271060235484613967919061594d565b613971919061596c565b60185490915060ff16156139b05760235460245461398f908361594d565b613999919061596c565b601960008282546139aa9190615816565b90915550505b601854610100900460ff16156139f1576023546025546139d0908361594d565b6139da919061596c565b601a60008282546139eb9190615816565b90915550505b60185462010000900460ff1615613a3357602354602654613a12908361594d565b613a1c919061596c565b601b6000828254613a2d9190615816565b90915550505b6018546301000000900460ff1615613a7657602354602754613a55908361594d565b613a5f919061596c565b601c6000828254613a709190615816565b90915550505b601854600160201b900460ff1615613ab957602354602854613a98908361594d565b613aa2919061596c565b601d6000828254613ab39190615816565b90915550505b613ac381846158dd565b92508015613ad657613ad68530836140ed565b505b613ae38484846140ed565b600e546001600160a01b031663e30443bc85613afe816119d1565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613b4457600080fd5b505af1158015613b58573d6000803e3d6000fd5b5050600e546001600160a01b0316915063e30443bc905084613b79816119d1565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613bbf57600080fd5b505af1158015613bd3573d6000803e3d6000fd5b5050505050505050565b6000306001600160a01b037f0000000000000000000000004d0f56d728c5232ab07faa0bdcba23670a35451f16148015613c3657507f000000000000000000000000000000000000000000000000000000000000000146145b15613c6057507f55929cf1286bc6ac10782d639524ce7b59a5f12e4d385b4f044e3f5891a5750d90565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f1b6c552d2412af3508f99a446e6635ca0f3a86d0dc16739def2662ae32050b20828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b81811015613d68576000613d1f8284614a4c565b905084868281548110613d3457613d346158f4565b60009182526020909120015463ffffffff161115613d5457809250613d62565b613d5f816001615816565b91505b50613d0b565b8115613dab5784613d7a6001846158dd565b81548110613d8a57613d8a6158f4565b600091825260209091200154600160201b90046001600160e01b0316613dae565b60005b6001600160e01b031695945050505050565b611b588282614a67565b60008060008411613e165760405162461bcd60e51b815260206004820152601660248201527504552433230536e617073686f743a20696420697320360541b60448201526064016115a8565b613e1e614a7f565b841115613e6d5760405162461bcd60e51b815260206004820152601d60248201527f4552433230536e617073686f743a206e6f6e6578697374656e7420696400000060448201526064016115a8565b6000613e798486614a8a565b84549091508103613e91576000809250925050613eb9565b6001846001018281548110613ea857613ea86158f4565b906000526020600020015492509250505b9250929050565b6001600160a01b038281166000908152600b602052604081205490911690613ee7846119d1565b6001600160a01b038581166000818152600b602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4612c348284836142bd565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000613fb1600880546001019055565b6000613fbb614a7f565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb6781604051613fee91815260200190565b60405180910390a1919050565b6001600160a01b038216600081815260146020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b600061147761405c613bdd565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006140ae87878787614b4f565b915091506140bb81614c3c565b5095945050505050565b6001600160a01b0381166000908152600a602052604090208054600181018255905b50919050565b612e2a838383614df2565b82546000908190801561414257856141116001836158dd565b81548110614121576141216158f4565b600091825260209091200154600160201b90046001600160e01b0316614145565b60005b6001600160e01b0316925061415e83858763ffffffff16565b915060008111801561419c575043866141786001846158dd565b81548110614188576141886158f4565b60009182526020909120015463ffffffff16145b156141fc576141aa82612d39565b866141b66001846158dd565b815481106141c6576141c66158f4565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b03160217905550614266565b85604051806040016040528061421143612da6565b63ffffffff16815260200161422585612d39565b6001600160e01b039081169091528254600181018455600093845260209384902083519490930151909116600160201b0263ffffffff909316929092179101555b50935093915050565b612e2a838383612e0b565b612e2a838383612e58565b6001600160a01b0381166000908152600560205260409020611732906142aa836119d1565b614fd1565b611a2060066142aa60025490565b816001600160a01b0316836001600160a01b0316141580156142df5750600081115b15612e2a576001600160a01b0383161561436d576001600160a01b0383166000908152600c60205260408120819061431a90612e8a856140f8565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051614362929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615612e2a576001600160a01b0382166000908152600c6020526040812081906143a390612d2d856140f8565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516143eb929190918252602082015260400190565b60405180910390a25050505050565b6000614405306119d1565b9050600081116144125750565b6015546301000000900460ff161580156144355750601854600160501b900460ff165b801561444357506000601954115b1561451e5761445360195461501b565b601e546040516000916001600160a01b03169047908381818185875af1925050503d80600081146144a0576040519150601f19603f3d011682016040523d82523d6000602084013e6144a5565b606091505b5050905080156144ef577fc8c35e282910145df6fa4ba7ef6cbd35b815836b54a4fc1d12022e89429eb9ce6019546040516144e291815260200190565b60405180910390a1614513565b600080516020615a9b83398151915260405161450a9061598e565b60405180910390a15b5060006019556149f2565b6015546301000000900460ff1660011480156145435750601854600160581b900460ff165b801561455157506000601a54115b1561468b57601854600160781b900460ff16156145b45761457430601a54613dc0565b7f6ef4855b666dcc7884561072e4358b28dfe01feb1b7f4dcebc00e62d50394ac7601a546040516145a791815260200190565b60405180910390a1614681565b6145bf601a5461501b565b601f546040516000916001600160a01b03169047908381818185875af1925050503d806000811461460c576040519150601f19603f3d011682016040523d82523d6000602084013e614611565b606091505b50509050801561465b577f445ad4c2896a7934aded290a8b2788b7bf9f30eddd5cd2cc37afd511a982440d601a5460405161464e91815260200190565b60405180910390a161467f565b600080516020615a9b8339815191526040516146769061598e565b60405180910390a15b505b6000601a556149f2565b6015546301000000900460ff1660021480156146b05750601854600160601b900460ff165b80156146be57506000601b54115b1561484d57601854600160801b900460ff16156147ea576146e0601b5461501b565b600e546040516000916001600160a01b03169047908381818185875af1925050503d806000811461472d576040519150601f19603f3d011682016040523d82523d6000602084013e614732565b606091505b50509050801561477c577f385335e8f2d93554f1e948d10df62c08f64d919eb4c750388917bd23027f6104601b5460405161476f91815260200190565b60405180910390a16147e4565b600080516020615a9b8339815191526040516147db9060208082526029908201527f57616c6c6574206661696c656420746f2072656365697665206368616e6e656c604082015268203320746f6b656e7360b81b606082015260800190565b60405180910390a15b50614843565b602054601b546148079130916001600160a01b03909116906140ed565b7f385335e8f2d93554f1e948d10df62c08f64d919eb4c750388917bd23027f6104601b5460405161483a91815260200190565b60405180910390a15b6000601b556149f2565b60155460ff63010000009091041660031480156148735750601854600160681b900460ff165b801561488157506000601c54115b156148e857602154601c546148a39130916001600160a01b03909116906140ed565b7f8ab07c09b14c48c645c26beb0ade80e983ae51912b8a1e2779bf19912dbe318f601c546040516148d691815260200190565b60405180910390a16000601c556149f2565b6015546301000000900460ff16600414801561490d5750601854600160701b900460ff165b801561491b57506000601d54115b156149f25761492b601d5461501b565b6022546040516000916001600160a01b03169047908381818185875af1925050503d8060008114614978576040519150601f19603f3d011682016040523d82523d6000602084013e61497d565b606091505b5050905080156149c7577ff66341b84052339b019e40d3b0fa2d0e140d7303ad384ad3aad95a667ecc219f601d546040516149ba91815260200190565b60405180910390a16149eb565b600080516020615a9b8339815191526040516149e29061584b565b60405180910390a15b506000601d555b6015546301000000900460ff16600403614a16576015805463ff0000001916905550565b601580546301000000900460ff16906003614a30836159d7565b91906101000a81548160ff021916908360ff1602179055505050565b6000614a5b600284841861596c565b61172190848416615816565b614a7182826151db565b612c34600d612e8a836140f8565b600061166a60085490565b81546000908103614a9d57506000611477565b82546000905b80821015614af9576000614ab78383614a4c565b905084868281548110614acc57614acc6158f4565b90600052602060002001541115614ae557809150614af3565b614af0816001615816565b92505b50614aa3565b600082118015614b2e57508385614b116001856158dd565b81548110614b2157614b216158f4565b9060005260206000200154145b15614b4757614b3e6001836158dd565b92505050611477565b509050611477565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115614b865750600090506003614c33565b8460ff16601b14158015614b9e57508460ff16601c14155b15614baf5750600090506004614c33565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614c03573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614c2c57600060019250925050614c33565b9150600090505b94509492505050565b6000816004811115614c5057614c506159f6565b03614c585750565b6001816004811115614c6c57614c6c6159f6565b03614cb95760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016115a8565b6002816004811115614ccd57614ccd6159f6565b03614d1a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016115a8565b6003816004811115614d2e57614d2e6159f6565b03614d865760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016115a8565b6004816004811115614d9a57614d9a6159f6565b036117325760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016115a8565b6001600160a01b038316614e565760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016115a8565b6001600160a01b038216614eb85760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016115a8565b614ec383838361426f565b6001600160a01b03831660009081526020819052604090205481811015614f3b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016115a8565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290614f72908490615816565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051614fbe91815260200190565b60405180910390a3612c3484848461427a565b6000614fdb614a7f565b905080614fe78461533c565b1015612e2a578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110615050576150506158f4565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156150ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150f29190615a0c565b81600181518110615105576151056158f4565b60200260200101906001600160a01b031690816001600160a01b031681525050615150307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612e9a565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906151a5908590600090869030904290600401615a29565b600060405180830381600087803b1580156151bf57600080fd5b505af11580156151d3573d6000803e3d6000fd5b505050505050565b6001600160a01b03821661523b5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016115a8565b6152478260008361426f565b6001600160a01b038216600090815260208190526040902054818110156152bb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016115a8565b6001600160a01b03831660009081526020819052604081208383039055600280548492906152ea9084906158dd565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3612e2a8360008461427a565b8054600090810361534f57506000919050565b8154829061535f906001906158dd565b8154811061536f5761536f6158f4565b90600052602060002001549050919050565b919050565b6001600160a01b038116811461173257600080fd5b6000602082840312156153ad57600080fd5b813561172181615386565b600060208083528351808285015260005b818110156153e5578581018301518582016040015282016153c9565b818111156153f7576000604083870101525b50601f01601f1916929092016040019392505050565b6000806040838503121561542057600080fd5b823561542b81615386565b946020939093013593505050565b60008060006060848603121561544e57600080fd5b833561545981615386565b9250602084013561546981615386565b929592945050506040919091013590565b801515811461173257600080fd5b6000806040838503121561549b57600080fd5b82356154a681615386565b915060208301356154b68161547a565b809150509250929050565b6000602082840312156154d357600080fd5b81356117218161547a565b6000602082840312156154f057600080fd5b5035919050565b803560ff8116811461538157600080fd5b6000806040838503121561551b57600080fd5b823561552681615386565b9150615534602084016154f7565b90509250929050565b60008060008060008060c0878903121561555657600080fd5b863561556181615386565b9550602087013594506040870135935061557d606088016154f7565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a0312156155b257600080fd5b87356155bd81615386565b965060208801356155cd81615386565b955060408801359450606088013593506155e9608089016154f7565b925060a0880135915060c0880135905092959891949750929550565b6000806000806000806000806000806101408b8d03121561562557600080fd5b8a356156308161547a565b995060208b0135985060408b01356156478161547a565b975060608b0135965060808b013561565e8161547a565b955060a08b0135945060c08b01356156758161547a565b935060e08b013592506101008b013561568d8161547a565b809250506101208b013590509295989b9194979a5092959850565b600080604083850312156156bb57600080fd5b82356156c681615386565b915060208301356154b681615386565b600080600080600060a086880312156156ee57600080fd5b85356156f98161547a565b945060208601356157098161547a565b935060408601356157198161547a565b925060608601356157298161547a565b915060808601356157398161547a565b809150509295509295909350565b6000806040838503121561575a57600080fd5b823561576581615386565b9150602083013563ffffffff811681146154b657600080fd5b60006020828403121561579057600080fd5b5051919050565b600181811c908216806157ab57607f821691505b6020821081036140e757634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561582957615829615800565b500190565b60006020828403121561584057600080fd5b81516117218161547a565b60208082526029908201527f57616c6c6574206661696c656420746f2072656365697665206368616e6e656c604082015268203520746f6b656e7360b81b606082015260800190565b600080600080600060a086880312156158ac57600080fd5b85516158b781615386565b602087015160408801516060890151608090990151929a91995097965090945092505050565b6000828210156158ef576158ef615800565b500390565b634e487b7160e01b600052603260045260246000fd5b60208082526023908201527f414746493a204d757374206b656570206665657320617420333025206f72206c60408201526265737360e81b606082015260800190565b600081600019048311821515161561596757615967615800565b500290565b60008261598957634e487b7160e01b600052601260045260246000fd5b500490565b60208082526029908201527f57616c6c6574206661696c656420746f2072656365697665206368616e6e656c604082015268203120746f6b656e7360b81b606082015260800190565b600060ff821660ff81036159ed576159ed615800565b60010192915050565b634e487b7160e01b600052602160045260246000fd5b600060208284031215615a1e57600080fd5b815161172181615386565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015615a795784516001600160a01b031683529383019391830191600101615a54565b50506001600160a01b0396909616606085015250505060800152939250505056fe551303dd5f39cbfe6daba6b3e27754b8a7d72f519756a2cde2b92c2bbde159a7a2646970667358221220d2b14285345d102843e0efaff3a24fc30a234f4b8a2f8e7a74c7fad78c04a85c64736f6c634300080d0033
Deployed Bytecode Sourcemap
99763:24302:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101330:35;;;;;;;;;;-1:-1:-1;101330:35:0;;;;-1:-1:-1;;;101330:35:0;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;101330:35:0;;;;;;;;101153;;;;;;;;;;-1:-1:-1;101153:35:0;;;;;;;;;;;108678:150;;;;;;;;;;-1:-1:-1;108678:150:0;;;;;:::i;:::-;;:::i;:::-;;;740:25:1;;;728:2;713:18;108678:150:0;594:177:1;50543:104:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;53042:209::-;;;;;;;;;;-1:-1:-1;53042:209:0;;;;;:::i;:::-;;:::i;101960:26::-;;;;;;;;;;;;;;;;108320:190;;;;;;;;;;-1:-1:-1;108320:190:0;;;;;:::i;:::-;;:::i;100943:27::-;;;;;;;;;;;;;;;;103544:30;;;;;;;;;;;;;;;;102115:23;;;;;;;;;;-1:-1:-1;102115:23:0;;;;-1:-1:-1;;;;;102115:23:0;;;;;;-1:-1:-1;;;;;1862:32:1;;;1844:51;;1832:2;1817:18;102115:23:0;1698:203:1;100084:51:0;;;;;;;;;;;;;;;51727:112;;;;;;;;;;-1:-1:-1;51817:12:0;;51727:112;;53867:313;;;;;;;;;;-1:-1:-1;53867:313:0;;;;;:::i;:::-;;:::i;102886:23::-;;;;;;;;;;-1:-1:-1;102886:23:0;;;;-1:-1:-1;;;;;102886:23:0;;;101506:35;;;;;;;;;;-1:-1:-1;101506:35:0;;;;-1:-1:-1;;;101506:35:0;;;;;;101554:32;;;;;;;;;;-1:-1:-1;101554:32:0;;;;-1:-1:-1;;;101554:32:0;;;;;;101283:34;;;;;;;;;;-1:-1:-1;101283:34:0;;;;-1:-1:-1;;;101283:34:0;;;;;;102980:29;;;;;;;;;;;;;;;;107040:138;;;;;;;;;;-1:-1:-1;107040:138:0;;;;;:::i;:::-;;:::i;:::-;;101807:35;;;;;;;;;;-1:-1:-1;101807:35:0;;;;-1:-1:-1;;;101807:35:0;;;;;;100897:37;;;;;;;;;;-1:-1:-1;100897:37:0;;;;-1:-1:-1;;;100897:37:0;;;;;;106598:88;;;;;;;;;;-1:-1:-1;106675:1:0;106598:88;;;3284:4:1;3272:17;;;3254:36;;3242:2;3227:18;106598:88:0;3112:184:1;110070:160:0;;;;;;;;;;-1:-1:-1;110070:160:0;;;;;:::i;:::-;;:::i;101374:35::-;;;;;;;;;;-1:-1:-1;101374:35:0;;;;-1:-1:-1;;;101374:35:0;;;;;;64520:119;;;;;;;;;;;;;:::i;101110:34::-;;;;;;;;;;-1:-1:-1;101110:34:0;;;;;;;;54617:248;;;;;;;;;;-1:-1:-1;54617:248:0;;;;;:::i;:::-;;:::i;67864:274::-;;;;;;;;;;-1:-1:-1;67864:274:0;;;;;:::i;:::-;;:::i;84716:95::-;;;;;;;;;;-1:-1:-1;84716:95:0;;;;;:::i;:::-;;:::i;102382:23::-;;;;;;;;;;-1:-1:-1;102382:23:0;;;;-1:-1:-1;;;;;102382:23:0;;;101763:35;;;;;;;;;;-1:-1:-1;101763:35:0;;;;-1:-1:-1;;;101763:35:0;;;;;;100144:38;;;;;;;;;;;;;;;100586:33;;;;;;;;;;-1:-1:-1;100586:33:0;;;;;;;;101418:35;;;;;;;;;;-1:-1:-1;101418:35:0;;;;-1:-1:-1;;;101418:35:0;;;;;;107953:98;;;;;;;;;;;;;:::i;80052:274::-;;;;;;;;;;-1:-1:-1;80052:274:0;;;;;:::i;:::-;;:::i;103316:30::-;;;;;;;;;;;;;;;;106898:130;;;;;;;;;;-1:-1:-1;106898:130:0;;;;;:::i;:::-;-1:-1:-1;;;;;106990:28:0;106964:4;106990:28;;;:19;:28;;;;;;;;;106898:130;101240:34;;;;;;;;;;-1:-1:-1;101240:34:0;;;;;;;;;;;110839:611;;;;;;;;;;-1:-1:-1;110839:611:0;;;;;:::i;:::-;;:::i;67200:132::-;;;;;;;;;;-1:-1:-1;67200:132:0;;;;;:::i;:::-;-1:-1:-1;;;;;67303:19:0;;;67274:7;67303:19;;;:10;:19;;;;;;;;67200:132;103033:27;;;;;;;;;;;;;;;;101677:32;;;;;;;;;;-1:-1:-1;101677:32:0;;;;-1:-1:-1;;;101677:32:0;;;;;;70437:118;;;;;;;;;;-1:-1:-1;70437:118:0;;;;;:::i;:::-;;:::i;103257:35::-;;;;;;;;;;;;;;;;100040;;;;;;;;;;-1:-1:-1;100040:35:0;;;;-1:-1:-1;;;;;100040:35:0;;;103482:30;;;;;;;;;;;;;;;;100857:31;;;;;;;;;;-1:-1:-1;100857:31:0;;;;-1:-1:-1;;;100857:31:0;;;;;;103425:30;;;;;;;;;;;;;;;;66942:155;;;;;;;;;;-1:-1:-1;66942:155:0;;;;;:::i;:::-;;:::i;:::-;;;4810:10:1;4798:23;;;4780:42;;4768:2;4753:18;66942:155:0;4636:192:1;51912:131:0;;;;;;;;;;-1:-1:-1;51912:131:0;;;;;:::i;:::-;;:::i;38340:107::-;;;;;;;;;;;;;:::i;110242:121::-;;;;;;;;;;;;;:::i;101890:26::-;;;;;;;;;;;;;;;;102767:23;;;;;;;;;;-1:-1:-1;102767:23:0;;;;-1:-1:-1;;;;;102767:23:0;;;123165:331;;;;;;;;;;;;;:::i;101925:26::-;;;;;;;;;;;;;;;;85156:170;;;;;;;;;;-1:-1:-1;85156:170:0;;;;;:::i;:::-;;:::i;108840:302::-;;;;;;;;;;-1:-1:-1;108840:302:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5110:32:1;;;5092:51;;5174:2;5159:18;;5152:34;;;;5202:18;;;5195:34;;;;5260:2;5245:18;;5238:34;5303:3;5288:19;;5281:35;5079:3;5064:19;108840:302:0;4833:489:1;103080:29:0;;;;;;;;;;;;;;;;64246:132;;;;;;;;;;-1:-1:-1;64246:132:0;;;;;:::i;:::-;;:::i;101855:26::-;;;;;;;;;;;;;;;;101995;;;;;;;;;;;;;;;;109154:161;;;;;;;;;;;;;:::i;37651:91::-;;;;;;;;;;-1:-1:-1;37726:6:0;;-1:-1:-1;;;;;37726:6:0;37651:91;;68447:265;;;;;;;;;;-1:-1:-1;68447:265:0;;;;;:::i;:::-;;:::i;110375:126::-;;;;;;;;;;;;;:::i;50778:108::-;;;;;;;;;;;;;:::i;100810:38::-;;;;;;;;;;-1:-1:-1;100810:38:0;;;;-1:-1:-1;;;100810:38:0;;;;;;113519:71;;;;;;;;;;;;;:::i;80440:242::-;;;;;;;;;;-1:-1:-1;80440:242:0;;;;;:::i;:::-;;:::i;101595:32::-;;;;;;;;;;-1:-1:-1;101595:32:0;;;;-1:-1:-1;;;101595:32:0;;;;;;107190:258;;;;;;;;;;-1:-1:-1;107190:258:0;;;;;:::i;:::-;;:::i;67426:218::-;;;;;;;;;;-1:-1:-1;67426:218:0;;;;;:::i;:::-;;:::i;100327:43::-;;;;;;;;;;-1:-1:-1;100327:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;110676:151;;;;;;;;;;-1:-1:-1;110676:151:0;;;;;:::i;:::-;;:::i;55400:456::-;;;;;;;;;;-1:-1:-1;55400:456:0;;;;;:::i;:::-;;:::i;109327:142::-;;;;;;;;;;-1:-1:-1;109327:142:0;;;;;:::i;:::-;;:::i;110513:151::-;;;;;;;;;;-1:-1:-1;110513:151:0;;;;;:::i;:::-;;:::i;52269:201::-;;;;;;;;;;-1:-1:-1;52269:201:0;;;;;:::i;:::-;;:::i;108522:144::-;;;;;;;;;;-1:-1:-1;108522:144:0;;;;;:::i;:::-;;:::i;100706:22::-;;;;;;;;;;-1:-1:-1;100706:22:0;;;;;;;;;;;100515:58;;;;;;;;;;-1:-1:-1;100515:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;106698:188;;;;;;;;;;-1:-1:-1;106698:188:0;;;;;:::i;:::-;;:::i;70647:625::-;;;;;;;;;;-1:-1:-1;70647:625:0;;;;;:::i;:::-;;:::i;100628:39::-;;;;;;;;;;-1:-1:-1;100628:39:0;;;;;;;;;;;103197:29;;;;;;;;;;;;;;;;101718:32;;;;;;;;;;-1:-1:-1;101718:32:0;;;;-1:-1:-1;;;101718:32:0;;;;;;101462:35;;;;;;;;;;-1:-1:-1;101462:35:0;;;;-1:-1:-1;;;101462:35:0;;;;;;63487:683;;;;;;;;;;-1:-1:-1;63487:683:0;;;;;:::i;:::-;;:::i;111747:867::-;;;;;;;;;;-1:-1:-1;111747:867:0;;;;;:::i;:::-;;:::i;103370:30::-;;;;;;;;;;;;;;;;102922:34;;;;;;;;;;;;;;;;122650:315;;;;;;;;;;;;;:::i;52543:155::-;;;;;;;;;;-1:-1:-1;52543:155:0;;;;;:::i;:::-;-1:-1:-1;;;;;52661:18:0;;;52632:7;52661:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;52543:155;109653:139;;;;;;;;;;-1:-1:-1;109653:139:0;;;;;:::i;:::-;;:::i;112627:880::-;;;;;;;;;;-1:-1:-1;112627:880:0;;;;;:::i;:::-;;:::i;109481:160::-;;;;;;;;;;-1:-1:-1;109481:160:0;;;;;:::i;:::-;;:::i;111517:218::-;;;;;;;;;;;;;:::i;102643:23::-;;;;;;;;;;-1:-1:-1;102643:23:0;;;;-1:-1:-1;;;;;102643:23:0;;;109804:254;;;;;;;;;;-1:-1:-1;109804:254:0;;;;;:::i;:::-;;:::i;66698:154::-;;;;;;;;;;-1:-1:-1;66698:154:0;;;;;:::i;:::-;;:::i;:::-;;;;9625:13:1;;9640:10;9621:30;9603:49;;9712:4;9700:17;;;9694:24;-1:-1:-1;;;;;9690:50:1;9668:20;;;9661:80;;;;9576:18;66698:154:0;9401:346:1;107670:271:0;;;;;;;;;;-1:-1:-1;107670:271:0;;;;;:::i;:::-;;:::i;38614:207::-;;;;;;;;;;-1:-1:-1;38614:207:0;;;;;:::i;:::-;;:::i;108063:245::-;;;;;;;;;;;;;:::i;103136:29::-;;;;;;;;;;;;;;;;101636:32;;;;;;;;;;-1:-1:-1;101636:32:0;;;;-1:-1:-1;;;101636:32:0;;;;;;101197:34;;;;;;;;;;-1:-1:-1;101197:34:0;;;;;;;;;;;108678:150;108775:13;;:43;;-1:-1:-1;;;108775:43:0;;-1:-1:-1;;;;;1862:32:1;;;108775:43:0;;;1844:51:1;108746:7:0;;108775:13;;:34;;1817:18:1;;108775:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;108768:50;108678:150;-1:-1:-1;;108678:150:0:o;50543:104::-;50597:13;50632:5;50625:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50543:104;:::o;53042:209::-;53125:4;36387:10;53185:32;36387:10;53201:7;53210:6;53185:8;:32::i;:::-;-1:-1:-1;53237:4:0;;53042:209;-1:-1:-1;;;53042:209:0:o;108320:190::-;108457:13;;:43;;-1:-1:-1;;;108457:43:0;;-1:-1:-1;;;;;1862:32:1;;;108457:43:0;;;1844:51:1;108421:7:0;;108457:13;;:34;;1817:18:1;;108457:43:0;1698:203:1;53867:313:0;54006:4;36387:10;54068:38;54084:4;36387:10;54099:6;54068:15;:38::i;:::-;54119:27;54129:4;54135:2;54139:6;54119:9;:27::i;:::-;-1:-1:-1;54166:4:0;;53867:313;-1:-1:-1;;;;53867:313:0:o;107040:138::-;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;107133:19:0;;;::::1;;::::0;;;:10:::1;:19;::::0;;;;:35;;-1:-1:-1;;107133:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;107040:138::o;110070:160::-;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;110147:18:::1;:28:::0;;;::::1;;-1:-1:-1::0;;;110147:28:0::1;-1:-1:-1::0;;110147:28:0;;::::1;;::::0;;110193:27:::1;::::0;::::1;::::0;::::1;::::0;110168:7;179:14:1;172:22;154:41;;142:2;127:18;;14:187;110193:27:0::1;;;;;;;;110070:160:::0;:::o;64520:119::-;64580:7;64609:20;:18;:20::i;:::-;64602:27;;64520:119;:::o;54617:248::-;36387:10;54705:4;54790:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;54790:27:0;;;;;;;;;;54705:4;;36387:10;54765:66;;36387:10;;54790:27;;:40;;54820:10;;54790:40;:::i;:::-;54765:8;:66::i;67864:274::-;67962:7;68006:12;67992:11;:26;67984:70;;;;-1:-1:-1;;;67984:70:0;;11414:2:1;67984:70:0;;;11396:21:1;11453:2;11433:18;;;11426:30;11492:33;11472:18;;;11465:61;11543:18;;67984:70:0;11212:355:1;67984:70:0;-1:-1:-1;;;;;68093:21:0;;;;;;:12;:21;;;;;68074:54;;68116:11;68074:18;:54::i;:::-;68067:61;67864:274;-1:-1:-1;;;67864:274:0:o;84716:95::-;84774:27;36387:10;84794:6;84774:5;:27::i;:::-;84716:95;:::o;107953:98::-;107990:13;;-1:-1:-1;;;;;107990:13:0;:28;36387:10;107990:51;;-1:-1:-1;;;;;;107990:51:0;;;;;;;-1:-1:-1;;;;;1862:32:1;;;107990:51:0;;;1844::1;1817:18;;107990:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;80052:274::-;-1:-1:-1;;;;;80218:33:0;;80139:7;80218:33;;;:24;:33;;;;;80139:7;;;;80197:55;;80206:10;;80197:8;:55::i;:::-;80161:91;;;;80276:11;:40;;80298:18;80308:7;80298:9;:18::i;:::-;80276:40;;;80290:5;80276:40;80269:47;80052:274;-1:-1:-1;;;;;80052:274:0:o;110839:611::-;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;110939:24:0;::::1;110931:78;;;::::0;-1:-1:-1;;;110931:78:0;;12248:2:1;110931:78:0::1;::::0;::::1;12230:21:1::0;12287:2;12267:18;;;12260:30;12326:34;12306:18;;;12299:62;-1:-1:-1;;;12377:18:1;;;12370:39;12426:19;;110931:78:0::1;12046:405:1::0;110931:78:0::1;111030:3;:8;;111037:1;111030:8:::0;111026:354:::1;;111057:8;:21:::0;;-1:-1:-1;;;;;;111057:21:0::1;-1:-1:-1::0;;;;;111057:21:0;::::1;;::::0;;111026:354:::1;;;111102:3;:8;;111109:1;111102:8:::0;111098:282:::1;;111129:8;:21:::0;;-1:-1:-1;;;;;;111129:21:0::1;-1:-1:-1::0;;;;;111129:21:0;::::1;;::::0;;111098:282:::1;;;111174:3;:8;;111181:1;111174:8:::0;111170:210:::1;;111201:8;:21:::0;;-1:-1:-1;;;;;;111201:21:0::1;-1:-1:-1::0;;;;;111201:21:0;::::1;;::::0;;111170:210:::1;;;111246:3;:8;;111253:1;111246:8:::0;111242:138:::1;;111273:8;:21:::0;;-1:-1:-1;;;;;;111273:21:0::1;-1:-1:-1::0;;;;;111273:21:0;::::1;;::::0;;111242:138:::1;;;111318:3;:8;;111325:1;111318:8:::0;111314:66:::1;;111345:8;:21:::0;;-1:-1:-1;;;;;;111345:21:0::1;-1:-1:-1::0;;;;;111345:21:0;::::1;;::::0;;111314:66:::1;111401:39;::::0;3284:4:1;3272:17;;3254:36;;-1:-1:-1;;;;;111401:39:0;::::1;::::0;::::1;::::0;3242:2:1;3227:18;111401:39:0::1;;;;;;;;110839:611:::0;;:::o;70437:118::-;70511:34;36387:10;70535:9;70511;:34::i;66942:155::-;-1:-1:-1;;;;;67058:21:0;;67012:6;67058:21;;;:12;:21;;;;;:28;67040:47;;:17;:47::i;51912:131::-;-1:-1:-1;;;;;52015:18:0;51986:7;52015:18;;;;;;;;;;;;51912:131::o;38340:107::-;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;38407:30:::1;38434:1;38407:18;:30::i;:::-;38340:107::o:0;110242:121::-;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;110298:14:::1;:22:::0;;-1:-1:-1;;110298:22:0::1;::::0;;110338:15:::1;::::0;::::1;::::0;110315:5:::1;::::0;110338:15:::1;110242:121::o:0;123165:331::-;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;123249:58:::1;::::0;123231:12:::1;::::0;123257:10:::1;::::0;123281:21:::1;::::0;123231:12;123249:58;123231:12;123249:58;123281:21;123257:10;123249:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;123230:77;;;123324:7;123320:167;;;123355:17;::::0;::::1;::::0;;;::::1;84716:95:::0;:::o;123320:167::-:1;-1:-1:-1::0;;;;;;;;;;;123414:59:0::1;;;;;:::i;85156:170::-:0;85235:46;85251:7;36387:10;85274:6;85235:15;:46::i;:::-;85294:22;85300:7;85309:6;85294:5;:22::i;:::-;85156:170;;:::o;108840:302::-;109095:13;;:37;;-1:-1:-1;;;109095:37:0;;-1:-1:-1;;;;;1862:32:1;;;109095:37:0;;;1844:51:1;108951:7:0;;;;;;;;;;109095:13;;;:28;;1817:18:1;;109095:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;109088:44;;;;-1:-1:-1;109088:44:0;;-1:-1:-1;109088:44:0;-1:-1:-1;109088:44:0;;-1:-1:-1;108840:302:0;-1:-1:-1;;108840:302:0:o;64246:132::-;-1:-1:-1;;;;;64344:14:0;;64315:7;64344:14;;;:7;:14;;;;;32044;64344:24;31950:118;109154:161;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;109211:11:::1;:18:::0;;-1:-1:-1;;109242:25:0;;;;;109293:12:::1;109280:10;:25:::0;109154:161::o;68447:265::-;68534:7;68578:12;68564:11;:26;68556:70;;;;-1:-1:-1;;;68556:70:0;;11414:2:1;68556:70:0;;;11396:21:1;11453:2;11433:18;;;11426:30;11492:33;11472:18;;;11465:61;11543:18;;68556:70:0;11212:355:1;68556:70:0;68646:56;68665:23;68690:11;68646:18;:56::i;110375:126::-;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;110434:14:::1;:21:::0;;-1:-1:-1;;110434:21:0::1;110451:4;110434:21;::::0;;110473:18:::1;::::0;::::1;::::0;110434:14:::1;::::0;110473:18:::1;110375:126::o:0;50778:108::-;50834:13;50869:7;50862:14;;;;;:::i;113519:71::-;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;113569:11:::1;:9;:11::i;80440:242::-:0;80512:7;80535:16;80553:13;80570:43;80579:10;80591:21;80570:8;:43::i;:::-;80534:79;;;;80637:11;:35;;51817:12;;80637:35;;;80651:5;80637:35;80630:42;80440:242;-1:-1:-1;;;;80440:242:0:o;107190:258::-;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;107301:13:::1;-1:-1:-1::0;;;;;107293:21:0::1;:4;-1:-1:-1::0;;;;;107293:21:0::1;::::0;107285:97:::1;;;::::0;-1:-1:-1;;;107285:97:0;;13780:2:1;107285:97:0::1;::::0;::::1;13762:21:1::0;13819:2;13799:18;;;13792:30;13858:34;13838:18;;;13831:62;13929:33;13909:18;;;13902:61;13980:19;;107285:97:0::1;13578:427:1::0;107285:97:0::1;107395:43;107424:4;107430:7;107395:28;:43::i;67426:218::-:0;-1:-1:-1;;;;;67535:21:0;;67499:7;67535:21;;;:12;:21;;;;;:28;67583:8;;:51;;-1:-1:-1;;;;;67598:21:0;;;;;;:12;:21;;;;;67620:7;67626:1;67620:3;:7;:::i;:::-;67598:30;;;;;;;;:::i;:::-;;;;;;;;;;:36;-1:-1:-1;;;67598:36:0;;-1:-1:-1;;;;;67598:36:0;67583:51;;;67594:1;67583:51;-1:-1:-1;;;;;67576:58:0;;67426:218;-1:-1:-1;;;67426:218:0:o;110676:151::-;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;110747:16:::1;:26:::0;;;::::1;;-1:-1:-1::0;;;110747:26:0::1;-1:-1:-1::0;;;;110747:26:0;;::::1;;::::0;;110791::::1;::::0;::::1;::::0;::::1;::::0;110766:7;179:14:1;172:22;154:41;;142:2;127:18;;14:187;55400:456:0;36387:10;55493:4;55580:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;55580:27:0;;;;;;;;;;55493:4;;36387:10;55628:35;;;;55620:85;;;;-1:-1:-1;;;55620:85:0;;14474:2:1;55620:85:0;;;14456:21:1;14513:2;14493:18;;;14486:30;14552:34;14532:18;;;14525:62;-1:-1:-1;;;14603:18:1;;;14596:35;14648:19;;55620:85:0;14272:401:1;55620:85:0;55745:60;55754:5;55761:7;55789:15;55770:16;:34;55745:8;:60::i;109327:142::-;109420:13;;:39;;-1:-1:-1;;;109420:39:0;;-1:-1:-1;;;;;1862:32:1;;;109420:39:0;;;1844:51:1;109391:7:0;;109420:13;;:30;;1817:18:1;;109420:39:0;1698:203:1;110513:151:0;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;110584:16:::1;:26:::0;;;::::1;;-1:-1:-1::0;;;110584:26:0::1;-1:-1:-1::0;;;;110584:26:0;;::::1;;::::0;;110628::::1;::::0;::::1;::::0;::::1;::::0;110603:7;179:14:1;172:22;154:41;;142:2;127:18;;14:187;52269:201:0;52348:4;36387:10;52408:28;36387:10;52425:2;52429:6;52408:9;:28::i;108522:144::-;108616:13;;:40;;-1:-1:-1;;;108616:40:0;;-1:-1:-1;;;;;1862:32:1;;;108616:40:0;;;1844:51:1;108587:7:0;;108616:13;;:31;;1817:18:1;;108616:40:0;1698:203:1;106698:188:0;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;106785:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;106785:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;106842:34;;154:41:1;;;106842:34:0::1;::::0;127:18:1;106842:34:0::1;14:187:1::0;70647:625:0;70890:6;70871:15;:25;;70863:67;;;;-1:-1:-1;;;70863:67:0;;14880:2:1;70863:67:0;;;14862:21:1;14919:2;14899:18;;;14892:30;14958:31;14938:18;;;14931:59;15007:18;;70863:67:0;14678:353:1;70863:67:0;71017:58;;;66360:71;71017:58;;;15267:25:1;-1:-1:-1;;;;;15328:32:1;;15308:18;;;15301:60;;;;15377:18;;;15370:34;;;15420:18;;;15413:34;;;70943:14:0;;70960:184;;70990:87;;15239:19:1;;71017:58:0;;;;;;;;;;;;71007:69;;;;;;70990:16;:87::i;:::-;71094:1;71112;71130;70960:13;:184::i;:::-;70943:201;;71174:17;71184:6;71174:9;:17::i;:::-;71165:5;:26;71157:64;;;;-1:-1:-1;;;71157:64:0;;15660:2:1;71157:64:0;;;15642:21:1;15699:2;15679:18;;;15672:30;15738:27;15718:18;;;15711:55;15783:18;;71157:64:0;15458:349:1;71157:64:0;71234:28;71244:6;71252:9;71234;:28::i;:::-;70850:422;70647:625;;;;;;:::o;63487:683::-;63749:8;63730:15;:27;;63722:69;;;;-1:-1:-1;;;63722:69:0;;16014:2:1;63722:69:0;;;15996:21:1;16053:2;16033:18;;;16026:30;16092:31;16072:18;;;16065:59;16141:18;;63722:69:0;15812:353:1;63722:69:0;63808:18;63850:16;63868:5;63875:7;63884:5;63891:16;63901:5;63891:9;:16::i;:::-;63839:79;;;;;;16457:25:1;;;;-1:-1:-1;;;;;16556:15:1;;;16536:18;;;16529:43;16608:15;;;;16588:18;;;16581:43;16640:18;;;16633:34;16683:19;;;16676:35;16727:19;;;16720:35;;;16429:19;;63839:79:0;;;;;;;;;;;;63829:90;;;;;;63808:111;;63936:12;63951:28;63968:10;63951:16;:28::i;:::-;63936:43;;63996:14;64013:28;64027:4;64033:1;64036;64039;64013:13;:28::i;:::-;63996:45;;64072:5;-1:-1:-1;;;;;64062:15:0;:6;-1:-1:-1;;;;;64062:15:0;;64054:58;;;;-1:-1:-1;;;64054:58:0;;16968:2:1;64054:58:0;;;16950:21:1;17007:2;16987:18;;;16980:30;17046:32;17026:18;;;17019:60;17096:18;;64054:58:0;16766:354:1;64054:58:0;64129:31;64138:5;64145:7;64154:5;64129:8;:31::i;:::-;63709:461;;;63487:683;;;;;;;:::o;111747:867::-;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;112099:9:::1;112081:15;;:27;;;;;;;;;;;;;;;;;;112132:6;112121:8;:17;;;;112169:9;112151:15;;:27;;;;;;;;;;;;;;;;;;112202:6;112191:8;:17;;;;112239:9;112221:15;;:27;;;;;;;;;;;;;;;;;;112272:6;112261:8;:17;;;;112309:9;112291:15;;:27;;;;;;;;;;;;;;;;;;112342:6;112331:8;:17;;;;112379:9;112361:15;;:27;;;;;;;;;;;;;;;;;;112412:6;112401:8;:17;;;;112486:6;112477;112468;112459;112450;:15;;;;:::i;:::-;:24;;;;:::i;:::-;:33;;;;:::i;:::-;:42;;;;:::i;:::-;112435:12;:57:::0;;;112529:4:::1;-1:-1:-1::0;112513:20:0::1;112505:68;;;;-1:-1:-1::0;;;112505:68:0::1;;;;;;;:::i;:::-;112591:13;::::0;::::1;::::0;;;::::1;111747:867:::0;;;;;;;;;;:::o;122650:315::-;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;122713:69:::1;122738:4;122745:10;122757:24;122775:4;122757:9;:24::i;:::-;122713:16;:69::i;:::-;122809:1;122795:11;:15:::0;;;122823:11:::1;:15:::0;;;122851:11:::1;:15:::0;;;122879:11:::1;:15:::0;;;122907:11:::1;:15:::0;;;122940::::1;::::0;::::1;::::0;122809:1;122940:15:::1;122650:315::o:0;109653:139::-;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;109723:11:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;109723:21:0::1;-1:-1:-1::0;;109723:21:0;;::::1;;::::0;;109762:20:::1;::::0;::::1;::::0;::::1;::::0;109737:7;179:14:1;172:22;154:41;;142:2;127:18;;14:187;112627:880:0;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;112981:9:::1;112962:16;;:28;;;;;;;;;;;;;;;;;;113015:6;113003:9;:18;;;;113053:9;113034:16;;:28;;;;;;;;;;;;;;;;;;113087:6;113075:9;:18;;;;113125:9;113106:16;;:28;;;;;;;;;;;;;;;;;;113159:6;113147:9;:18;;;;113197:9;113178:16;;:28;;;;;;;;;;;;;;;;;;113231:6;113219:9;:18;;;;113269:9;113250:16;;:28;;;;;;;;;;;;;;;;;;113303:6;113291:9;:18;;;;113378:6;113369;113360;113351;113342;:15;;;;:::i;:::-;:24;;;;:::i;:::-;:33;;;;:::i;:::-;:42;;;;:::i;:::-;113326:13;:58:::0;;;113422:4:::1;-1:-1:-1::0;113405:21:0::1;113397:69;;;;-1:-1:-1::0;;;113397:69:0::1;;;;;;;:::i;109481:160::-:0;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;109558:18:::1;:28:::0;;;::::1;;-1:-1:-1::0;;;109558:28:0::1;-1:-1:-1::0;;109558:28:0;;::::1;;::::0;;109604:27:::1;::::0;::::1;::::0;::::1;::::0;109579:7;179:14:1;172:22;154:41;;142:2;127:18;;14:187;111517:218:0;37726:6;;111577:4;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;-1:-1:-1;111596:20:0::1;:28:::0;;-1:-1:-1;;111596:28:0::1;::::0;;:20:::1;111517:218:::0;:::o;109804:254::-;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;109906:13:::1;:18:::0;;110030;::::1;;-1:-1:-1::0;;;110030:18:0::1;-1:-1:-1::0;;;;109999:18:0;::::1;;-1:-1:-1::0;;;109999:18:0::1;-1:-1:-1::0;;;;109968:18:0;::::1;;-1:-1:-1::0;;;109968:18:0::1;109999::::0;;;;-1:-1:-1;;;;109937:18:0;::::1;;-1:-1:-1::0;;;109937:18:0::1;-1:-1:-1::0;;;;109906:18:0;::::1;;-1:-1:-1::0;;;109906:18:0::1;109937::::0;;;;-1:-1:-1;;;;109937:18:0;;;;;;;;;;::::1;109999::::0;;;;;;;;::::1;110030;::::0;;;::::1;::::0;;109804:254::o;66698:154::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;66816:21:0;;;;;;:12;:21;;;;;:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;;66809:33;;;;;;;;;66816:26;;66809:33;;;;;;-1:-1:-1;;;66809:33:0;;-1:-1:-1;;;;;66809:33:0;;;;;;;;;66698:154;-1:-1:-1;;;66698:154:0:o;107670:271::-;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;107762:24:0;::::1;107754:76;;;::::0;-1:-1:-1;;;107754:76:0;;17731:2:1;107754:76:0::1;::::0;::::1;17713:21:1::0;17770:2;17750:18;;;17743:30;17809:34;17789:18;;;17782:62;-1:-1:-1;;;17860:18:1;;;17853:37;17907:19;;107754:76:0::1;17529:403:1::0;107754:76:0::1;107843:13;:42:::0;;-1:-1:-1;;;;;;107843:42:0::1;-1:-1:-1::0;;;;;107843:42:0;::::1;::::0;;::::1;::::0;;;107903:28:::1;::::0;::::1;::::0;-1:-1:-1;;107903:28:0::1;107670:271:::0;:::o;38614:207::-;37726:6;;-1:-1:-1;;;;;37726:6:0;36387:10;37887:23;37879:68;;;;-1:-1:-1;;;37879:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38705:22:0;::::1;38697:73;;;::::0;-1:-1:-1;;;38697:73:0;;18139:2:1;38697:73:0::1;::::0;::::1;18121:21:1::0;18178:2;18158:18;;;18151:30;18217:34;18197:18;;;18190:62;-1:-1:-1;;;18268:18:1;;;18261:36;18314:19;;38697:73:0::1;17937:402:1::0;38697:73:0::1;38783:28;38802:8;38783:18;:28::i;108063:245::-:0;108111:18;;-1:-1:-1;;;108111:18:0;;;;108103:63;;;;-1:-1:-1;;;108103:63:0;;18546:2:1;108103:63:0;;;18528:21:1;;;18565:18;;;18558:30;18624:34;18604:18;;;18597:62;18676:18;;108103:63:0;18344:356:1;108103:63:0;108179:13;:20;;-1:-1:-1;;108179:20:0;-1:-1:-1;;;108179:20:0;;;108212:13;;-1:-1:-1;;;;;108212:13:0;:29;108250:12;36387:10;;36305:102;108250:12;108212:52;;-1:-1:-1;;;;;;108212:52:0;;;;;;;-1:-1:-1;;;;;1862:32:1;;;108212:52:0;;;1844:51:1;1817:18;;108212:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;108277:13:0;:21;;-1:-1:-1;;108277:21:0;;;108063:245::o;71602:300::-;71689:28;71701:7;71710:6;71689:11;:28::i;:::-;51817:12;;-1:-1:-1;;;;;;71738:29:0;71730:90;;;;-1:-1:-1;;;71730:90:0;;18907:2:1;71730:90:0;;;18889:21:1;18946:2;18926:18;;;18919:30;18985:34;18965:18;;;18958:62;-1:-1:-1;;;19036:18:1;;;19029:46;19092:19;;71730:90:0;18705:412:1;71730:90:0;71837:55;71854:23;71879:4;71885:6;71837:16;:55::i;:::-;;;71602:300;;:::o;57387:419::-;-1:-1:-1;;;;;57473:21:0;;57465:65;;;;-1:-1:-1;;;57465:65:0;;19324:2:1;57465:65:0;;;19306:21:1;19363:2;19343:18;;;19336:30;19402:33;19382:18;;;19375:61;19453:18;;57465:65:0;19122:355:1;57465:65:0;57547:49;57576:1;57580:7;57589:6;57547:20;:49::i;:::-;57629:6;57613:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;57648:18:0;;:9;:18;;;;;;;;;;:28;;57670:6;;57648:9;:28;;57670:6;;57648:28;:::i;:::-;;;;-1:-1:-1;;57694:37:0;;740:25:1;;;-1:-1:-1;;;;;57694:37:0;;;57711:1;;57694:37;;728:2:1;713:18;57694:37:0;;;;;;;57748:48;57776:1;57780:7;57789:6;57748:19;:48::i;74606:102::-;74664:7;74693:5;74697:1;74693;:5;:::i;1999:201::-;2056:7;-1:-1:-1;;;;;2086:26:0;;;2078:78;;;;-1:-1:-1;;;2078:78:0;;19684:2:1;2078:78:0;;;19666:21:1;19723:2;19703:18;;;19696:30;19762:34;19742:18;;;19735:62;-1:-1:-1;;;19813:18:1;;;19806:37;19860:19;;2078:78:0;19482:403:1;2078:78:0;-1:-1:-1;2184:5:0;1999:201::o;4089:196::-;4145:6;4183:16;4174:25;;;4166:76;;;;-1:-1:-1;;;4166:76:0;;20092:2:1;4166:76:0;;;20074:21:1;20131:2;20111:18;;;20104:30;20170:34;20150:18;;;20143:62;-1:-1:-1;;;20221:18:1;;;20214:36;20267:19;;4166:76:0;19890:402:1;80907:662:0;-1:-1:-1;;;;;81125:18:0;;81121:439;;81185:26;81208:2;81185:22;:26::i;:::-;81228:28;:26;:28::i;:::-;80907:662;;;:::o;81121:439::-;-1:-1:-1;;;;;81280:16:0;;81276:284;;81338:28;81361:4;81338:22;:28::i;81276:284::-;81475:28;81498:4;81475:22;:28::i;:::-;81520:26;81543:2;81520:22;:26::i;72362:278::-;-1:-1:-1;;;;;67303:19:0;;;67274:7;67303:19;;;:10;:19;;;;;;;;;;;;;;;72574:56;;67303:19;;;;;72623:6;72574:16;:56::i;74720:107::-;74783:7;74812:5;74816:1;74812;:5;:::i;31950:118::-;32044:14;;31950:118::o;59254:400::-;-1:-1:-1;;;;;59400:19:0;;59392:68;;;;-1:-1:-1;;;59392:68:0;;20499:2:1;59392:68:0;;;20481:21:1;20538:2;20518:18;;;20511:30;20577:34;20557:18;;;20550:62;-1:-1:-1;;;20628:18:1;;;20621:34;20672:19;;59392:68:0;20297:400:1;59392:68:0;-1:-1:-1;;;;;59481:21:0;;59473:68;;;;-1:-1:-1;;;59473:68:0;;20904:2:1;59473:68:0;;;20886:21:1;20943:2;20923:18;;;20916:30;20982:34;20962:18;;;20955:62;-1:-1:-1;;;21033:18:1;;;21026:32;21075:19;;59473:68:0;20702:398:1;59473:68:0;-1:-1:-1;;;;;59558:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;59612:32;;740:25:1;;;59612:32:0;;713:18:1;59612:32:0;;;;;;;59254:400;;;:::o;59961:477::-;-1:-1:-1;;;;;52661:18:0;;;60106:24;52661:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;60175:37:0;;60171:258;;60259:6;60239:16;:26;;60231:68;;;;-1:-1:-1;;;60231:68:0;;21307:2:1;60231:68:0;;;21289:21:1;21346:2;21326:18;;;21319:30;21385:31;21365:18;;;21358:59;21434:18;;60231:68:0;21105:353:1;60231:68:0;60347:51;60356:5;60363:7;60391:6;60372:16;:25;60347:8;:51::i;114265:5238::-;-1:-1:-1;;;;;114407:18:0;;114399:72;;;;-1:-1:-1;;;114399:72:0;;21665:2:1;114399:72:0;;;21647:21:1;21704:2;21684:18;;;21677:30;21743:34;21723:18;;;21716:62;-1:-1:-1;;;21794:18:1;;;21787:39;21843:19;;114399:72:0;21463:405:1;114399:72:0;-1:-1:-1;;;;;114492:16:0;;114484:68;;;;-1:-1:-1;;;114484:68:0;;22075:2:1;114484:68:0;;;22057:21:1;22114:2;22094:18;;;22087:30;22153:34;22133:18;;;22126:62;-1:-1:-1;;;22204:18:1;;;22197:37;22251:19;;114484:68:0;21873:403:1;114484:68:0;-1:-1:-1;;;;;114574:16:0;;;;;;:10;:16;;;;;;;;114573:17;114565:62;;;;-1:-1:-1;;;114565:62:0;;22483:2:1;114565:62:0;;;22465:21:1;;;22502:18;;;22495:30;22561:34;22541:18;;;22534:62;22613:18;;114565:62:0;22281:356:1;114565:62:0;-1:-1:-1;;;;;114649:14:0;;;;;;:10;:14;;;;;;;;114648:15;114640:63;;;;-1:-1:-1;;;114640:63:0;;22844:2:1;114640:63:0;;;22826:21:1;22883:2;22863:18;;;22856:30;22922:34;22902:18;;;22895:62;-1:-1:-1;;;22973:18:1;;;22966:33;23016:19;;114640:63:0;22642:399:1;114640:63:0;114725:6;114735:1;114725:11;114721:100;;114755:29;114772:4;114778:2;114782:1;114755:16;:29::i;114721:100::-;114842:14;;;;114838:1053;;;37726:6;;-1:-1:-1;;;;;114899:15:0;;;37726:6;;114899:15;;;;:51;;-1:-1:-1;37726:6:0;;-1:-1:-1;;;;;114937:13:0;;;37726:6;;114937:13;;114899:51;:90;;;;-1:-1:-1;;;;;;114973:16:0;;;;114899:90;:134;;;;-1:-1:-1;;;;;;115012:21:0;;115026:6;115012:21;;114899:134;:166;;;;-1:-1:-1;115057:8:0;;;;;;;115056:9;114899:166;114875:1003;;;115109:11;;-1:-1:-1;;;115109:11:0;;;;115104:163;;-1:-1:-1;;;;;115155:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;115184:23:0;;;;;;:19;:23;;;;;;;;115155:52;115147:98;;;;-1:-1:-1;;;115147:98:0;;23248:2:1;115147:98:0;;;23230:21:1;23287:2;23267:18;;;23260:30;23326:34;23306:18;;;23299:62;-1:-1:-1;;;23377:18:1;;;23370:31;23418:19;;115147:98:0;23046:397:1;115147:98:0;115432:20;;;;;;;115428:433;;;37726:6;;-1:-1:-1;;;;;115482:13:0;;;37726:6;;115482:13;;;;:47;;;115513:15;-1:-1:-1;;;;;115499:30:0;:2;-1:-1:-1;;;;;115499:30:0;;;115482:47;:79;;;;;115547:13;-1:-1:-1;;;;;115533:28:0;:2;-1:-1:-1;;;;;115533:28:0;;;115482:79;115478:362;;;115629:9;115600:39;;;;:28;:39;;;;;;115642:12;-1:-1:-1;115592:139:0;;;;-1:-1:-1;;;115592:139:0;;23650:2:1;115592:139:0;;;23632:21:1;23689:2;23669:18;;;23662:30;23728:34;23708:18;;;23701:62;23799:34;23779:18;;;23772:62;-1:-1:-1;;;23850:19:1;;;23843:39;23899:19;;115592:139:0;23448:476:1;115592:139:0;115789:9;115760:39;;;;:28;:39;;;;;115802:12;115760:54;;115478:362;115958:10;;:14;;115971:1;115958:14;:::i;:::-;115941:12;:32;;:71;;;;;115999:13;-1:-1:-1;;;;;115993:19:0;:2;-1:-1:-1;;;;;115993:19:0;;;115941:71;:148;;;;-1:-1:-1;;;;;;116032:57:0;;116046:42;116032:57;;115941:148;115937:255;;;-1:-1:-1;;;;;116120:14:0;;;;;;:10;:14;;;;;;:21;;-1:-1:-1;;116120:21:0;116137:4;116120:21;;;116163:15;;;116120:14;116163:15;115937:255;116228:11;;-1:-1:-1;;;116228:11:0;;;;:72;;;;-1:-1:-1;116292:8:0;;;;;;;116291:9;116228:72;:170;;;;-1:-1:-1;;;;;;116367:31:0;;;;;;:25;:31;;;;;;;;116366:32;116228:170;:270;;;;;116482:15;-1:-1:-1;;;;;116466:32:0;:4;-1:-1:-1;;;;;116466:32:0;;;116228:270;:342;;;;-1:-1:-1;37726:6:0;;-1:-1:-1;;;;;116555:15:0;;;37726:6;;116555:15;;116228:342;:404;;;;-1:-1:-1;37726:6:0;;-1:-1:-1;;;;;116619:13:0;;;37726:6;;116619:13;;116228:404;116208:603;;;116663:8;:15;;-1:-1:-1;;116663:15:0;;;;;116699:14;:12;:14::i;:::-;116749:15;116734:12;:30;116781:8;:16;;-1:-1:-1;;116781:16:0;;;116208:603;116827:12;116892:13;-1:-1:-1;;;;;116876:30:0;:4;-1:-1:-1;;;;;116876:30:0;;:77;;;;116939:13;-1:-1:-1;;;;;116925:28:0;:2;-1:-1:-1;;;;;116925:28:0;;116876:77;:125;;;-1:-1:-1;;;;;;116972:29:0;;;;;;:25;:29;;;;;;;;116876:125;:175;;;-1:-1:-1;;;;;;117020:31:0;;;;;;:25;:31;;;;;;;;116876:175;:212;;;-1:-1:-1;117070:18:0;;-1:-1:-1;;;117070:18:0;;;;116876:212;116856:291;;;-1:-1:-1;117129:4:0;116856:291;-1:-1:-1;;;;;117167:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;117196:23:0;;;;;;:19;:23;;;;;;;;117167:52;:64;;;-1:-1:-1;117223:8:0;;;;;;;117167:64;:81;;;-1:-1:-1;117235:13:0;;-1:-1:-1;;;117235:13:0;;;;117167:81;:104;;;-1:-1:-1;117253:18:0;;-1:-1:-1;;;117253:18:0;;;;117252:19;117167:104;117163:156;;;-1:-1:-1;117300:5:0;117163:156;117415:7;117411:1893;;;-1:-1:-1;;;;;117500:29:0;;117441:12;117500:29;;;:25;:29;;;;;;;;:50;;;;;117549:1;117533:13;;:17;117500:50;117496:1648;;;117607:5;117590:13;;117581:6;:22;;;;:::i;:::-;117580:32;;;;:::i;:::-;117637:16;;117573:39;;-1:-1:-1;;;;117637:16:0;;;;117633:116;;;117714:13;;117702:9;;117695:16;;:4;:16;:::i;:::-;:32;;;;:::i;:::-;117680:11;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;117633:116:0;117773:16;;-1:-1:-1;;;117773:16:0;;;;117769:116;;;117850:13;;117838:9;;117831:16;;:4;:16;:::i;:::-;:32;;;;:::i;:::-;117816:11;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;117769:116:0;117909:16;;-1:-1:-1;;;117909:16:0;;;;117905:116;;;117986:13;;117974:9;;117967:16;;:4;:16;:::i;:::-;:32;;;;:::i;:::-;117952:11;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;117905:116:0;118045:16;;-1:-1:-1;;;118045:16:0;;;;118041:116;;;118122:13;;118110:9;;118103:16;;:4;:16;:::i;:::-;:32;;;;:::i;:::-;118088:11;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;118041:116:0;118181:16;;-1:-1:-1;;;118181:16:0;;;;118177:116;;;118258:13;;118246:9;;118239:16;;:4;:16;:::i;:::-;:32;;;;:::i;:::-;118224:11;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;118177:116:0;117496:1648;;;-1:-1:-1;;;;;118345:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;118395:1;118380:12;;:16;118345:51;118341:803;;;118452:5;118436:12;;118427:6;:21;;;;:::i;:::-;118426:31;;;;:::i;:::-;118486:15;;118419:38;;-1:-1:-1;118486:15:0;;118482:113;;;118561:12;;118550:8;;118543:15;;:4;:15;:::i;:::-;:30;;;;:::i;:::-;118528:11;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;118482:113:0;118619:15;;;;;;;118615:113;;;118694:12;;118683:8;;118676:15;;:4;:15;:::i;:::-;:30;;;;:::i;:::-;118661:11;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;118615:113:0;118752:15;;;;;;;118748:113;;;118827:12;;118816:8;;118809:15;;:4;:15;:::i;:::-;:30;;;;:::i;:::-;118794:11;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;118748:113:0;118885:15;;;;;;;118881:113;;;118960:12;;118949:8;;118942:15;;:4;:15;:::i;:::-;:30;;;;:::i;:::-;118927:11;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;118881:113:0;119018:15;;-1:-1:-1;;;119018:15:0;;;;119014:113;;;119093:12;;119082:8;;119075:15;;:4;:15;:::i;:::-;:30;;;;:::i;:::-;119060:11;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;119014:113:0;119165:14;119175:4;119165:14;;:::i;:::-;;-1:-1:-1;119200:8:0;;119196:95;;119230:43;119247:4;119261;119268;119230:16;:43::i;:::-;117424:1880;117411:1893;119321:34;119338:4;119344:2;119348:6;119321:16;:34::i;:::-;119372:13;;-1:-1:-1;;;;;119372:13:0;:24;119405:4;119412:15;119405:4;119412:9;:15::i;:::-;119372:56;;-1:-1:-1;;;;;;119372:56:0;;;;;;;-1:-1:-1;;;;;24532:32:1;;;119372:56:0;;;24514:51:1;24581:18;;;24574:34;24487:18;;119372:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;119441:13:0;;-1:-1:-1;;;;;119441:13:0;;-1:-1:-1;119441:24:0;;-1:-1:-1;119474:2:0;119479:13;119474:2;119479:9;:13::i;:::-;119441:52;;-1:-1:-1;;;;;;119441:52:0;;;;;;;-1:-1:-1;;;;;24532:32:1;;;119441:52:0;;;24514:51:1;24581:18;;;24574:34;24487:18;;119441:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;114386:5117;114265:5238;;;:::o;27120:326::-;27173:7;27207:4;-1:-1:-1;;;;;27216:12:0;27199:29;;:66;;;;;27249:16;27232:13;:33;27199:66;27195:242;;;-1:-1:-1;27291:24:0;;27120:326::o;27195:242::-;-1:-1:-1;27649:73:0;;;27381:10;27649:73;;;;26840:25:1;;;;27393:12:0;26881:18:1;;;26874:34;27407:15:0;26924:18:1;;;26917:34;27693:13:0;26967:18:1;;;26960:34;27716:4:0;27010:19:1;;;;27003:61;;;;27649:73:0;;;;;;;;;;26812:19:1;;;;27649:73:0;;;27639:84;;;;;;64520:119::o;68811:1530::-;69968:12;;68910:7;;;70021:250;70034:4;70028:3;:10;70021:250;;;70057:11;70071:23;70084:3;70089:4;70071:12;:23::i;:::-;70057:37;;70138:11;70115:5;70121:3;70115:10;;;;;;;;:::i;:::-;;;;;;;;;;:20;;;:34;70111:147;;;70179:3;70172:10;;70111:147;;;70233:7;:3;70239:1;70233:7;:::i;:::-;70227:13;;70111:147;70040:231;70021:250;;;70294:9;;:37;;70310:5;70316:8;70323:1;70316:4;:8;:::i;:::-;70310:15;;;;;;;;:::i;:::-;;;;;;;;;;:21;-1:-1:-1;;;70310:21:0;;-1:-1:-1;;;;;70310:21:0;70294:37;;;70306:1;70294:37;-1:-1:-1;;;;;70287:44:0;;68811:1530;-1:-1:-1;;;;;68811:1530:0:o;114117:136::-;114215:28;114227:7;114236:6;114215:11;:28::i;81581:1669::-;81670:4;81676:7;81719:1;81706:10;:14;81698:49;;;;-1:-1:-1;;;81698:49:0;;24821:2:1;81698:49:0;;;24803:21:1;24860:2;24840:18;;;24833:30;-1:-1:-1;;;24879:18:1;;;24872:52;24941:18;;81698:49:0;24619:346:1;81698:49:0;81782:23;:21;:23::i;:::-;81768:10;:37;;81760:79;;;;-1:-1:-1;;;81760:79:0;;25172:2:1;81760:79:0;;;25154:21:1;25211:2;25191:18;;;25184:30;25250:31;25230:18;;;25223:59;25299:18;;81760:79:0;24970:353:1;81760:79:0;83010:13;83026:40;:9;83055:10;83026:28;:40::i;:::-;83096:20;;83010:56;;-1:-1:-1;83087:29:0;;83083:158;;83143:5;83150:1;83135:17;;;;;;;83083:158;83197:4;83203:9;:16;;83220:5;83203:23;;;;;;;;:::i;:::-;;;;;;;;;83189:38;;;;;81581:1669;;;;;;:::o;72818:404::-;-1:-1:-1;;;;;67303:19:0;;;72905:23;67303:19;;;:10;:19;;;;;;;;;;72991:20;67303:19;72991:9;:20::i;:::-;-1:-1:-1;;;;;73024:21:0;;;;;;;:10;:21;;;;;;:33;;-1:-1:-1;;;;;;73024:33:0;;;;;;;;;;73079:54;;72964:47;;-1:-1:-1;73024:33:0;73079:54;;;;;;73024:21;73079:54;73150:62;73167:15;73184:9;73195:16;73150;:62::i;38993:199::-;39088:6;;;-1:-1:-1;;;;;39107:17:0;;;-1:-1:-1;;;;;;39107:17:0;;;;;;;39142:40;;39088:6;;;39107:17;39088:6;;39142:40;;39069:16;;39142:40;39056:136;38993:199;:::o;79488:235::-;79535:7;79557:30;:18;32173:19;;32191:1;32173:19;;;32080:135;79557:30;79604:17;79624:23;:21;:23::i;:::-;79604:43;;79665:19;79674:9;79665:19;;;;740:25:1;;728:2;713:18;;594:177;79665:19:0;;;;;;;;79704:9;79488:235;-1:-1:-1;79488:235:0:o;107460:198::-;-1:-1:-1;;;;;107547:31:0;;;;;;:25;:31;;;;;;:41;;-1:-1:-1;;107547:41:0;;;;;;;;;;107606:42;;107547:41;;:31;107606:42;;;107460:198;;:::o;28409:171::-;28486:7;28515:55;28537:20;:18;:20::i;:::-;28559:10;23704:57;;-1:-1:-1;;;23704:57:0;;;27333:27:1;27376:11;;;27369:27;;;27412:12;;;27405:28;;;23665:7:0;;27449:12:1;;23704:57:0;;;;;;;;;;;;23694:68;;;;;;23687:75;;23572:200;;;;;21789:297;21927:7;21950:17;21969:18;21991:25;22002:4;22008:1;22011;22014;21991:10;:25::i;:::-;21949:67;;;;22029:18;22041:5;22029:11;:18::i;:::-;-1:-1:-1;22067:9:0;21789:297;-1:-1:-1;;;;;21789:297:0:o;64791:215::-;-1:-1:-1;;;;;64914:14:0;;64851:15;64914:14;;;:7;:14;;;;;32044;;32191:1;32173:19;;;;32044:14;64979:17;64868:138;64791:215;;;:::o;122977:150::-;123075:42;123091:6;123099:9;123110:6;123075:15;:42::i;73921:673::-;74168:12;;74103:17;;;;74205:8;;:35;;74220:5;74226:7;74232:1;74226:3;:7;:::i;:::-;74220:14;;;;;;;;:::i;:::-;;;;;;;;;;:20;-1:-1:-1;;;74220:20:0;;-1:-1:-1;;;;;74220:20:0;74205:35;;;74216:1;74205:35;-1:-1:-1;;;;;74193:47:0;;;74265:20;74268:9;74279:5;74265:2;:20;;:::i;:::-;74253:32;;74312:1;74306:3;:7;:51;;;;-1:-1:-1;74345:12:0;74317:5;74323:7;74329:1;74323:3;:7;:::i;:::-;74317:14;;;;;;;;:::i;:::-;;;;;;;;;;:24;;;:40;74306:51;74302:283;;;74399:29;74418:9;74399:18;:29::i;:::-;74376:5;74382:7;74388:1;74382:3;:7;:::i;:::-;74376:14;;;;;;;;:::i;:::-;;;;;;;;:20;;;:52;;;;;-1:-1:-1;;;;;74376:52:0;;;;;-1:-1:-1;;;;;74376:52:0;;;;;;74302:283;;;74465:5;74476:94;;;;;;;;74499:31;74517:12;74499:17;:31::i;:::-;74476:94;;;;;;74539:29;74558:9;74539:18;:29::i;:::-;-1:-1:-1;;;;;74476:94:0;;;;;;74465:106;;;;;;;-1:-1:-1;74465:106:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;74465:106:0;;;;;;;;;;;;74302:283;74141:453;73921:673;;;;;;:::o;113602:179::-;113727:44;113754:4;113760:2;113764:6;113727:26;:44::i;113793:174::-;113914:43;113940:4;113946:2;113950:6;113914:25;:43::i;83262:150::-;-1:-1:-1;;;;;83348:33:0;;;;;;:24;:33;;;;;83332:70;;83383:18;83373:7;83383:9;:18::i;:::-;83332:15;:70::i;83424:122::-;83483:53;83499:21;83522:13;51817:12;;;51727:112;73234:675;73376:3;-1:-1:-1;;;;;73369:10:0;:3;-1:-1:-1;;;;;73369:10:0;;;:24;;;;;73392:1;73383:6;:10;73369:24;73365:535;;;-1:-1:-1;;;;;73416:17:0;;;73412:230;;-1:-1:-1;;;;;73514:17:0;;73457;73514;;;:12;:17;;;;;73457;;73497:54;;73533:9;73544:6;73497:16;:54::i;:::-;73456:95;;;;73598:3;-1:-1:-1;;;;;73577:47:0;;73603:9;73614;73577:47;;;;;;25502:25:1;;;25558:2;25543:18;;25536:34;25490:2;25475:18;;25328:248;73577:47:0;;;;;;;;73435:207;;73412:230;-1:-1:-1;;;;;73666:17:0;;;73662:225;;-1:-1:-1;;;;;73764:17:0;;73707;73764;;;:12;:17;;;;;73707;;73747:49;;73783:4;73789:6;73747:16;:49::i;:::-;73706:90;;;;73843:3;-1:-1:-1;;;;;73822:47:0;;73848:9;73859;73822:47;;;;;;25502:25:1;;;25558:2;25543:18;;25536:34;25490:2;25475:18;;25328:248;73822:47:0;;;;;;;;73685:202;;73234:675;;;:::o;119515:3097::-;119560:28;119591:24;119609:4;119591:9;:24::i;:::-;119560:55;;119656:1;119632:20;:25;119628:42;;119661:7;119515:3097::o;119628:42::-;119698:9;;;;;;;:14;:31;;;;-1:-1:-1;119716:13:0;;-1:-1:-1;;;119716:13:0;;;;119698:31;:50;;;;;119747:1;119733:11;;:15;119698:50;119694:2720;;;119806:32;119826:11;;119806:19;:32::i;:::-;119882:8;;119874:56;;119856:12;;-1:-1:-1;;;;;119882:8:0;;119904:21;;119856:12;119874:56;119856:12;119874:56;119904:21;119882:8;119874:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;119855:75;;;119951:7;119947:191;;;119986:25;119999:11;;119986:25;;;;740::1;;728:2;713:18;;594:177;119986:25:0;;;;;;;;119947:191;;;-1:-1:-1;;;;;;;;;;;120061:59:0;;;;;:::i;:::-;;;;;;;;119947:191;-1:-1:-1;120168:1:0;120154:11;:15;119694:2720;;;120197:9;;;;;;;120210:1;120197:14;:31;;;;-1:-1:-1;120215:13:0;;-1:-1:-1;;;120215:13:0;;;;120197:31;:50;;;;;120246:1;120232:11;;:15;120197:50;120193:2221;;;120308:16;;-1:-1:-1;;;120308:16:0;;;;120304:545;;;120347:33;120361:4;120368:11;;120347:5;:33::i;:::-;120406:25;120419:11;;120406:25;;;;740::1;;728:2;713:18;;594:177;120406:25:0;;;;;;;;120304:545;;;120476:32;120496:11;;120476:19;:32::i;:::-;120556:8;;120548:56;;120530:12;;-1:-1:-1;;;;;120556:8:0;;120578:21;;120530:12;120548:56;120530:12;120548:56;120578:21;120556:8;120548:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;120529:75;;;120629:7;120625:207;;;120668:25;120681:11;;120668:25;;;;740::1;;728:2;713:18;;594:177;120668:25:0;;;;;;;;120625:207;;;-1:-1:-1;;;;;;;;;;;120751:59:0;;;;;:::i;:::-;;;;;;;;120625:207;120455:394;120304:545;120879:1;120865:11;:15;120193:2221;;;120908:9;;;;;;;120921:1;120908:14;:31;;;;-1:-1:-1;120926:13:0;;-1:-1:-1;;;120926:13:0;;;;120908:31;:50;;;;;120957:1;120943:11;;:15;120908:50;120904:1510;;;121019:16;;-1:-1:-1;;;121019:16:0;;;;121015:571;;;121058:32;121078:11;;121058:19;:32::i;:::-;121138:13;;121130:61;;121112:12;;-1:-1:-1;;;;;121138:13:0;;121165:21;;121112:12;121130:61;121112:12;121130:61;121165:21;121138:13;121130:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;121111:80;;;121216:7;121212:207;;;121255:25;121268:11;;121255:25;;;;740::1;;728:2;713:18;;594:177;121255:25:0;;;;;;;;121212:207;;;-1:-1:-1;;;;;;;;;;;121338:59:0;;;;26193:2:1;26175:21;;;26232:2;26212:18;;;26205:30;26271:34;26266:2;26251:18;;26244:62;-1:-1:-1;;;26337:2:1;26322:18;;26315:39;26386:3;26371:19;;25991:405;121338:59:0;;;;;;;;121212:207;121037:399;121015:571;;;121495:8;;121505:11;;121463:54;;121488:4;;-1:-1:-1;;;;;121495:8:0;;;;121463:16;:54::i;:::-;121543:25;121556:11;;121543:25;;;;740::1;;728:2;713:18;;594:177;121543:25:0;;;;;;;;121015:571;121616:1;121602:11;:15;120904:1510;;;121645:9;;;;;;;;;:14;:31;;;;-1:-1:-1;121663:13:0;;-1:-1:-1;;;121663:13:0;;;;121645:31;:50;;;;;121694:1;121680:11;;:15;121645:50;121641:773;;;121792:8;;121802:11;;121760:54;;121785:4;;-1:-1:-1;;;;;121792:8:0;;;;121760:16;:54::i;:::-;121836:25;121849:11;;121836:25;;;;740::1;;728:2;713:18;;594:177;121836:25:0;;;;;;;;121892:1;121878:11;:15;121641:773;;;121921:9;;;;;;;121934:1;121921:14;:31;;;;-1:-1:-1;121939:13:0;;-1:-1:-1;;;121939:13:0;;;;121921:31;:50;;;;;121970:1;121956:11;;:15;121921:50;121917:497;;;122037:32;122057:11;;122037:19;:32::i;:::-;122113:8;;122105:56;;122087:12;;-1:-1:-1;;;;;122113:8:0;;122135:21;;122087:12;122105:56;122087:12;122105:56;122135:21;122113:8;122105:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;122086:75;;;122182:7;122178:191;;;122217:25;122230:11;;122217:25;;;;740::1;;728:2;713:18;;594:177;122217:25:0;;;;;;;;122178:191;;;-1:-1:-1;;;;;;;;;;;122292:59:0;;;;;:::i;:::-;;;;;;;;122178:191;-1:-1:-1;122399:1:0;122385:11;:15;121917:497;122434:9;;;;;;;122447:1;122434:14;122430:173;;122467:9;:13;;-1:-1:-1;;122467:13:0;;;84716:95;:::o;122430:173::-;122544:9;:11;;;;;;;;:9;:11;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;119547:3065;119515:3097::o;33352:162::-;33414:7;33493:11;33503:1;33494:5;;;33493:11;:::i;:::-;33483:21;;33484:5;;;33483:21;:::i;72006:202::-;72093:28;72105:7;72114:6;72093:11;:28::i;:::-;72138:60;72155:23;72180:9;72191:6;72138:16;:60::i;79799:131::-;79863:7;79892:28;:18;32044:14;;31950:118;34622:970;34737:12;;34711:7;;34737:17;;34733:62;;-1:-1:-1;34780:1:0;34773:8;;34733:62;34854:12;;34811:11;;34883:444;34896:4;34890:3;:10;34883:444;;;34919:11;34933:23;34946:3;34951:4;34933:12;:23::i;:::-;34919:37;;35198:7;35185:5;35191:3;35185:10;;;;;;;;:::i;:::-;;;;;;;;;:20;35181:133;;;35235:3;35228:10;;35181:133;;;35289:7;:3;35295:1;35289:7;:::i;:::-;35283:13;;35181:133;34902:425;34883:444;;;35459:1;35453:3;:7;:36;;;;-1:-1:-1;35482:7:0;35464:5;35470:7;35476:1;35470:3;:7;:::i;:::-;35464:14;;;;;;;;:::i;:::-;;;;;;;;;:25;35453:36;35449:134;;;35515:7;35521:1;35515:3;:7;:::i;:::-;35508:14;;;;;;35449:134;-1:-1:-1;35566:3:0;-1:-1:-1;35559:10:0;;19948:1690;20089:7;;21043:66;21030:79;;21026:167;;;-1:-1:-1;21144:1:0;;-1:-1:-1;21148:30:0;21128:51;;21026:167;21209:1;:7;;21214:2;21209:7;;:18;;;;;21220:1;:7;;21225:2;21220:7;;21209:18;21205:106;;;-1:-1:-1;21262:1:0;;-1:-1:-1;21266:30:0;21246:51;;21205:106;21431:24;;;21414:14;21431:24;;;;;;;;;27699:25:1;;;27772:4;27760:17;;27740:18;;;27733:45;;;;27794:18;;;27787:34;;;27837:18;;;27830:34;;;21431:24:0;;27671:19:1;;21431:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21431:24:0;;-1:-1:-1;;21431:24:0;;;-1:-1:-1;;;;;;;21472:20:0;;21468:107;;21527:1;21531:29;21511:50;;;;;;;21468:107;21599:6;-1:-1:-1;21607:20:0;;-1:-1:-1;19948:1690:0;;;;;;;;:::o;14411:667::-;14491:20;14482:5;:29;;;;;;;;:::i;:::-;;14478:591;;14411:667;:::o;14478:591::-;14593:29;14584:5;:38;;;;;;;;:::i;:::-;;14580:489;;14641:34;;-1:-1:-1;;;14641:34:0;;28209:2:1;14641:34:0;;;28191:21:1;28248:2;28228:18;;;28221:30;28287:26;28267:18;;;28260:54;28331:18;;14641:34:0;28007:348:1;14580:489:0;14708:35;14699:5;:44;;;;;;;;:::i;:::-;;14695:374;;14762:41;;-1:-1:-1;;;14762:41:0;;28562:2:1;14762:41:0;;;28544:21:1;28601:2;28581:18;;;28574:30;28640:33;28620:18;;;28613:61;28691:18;;14762:41:0;28360:355:1;14695:374:0;14836:30;14827:5;:39;;;;;;;;:::i;:::-;;14823:246;;14885:44;;-1:-1:-1;;;14885:44:0;;28922:2:1;14885:44:0;;;28904:21:1;28961:2;28941:18;;;28934:30;29000:34;28980:18;;;28973:62;-1:-1:-1;;;29051:18:1;;;29044:32;29093:19;;14885:44:0;28720:398:1;14823:246:0;14962:30;14953:5;:39;;;;;;;;:::i;:::-;;14949:120;;15011:44;;-1:-1:-1;;;15011:44:0;;29325:2:1;15011:44:0;;;29307:21:1;29364:2;29344:18;;;29337:30;29403:34;29383:18;;;29376:62;-1:-1:-1;;;29454:18:1;;;29447:32;29496:19;;15011:44:0;29123:398:1;56367:711:0;-1:-1:-1;;;;;56508:18:0;;56500:68;;;;-1:-1:-1;;;56500:68:0;;29728:2:1;56500:68:0;;;29710:21:1;29767:2;29747:18;;;29740:30;29806:34;29786:18;;;29779:62;-1:-1:-1;;;29857:18:1;;;29850:35;29902:19;;56500:68:0;29526:401:1;56500:68:0;-1:-1:-1;;;;;56589:16:0;;56581:64;;;;-1:-1:-1;;;56581:64:0;;30134:2:1;56581:64:0;;;30116:21:1;30173:2;30153:18;;;30146:30;30212:34;30192:18;;;30185:62;-1:-1:-1;;;30263:18:1;;;30256:33;30306:19;;56581:64:0;29932:399:1;56581:64:0;56662:38;56683:4;56689:2;56693:6;56662:20;:38::i;:::-;-1:-1:-1;;;;;56739:15:0;;56717:19;56739:15;;;;;;;;;;;56775:21;;;;56767:72;;;;-1:-1:-1;;;56767:72:0;;30538:2:1;56767:72:0;;;30520:21:1;30577:2;30557:18;;;30550:30;30616:34;30596:18;;;30589:62;-1:-1:-1;;;30667:18:1;;;30660:36;30713:19;;56767:72:0;30336:402:1;56767:72:0;-1:-1:-1;;;;;56879:15:0;;;:9;:15;;;;;;;;;;;56897:20;;;56879:38;;56943:13;;;;;;;;:23;;56911:6;;56879:9;56943:23;;56911:6;;56943:23;:::i;:::-;;;;;;;;57003:2;-1:-1:-1;;;;;56988:26:0;56997:4;-1:-1:-1;;;;;56988:26:0;;57007:6;56988:26;;;;740:25:1;;728:2;713:18;;594:177;56988:26:0;;;;;;;;57031:37;57051:4;57057:2;57061:6;57031:19;:37::i;83558:322::-;83655:17;83675:23;:21;:23::i;:::-;83655:43;-1:-1:-1;83655:43:0;83715:30;83731:9;83715:15;:30::i;:::-;:42;83711:160;;;83776:29;;;;;;;;-1:-1:-1;83776:29:0;;;;;;;;;;;;;;83822:16;;;:35;;;;;;;;;;;;;;;83558:322::o;123546:514::-;123636:16;;;123650:1;123636:16;;;;;;;;123612:21;;123636:16;;;;;;;;;;-1:-1:-1;123636:16:0;123612:40;;123683:4;123665;123670:1;123665:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;123665:23:0;;;-1:-1:-1;;;;;123665:23:0;;;;;123711:15;-1:-1:-1;;;;;123711:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;123701:4;123706:1;123701:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;123701:32:0;;;-1:-1:-1;;;;;123701:32:0;;;;;123746:57;123763:4;123778:15;123796:6;123746:8;:57::i;:::-;123816:234;;-1:-1:-1;;;123816:234:0;;-1:-1:-1;;;;;123816:15:0;:66;;;;:234;;123899:6;;123922:1;;123971:4;;124000;;124022:15;;123816:234;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;123599:461;123546:514;:::o;58165:621::-;-1:-1:-1;;;;;58251:21:0;;58243:67;;;;-1:-1:-1;;;58243:67:0;;32318:2:1;58243:67:0;;;32300:21:1;32357:2;32337:18;;;32330:30;32396:34;32376:18;;;32369:62;-1:-1:-1;;;32447:18:1;;;32440:31;32488:19;;58243:67:0;32116:397:1;58243:67:0;58327:49;58348:7;58365:1;58369:6;58327:20;:49::i;:::-;-1:-1:-1;;;;;58418:18:0;;58393:22;58418:18;;;;;;;;;;;58457:24;;;;58449:71;;;;-1:-1:-1;;;58449:71:0;;32720:2:1;58449:71:0;;;32702:21:1;32759:2;32739:18;;;32732:30;32798:34;32778:18;;;32771:62;-1:-1:-1;;;32849:18:1;;;32842:32;32891:19;;58449:71:0;32518:398:1;58449:71:0;-1:-1:-1;;;;;58560:18:0;;:9;:18;;;;;;;;;;58581:23;;;58560:44;;58630:12;:22;;58598:6;;58560:9;58630:22;;58598:6;;58630:22;:::i;:::-;;;;-1:-1:-1;;58674:37:0;;740:25:1;;;58700:1:0;;-1:-1:-1;;;;;58674:37:0;;;;;728:2:1;713:18;58674:37:0;;;;;;;58728:48;58748:7;58765:1;58769:6;58728:19;:48::i;83892:224::-;83988:10;;83962:7;;83988:15;;83984:123;;-1:-1:-1;84029:1:0;;83892:224;-1:-1:-1;83892:224:0:o;83984:123::-;84078:10;;84074:3;;84078:14;;84091:1;;84078:14;:::i;:::-;84074:19;;;;;;;;:::i;:::-;;;;;;;;;84067:26;;83892:224;;;:::o;83984:123::-;83892:224;;;:::o;206:131:1:-;-1:-1:-1;;;;;281:31:1;;271:42;;261:70;;327:1;324;317:12;342:247;401:6;454:2;442:9;433:7;429:23;425:32;422:52;;;470:1;467;460:12;422:52;509:9;496:23;528:31;553:5;528:31;:::i;776:597::-;888:4;917:2;946;935:9;928:21;978:6;972:13;1021:6;1016:2;1005:9;1001:18;994:34;1046:1;1056:140;1070:6;1067:1;1064:13;1056:140;;;1165:14;;;1161:23;;1155:30;1131:17;;;1150:2;1127:26;1120:66;1085:10;;1056:140;;;1214:6;1211:1;1208:13;1205:91;;;1284:1;1279:2;1270:6;1259:9;1255:22;1251:31;1244:42;1205:91;-1:-1:-1;1357:2:1;1336:15;-1:-1:-1;;1332:29:1;1317:45;;;;1364:2;1313:54;;776:597;-1:-1:-1;;;776:597:1:o;1378:315::-;1446:6;1454;1507:2;1495:9;1486:7;1482:23;1478:32;1475:52;;;1523:1;1520;1513:12;1475:52;1562:9;1549:23;1581:31;1606:5;1581:31;:::i;:::-;1631:5;1683:2;1668:18;;;;1655:32;;-1:-1:-1;;;1378:315:1:o;2141:456::-;2218:6;2226;2234;2287:2;2275:9;2266:7;2262:23;2258:32;2255:52;;;2303:1;2300;2293:12;2255:52;2342:9;2329:23;2361:31;2386:5;2361:31;:::i;:::-;2411:5;-1:-1:-1;2468:2:1;2453:18;;2440:32;2481:33;2440:32;2481:33;:::i;:::-;2141:456;;2533:7;;-1:-1:-1;;;2587:2:1;2572:18;;;;2559:32;;2141:456::o;2602:118::-;2688:5;2681:13;2674:21;2667:5;2664:32;2654:60;;2710:1;2707;2700:12;2725:382;2790:6;2798;2851:2;2839:9;2830:7;2826:23;2822:32;2819:52;;;2867:1;2864;2857:12;2819:52;2906:9;2893:23;2925:31;2950:5;2925:31;:::i;:::-;2975:5;-1:-1:-1;3032:2:1;3017:18;;3004:32;3045:30;3004:32;3045:30;:::i;:::-;3094:7;3084:17;;;2725:382;;;;;:::o;3301:241::-;3357:6;3410:2;3398:9;3389:7;3385:23;3381:32;3378:52;;;3426:1;3423;3416:12;3378:52;3465:9;3452:23;3484:28;3506:5;3484:28;:::i;3729:180::-;3788:6;3841:2;3829:9;3820:7;3816:23;3812:32;3809:52;;;3857:1;3854;3847:12;3809:52;-1:-1:-1;3880:23:1;;3729:180;-1:-1:-1;3729:180:1:o;3914:156::-;3980:20;;4040:4;4029:16;;4019:27;;4009:55;;4060:1;4057;4050:12;4075:317;4141:6;4149;4202:2;4190:9;4181:7;4177:23;4173:32;4170:52;;;4218:1;4215;4208:12;4170:52;4257:9;4244:23;4276:31;4301:5;4276:31;:::i;:::-;4326:5;-1:-1:-1;4350:36:1;4382:2;4367:18;;4350:36;:::i;:::-;4340:46;;4075:317;;;;;:::o;5327:592::-;5429:6;5437;5445;5453;5461;5469;5522:3;5510:9;5501:7;5497:23;5493:33;5490:53;;;5539:1;5536;5529:12;5490:53;5578:9;5565:23;5597:31;5622:5;5597:31;:::i;:::-;5647:5;-1:-1:-1;5699:2:1;5684:18;;5671:32;;-1:-1:-1;5750:2:1;5735:18;;5722:32;;-1:-1:-1;5773:36:1;5805:2;5790:18;;5773:36;:::i;:::-;5763:46;;5856:3;5845:9;5841:19;5828:33;5818:43;;5908:3;5897:9;5893:19;5880:33;5870:43;;5327:592;;;;;;;;:::o;5924:734::-;6035:6;6043;6051;6059;6067;6075;6083;6136:3;6124:9;6115:7;6111:23;6107:33;6104:53;;;6153:1;6150;6143:12;6104:53;6192:9;6179:23;6211:31;6236:5;6211:31;:::i;:::-;6261:5;-1:-1:-1;6318:2:1;6303:18;;6290:32;6331:33;6290:32;6331:33;:::i;:::-;6383:7;-1:-1:-1;6437:2:1;6422:18;;6409:32;;-1:-1:-1;6488:2:1;6473:18;;6460:32;;-1:-1:-1;6511:37:1;6543:3;6528:19;;6511:37;:::i;:::-;6501:47;;6595:3;6584:9;6580:19;6567:33;6557:43;;6647:3;6636:9;6632:19;6619:33;6609:43;;5924:734;;;;;;;;;;:::o;6663:1128::-;6788:6;6796;6804;6812;6820;6828;6836;6844;6852;6860;6913:3;6901:9;6892:7;6888:23;6884:33;6881:53;;;6930:1;6927;6920:12;6881:53;6969:9;6956:23;6988:28;7010:5;6988:28;:::i;:::-;7035:5;-1:-1:-1;7087:2:1;7072:18;;7059:32;;-1:-1:-1;7143:2:1;7128:18;;7115:32;7156:30;7115:32;7156:30;:::i;:::-;7205:7;-1:-1:-1;7259:2:1;7244:18;;7231:32;;-1:-1:-1;7315:3:1;7300:19;;7287:33;7329:30;7287:33;7329:30;:::i;:::-;7378:7;-1:-1:-1;7432:3:1;7417:19;;7404:33;;-1:-1:-1;7489:3:1;7474:19;;7461:33;7503:30;7461:33;7503:30;:::i;:::-;7552:7;-1:-1:-1;7606:3:1;7591:19;;7578:33;;-1:-1:-1;7663:3:1;7648:19;;7635:33;7677:30;7635:33;7677:30;:::i;:::-;7726:7;7716:17;;;7780:3;7769:9;7765:19;7752:33;7742:43;;6663:1128;;;;;;;;;;;;;:::o;7796:388::-;7864:6;7872;7925:2;7913:9;7904:7;7900:23;7896:32;7893:52;;;7941:1;7938;7931:12;7893:52;7980:9;7967:23;7999:31;8024:5;7999:31;:::i;:::-;8049:5;-1:-1:-1;8106:2:1;8091:18;;8078:32;8119:33;8078:32;8119:33;:::i;8189:783::-;8269:6;8277;8285;8293;8301;8354:3;8342:9;8333:7;8329:23;8325:33;8322:53;;;8371:1;8368;8361:12;8322:53;8410:9;8397:23;8429:28;8451:5;8429:28;:::i;:::-;8476:5;-1:-1:-1;8533:2:1;8518:18;;8505:32;8546:30;8505:32;8546:30;:::i;:::-;8595:7;-1:-1:-1;8654:2:1;8639:18;;8626:32;8667:30;8626:32;8667:30;:::i;:::-;8716:7;-1:-1:-1;8775:2:1;8760:18;;8747:32;8788:30;8747:32;8788:30;:::i;:::-;8837:7;-1:-1:-1;8896:3:1;8881:19;;8868:33;8910:30;8868:33;8910:30;:::i;:::-;8959:7;8949:17;;;8189:783;;;;;;;;:::o;8977:419::-;9044:6;9052;9105:2;9093:9;9084:7;9080:23;9076:32;9073:52;;;9121:1;9118;9111:12;9073:52;9160:9;9147:23;9179:31;9204:5;9179:31;:::i;:::-;9229:5;-1:-1:-1;9286:2:1;9271:18;;9258:32;9334:10;9321:24;;9309:37;;9299:65;;9360:1;9357;9350:12;10012:184;10082:6;10135:2;10123:9;10114:7;10110:23;10106:32;10103:52;;;10151:1;10148;10141:12;10103:52;-1:-1:-1;10174:16:1;;10012:184;-1:-1:-1;10012:184:1:o;10201:380::-;10280:1;10276:12;;;;10323;;;10344:61;;10398:4;10390:6;10386:17;10376:27;;10344:61;10451:2;10443:6;10440:14;10420:18;10417:38;10414:161;;10497:10;10492:3;10488:20;10485:1;10478:31;10532:4;10529:1;10522:15;10560:4;10557:1;10550:15;10586:356;10788:2;10770:21;;;10807:18;;;10800:30;10866:34;10861:2;10846:18;;10839:62;10933:2;10918:18;;10586:356::o;10947:127::-;11008:10;11003:3;10999:20;10996:1;10989:31;11039:4;11036:1;11029:15;11063:4;11060:1;11053:15;11079:128;11119:3;11150:1;11146:6;11143:1;11140:13;11137:39;;;11156:18;;:::i;:::-;-1:-1:-1;11192:9:1;;11079:128::o;11796:245::-;11863:6;11916:2;11904:9;11895:7;11891:23;11887:32;11884:52;;;11932:1;11929;11922:12;11884:52;11964:9;11958:16;11983:28;12005:5;11983:28;:::i;12666:405::-;12868:2;12850:21;;;12907:2;12887:18;;;12880:30;12946:34;12941:2;12926:18;;12919:62;-1:-1:-1;;;13012:2:1;12997:18;;12990:39;13061:3;13046:19;;12666:405::o;13076:497::-;13182:6;13190;13198;13206;13214;13267:3;13255:9;13246:7;13242:23;13238:33;13235:53;;;13284:1;13281;13274:12;13235:53;13316:9;13310:16;13335:31;13360:5;13335:31;:::i;:::-;13430:2;13415:18;;13409:25;13474:2;13459:18;;13453:25;13518:2;13503:18;;13497:25;13562:3;13547:19;;;13541:26;13385:5;;13409:25;;-1:-1:-1;13453:25:1;13497;-1:-1:-1;13541:26:1;;-1:-1:-1;13076:497:1;-1:-1:-1;;;13076:497:1:o;14010:125::-;14050:4;14078:1;14075;14072:8;14069:34;;;14083:18;;:::i;:::-;-1:-1:-1;14120:9:1;;14010:125::o;14140:127::-;14201:10;14196:3;14192:20;14189:1;14182:31;14232:4;14229:1;14222:15;14256:4;14253:1;14246:15;17125:399;17327:2;17309:21;;;17366:2;17346:18;;;17339:30;17405:34;17400:2;17385:18;;17378:62;-1:-1:-1;;;17471:2:1;17456:18;;17449:33;17514:3;17499:19;;17125:399::o;23929:168::-;23969:7;24035:1;24031;24027:6;24023:14;24020:1;24017:21;24012:1;24005:9;23998:17;23994:45;23991:71;;;24042:18;;:::i;:::-;-1:-1:-1;24082:9:1;;23929:168::o;24102:217::-;24142:1;24168;24158:132;;24212:10;24207:3;24203:20;24200:1;24193:31;24247:4;24244:1;24237:15;24275:4;24272:1;24265:15;24158:132;-1:-1:-1;24304:9:1;;24102:217::o;25581:405::-;25783:2;25765:21;;;25822:2;25802:18;;;25795:30;25861:34;25856:2;25841:18;;25834:62;-1:-1:-1;;;25927:2:1;25912:18;;25905:39;25976:3;25961:19;;25581:405::o;26401:175::-;26438:3;26482:4;26475:5;26471:16;26511:4;26502:7;26499:17;26496:43;;26519:18;;:::i;:::-;26568:1;26555:15;;26401:175;-1:-1:-1;;26401:175:1:o;27875:127::-;27936:10;27931:3;27927:20;27924:1;27917:31;27967:4;27964:1;27957:15;27991:4;27988:1;27981:15;30875:251;30945:6;30998:2;30986:9;30977:7;30973:23;30969:32;30966:52;;;31014:1;31011;31004:12;30966:52;31046:9;31040:16;31065:31;31090:5;31065:31;:::i;31131:980::-;31393:4;31441:3;31430:9;31426:19;31472:6;31461:9;31454:25;31498:2;31536:6;31531:2;31520:9;31516:18;31509:34;31579:3;31574:2;31563:9;31559:18;31552:31;31603:6;31638;31632:13;31669:6;31661;31654:22;31707:3;31696:9;31692:19;31685:26;;31746:2;31738:6;31734:15;31720:29;;31767:1;31777:195;31791:6;31788:1;31785:13;31777:195;;;31856:13;;-1:-1:-1;;;;;31852:39:1;31840:52;;31947:15;;;;31912:12;;;;31888:1;31806:9;31777:195;;;-1:-1:-1;;;;;;;32028:32:1;;;;32023:2;32008:18;;32001:60;-1:-1:-1;;;32092:3:1;32077:19;32070:35;31989:3;31131:980;-1:-1:-1;;;31131:980:1:o
Swarm Source
ipfs://f77d010c149c6bd02e88b843a6d6bbc01ffd386ddde250c77fa06b778ccf7d77
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.