Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,037 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 22181312 | 8 days ago | IN | 0 ETH | 0.00005436 | ||||
Set Approval For... | 21800765 | 61 days ago | IN | 0 ETH | 0.00005844 | ||||
Set Approval For... | 21800736 | 61 days ago | IN | 0 ETH | 0.00006063 | ||||
Set Approval For... | 21723092 | 72 days ago | IN | 0 ETH | 0.00019848 | ||||
Transfer From | 21517678 | 101 days ago | IN | 0 ETH | 0.00062739 | ||||
Set Approval For... | 21500131 | 103 days ago | IN | 0 ETH | 0.00010392 | ||||
Set Approval For... | 21006679 | 172 days ago | IN | 0 ETH | 0.00045362 | ||||
Set Approval For... | 20807114 | 200 days ago | IN | 0 ETH | 0.00053365 | ||||
Set Approval For... | 20276821 | 274 days ago | IN | 0 ETH | 0.00056051 | ||||
Set Approval For... | 19481032 | 385 days ago | IN | 0 ETH | 0.00072754 | ||||
Set Approval For... | 19481032 | 385 days ago | IN | 0 ETH | 0.00126866 | ||||
Transfer From | 19480737 | 385 days ago | IN | 0 ETH | 0.0023161 | ||||
Set Approval For... | 19472399 | 387 days ago | IN | 0 ETH | 0.00147524 | ||||
Set Approval For... | 19458676 | 389 days ago | IN | 0 ETH | 0.00107103 | ||||
Set Approval For... | 19387388 | 399 days ago | IN | 0 ETH | 0.0021223 | ||||
Set Approval For... | 19374142 | 400 days ago | IN | 0 ETH | 0.00326089 | ||||
Set Approval For... | 19347064 | 404 days ago | IN | 0 ETH | 0.00199174 | ||||
Set Approval For... | 19345903 | 404 days ago | IN | 0 ETH | 0.00212911 | ||||
Set Approval For... | 19127956 | 435 days ago | IN | 0 ETH | 0.0012902 | ||||
Set Approval For... | 19100161 | 439 days ago | IN | 0 ETH | 0.00050805 | ||||
Transfer From | 18664772 | 500 days ago | IN | 0 ETH | 0.00675119 | ||||
Set Approval For... | 18662797 | 500 days ago | IN | 0 ETH | 0.00076819 | ||||
Set Approval For... | 18622831 | 506 days ago | IN | 0 ETH | 0.00116641 | ||||
Set Approval For... | 18622830 | 506 days ago | IN | 0 ETH | 0.001163 | ||||
Set Approval For... | 17976346 | 596 days ago | IN | 0 ETH | 0.00070367 |
Loading...
Loading
Contract Name:
NineTales
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-03 */ // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.0 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts v4.4.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; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.0 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/ninetales.sol pragma solidity ^0.8.4; contract NineTales is ERC721Enumerable, Ownable { using Strings for uint256; using SafeMath for uint256; using ECDSA for bytes32; uint256 public NTT_PER_USER = 10; uint256 public constant NTT_PRESALE = 999; uint256 public constant NTT_GIFT = 200; uint256 public constant NTT_PUBLIC = 8800; uint256 public constant NTT_MAX_SUPPLY = 9999; uint256 public constant NTT_PRESALE_PRICE = 0.049 ether; uint256 public NTT_PUBLIC_PRICE = 0.089 ether; mapping(address => uint256) public addressNumMinted; string private _tokenBaseURI; string private _finalProvenanceHash; address private _ownerAddress = 0xcd99C8B1723dA75d654F734499C64d8fe815F1aA; address private _consultant = 0x69B630b2Dc0eC30258494435Cc3d28C2167D5053; address private _signerAddress = 0xBa8128fF5f4220f6190A61234567F190942dBEf6; uint256 public giftedAmount; uint256 public publicAmountMinted; uint256 public presaleAmountMinted; bool public presaleOnly = true; bool public saleIsLive = true; bool public hashMintOnly = true; bool public provenanceLocked = false; constructor() ERC721("Nine Tales NFT Official", "NTT") { } modifier liveSale { require(saleIsLive, "SALE_CLOSED"); _; } function hashTx(address sender) private pure returns(bytes32) { bytes32 hash = keccak256(abi.encodePacked(sender)).toEthSignedMessageHash(); return hash; } function matchAddressSigner(bytes32 hash, bytes memory signature) private view returns(bool) { return _signerAddress == hash.toEthSignedMessageHash().recover(signature); } function presaleMint(uint256 tokenQuantity) private { require(presaleAmountMinted + tokenQuantity <= NTT_PRESALE, "EXCEEDS_PRESALE_MAX"); require(addressNumMinted[msg.sender] + tokenQuantity <= NTT_PER_USER, "EXCEEDS_TOKENS_PER_USER"); require(NTT_PRESALE_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH"); addressNumMinted[msg.sender] += tokenQuantity; for(uint256 i = 0; i < tokenQuantity; i++) { presaleAmountMinted++; _safeMint(msg.sender, totalSupply() + 1); } } function publicMint(uint256 tokenQuantity) private { require(publicAmountMinted + tokenQuantity <= NTT_PUBLIC, "EXCEEDS_PUBLIC_MAX"); require(balanceOf(msg.sender) + tokenQuantity <= NTT_PER_USER, "EXCEEDS_TOKENS_PER_USER"); require(NTT_PUBLIC_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH"); for(uint256 i = 0; i < tokenQuantity; i++) { publicAmountMinted++; _safeMint(msg.sender, totalSupply() + 1); } } function mint(uint256 tokenQuantity) public payable liveSale { require(!hashMintOnly,"DIRECT_MINT_DISALLOWED"); require(tokenQuantity > 0, "AMOUNT_ERROR"); require(totalSupply() < NTT_MAX_SUPPLY, "OUT_OF_STOCK"); if(presaleOnly) { presaleMint(tokenQuantity); } else { publicMint(tokenQuantity); } } function hashMint(bytes memory signature, uint256 tokenQuantity) external payable liveSale { require(hashMintOnly,"WRONG_FUNCTION"); require(matchAddressSigner(hashTx(msg.sender), signature), "DIRECT_MINT_DISALLOWED"); require(tokenQuantity > 0, "AMOUNT_ERROR"); require(totalSupply() < NTT_MAX_SUPPLY, "OUT_OF_STOCK"); if(presaleOnly) { presaleMint(tokenQuantity); } else { publicMint(tokenQuantity); } } function gift(address[] calldata winners) external onlyOwner { require(totalSupply() + winners.length <= NTT_MAX_SUPPLY, "EXCEEDS_MAX_SUPPLY"); require(giftedAmount + winners.length <= NTT_GIFT, "EXCEEDS_GIFTS_MAX"); for (uint256 i = 0; i < winners.length; i++) { giftedAmount++; _safeMint(winners[i], totalSupply() + 1); } } function withdrawAll() public onlyOwner { uint256 balance = address(this).balance; require(balance > 0,"NO_BALANCE"); _withdraw(_consultant, balance.mul(5).div(100)); _withdraw(_ownerAddress, address(this).balance); } function _withdraw(address _address, uint256 _amount) private { (bool success, ) = _address.call{value: _amount}(""); require(success, "TRANSFER_FAIL"); } function setFinalProvenanceHash(string memory provenanceHash) external onlyOwner { require(!provenanceLocked, "PROVENANCE_LOCKED"); _finalProvenanceHash = provenanceHash; provenanceLocked = true; } function getFinalProvenanceHash() external view returns(string memory){ return _finalProvenanceHash; } function changePresaleStatus() external onlyOwner { presaleOnly = !presaleOnly; } function changeSaleStatus() external onlyOwner { saleIsLive = !saleIsLive; } function changeHashOnlyStatus() external onlyOwner { hashMintOnly = !hashMintOnly; } function getHashMintVariable() external view returns(bool) { return hashMintOnly; } function getAmountMinted() external view returns(uint256) { return addressNumMinted[msg.sender]; } function setSignerAddress(address _addr) external onlyOwner { _signerAddress = _addr; } function setBaseURI(string calldata URI) external onlyOwner { _tokenBaseURI = URI; } function setNttPerUserLimit(uint256 _limit) public onlyOwner { NTT_PER_USER = _limit; } function setPublicPrice(uint256 _salePrice) public onlyOwner { NTT_PUBLIC_PRICE = _salePrice; } function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) { require(_exists(tokenId), "NONEXISTANT_TOKEN"); return string(abi.encodePacked(_tokenBaseURI, tokenId.toString())); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"NTT_GIFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NTT_MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NTT_PER_USER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NTT_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NTT_PRESALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NTT_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NTT_PUBLIC_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressNumMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changeHashOnlyStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changePresaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAmountMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFinalProvenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHashMintVariable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"winners","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"giftedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"hashMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"hashMintOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleAmountMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenanceLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicAmountMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setFinalProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNttPerUserLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600a600b5567013c310749028000600c5573cd99c8b1723da75d654f734499c64d8fe815f1aa601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507369b630b2dc0ec30258494435cc3d28c2167d5053601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ba8128ff5f4220f6190a61234567f190942dbef6601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601660006101000a81548160ff0219169083151502179055506001601660016101000a81548160ff0219169083151502179055506001601660026101000a81548160ff0219169083151502179055506000601660036101000a81548160ff0219169083151502179055503480156200018d57600080fd5b506040518060400160405280601781526020017f4e696e652054616c6573204e4654204f6666696369616c0000000000000000008152506040518060400160405280600381526020017f4e5454000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200021292919062000322565b5080600190805190602001906200022b92919062000322565b5050506200024e620002426200025460201b60201c565b6200025c60201b60201c565b62000437565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200033090620003d2565b90600052602060002090601f016020900481019282620003545760008555620003a0565b82601f106200036f57805160ff1916838001178555620003a0565b82800160010185558215620003a0579182015b828111156200039f57825182559160200191906001019062000382565b5b509050620003af9190620003b3565b5090565b5b80821115620003ce576000816000905550600101620003b4565b5090565b60006002820490506001821680620003eb57607f821691505b6020821081141562000402576200040162000408565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615d6180620004476000396000f3fe6080604052600436106102ae5760003560e01c806370a0823111610175578063aa35581f116100dc578063ca1d953c11610095578063e985e9c51161006f578063e985e9c514610a4e578063f137c82f14610a8b578063f2fde38b14610aa2578063f412f5b614610acb576102ae565b8063ca1d953c146109e1578063dfe8e7a4146109f8578063e777df2014610a23576102ae565b8063aa35581f146108e2578063b7c8259f146108f9578063b88d4fde14610936578063bd533dcd1461095f578063c62752551461097b578063c87b56dd146109a4576102ae565b806395d89b411161012e57806395d89b41146107f357806396e4f7311461081e578063a0712d6814610847578063a22cb46514610863578063a8796a031461088c578063a976406c146108b7576102ae565b806370a0823114610707578063715018a614610744578063853828b61461075b57806389e8a87b146107725780638da5cb5b1461079d578063940f1ada146107c8576102ae565b80632e2c15691161021957806342842e0e116101d257806342842e0e146105e55780634f6ccce71461060e57806355f804b31461064b5780636352211e146106745780636639c0db146106b1578063672a7fe0146106dc576102ae565b80632e2c1569146104d35780632f1d25a5146104fe5780632f745c5914610527578063342a891f146105645780633a8879bb1461058f5780633ab9c987146105ba576102ae565b8063163e1e611161026b578063163e1e61146103d557806318160ddd146103fe5780631b57190e1461042957806320c22d971461045457806323b872dd1461047f578063291fd06a146104a8576102ae565b806301ffc9a7146102b3578063046dc166146102f057806306fdde0314610319578063079d6c2914610344578063081812fc1461036f578063095ea7b3146103ac575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190614105565b610af6565b6040516102e79190614a2c565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613ef5565b610b70565b005b34801561032557600080fd5b5061032e610c30565b60405161033b9190614a8c565b60405180910390f35b34801561035057600080fd5b50610359610cc2565b6040516103669190614f2e565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190614251565b610cc8565b6040516103a391906149c5565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce9190614078565b610d4d565b005b3480156103e157600080fd5b506103fc60048036038101906103f791906140b8565b610e65565b005b34801561040a57600080fd5b50610413611011565b6040516104209190614f2e565b60405180910390f35b34801561043557600080fd5b5061043e61101e565b60405161044b9190614f2e565b60405180910390f35b34801561046057600080fd5b50610469611024565b6040516104769190614f2e565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a19190613f62565b61102a565b005b3480156104b457600080fd5b506104bd61108a565b6040516104ca9190614f2e565b60405180910390f35b3480156104df57600080fd5b506104e8611090565b6040516104f59190614f2e565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190614251565b61109b565b005b34801561053357600080fd5b5061054e60048036038101906105499190614078565b611121565b60405161055b9190614f2e565b60405180910390f35b34801561057057600080fd5b506105796111c6565b6040516105869190614f2e565b60405180910390f35b34801561059b57600080fd5b506105a46111cc565b6040516105b19190614a2c565b60405180910390f35b3480156105c657600080fd5b506105cf6111df565b6040516105dc9190614a2c565b60405180910390f35b3480156105f157600080fd5b5061060c60048036038101906106079190613f62565b6111f6565b005b34801561061a57600080fd5b5061063560048036038101906106309190614251565b611216565b6040516106429190614f2e565b60405180910390f35b34801561065757600080fd5b50610672600480360381019061066d91906141bb565b611287565b005b34801561068057600080fd5b5061069b60048036038101906106969190614251565b611319565b6040516106a891906149c5565b60405180910390f35b3480156106bd57600080fd5b506106c66113cb565b6040516106d39190614f2e565b60405180910390f35b3480156106e857600080fd5b506106f16113d1565b6040516106fe9190614a2c565b60405180910390f35b34801561071357600080fd5b5061072e60048036038101906107299190613ef5565b6113e4565b60405161073b9190614f2e565b60405180910390f35b34801561075057600080fd5b5061075961149c565b005b34801561076757600080fd5b50610770611524565b005b34801561077e57600080fd5b50610787611669565b6040516107949190614a8c565b60405180910390f35b3480156107a957600080fd5b506107b26116fb565b6040516107bf91906149c5565b60405180910390f35b3480156107d457600080fd5b506107dd611725565b6040516107ea9190614f2e565b60405180910390f35b3480156107ff57600080fd5b5061080861172b565b6040516108159190614a8c565b60405180910390f35b34801561082a57600080fd5b5061084560048036038101906108409190614208565b6117bd565b005b610861600480360381019061085c9190614251565b6118be565b005b34801561086f57600080fd5b5061088a60048036038101906108859190614038565b611a1b565b005b34801561089857600080fd5b506108a1611a31565b6040516108ae9190614a2c565b60405180910390f35b3480156108c357600080fd5b506108cc611a44565b6040516108d99190614f2e565b60405180910390f35b3480156108ee57600080fd5b506108f7611a4a565b005b34801561090557600080fd5b50610920600480360381019061091b9190613ef5565b611af2565b60405161092d9190614f2e565b60405180910390f35b34801561094257600080fd5b5061095d60048036038101906109589190613fb5565b611b0a565b005b6109796004803603810190610974919061415f565b611b6c565b005b34801561098757600080fd5b506109a2600480360381019061099d9190614251565b611d1a565b005b3480156109b057600080fd5b506109cb60048036038101906109c69190614251565b611da0565b6040516109d89190614a8c565b60405180910390f35b3480156109ed57600080fd5b506109f6611e1c565b005b348015610a0457600080fd5b50610a0d611ec4565b604051610a1a9190614f2e565b60405180910390f35b348015610a2f57600080fd5b50610a38611ec9565b604051610a459190614f2e565b60405180910390f35b348015610a5a57600080fd5b50610a756004803603810190610a709190613f22565b611f10565b604051610a829190614a2c565b60405180910390f35b348015610a9757600080fd5b50610aa0611fa4565b005b348015610aae57600080fd5b50610ac96004803603810190610ac49190613ef5565b61204c565b005b348015610ad757600080fd5b50610ae0612144565b604051610aed9190614a2c565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b695750610b6882612157565b5b9050919050565b610b78612239565b73ffffffffffffffffffffffffffffffffffffffff16610b966116fb565b73ffffffffffffffffffffffffffffffffffffffff1614610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390614dee565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060008054610c3f90615215565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6b90615215565b8015610cb85780601f10610c8d57610100808354040283529160200191610cb8565b820191906000526020600020905b815481529060010190602001808311610c9b57829003601f168201915b5050505050905090565b600b5481565b6000610cd382612241565b610d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0990614dce565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d5882611319565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc090614e4e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610de8612239565b73ffffffffffffffffffffffffffffffffffffffff161480610e175750610e1681610e11612239565b611f10565b5b610e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4d90614d0e565b60405180910390fd5b610e6083836122ad565b505050565b610e6d612239565b73ffffffffffffffffffffffffffffffffffffffff16610e8b6116fb565b73ffffffffffffffffffffffffffffffffffffffff1614610ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed890614dee565b60405180910390fd5b61270f82829050610ef0611011565b610efa9190615033565b1115610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3290614d6e565b60405180910390fd5b60c882829050601354610f4e9190615033565b1115610f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8690614e8e565b60405180910390fd5b60005b8282905081101561100c5760136000815480929190610fb090615278565b9190505550610ff9838383818110610fcb57610fca61540b565b5b9050602002016020810190610fe09190613ef5565b6001610fea611011565b610ff49190615033565b612366565b808061100490615278565b915050610f92565b505050565b6000600880549050905090565b60135481565b6103e781565b61103b611035612239565b82612384565b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614eae565b60405180910390fd5b611085838383612462565b505050565b600c5481565b66ae153d89fe800081565b6110a3612239565b73ffffffffffffffffffffffffffffffffffffffff166110c16116fb565b73ffffffffffffffffffffffffffffffffffffffff1614611117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110e90614dee565b60405180910390fd5b80600b8190555050565b600061112c836113e4565b821061116d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116490614b4e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60155481565b601660039054906101000a900460ff1681565b6000601660029054906101000a900460ff16905090565b61121183838360405180602001604052806000815250611b0a565b505050565b6000611220611011565b8210611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890614ece565b60405180910390fd5b600882815481106112755761127461540b565b5b90600052602060002001549050919050565b61128f612239565b73ffffffffffffffffffffffffffffffffffffffff166112ad6116fb565b73ffffffffffffffffffffffffffffffffffffffff1614611303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fa90614dee565b60405180910390fd5b8181600e9190611314929190613bd7565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b990614d4e565b60405180910390fd5b80915050919050565b61270f81565b601660009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90614d2e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114a4612239565b73ffffffffffffffffffffffffffffffffffffffff166114c26116fb565b73ffffffffffffffffffffffffffffffffffffffff1614611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150f90614dee565b60405180910390fd5b61152260006126be565b565b61152c612239565b73ffffffffffffffffffffffffffffffffffffffff1661154a6116fb565b73ffffffffffffffffffffffffffffffffffffffff16146115a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159790614dee565b60405180910390fd5b6000479050600081116115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df90614bce565b60405180910390fd5b61163a601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611635606461162760058661278490919063ffffffff16565b61279a90919063ffffffff16565b6127b0565b611666601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16476127b0565b50565b6060600f805461167890615215565b80601f01602080910402602001604051908101604052809291908181526020018280546116a490615215565b80156116f15780601f106116c6576101008083540402835291602001916116f1565b820191906000526020600020905b8154815290600101906020018083116116d457829003601f168201915b5050505050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60145481565b60606001805461173a90615215565b80601f016020809104026020016040519081016040528092919081815260200182805461176690615215565b80156117b35780601f10611788576101008083540402835291602001916117b3565b820191906000526020600020905b81548152906001019060200180831161179657829003601f168201915b5050505050905090565b6117c5612239565b73ffffffffffffffffffffffffffffffffffffffff166117e36116fb565b73ffffffffffffffffffffffffffffffffffffffff1614611839576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183090614dee565b60405180910390fd5b601660039054906101000a900460ff1615611889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188090614eee565b60405180910390fd5b80600f908051906020019061189f929190613c5d565b506001601660036101000a81548160ff02191690831515021790555050565b601660019054906101000a900460ff1661190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190490614c8e565b60405180910390fd5b601660029054906101000a900460ff161561195d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195490614ace565b60405180910390fd5b600081116119a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199790614cce565b60405180910390fd5b61270f6119ab611011565b106119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290614c4e565b60405180910390fd5b601660009054906101000a900460ff1615611a0e57611a0981612861565b611a18565b611a1781612a44565b5b50565b611a2d611a26612239565b8383612b95565b5050565b601660029054906101000a900460ff1681565b61226081565b611a52612239565b73ffffffffffffffffffffffffffffffffffffffff16611a706116fb565b73ffffffffffffffffffffffffffffffffffffffff1614611ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abd90614dee565b60405180910390fd5b601660009054906101000a900460ff1615601660006101000a81548160ff021916908315150217905550565b600d6020528060005260406000206000915090505481565b611b1b611b15612239565b83612384565b611b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5190614eae565b60405180910390fd5b611b6684848484612d02565b50505050565b601660019054906101000a900460ff16611bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb290614c8e565b60405180910390fd5b601660029054906101000a900460ff16611c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0190614bee565b60405180910390fd5b611c1c611c1633612d5e565b83612d9b565b611c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5290614ace565b60405180910390fd5b60008111611c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9590614cce565b60405180910390fd5b61270f611ca9611011565b10611ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce090614c4e565b60405180910390fd5b601660009054906101000a900460ff1615611d0c57611d0781612861565b611d16565b611d1581612a44565b5b5050565b611d22612239565b73ffffffffffffffffffffffffffffffffffffffff16611d406116fb565b73ffffffffffffffffffffffffffffffffffffffff1614611d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8d90614dee565b60405180910390fd5b80600c8190555050565b6060611dab82612241565b611dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de190614b2e565b60405180910390fd5b600e611df583612e10565b604051602001611e06929190614966565b6040516020818303038152906040529050919050565b611e24612239565b73ffffffffffffffffffffffffffffffffffffffff16611e426116fb565b73ffffffffffffffffffffffffffffffffffffffff1614611e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8f90614dee565b60405180910390fd5b601660019054906101000a900460ff1615601660016101000a81548160ff021916908315150217905550565b60c881565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fac612239565b73ffffffffffffffffffffffffffffffffffffffff16611fca6116fb565b73ffffffffffffffffffffffffffffffffffffffff1614612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201790614dee565b60405180910390fd5b601660029054906101000a900460ff1615601660026101000a81548160ff021916908315150217905550565b612054612239565b73ffffffffffffffffffffffffffffffffffffffff166120726116fb565b73ffffffffffffffffffffffffffffffffffffffff16146120c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bf90614dee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212f90614b8e565b60405180910390fd5b612141816126be565b50565b601660019054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061222257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612232575061223182612f71565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661232083611319565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612380828260405180602001604052806000815250612fdb565b5050565b600061238f82612241565b6123ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c590614cae565b60405180910390fd5b60006123d983611319565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061244857508373ffffffffffffffffffffffffffffffffffffffff1661243084610cc8565b73ffffffffffffffffffffffffffffffffffffffff16145b8061245957506124588185611f10565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661248282611319565b73ffffffffffffffffffffffffffffffffffffffff16146124d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cf90614e0e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253f90614c0e565b60405180910390fd5b612553838383613036565b61255e6000826122ad565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125ae9190615114565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126059190615033565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818361279291906150ba565b905092915050565b600081836127a89190615089565b905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516127d6906149b0565b60006040518083038185875af1925050503d8060008114612813576040519150601f19603f3d011682016040523d82523d6000602084013e612818565b606091505b505090508061285c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285390614cee565b60405180910390fd5b505050565b6103e7816015546128729190615033565b11156128b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128aa90614aee565b60405180910390fd5b600b5481600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129019190615033565b1115612942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293990614e6e565b60405180910390fd5b348166ae153d89fe800061295691906150ba565b1115612997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298e90614f0e565b60405180910390fd5b80600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129e69190615033565b9250508190555060005b81811015612a405760156000815480929190612a0b90615278565b9190505550612a2d336001612a1e611011565b612a289190615033565b612366565b8080612a3890615278565b9150506129f0565b5050565b61226081601454612a559190615033565b1115612a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8d90614e2e565b60405180910390fd5b600b5481612aa3336113e4565b612aad9190615033565b1115612aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae590614e6e565b60405180910390fd5b3481600c54612afd91906150ba565b1115612b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3590614f0e565b60405180910390fd5b60005b81811015612b915760146000815480929190612b5c90615278565b9190505550612b7e336001612b6f611011565b612b799190615033565b612366565b8080612b8990615278565b915050612b41565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfb90614c2e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612cf59190614a2c565b60405180910390a3505050565b612d0d848484612462565b612d198484848461314a565b612d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4f90614b6e565b60405180910390fd5b50505050565b600080612d9083604051602001612d75919061494b565b604051602081830303815290604052805190602001206132e1565b905080915050919050565b6000612db882612daa856132e1565b61331190919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b60606000821415612e58576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f6c565b600082905060005b60008214612e8a578080612e7390615278565b915050600a82612e839190615089565b9150612e60565b60008167ffffffffffffffff811115612ea657612ea561543a565b5b6040519080825280601f01601f191660200182016040528015612ed85781602001600182028036833780820191505090505b5090505b60008514612f6557600182612ef19190615114565b9150600a85612f0091906152ef565b6030612f0c9190615033565b60f81b818381518110612f2257612f2161540b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f5e9190615089565b9450612edc565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612fe58383613338565b612ff2600084848461314a565b613031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302890614b6e565b60405180910390fd5b505050565b613041838383613506565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130845761307f8161350b565b6130c3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130c2576130c18382613554565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561310657613101816136c1565b613145565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613144576131438282613792565b5b5b505050565b600061316b8473ffffffffffffffffffffffffffffffffffffffff16613811565b156132d4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613194612239565b8786866040518563ffffffff1660e01b81526004016131b694939291906149e0565b602060405180830381600087803b1580156131d057600080fd5b505af192505050801561320157506040513d601f19601f820116820180604052508101906131fe9190614132565b60015b613284573d8060008114613231576040519150601f19603f3d011682016040523d82523d6000602084013e613236565b606091505b5060008151141561327c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327390614b6e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132d9565b600190505b949350505050565b6000816040516020016132f4919061498a565b604051602081830303815290604052805190602001209050919050565b60008060006133208585613824565b9150915061332d816138a7565b819250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339f90614dae565b60405180910390fd5b6133b181612241565b156133f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e890614bae565b60405180910390fd5b6133fd60008383613036565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461344d9190615033565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613561846113e4565b61356b9190615114565b9050600060076000848152602001908152602001600020549050818114613650576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136d59190615114565b90506000600960008481526020019081526020016000205490506000600883815481106137055761370461540b565b5b9060005260206000200154905080600883815481106137275761372661540b565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613776576137756153dc565b5b6001900381819060005260206000200160009055905550505050565b600061379d836113e4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6000806041835114156138665760008060006020860151925060408601519150606086015160001a905061385a87828585613a7c565b945094505050506138a0565b60408351141561389757600080602085015191506040850151905061388c868383613b89565b9350935050506138a0565b60006002915091505b9250929050565b600060048111156138bb576138ba61537e565b5b8160048111156138ce576138cd61537e565b5b14156138d957613a79565b600160048111156138ed576138ec61537e565b5b816004811115613900576138ff61537e565b5b1415613941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161393890614aae565b60405180910390fd5b600260048111156139555761395461537e565b5b8160048111156139685761396761537e565b5b14156139a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139a090614b0e565b60405180910390fd5b600360048111156139bd576139bc61537e565b5b8160048111156139d0576139cf61537e565b5b1415613a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0890614c6e565b60405180910390fd5b600480811115613a2457613a2361537e565b5b816004811115613a3757613a3661537e565b5b1415613a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a6f90614d8e565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613ab7576000600391509150613b80565b601b8560ff1614158015613acf5750601c8560ff1614155b15613ae1576000600491509150613b80565b600060018787878760405160008152602001604052604051613b069493929190614a47565b6020604051602081039080840390855afa158015613b28573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b7757600060019250925050613b80565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613bc987828885613a7c565b935093505050935093915050565b828054613be390615215565b90600052602060002090601f016020900481019282613c055760008555613c4c565b82601f10613c1e57803560ff1916838001178555613c4c565b82800160010185558215613c4c579182015b82811115613c4b578235825591602001919060010190613c30565b5b509050613c599190613ce3565b5090565b828054613c6990615215565b90600052602060002090601f016020900481019282613c8b5760008555613cd2565b82601f10613ca457805160ff1916838001178555613cd2565b82800160010185558215613cd2579182015b82811115613cd1578251825591602001919060010190613cb6565b5b509050613cdf9190613ce3565b5090565b5b80821115613cfc576000816000905550600101613ce4565b5090565b6000613d13613d0e84614f6e565b614f49565b905082815260208101848484011115613d2f57613d2e615478565b5b613d3a8482856151d3565b509392505050565b6000613d55613d5084614f9f565b614f49565b905082815260208101848484011115613d7157613d70615478565b5b613d7c8482856151d3565b509392505050565b600081359050613d9381615ccf565b92915050565b60008083601f840112613daf57613dae61546e565b5b8235905067ffffffffffffffff811115613dcc57613dcb615469565b5b602083019150836020820283011115613de857613de7615473565b5b9250929050565b600081359050613dfe81615ce6565b92915050565b600081359050613e1381615cfd565b92915050565b600081519050613e2881615cfd565b92915050565b600082601f830112613e4357613e4261546e565b5b8135613e53848260208601613d00565b91505092915050565b60008083601f840112613e7257613e7161546e565b5b8235905067ffffffffffffffff811115613e8f57613e8e615469565b5b602083019150836001820283011115613eab57613eaa615473565b5b9250929050565b600082601f830112613ec757613ec661546e565b5b8135613ed7848260208601613d42565b91505092915050565b600081359050613eef81615d14565b92915050565b600060208284031215613f0b57613f0a615482565b5b6000613f1984828501613d84565b91505092915050565b60008060408385031215613f3957613f38615482565b5b6000613f4785828601613d84565b9250506020613f5885828601613d84565b9150509250929050565b600080600060608486031215613f7b57613f7a615482565b5b6000613f8986828701613d84565b9350506020613f9a86828701613d84565b9250506040613fab86828701613ee0565b9150509250925092565b60008060008060808587031215613fcf57613fce615482565b5b6000613fdd87828801613d84565b9450506020613fee87828801613d84565b9350506040613fff87828801613ee0565b925050606085013567ffffffffffffffff8111156140205761401f61547d565b5b61402c87828801613e2e565b91505092959194509250565b6000806040838503121561404f5761404e615482565b5b600061405d85828601613d84565b925050602061406e85828601613def565b9150509250929050565b6000806040838503121561408f5761408e615482565b5b600061409d85828601613d84565b92505060206140ae85828601613ee0565b9150509250929050565b600080602083850312156140cf576140ce615482565b5b600083013567ffffffffffffffff8111156140ed576140ec61547d565b5b6140f985828601613d99565b92509250509250929050565b60006020828403121561411b5761411a615482565b5b600061412984828501613e04565b91505092915050565b60006020828403121561414857614147615482565b5b600061415684828501613e19565b91505092915050565b6000806040838503121561417657614175615482565b5b600083013567ffffffffffffffff8111156141945761419361547d565b5b6141a085828601613e2e565b92505060206141b185828601613ee0565b9150509250929050565b600080602083850312156141d2576141d1615482565b5b600083013567ffffffffffffffff8111156141f0576141ef61547d565b5b6141fc85828601613e5c565b92509250509250929050565b60006020828403121561421e5761421d615482565b5b600082013567ffffffffffffffff81111561423c5761423b61547d565b5b61424884828501613eb2565b91505092915050565b60006020828403121561426757614266615482565b5b600061427584828501613ee0565b91505092915050565b61428781615148565b82525050565b61429e61429982615148565b6152c1565b82525050565b6142ad8161515a565b82525050565b6142bc81615166565b82525050565b6142d36142ce82615166565b6152d3565b82525050565b60006142e482614fe5565b6142ee8185614ffb565b93506142fe8185602086016151e2565b61430781615487565b840191505092915050565b600061431d82614ff0565b6143278185615017565b93506143378185602086016151e2565b61434081615487565b840191505092915050565b600061435682614ff0565b6143608185615028565b93506143708185602086016151e2565b80840191505092915050565b6000815461438981615215565b6143938186615028565b945060018216600081146143ae57600181146143bf576143f2565b60ff198316865281860193506143f2565b6143c885614fd0565b60005b838110156143ea578154818901526001820191506020810190506143cb565b838801955050505b50505092915050565b6000614408601883615017565b9150614413826154a5565b602082019050919050565b600061442b601683615017565b9150614436826154ce565b602082019050919050565b600061444e601383615017565b9150614459826154f7565b602082019050919050565b6000614471601f83615017565b915061447c82615520565b602082019050919050565b6000614494601c83615028565b915061449f82615549565b601c82019050919050565b60006144b7601183615017565b91506144c282615572565b602082019050919050565b60006144da602b83615017565b91506144e58261559b565b604082019050919050565b60006144fd603283615017565b9150614508826155ea565b604082019050919050565b6000614520602683615017565b915061452b82615639565b604082019050919050565b6000614543601c83615017565b915061454e82615688565b602082019050919050565b6000614566600a83615017565b9150614571826156b1565b602082019050919050565b6000614589600e83615017565b9150614594826156da565b602082019050919050565b60006145ac602483615017565b91506145b782615703565b604082019050919050565b60006145cf601983615017565b91506145da82615752565b602082019050919050565b60006145f2600c83615017565b91506145fd8261577b565b602082019050919050565b6000614615602283615017565b9150614620826157a4565b604082019050919050565b6000614638600b83615017565b9150614643826157f3565b602082019050919050565b600061465b602c83615017565b91506146668261581c565b604082019050919050565b600061467e600c83615017565b91506146898261586b565b602082019050919050565b60006146a1600d83615017565b91506146ac82615894565b602082019050919050565b60006146c4603883615017565b91506146cf826158bd565b604082019050919050565b60006146e7602a83615017565b91506146f28261590c565b604082019050919050565b600061470a602983615017565b91506147158261595b565b604082019050919050565b600061472d601283615017565b9150614738826159aa565b602082019050919050565b6000614750602283615017565b915061475b826159d3565b604082019050919050565b6000614773602083615017565b915061477e82615a22565b602082019050919050565b6000614796602c83615017565b91506147a182615a4b565b604082019050919050565b60006147b9602083615017565b91506147c482615a9a565b602082019050919050565b60006147dc602983615017565b91506147e782615ac3565b604082019050919050565b60006147ff601283615017565b915061480a82615b12565b602082019050919050565b6000614822602183615017565b915061482d82615b3b565b604082019050919050565b6000614845601783615017565b915061485082615b8a565b602082019050919050565b6000614868601183615017565b915061487382615bb3565b602082019050919050565b600061488b60008361500c565b915061489682615bdc565b600082019050919050565b60006148ae603183615017565b91506148b982615bdf565b604082019050919050565b60006148d1602c83615017565b91506148dc82615c2e565b604082019050919050565b60006148f4601183615017565b91506148ff82615c7d565b602082019050919050565b6000614917601083615017565b915061492282615ca6565b602082019050919050565b614936816151bc565b82525050565b614945816151c6565b82525050565b6000614957828461428d565b60148201915081905092915050565b6000614972828561437c565b915061497e828461434b565b91508190509392505050565b600061499582614487565b91506149a182846142c2565b60208201915081905092915050565b60006149bb8261487e565b9150819050919050565b60006020820190506149da600083018461427e565b92915050565b60006080820190506149f5600083018761427e565b614a02602083018661427e565b614a0f604083018561492d565b8181036060830152614a2181846142d9565b905095945050505050565b6000602082019050614a4160008301846142a4565b92915050565b6000608082019050614a5c60008301876142b3565b614a69602083018661493c565b614a7660408301856142b3565b614a8360608301846142b3565b95945050505050565b60006020820190508181036000830152614aa68184614312565b905092915050565b60006020820190508181036000830152614ac7816143fb565b9050919050565b60006020820190508181036000830152614ae78161441e565b9050919050565b60006020820190508181036000830152614b0781614441565b9050919050565b60006020820190508181036000830152614b2781614464565b9050919050565b60006020820190508181036000830152614b47816144aa565b9050919050565b60006020820190508181036000830152614b67816144cd565b9050919050565b60006020820190508181036000830152614b87816144f0565b9050919050565b60006020820190508181036000830152614ba781614513565b9050919050565b60006020820190508181036000830152614bc781614536565b9050919050565b60006020820190508181036000830152614be781614559565b9050919050565b60006020820190508181036000830152614c078161457c565b9050919050565b60006020820190508181036000830152614c278161459f565b9050919050565b60006020820190508181036000830152614c47816145c2565b9050919050565b60006020820190508181036000830152614c67816145e5565b9050919050565b60006020820190508181036000830152614c8781614608565b9050919050565b60006020820190508181036000830152614ca78161462b565b9050919050565b60006020820190508181036000830152614cc78161464e565b9050919050565b60006020820190508181036000830152614ce781614671565b9050919050565b60006020820190508181036000830152614d0781614694565b9050919050565b60006020820190508181036000830152614d27816146b7565b9050919050565b60006020820190508181036000830152614d47816146da565b9050919050565b60006020820190508181036000830152614d67816146fd565b9050919050565b60006020820190508181036000830152614d8781614720565b9050919050565b60006020820190508181036000830152614da781614743565b9050919050565b60006020820190508181036000830152614dc781614766565b9050919050565b60006020820190508181036000830152614de781614789565b9050919050565b60006020820190508181036000830152614e07816147ac565b9050919050565b60006020820190508181036000830152614e27816147cf565b9050919050565b60006020820190508181036000830152614e47816147f2565b9050919050565b60006020820190508181036000830152614e6781614815565b9050919050565b60006020820190508181036000830152614e8781614838565b9050919050565b60006020820190508181036000830152614ea78161485b565b9050919050565b60006020820190508181036000830152614ec7816148a1565b9050919050565b60006020820190508181036000830152614ee7816148c4565b9050919050565b60006020820190508181036000830152614f07816148e7565b9050919050565b60006020820190508181036000830152614f278161490a565b9050919050565b6000602082019050614f43600083018461492d565b92915050565b6000614f53614f64565b9050614f5f8282615247565b919050565b6000604051905090565b600067ffffffffffffffff821115614f8957614f8861543a565b5b614f9282615487565b9050602081019050919050565b600067ffffffffffffffff821115614fba57614fb961543a565b5b614fc382615487565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061503e826151bc565b9150615049836151bc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561507e5761507d615320565b5b828201905092915050565b6000615094826151bc565b915061509f836151bc565b9250826150af576150ae61534f565b5b828204905092915050565b60006150c5826151bc565b91506150d0836151bc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561510957615108615320565b5b828202905092915050565b600061511f826151bc565b915061512a836151bc565b92508282101561513d5761513c615320565b5b828203905092915050565b60006151538261519c565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156152005780820151818401526020810190506151e5565b8381111561520f576000848401525b50505050565b6000600282049050600182168061522d57607f821691505b60208210811415615241576152406153ad565b5b50919050565b61525082615487565b810181811067ffffffffffffffff8211171561526f5761526e61543a565b5b80604052505050565b6000615283826151bc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152b6576152b5615320565b5b600182019050919050565b60006152cc826152dd565b9050919050565b6000819050919050565b60006152e882615498565b9050919050565b60006152fa826151bc565b9150615305836151bc565b9250826153155761531461534f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f4449524543545f4d494e545f444953414c4c4f57454400000000000000000000600082015250565b7f455843454544535f50524553414c455f4d415800000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4e4f4e4558495354414e545f544f4b454e000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e4f5f42414c414e434500000000000000000000000000000000000000000000600082015250565b7f57524f4e475f46554e4354494f4e000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4f55545f4f465f53544f434b0000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f53414c455f434c4f534544000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f414d4f554e545f4552524f520000000000000000000000000000000000000000600082015250565b7f5452414e534645525f4641494c00000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f455843454544535f4d41585f535550504c590000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f455843454544535f5055424c49435f4d41580000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f455843454544535f544f4b454e535f5045525f55534552000000000000000000600082015250565b7f455843454544535f47494654535f4d4158000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f50524f56454e414e43455f4c4f434b4544000000000000000000000000000000600082015250565b7f494e53554646494349454e545f45544800000000000000000000000000000000600082015250565b615cd881615148565b8114615ce357600080fd5b50565b615cef8161515a565b8114615cfa57600080fd5b50565b615d0681615170565b8114615d1157600080fd5b50565b615d1d816151bc565b8114615d2857600080fd5b5056fea2646970667358221220e0ab97c1240726b45ea4995e4972c03cdc6e342427eba82b2c512f6f1b335c4364736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102ae5760003560e01c806370a0823111610175578063aa35581f116100dc578063ca1d953c11610095578063e985e9c51161006f578063e985e9c514610a4e578063f137c82f14610a8b578063f2fde38b14610aa2578063f412f5b614610acb576102ae565b8063ca1d953c146109e1578063dfe8e7a4146109f8578063e777df2014610a23576102ae565b8063aa35581f146108e2578063b7c8259f146108f9578063b88d4fde14610936578063bd533dcd1461095f578063c62752551461097b578063c87b56dd146109a4576102ae565b806395d89b411161012e57806395d89b41146107f357806396e4f7311461081e578063a0712d6814610847578063a22cb46514610863578063a8796a031461088c578063a976406c146108b7576102ae565b806370a0823114610707578063715018a614610744578063853828b61461075b57806389e8a87b146107725780638da5cb5b1461079d578063940f1ada146107c8576102ae565b80632e2c15691161021957806342842e0e116101d257806342842e0e146105e55780634f6ccce71461060e57806355f804b31461064b5780636352211e146106745780636639c0db146106b1578063672a7fe0146106dc576102ae565b80632e2c1569146104d35780632f1d25a5146104fe5780632f745c5914610527578063342a891f146105645780633a8879bb1461058f5780633ab9c987146105ba576102ae565b8063163e1e611161026b578063163e1e61146103d557806318160ddd146103fe5780631b57190e1461042957806320c22d971461045457806323b872dd1461047f578063291fd06a146104a8576102ae565b806301ffc9a7146102b3578063046dc166146102f057806306fdde0314610319578063079d6c2914610344578063081812fc1461036f578063095ea7b3146103ac575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190614105565b610af6565b6040516102e79190614a2c565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613ef5565b610b70565b005b34801561032557600080fd5b5061032e610c30565b60405161033b9190614a8c565b60405180910390f35b34801561035057600080fd5b50610359610cc2565b6040516103669190614f2e565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190614251565b610cc8565b6040516103a391906149c5565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce9190614078565b610d4d565b005b3480156103e157600080fd5b506103fc60048036038101906103f791906140b8565b610e65565b005b34801561040a57600080fd5b50610413611011565b6040516104209190614f2e565b60405180910390f35b34801561043557600080fd5b5061043e61101e565b60405161044b9190614f2e565b60405180910390f35b34801561046057600080fd5b50610469611024565b6040516104769190614f2e565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a19190613f62565b61102a565b005b3480156104b457600080fd5b506104bd61108a565b6040516104ca9190614f2e565b60405180910390f35b3480156104df57600080fd5b506104e8611090565b6040516104f59190614f2e565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190614251565b61109b565b005b34801561053357600080fd5b5061054e60048036038101906105499190614078565b611121565b60405161055b9190614f2e565b60405180910390f35b34801561057057600080fd5b506105796111c6565b6040516105869190614f2e565b60405180910390f35b34801561059b57600080fd5b506105a46111cc565b6040516105b19190614a2c565b60405180910390f35b3480156105c657600080fd5b506105cf6111df565b6040516105dc9190614a2c565b60405180910390f35b3480156105f157600080fd5b5061060c60048036038101906106079190613f62565b6111f6565b005b34801561061a57600080fd5b5061063560048036038101906106309190614251565b611216565b6040516106429190614f2e565b60405180910390f35b34801561065757600080fd5b50610672600480360381019061066d91906141bb565b611287565b005b34801561068057600080fd5b5061069b60048036038101906106969190614251565b611319565b6040516106a891906149c5565b60405180910390f35b3480156106bd57600080fd5b506106c66113cb565b6040516106d39190614f2e565b60405180910390f35b3480156106e857600080fd5b506106f16113d1565b6040516106fe9190614a2c565b60405180910390f35b34801561071357600080fd5b5061072e60048036038101906107299190613ef5565b6113e4565b60405161073b9190614f2e565b60405180910390f35b34801561075057600080fd5b5061075961149c565b005b34801561076757600080fd5b50610770611524565b005b34801561077e57600080fd5b50610787611669565b6040516107949190614a8c565b60405180910390f35b3480156107a957600080fd5b506107b26116fb565b6040516107bf91906149c5565b60405180910390f35b3480156107d457600080fd5b506107dd611725565b6040516107ea9190614f2e565b60405180910390f35b3480156107ff57600080fd5b5061080861172b565b6040516108159190614a8c565b60405180910390f35b34801561082a57600080fd5b5061084560048036038101906108409190614208565b6117bd565b005b610861600480360381019061085c9190614251565b6118be565b005b34801561086f57600080fd5b5061088a60048036038101906108859190614038565b611a1b565b005b34801561089857600080fd5b506108a1611a31565b6040516108ae9190614a2c565b60405180910390f35b3480156108c357600080fd5b506108cc611a44565b6040516108d99190614f2e565b60405180910390f35b3480156108ee57600080fd5b506108f7611a4a565b005b34801561090557600080fd5b50610920600480360381019061091b9190613ef5565b611af2565b60405161092d9190614f2e565b60405180910390f35b34801561094257600080fd5b5061095d60048036038101906109589190613fb5565b611b0a565b005b6109796004803603810190610974919061415f565b611b6c565b005b34801561098757600080fd5b506109a2600480360381019061099d9190614251565b611d1a565b005b3480156109b057600080fd5b506109cb60048036038101906109c69190614251565b611da0565b6040516109d89190614a8c565b60405180910390f35b3480156109ed57600080fd5b506109f6611e1c565b005b348015610a0457600080fd5b50610a0d611ec4565b604051610a1a9190614f2e565b60405180910390f35b348015610a2f57600080fd5b50610a38611ec9565b604051610a459190614f2e565b60405180910390f35b348015610a5a57600080fd5b50610a756004803603810190610a709190613f22565b611f10565b604051610a829190614a2c565b60405180910390f35b348015610a9757600080fd5b50610aa0611fa4565b005b348015610aae57600080fd5b50610ac96004803603810190610ac49190613ef5565b61204c565b005b348015610ad757600080fd5b50610ae0612144565b604051610aed9190614a2c565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b695750610b6882612157565b5b9050919050565b610b78612239565b73ffffffffffffffffffffffffffffffffffffffff16610b966116fb565b73ffffffffffffffffffffffffffffffffffffffff1614610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390614dee565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060008054610c3f90615215565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6b90615215565b8015610cb85780601f10610c8d57610100808354040283529160200191610cb8565b820191906000526020600020905b815481529060010190602001808311610c9b57829003601f168201915b5050505050905090565b600b5481565b6000610cd382612241565b610d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0990614dce565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d5882611319565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc090614e4e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610de8612239565b73ffffffffffffffffffffffffffffffffffffffff161480610e175750610e1681610e11612239565b611f10565b5b610e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4d90614d0e565b60405180910390fd5b610e6083836122ad565b505050565b610e6d612239565b73ffffffffffffffffffffffffffffffffffffffff16610e8b6116fb565b73ffffffffffffffffffffffffffffffffffffffff1614610ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed890614dee565b60405180910390fd5b61270f82829050610ef0611011565b610efa9190615033565b1115610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3290614d6e565b60405180910390fd5b60c882829050601354610f4e9190615033565b1115610f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8690614e8e565b60405180910390fd5b60005b8282905081101561100c5760136000815480929190610fb090615278565b9190505550610ff9838383818110610fcb57610fca61540b565b5b9050602002016020810190610fe09190613ef5565b6001610fea611011565b610ff49190615033565b612366565b808061100490615278565b915050610f92565b505050565b6000600880549050905090565b60135481565b6103e781565b61103b611035612239565b82612384565b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614eae565b60405180910390fd5b611085838383612462565b505050565b600c5481565b66ae153d89fe800081565b6110a3612239565b73ffffffffffffffffffffffffffffffffffffffff166110c16116fb565b73ffffffffffffffffffffffffffffffffffffffff1614611117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110e90614dee565b60405180910390fd5b80600b8190555050565b600061112c836113e4565b821061116d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116490614b4e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60155481565b601660039054906101000a900460ff1681565b6000601660029054906101000a900460ff16905090565b61121183838360405180602001604052806000815250611b0a565b505050565b6000611220611011565b8210611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890614ece565b60405180910390fd5b600882815481106112755761127461540b565b5b90600052602060002001549050919050565b61128f612239565b73ffffffffffffffffffffffffffffffffffffffff166112ad6116fb565b73ffffffffffffffffffffffffffffffffffffffff1614611303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fa90614dee565b60405180910390fd5b8181600e9190611314929190613bd7565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b990614d4e565b60405180910390fd5b80915050919050565b61270f81565b601660009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90614d2e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114a4612239565b73ffffffffffffffffffffffffffffffffffffffff166114c26116fb565b73ffffffffffffffffffffffffffffffffffffffff1614611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150f90614dee565b60405180910390fd5b61152260006126be565b565b61152c612239565b73ffffffffffffffffffffffffffffffffffffffff1661154a6116fb565b73ffffffffffffffffffffffffffffffffffffffff16146115a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159790614dee565b60405180910390fd5b6000479050600081116115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df90614bce565b60405180910390fd5b61163a601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611635606461162760058661278490919063ffffffff16565b61279a90919063ffffffff16565b6127b0565b611666601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16476127b0565b50565b6060600f805461167890615215565b80601f01602080910402602001604051908101604052809291908181526020018280546116a490615215565b80156116f15780601f106116c6576101008083540402835291602001916116f1565b820191906000526020600020905b8154815290600101906020018083116116d457829003601f168201915b5050505050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60145481565b60606001805461173a90615215565b80601f016020809104026020016040519081016040528092919081815260200182805461176690615215565b80156117b35780601f10611788576101008083540402835291602001916117b3565b820191906000526020600020905b81548152906001019060200180831161179657829003601f168201915b5050505050905090565b6117c5612239565b73ffffffffffffffffffffffffffffffffffffffff166117e36116fb565b73ffffffffffffffffffffffffffffffffffffffff1614611839576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183090614dee565b60405180910390fd5b601660039054906101000a900460ff1615611889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188090614eee565b60405180910390fd5b80600f908051906020019061189f929190613c5d565b506001601660036101000a81548160ff02191690831515021790555050565b601660019054906101000a900460ff1661190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190490614c8e565b60405180910390fd5b601660029054906101000a900460ff161561195d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195490614ace565b60405180910390fd5b600081116119a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199790614cce565b60405180910390fd5b61270f6119ab611011565b106119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290614c4e565b60405180910390fd5b601660009054906101000a900460ff1615611a0e57611a0981612861565b611a18565b611a1781612a44565b5b50565b611a2d611a26612239565b8383612b95565b5050565b601660029054906101000a900460ff1681565b61226081565b611a52612239565b73ffffffffffffffffffffffffffffffffffffffff16611a706116fb565b73ffffffffffffffffffffffffffffffffffffffff1614611ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abd90614dee565b60405180910390fd5b601660009054906101000a900460ff1615601660006101000a81548160ff021916908315150217905550565b600d6020528060005260406000206000915090505481565b611b1b611b15612239565b83612384565b611b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5190614eae565b60405180910390fd5b611b6684848484612d02565b50505050565b601660019054906101000a900460ff16611bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb290614c8e565b60405180910390fd5b601660029054906101000a900460ff16611c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0190614bee565b60405180910390fd5b611c1c611c1633612d5e565b83612d9b565b611c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5290614ace565b60405180910390fd5b60008111611c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9590614cce565b60405180910390fd5b61270f611ca9611011565b10611ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce090614c4e565b60405180910390fd5b601660009054906101000a900460ff1615611d0c57611d0781612861565b611d16565b611d1581612a44565b5b5050565b611d22612239565b73ffffffffffffffffffffffffffffffffffffffff16611d406116fb565b73ffffffffffffffffffffffffffffffffffffffff1614611d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8d90614dee565b60405180910390fd5b80600c8190555050565b6060611dab82612241565b611dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de190614b2e565b60405180910390fd5b600e611df583612e10565b604051602001611e06929190614966565b6040516020818303038152906040529050919050565b611e24612239565b73ffffffffffffffffffffffffffffffffffffffff16611e426116fb565b73ffffffffffffffffffffffffffffffffffffffff1614611e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8f90614dee565b60405180910390fd5b601660019054906101000a900460ff1615601660016101000a81548160ff021916908315150217905550565b60c881565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fac612239565b73ffffffffffffffffffffffffffffffffffffffff16611fca6116fb565b73ffffffffffffffffffffffffffffffffffffffff1614612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201790614dee565b60405180910390fd5b601660029054906101000a900460ff1615601660026101000a81548160ff021916908315150217905550565b612054612239565b73ffffffffffffffffffffffffffffffffffffffff166120726116fb565b73ffffffffffffffffffffffffffffffffffffffff16146120c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bf90614dee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212f90614b8e565b60405180910390fd5b612141816126be565b50565b601660019054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061222257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612232575061223182612f71565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661232083611319565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612380828260405180602001604052806000815250612fdb565b5050565b600061238f82612241565b6123ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c590614cae565b60405180910390fd5b60006123d983611319565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061244857508373ffffffffffffffffffffffffffffffffffffffff1661243084610cc8565b73ffffffffffffffffffffffffffffffffffffffff16145b8061245957506124588185611f10565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661248282611319565b73ffffffffffffffffffffffffffffffffffffffff16146124d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cf90614e0e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253f90614c0e565b60405180910390fd5b612553838383613036565b61255e6000826122ad565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125ae9190615114565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126059190615033565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818361279291906150ba565b905092915050565b600081836127a89190615089565b905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516127d6906149b0565b60006040518083038185875af1925050503d8060008114612813576040519150601f19603f3d011682016040523d82523d6000602084013e612818565b606091505b505090508061285c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285390614cee565b60405180910390fd5b505050565b6103e7816015546128729190615033565b11156128b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128aa90614aee565b60405180910390fd5b600b5481600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129019190615033565b1115612942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293990614e6e565b60405180910390fd5b348166ae153d89fe800061295691906150ba565b1115612997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298e90614f0e565b60405180910390fd5b80600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129e69190615033565b9250508190555060005b81811015612a405760156000815480929190612a0b90615278565b9190505550612a2d336001612a1e611011565b612a289190615033565b612366565b8080612a3890615278565b9150506129f0565b5050565b61226081601454612a559190615033565b1115612a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8d90614e2e565b60405180910390fd5b600b5481612aa3336113e4565b612aad9190615033565b1115612aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae590614e6e565b60405180910390fd5b3481600c54612afd91906150ba565b1115612b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3590614f0e565b60405180910390fd5b60005b81811015612b915760146000815480929190612b5c90615278565b9190505550612b7e336001612b6f611011565b612b799190615033565b612366565b8080612b8990615278565b915050612b41565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfb90614c2e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612cf59190614a2c565b60405180910390a3505050565b612d0d848484612462565b612d198484848461314a565b612d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4f90614b6e565b60405180910390fd5b50505050565b600080612d9083604051602001612d75919061494b565b604051602081830303815290604052805190602001206132e1565b905080915050919050565b6000612db882612daa856132e1565b61331190919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b60606000821415612e58576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f6c565b600082905060005b60008214612e8a578080612e7390615278565b915050600a82612e839190615089565b9150612e60565b60008167ffffffffffffffff811115612ea657612ea561543a565b5b6040519080825280601f01601f191660200182016040528015612ed85781602001600182028036833780820191505090505b5090505b60008514612f6557600182612ef19190615114565b9150600a85612f0091906152ef565b6030612f0c9190615033565b60f81b818381518110612f2257612f2161540b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f5e9190615089565b9450612edc565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612fe58383613338565b612ff2600084848461314a565b613031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302890614b6e565b60405180910390fd5b505050565b613041838383613506565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130845761307f8161350b565b6130c3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130c2576130c18382613554565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561310657613101816136c1565b613145565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613144576131438282613792565b5b5b505050565b600061316b8473ffffffffffffffffffffffffffffffffffffffff16613811565b156132d4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613194612239565b8786866040518563ffffffff1660e01b81526004016131b694939291906149e0565b602060405180830381600087803b1580156131d057600080fd5b505af192505050801561320157506040513d601f19601f820116820180604052508101906131fe9190614132565b60015b613284573d8060008114613231576040519150601f19603f3d011682016040523d82523d6000602084013e613236565b606091505b5060008151141561327c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327390614b6e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132d9565b600190505b949350505050565b6000816040516020016132f4919061498a565b604051602081830303815290604052805190602001209050919050565b60008060006133208585613824565b9150915061332d816138a7565b819250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339f90614dae565b60405180910390fd5b6133b181612241565b156133f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e890614bae565b60405180910390fd5b6133fd60008383613036565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461344d9190615033565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613561846113e4565b61356b9190615114565b9050600060076000848152602001908152602001600020549050818114613650576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136d59190615114565b90506000600960008481526020019081526020016000205490506000600883815481106137055761370461540b565b5b9060005260206000200154905080600883815481106137275761372661540b565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613776576137756153dc565b5b6001900381819060005260206000200160009055905550505050565b600061379d836113e4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6000806041835114156138665760008060006020860151925060408601519150606086015160001a905061385a87828585613a7c565b945094505050506138a0565b60408351141561389757600080602085015191506040850151905061388c868383613b89565b9350935050506138a0565b60006002915091505b9250929050565b600060048111156138bb576138ba61537e565b5b8160048111156138ce576138cd61537e565b5b14156138d957613a79565b600160048111156138ed576138ec61537e565b5b816004811115613900576138ff61537e565b5b1415613941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161393890614aae565b60405180910390fd5b600260048111156139555761395461537e565b5b8160048111156139685761396761537e565b5b14156139a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139a090614b0e565b60405180910390fd5b600360048111156139bd576139bc61537e565b5b8160048111156139d0576139cf61537e565b5b1415613a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0890614c6e565b60405180910390fd5b600480811115613a2457613a2361537e565b5b816004811115613a3757613a3661537e565b5b1415613a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a6f90614d8e565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613ab7576000600391509150613b80565b601b8560ff1614158015613acf5750601c8560ff1614155b15613ae1576000600491509150613b80565b600060018787878760405160008152602001604052604051613b069493929190614a47565b6020604051602081039080840390855afa158015613b28573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b7757600060019250925050613b80565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613bc987828885613a7c565b935093505050935093915050565b828054613be390615215565b90600052602060002090601f016020900481019282613c055760008555613c4c565b82601f10613c1e57803560ff1916838001178555613c4c565b82800160010185558215613c4c579182015b82811115613c4b578235825591602001919060010190613c30565b5b509050613c599190613ce3565b5090565b828054613c6990615215565b90600052602060002090601f016020900481019282613c8b5760008555613cd2565b82601f10613ca457805160ff1916838001178555613cd2565b82800160010185558215613cd2579182015b82811115613cd1578251825591602001919060010190613cb6565b5b509050613cdf9190613ce3565b5090565b5b80821115613cfc576000816000905550600101613ce4565b5090565b6000613d13613d0e84614f6e565b614f49565b905082815260208101848484011115613d2f57613d2e615478565b5b613d3a8482856151d3565b509392505050565b6000613d55613d5084614f9f565b614f49565b905082815260208101848484011115613d7157613d70615478565b5b613d7c8482856151d3565b509392505050565b600081359050613d9381615ccf565b92915050565b60008083601f840112613daf57613dae61546e565b5b8235905067ffffffffffffffff811115613dcc57613dcb615469565b5b602083019150836020820283011115613de857613de7615473565b5b9250929050565b600081359050613dfe81615ce6565b92915050565b600081359050613e1381615cfd565b92915050565b600081519050613e2881615cfd565b92915050565b600082601f830112613e4357613e4261546e565b5b8135613e53848260208601613d00565b91505092915050565b60008083601f840112613e7257613e7161546e565b5b8235905067ffffffffffffffff811115613e8f57613e8e615469565b5b602083019150836001820283011115613eab57613eaa615473565b5b9250929050565b600082601f830112613ec757613ec661546e565b5b8135613ed7848260208601613d42565b91505092915050565b600081359050613eef81615d14565b92915050565b600060208284031215613f0b57613f0a615482565b5b6000613f1984828501613d84565b91505092915050565b60008060408385031215613f3957613f38615482565b5b6000613f4785828601613d84565b9250506020613f5885828601613d84565b9150509250929050565b600080600060608486031215613f7b57613f7a615482565b5b6000613f8986828701613d84565b9350506020613f9a86828701613d84565b9250506040613fab86828701613ee0565b9150509250925092565b60008060008060808587031215613fcf57613fce615482565b5b6000613fdd87828801613d84565b9450506020613fee87828801613d84565b9350506040613fff87828801613ee0565b925050606085013567ffffffffffffffff8111156140205761401f61547d565b5b61402c87828801613e2e565b91505092959194509250565b6000806040838503121561404f5761404e615482565b5b600061405d85828601613d84565b925050602061406e85828601613def565b9150509250929050565b6000806040838503121561408f5761408e615482565b5b600061409d85828601613d84565b92505060206140ae85828601613ee0565b9150509250929050565b600080602083850312156140cf576140ce615482565b5b600083013567ffffffffffffffff8111156140ed576140ec61547d565b5b6140f985828601613d99565b92509250509250929050565b60006020828403121561411b5761411a615482565b5b600061412984828501613e04565b91505092915050565b60006020828403121561414857614147615482565b5b600061415684828501613e19565b91505092915050565b6000806040838503121561417657614175615482565b5b600083013567ffffffffffffffff8111156141945761419361547d565b5b6141a085828601613e2e565b92505060206141b185828601613ee0565b9150509250929050565b600080602083850312156141d2576141d1615482565b5b600083013567ffffffffffffffff8111156141f0576141ef61547d565b5b6141fc85828601613e5c565b92509250509250929050565b60006020828403121561421e5761421d615482565b5b600082013567ffffffffffffffff81111561423c5761423b61547d565b5b61424884828501613eb2565b91505092915050565b60006020828403121561426757614266615482565b5b600061427584828501613ee0565b91505092915050565b61428781615148565b82525050565b61429e61429982615148565b6152c1565b82525050565b6142ad8161515a565b82525050565b6142bc81615166565b82525050565b6142d36142ce82615166565b6152d3565b82525050565b60006142e482614fe5565b6142ee8185614ffb565b93506142fe8185602086016151e2565b61430781615487565b840191505092915050565b600061431d82614ff0565b6143278185615017565b93506143378185602086016151e2565b61434081615487565b840191505092915050565b600061435682614ff0565b6143608185615028565b93506143708185602086016151e2565b80840191505092915050565b6000815461438981615215565b6143938186615028565b945060018216600081146143ae57600181146143bf576143f2565b60ff198316865281860193506143f2565b6143c885614fd0565b60005b838110156143ea578154818901526001820191506020810190506143cb565b838801955050505b50505092915050565b6000614408601883615017565b9150614413826154a5565b602082019050919050565b600061442b601683615017565b9150614436826154ce565b602082019050919050565b600061444e601383615017565b9150614459826154f7565b602082019050919050565b6000614471601f83615017565b915061447c82615520565b602082019050919050565b6000614494601c83615028565b915061449f82615549565b601c82019050919050565b60006144b7601183615017565b91506144c282615572565b602082019050919050565b60006144da602b83615017565b91506144e58261559b565b604082019050919050565b60006144fd603283615017565b9150614508826155ea565b604082019050919050565b6000614520602683615017565b915061452b82615639565b604082019050919050565b6000614543601c83615017565b915061454e82615688565b602082019050919050565b6000614566600a83615017565b9150614571826156b1565b602082019050919050565b6000614589600e83615017565b9150614594826156da565b602082019050919050565b60006145ac602483615017565b91506145b782615703565b604082019050919050565b60006145cf601983615017565b91506145da82615752565b602082019050919050565b60006145f2600c83615017565b91506145fd8261577b565b602082019050919050565b6000614615602283615017565b9150614620826157a4565b604082019050919050565b6000614638600b83615017565b9150614643826157f3565b602082019050919050565b600061465b602c83615017565b91506146668261581c565b604082019050919050565b600061467e600c83615017565b91506146898261586b565b602082019050919050565b60006146a1600d83615017565b91506146ac82615894565b602082019050919050565b60006146c4603883615017565b91506146cf826158bd565b604082019050919050565b60006146e7602a83615017565b91506146f28261590c565b604082019050919050565b600061470a602983615017565b91506147158261595b565b604082019050919050565b600061472d601283615017565b9150614738826159aa565b602082019050919050565b6000614750602283615017565b915061475b826159d3565b604082019050919050565b6000614773602083615017565b915061477e82615a22565b602082019050919050565b6000614796602c83615017565b91506147a182615a4b565b604082019050919050565b60006147b9602083615017565b91506147c482615a9a565b602082019050919050565b60006147dc602983615017565b91506147e782615ac3565b604082019050919050565b60006147ff601283615017565b915061480a82615b12565b602082019050919050565b6000614822602183615017565b915061482d82615b3b565b604082019050919050565b6000614845601783615017565b915061485082615b8a565b602082019050919050565b6000614868601183615017565b915061487382615bb3565b602082019050919050565b600061488b60008361500c565b915061489682615bdc565b600082019050919050565b60006148ae603183615017565b91506148b982615bdf565b604082019050919050565b60006148d1602c83615017565b91506148dc82615c2e565b604082019050919050565b60006148f4601183615017565b91506148ff82615c7d565b602082019050919050565b6000614917601083615017565b915061492282615ca6565b602082019050919050565b614936816151bc565b82525050565b614945816151c6565b82525050565b6000614957828461428d565b60148201915081905092915050565b6000614972828561437c565b915061497e828461434b565b91508190509392505050565b600061499582614487565b91506149a182846142c2565b60208201915081905092915050565b60006149bb8261487e565b9150819050919050565b60006020820190506149da600083018461427e565b92915050565b60006080820190506149f5600083018761427e565b614a02602083018661427e565b614a0f604083018561492d565b8181036060830152614a2181846142d9565b905095945050505050565b6000602082019050614a4160008301846142a4565b92915050565b6000608082019050614a5c60008301876142b3565b614a69602083018661493c565b614a7660408301856142b3565b614a8360608301846142b3565b95945050505050565b60006020820190508181036000830152614aa68184614312565b905092915050565b60006020820190508181036000830152614ac7816143fb565b9050919050565b60006020820190508181036000830152614ae78161441e565b9050919050565b60006020820190508181036000830152614b0781614441565b9050919050565b60006020820190508181036000830152614b2781614464565b9050919050565b60006020820190508181036000830152614b47816144aa565b9050919050565b60006020820190508181036000830152614b67816144cd565b9050919050565b60006020820190508181036000830152614b87816144f0565b9050919050565b60006020820190508181036000830152614ba781614513565b9050919050565b60006020820190508181036000830152614bc781614536565b9050919050565b60006020820190508181036000830152614be781614559565b9050919050565b60006020820190508181036000830152614c078161457c565b9050919050565b60006020820190508181036000830152614c278161459f565b9050919050565b60006020820190508181036000830152614c47816145c2565b9050919050565b60006020820190508181036000830152614c67816145e5565b9050919050565b60006020820190508181036000830152614c8781614608565b9050919050565b60006020820190508181036000830152614ca78161462b565b9050919050565b60006020820190508181036000830152614cc78161464e565b9050919050565b60006020820190508181036000830152614ce781614671565b9050919050565b60006020820190508181036000830152614d0781614694565b9050919050565b60006020820190508181036000830152614d27816146b7565b9050919050565b60006020820190508181036000830152614d47816146da565b9050919050565b60006020820190508181036000830152614d67816146fd565b9050919050565b60006020820190508181036000830152614d8781614720565b9050919050565b60006020820190508181036000830152614da781614743565b9050919050565b60006020820190508181036000830152614dc781614766565b9050919050565b60006020820190508181036000830152614de781614789565b9050919050565b60006020820190508181036000830152614e07816147ac565b9050919050565b60006020820190508181036000830152614e27816147cf565b9050919050565b60006020820190508181036000830152614e47816147f2565b9050919050565b60006020820190508181036000830152614e6781614815565b9050919050565b60006020820190508181036000830152614e8781614838565b9050919050565b60006020820190508181036000830152614ea78161485b565b9050919050565b60006020820190508181036000830152614ec7816148a1565b9050919050565b60006020820190508181036000830152614ee7816148c4565b9050919050565b60006020820190508181036000830152614f07816148e7565b9050919050565b60006020820190508181036000830152614f278161490a565b9050919050565b6000602082019050614f43600083018461492d565b92915050565b6000614f53614f64565b9050614f5f8282615247565b919050565b6000604051905090565b600067ffffffffffffffff821115614f8957614f8861543a565b5b614f9282615487565b9050602081019050919050565b600067ffffffffffffffff821115614fba57614fb961543a565b5b614fc382615487565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061503e826151bc565b9150615049836151bc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561507e5761507d615320565b5b828201905092915050565b6000615094826151bc565b915061509f836151bc565b9250826150af576150ae61534f565b5b828204905092915050565b60006150c5826151bc565b91506150d0836151bc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561510957615108615320565b5b828202905092915050565b600061511f826151bc565b915061512a836151bc565b92508282101561513d5761513c615320565b5b828203905092915050565b60006151538261519c565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156152005780820151818401526020810190506151e5565b8381111561520f576000848401525b50505050565b6000600282049050600182168061522d57607f821691505b60208210811415615241576152406153ad565b5b50919050565b61525082615487565b810181811067ffffffffffffffff8211171561526f5761526e61543a565b5b80604052505050565b6000615283826151bc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152b6576152b5615320565b5b600182019050919050565b60006152cc826152dd565b9050919050565b6000819050919050565b60006152e882615498565b9050919050565b60006152fa826151bc565b9150615305836151bc565b9250826153155761531461534f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f4449524543545f4d494e545f444953414c4c4f57454400000000000000000000600082015250565b7f455843454544535f50524553414c455f4d415800000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4e4f4e4558495354414e545f544f4b454e000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e4f5f42414c414e434500000000000000000000000000000000000000000000600082015250565b7f57524f4e475f46554e4354494f4e000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4f55545f4f465f53544f434b0000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f53414c455f434c4f534544000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f414d4f554e545f4552524f520000000000000000000000000000000000000000600082015250565b7f5452414e534645525f4641494c00000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f455843454544535f4d41585f535550504c590000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f455843454544535f5055424c49435f4d41580000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f455843454544535f544f4b454e535f5045525f55534552000000000000000000600082015250565b7f455843454544535f47494654535f4d4158000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f50524f56454e414e43455f4c4f434b4544000000000000000000000000000000600082015250565b7f494e53554646494349454e545f45544800000000000000000000000000000000600082015250565b615cd881615148565b8114615ce357600080fd5b50565b615cef8161515a565b8114615cfa57600080fd5b50565b615d0681615170565b8114615d1157600080fd5b50565b615d1d816151bc565b8114615d2857600080fd5b5056fea2646970667358221220e0ab97c1240726b45ea4995e4972c03cdc6e342427eba82b2c512f6f1b335c4364736f6c63430008070033
Deployed Bytecode Sourcemap
61084:6345:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54859:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66745:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42353:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61236:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43912:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43435:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64973:402;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55499:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61973:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61275:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44662:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61530:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61468:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66960:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55167:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62047:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62201:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66520:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45072:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55689:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66854:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42047:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61416:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62090:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41777:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21323:103;;;;;;;;;;;;;:::i;:::-;;65383:276;;;;;;;;;;;;;:::i;:::-;;66089:116;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20672:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62007:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42522:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65852:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63932:406;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44205:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62163:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61368:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66213:95;;;;;;;;;;;;;:::i;:::-;;61588:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45328:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64346:619;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67069:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67186:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66316:90;;;;;;;;;;;;;:::i;:::-;;61323:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66625:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44431:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66414:98;;;;;;;;;;;;;:::i;:::-;;21581:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62127:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54859:224;54961:4;55000:35;54985:50;;;:11;:50;;;;:90;;;;55039:36;55063:11;55039:23;:36::i;:::-;54985:90;54978:97;;54859:224;;;:::o;66745:101::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66833:5:::1;66816:14;;:22;;;;;;;;;;;;;;;;;;66745:101:::0;:::o;42353:100::-;42407:13;42440:5;42433:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42353:100;:::o;61236:32::-;;;;:::o;43912:221::-;43988:7;44016:16;44024:7;44016;:16::i;:::-;44008:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44101:15;:24;44117:7;44101:24;;;;;;;;;;;;;;;;;;;;;44094:31;;43912:221;;;:::o;43435:411::-;43516:13;43532:23;43547:7;43532:14;:23::i;:::-;43516:39;;43580:5;43574:11;;:2;:11;;;;43566:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;43674:5;43658:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;43683:37;43700:5;43707:12;:10;:12::i;:::-;43683:16;:37::i;:::-;43658:62;43636:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;43817:21;43826:2;43830:7;43817:8;:21::i;:::-;43505:341;43435:411;;:::o;64973:402::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61457:4:::1;65069:7;;:14;;65053:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:48;;65045:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;61358:3;65158:7;;:14;;65143:12;;:29;;;;:::i;:::-;:41;;65135:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;65232:9;65227:141;65251:7;;:14;;65247:1;:18;65227:141;;;65287:12;;:14;;;;;;;;;:::i;:::-;;;;;;65316:40;65326:7;;65334:1;65326:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;65354:1;65338:13;:11;:13::i;:::-;:17;;;;:::i;:::-;65316:9;:40::i;:::-;65267:3;;;;;:::i;:::-;;;;65227:141;;;;64973:402:::0;;:::o;55499:113::-;55560:7;55587:10;:17;;;;55580:24;;55499:113;:::o;61973:27::-;;;;:::o;61275:41::-;61313:3;61275:41;:::o;44662:339::-;44857:41;44876:12;:10;:12::i;:::-;44890:7;44857:18;:41::i;:::-;44849:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;44965:28;44975:4;44981:2;44985:7;44965:9;:28::i;:::-;44662:339;;;:::o;61530:45::-;;;;:::o;61468:55::-;61512:11;61468:55;:::o;66960:101::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67047:6:::1;67032:12;:21;;;;66960:101:::0;:::o;55167:256::-;55264:7;55300:23;55317:5;55300:16;:23::i;:::-;55292:5;:31;55284:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;55389:12;:19;55402:5;55389:19;;;;;;;;;;;;;;;:26;55409:5;55389:26;;;;;;;;;;;;55382:33;;55167:256;;;;:::o;62047:34::-;;;;:::o;62201:36::-;;;;;;;;;;;;;:::o;66520:97::-;66573:4;66597:12;;;;;;;;;;;66590:19;;66520:97;:::o;45072:185::-;45210:39;45227:4;45233:2;45237:7;45210:39;;;;;;;;;;;;:16;:39::i;:::-;45072:185;;;:::o;55689:233::-;55764:7;55800:30;:28;:30::i;:::-;55792:5;:38;55784:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;55897:10;55908:5;55897:17;;;;;;;;:::i;:::-;;;;;;;;;;55890:24;;55689:233;;;:::o;66854:98::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66941:3:::1;;66925:13;:19;;;;;;;:::i;:::-;;66854:98:::0;;:::o;42047:239::-;42119:7;42139:13;42155:7;:16;42163:7;42155:16;;;;;;;;;;;;;;;;;;;;;42139:32;;42207:1;42190:19;;:5;:19;;;;42182:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42273:5;42266:12;;;42047:239;;;:::o;61416:45::-;61457:4;61416:45;:::o;62090:30::-;;;;;;;;;;;;;:::o;41777:208::-;41849:7;41894:1;41877:19;;:5;:19;;;;41869:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;41961:9;:16;41971:5;41961:16;;;;;;;;;;;;;;;;41954:23;;41777:208;;;:::o;21323:103::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21388:30:::1;21415:1;21388:18;:30::i;:::-;21323:103::o:0;65383:276::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65434:15:::1;65452:21;65434:39;;65502:1;65492:7;:11;65484:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;65538:47;65548:11;;;;;;;;;;;65561:23;65580:3;65561:14;65573:1;65561:7;:11;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;65538:9;:47::i;:::-;65596;65606:13;;;;;;;;;;;65621:21;65596:9;:47::i;:::-;65423:236;65383:276::o:0;66089:116::-;66145:13;66177:20;66170:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66089:116;:::o;20672:87::-;20718:7;20745:6;;;;;;;;;;;20738:13;;20672:87;:::o;62007:33::-;;;;:::o;42522:104::-;42578:13;42611:7;42604:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42522:104;:::o;65852:229::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65953:16:::1;;;;;;;;;;;65952:17;65944:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;66025:14;66002:20;:37;;;;;;;;;;;;:::i;:::-;;66069:4;66050:16;;:23;;;;;;;;;;;;;;;;;;65852:229:::0;:::o;63932:406::-;62359:10;;;;;;;;;;;62351:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;64013:12:::1;;;;;;;;;;;64012:13;64004:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;64086:1;64070:13;:17;64062:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;61457:4;64123:13;:11;:13::i;:::-;:30;64115:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;64186:11;;;;;;;;;;;64183:148;;;64214:26;64226:13;64214:11;:26::i;:::-;64183:148;;;64294:25;64305:13;64294:10;:25::i;:::-;64183:148;63932:406:::0;:::o;44205:155::-;44300:52;44319:12;:10;:12::i;:::-;44333:8;44343;44300:18;:52::i;:::-;44205:155;;:::o;62163:31::-;;;;;;;;;;;;;:::o;61368:41::-;61405:4;61368:41;:::o;66213:95::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66289:11:::1;;;;;;;;;;;66288:12;66274:11;;:26;;;;;;;;;;;;;;;;;;66213:95::o:0;61588:51::-;;;;;;;;;;;;;;;;;:::o;45328:328::-;45503:41;45522:12;:10;:12::i;:::-;45536:7;45503:18;:41::i;:::-;45495:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;45609:39;45623:4;45629:2;45633:7;45642:5;45609:13;:39::i;:::-;45328:328;;;;:::o;64346:619::-;62359:10;;;;;;;;;;;62351:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;64457:12:::1;;;;;;;;;;;64449:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;64506:49;64525:18;64532:10;64525:6;:18::i;:::-;64545:9;64506:18;:49::i;:::-;64498:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;64617:1;64601:13;:17;64593:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;61457:4;64654:13;:11;:13::i;:::-;:30;64646:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;64717:11;;;;;;;;;;;64714:244;;;64803:26;64815:13;64803:11;:26::i;:::-;64714:244;;;64921:25;64932:13;64921:10;:25::i;:::-;64714:244;64346:619:::0;;:::o;67069:109::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67160:10:::1;67141:16;:29;;;;67069:109:::0;:::o;67186:240::-;67259:13;67293:16;67301:7;67293;:16::i;:::-;67285:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;67383:13;67398:18;:7;:16;:18::i;:::-;67366:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67352:66;;67186:240;;;:::o;66316:90::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66388:10:::1;;;;;;;;;;;66387:11;66374:10;;:24;;;;;;;;;;;;;;;;;;66316:90::o:0;61323:38::-;61358:3;61323:38;:::o;66625:112::-;66674:7;66701:16;:28;66718:10;66701:28;;;;;;;;;;;;;;;;66694:35;;66625:112;:::o;44431:164::-;44528:4;44552:18;:25;44571:5;44552:25;;;;;;;;;;;;;;;:35;44578:8;44552:35;;;;;;;;;;;;;;;;;;;;;;;;;44545:42;;44431:164;;;;:::o;66414:98::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66492:12:::1;;;;;;;;;;;66491:13;66476:12;;:28;;;;;;;;;;;;;;;;;;66414:98::o:0;21581:201::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21690:1:::1;21670:22;;:8;:22;;;;21662:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21746:28;21765:8;21746:18;:28::i;:::-;21581:201:::0;:::o;62127:29::-;;;;;;;;;;;;;:::o;41408:305::-;41510:4;41562:25;41547:40;;;:11;:40;;;;:105;;;;41619:33;41604:48;;;:11;:48;;;;41547:105;:158;;;;41669:36;41693:11;41669:23;:36::i;:::-;41547:158;41527:178;;41408:305;;;:::o;19396:98::-;19449:7;19476:10;19469:17;;19396:98;:::o;47166:127::-;47231:4;47283:1;47255:30;;:7;:16;47263:7;47255:16;;;;;;;;;;;;;;;;;;;;;:30;;;;47248:37;;47166:127;;;:::o;51148:174::-;51250:2;51223:15;:24;51239:7;51223:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51306:7;51302:2;51268:46;;51277:23;51292:7;51277:14;:23::i;:::-;51268:46;;;;;;;;;;;;51148:174;;:::o;48150:110::-;48226:26;48236:2;48240:7;48226:26;;;;;;;;;;;;:9;:26::i;:::-;48150:110;;:::o;47460:348::-;47553:4;47578:16;47586:7;47578;:16::i;:::-;47570:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47654:13;47670:23;47685:7;47670:14;:23::i;:::-;47654:39;;47723:5;47712:16;;:7;:16;;;:51;;;;47756:7;47732:31;;:20;47744:7;47732:11;:20::i;:::-;:31;;;47712:51;:87;;;;47767:32;47784:5;47791:7;47767:16;:32::i;:::-;47712:87;47704:96;;;47460:348;;;;:::o;50452:578::-;50611:4;50584:31;;:23;50599:7;50584:14;:23::i;:::-;:31;;;50576:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;50694:1;50680:16;;:2;:16;;;;50672:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50750:39;50771:4;50777:2;50781:7;50750:20;:39::i;:::-;50854:29;50871:1;50875:7;50854:8;:29::i;:::-;50915:1;50896:9;:15;50906:4;50896:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;50944:1;50927:9;:13;50937:2;50927:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;50975:2;50956:7;:16;50964:7;50956:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;51014:7;51010:2;50995:27;;51004:4;50995:27;;;;;;;;;;;;50452:578;;;:::o;21942:191::-;22016:16;22035:6;;;;;;;;;;;22016:25;;22061:8;22052:6;;:17;;;;;;;;;;;;;;;;;;22116:8;22085:40;;22106:8;22085:40;;;;;;;;;;;;22005:128;21942:191;:::o;3600:98::-;3658:7;3689:1;3685;:5;;;;:::i;:::-;3678:12;;3600:98;;;;:::o;3999:::-;4057:7;4088:1;4084;:5;;;;:::i;:::-;4077:12;;3999:98;;;;:::o;65667:177::-;65741:12;65759:8;:13;;65780:7;65759:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65740:52;;;65811:7;65803:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;65729:115;65667:177;;:::o;62794:631::-;61313:3;62887:13;62865:19;;:35;;;;:::i;:::-;:50;;62857:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;63007:12;;62989:13;62958:16;:28;62975:10;62958:28;;;;;;;;;;;;;;;;:44;;;;:::i;:::-;:61;;62950:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;63103:9;63086:13;61512:11;63066:33;;;;:::i;:::-;:46;;63058:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;63186:13;63154:16;:28;63171:10;63154:28;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;63276:9;63272:146;63295:13;63291:1;:17;63272:146;;;63330:19;;:21;;;;;;;;;:::i;:::-;;;;;;63366:40;63376:10;63404:1;63388:13;:11;:13::i;:::-;:17;;;;:::i;:::-;63366:9;:40::i;:::-;63310:3;;;;;:::i;:::-;;;;63272:146;;;;62794:631;:::o;63433:491::-;61405:4;63524:13;63503:18;;:34;;;;:::i;:::-;:48;;63495:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;63634:12;;63617:13;63593:21;63603:10;63593:9;:21::i;:::-;:37;;;;:::i;:::-;:53;;63585:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;63729:9;63712:13;63693:16;;:32;;;;:::i;:::-;:45;;63685:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;63776:9;63772:145;63795:13;63791:1;:17;63772:145;;;63830:18;;:20;;;;;;;;;:::i;:::-;;;;;;63865:40;63875:10;63903:1;63887:13;:11;:13::i;:::-;:17;;;;:::i;:::-;63865:9;:40::i;:::-;63810:3;;;;;:::i;:::-;;;;63772:145;;;;63433:491;:::o;51464:315::-;51619:8;51610:17;;:5;:17;;;;51602:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;51706:8;51668:18;:25;51687:5;51668:25;;;;;;;;;;;;;;;:35;51694:8;51668:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;51752:8;51730:41;;51745:5;51730:41;;;51762:8;51730:41;;;;;;:::i;:::-;;;;;;;;51464:315;;;:::o;46538:::-;46695:28;46705:4;46711:2;46715:7;46695:9;:28::i;:::-;46742:48;46765:4;46771:2;46775:7;46784:5;46742:22;:48::i;:::-;46734:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;46538:315;;;;:::o;62413:178::-;62466:7;62486:12;62501:60;62528:6;62511:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;62501:35;;;;;;:58;:60::i;:::-;62486:75;;62579:4;62572:11;;;62413:178;;;:::o;62601:185::-;62688:4;62730:48;62768:9;62730:29;:4;:27;:29::i;:::-;:37;;:48;;;;:::i;:::-;62712:66;;:14;;;;;;;;;;;:66;;;62705:73;;62601:185;;;;:::o;7392:723::-;7448:13;7678:1;7669:5;:10;7665:53;;;7696:10;;;;;;;;;;;;;;;;;;;;;7665:53;7728:12;7743:5;7728:20;;7759:14;7784:78;7799:1;7791:4;:9;7784:78;;7817:8;;;;;:::i;:::-;;;;7848:2;7840:10;;;;;:::i;:::-;;;7784:78;;;7872:19;7904:6;7894:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7872:39;;7922:154;7938:1;7929:5;:10;7922:154;;7966:1;7956:11;;;;;:::i;:::-;;;8033:2;8025:5;:10;;;;:::i;:::-;8012:2;:24;;;;:::i;:::-;7999:39;;7982:6;7989;7982:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8062:2;8053:11;;;;;:::i;:::-;;;7922:154;;;8100:6;8086:21;;;;;7392:723;;;;:::o;33104:157::-;33189:4;33228:25;33213:40;;;:11;:40;;;;33206:47;;33104:157;;;:::o;48487:321::-;48617:18;48623:2;48627:7;48617:5;:18::i;:::-;48668:54;48699:1;48703:2;48707:7;48716:5;48668:22;:54::i;:::-;48646:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;48487:321;;;:::o;56535:589::-;56679:45;56706:4;56712:2;56716:7;56679:26;:45::i;:::-;56757:1;56741:18;;:4;:18;;;56737:187;;;56776:40;56808:7;56776:31;:40::i;:::-;56737:187;;;56846:2;56838:10;;:4;:10;;;56834:90;;56865:47;56898:4;56904:7;56865:32;:47::i;:::-;56834:90;56737:187;56952:1;56938:16;;:2;:16;;;56934:183;;;56971:45;57008:7;56971:36;:45::i;:::-;56934:183;;;57044:4;57038:10;;:2;:10;;;57034:83;;57065:40;57093:2;57097:7;57065:27;:40::i;:::-;57034:83;56934:183;56535:589;;;:::o;52344:799::-;52499:4;52520:15;:2;:13;;;:15::i;:::-;52516:620;;;52572:2;52556:36;;;52593:12;:10;:12::i;:::-;52607:4;52613:7;52622:5;52556:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;52552:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52815:1;52798:6;:13;:18;52794:272;;;52841:60;;;;;;;;;;:::i;:::-;;;;;;;;52794:272;53016:6;53010:13;53001:6;52997:2;52993:15;52986:38;52552:529;52689:41;;;52679:51;;;:6;:51;;;;52672:58;;;;;52516:620;53120:4;53113:11;;52344:799;;;;;;;:::o;17402:269::-;17471:7;17657:4;17604:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;17594:69;;;;;;17587:76;;17402:269;;;:::o;13553:231::-;13631:7;13652:17;13671:18;13693:27;13704:4;13710:9;13693:10;:27::i;:::-;13651:69;;;;13731:18;13743:5;13731:11;:18::i;:::-;13767:9;13760:16;;;;13553:231;;;;:::o;49144:382::-;49238:1;49224:16;;:2;:16;;;;49216:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;49297:16;49305:7;49297;:16::i;:::-;49296:17;49288:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49359:45;49388:1;49392:2;49396:7;49359:20;:45::i;:::-;49434:1;49417:9;:13;49427:2;49417:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;49465:2;49446:7;:16;49454:7;49446:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49510:7;49506:2;49485:33;;49502:1;49485:33;;;;;;;;;;;;49144:382;;:::o;53715:126::-;;;;:::o;57847:164::-;57951:10;:17;;;;57924:15;:24;57940:7;57924:24;;;;;;;;;;;:44;;;;57979:10;57995:7;57979:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57847:164;:::o;58638:988::-;58904:22;58954:1;58929:22;58946:4;58929:16;:22::i;:::-;:26;;;;:::i;:::-;58904:51;;58966:18;58987:17;:26;59005:7;58987:26;;;;;;;;;;;;58966:47;;59134:14;59120:10;:28;59116:328;;59165:19;59187:12;:18;59200:4;59187:18;;;;;;;;;;;;;;;:34;59206:14;59187:34;;;;;;;;;;;;59165:56;;59271:11;59238:12;:18;59251:4;59238:18;;;;;;;;;;;;;;;:30;59257:10;59238:30;;;;;;;;;;;:44;;;;59388:10;59355:17;:30;59373:11;59355:30;;;;;;;;;;;:43;;;;59150:294;59116:328;59540:17;:26;59558:7;59540:26;;;;;;;;;;;59533:33;;;59584:12;:18;59597:4;59584:18;;;;;;;;;;;;;;;:34;59603:14;59584:34;;;;;;;;;;;59577:41;;;58719:907;;58638:988;;:::o;59921:1079::-;60174:22;60219:1;60199:10;:17;;;;:21;;;;:::i;:::-;60174:46;;60231:18;60252:15;:24;60268:7;60252:24;;;;;;;;;;;;60231:45;;60603:19;60625:10;60636:14;60625:26;;;;;;;;:::i;:::-;;;;;;;;;;60603:48;;60689:11;60664:10;60675;60664:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;60800:10;60769:15;:28;60785:11;60769:28;;;;;;;;;;;:41;;;;60941:15;:24;60957:7;60941:24;;;;;;;;;;;60934:31;;;60976:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;59992:1008;;;59921:1079;:::o;57425:221::-;57510:14;57527:20;57544:2;57527:16;:20::i;:::-;57510:37;;57585:7;57558:12;:16;57571:2;57558:16;;;;;;;;;;;;;;;:24;57575:6;57558:24;;;;;;;;;;;:34;;;;57632:6;57603:17;:26;57621:7;57603:26;;;;;;;;;;;:35;;;;57499:147;57425:221;;:::o;22960:387::-;23020:4;23228:12;23295:7;23283:20;23275:28;;23338:1;23331:4;:8;23324:15;;;22960:387;;;:::o;11443:1308::-;11524:7;11533:12;11778:2;11758:9;:16;:22;11754:990;;;11797:9;11821;11845:7;12054:4;12043:9;12039:20;12033:27;12028:32;;12104:4;12093:9;12089:20;12083:27;12078:32;;12162:4;12151:9;12147:20;12141:27;12138:1;12133:36;12128:41;;12205:25;12216:4;12222:1;12225;12228;12205:10;:25::i;:::-;12198:32;;;;;;;;;11754:990;12272:2;12252:9;:16;:22;12248:496;;;12291:9;12315:10;12527:4;12516:9;12512:20;12506:27;12501:32;;12578:4;12567:9;12563:20;12557:27;12551:33;;12620:23;12631:4;12637:1;12640:2;12620:10;:23::i;:::-;12613:30;;;;;;;;12248:496;12692:1;12696:35;12676:56;;;;11443:1308;;;;;;:::o;9714:643::-;9792:20;9783:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;9779:571;;;9829:7;;9779:571;9890:29;9881:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;9877:473;;;9936:34;;;;;;;;;;:::i;:::-;;;;;;;;9877:473;10001:35;9992:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;9988:362;;;10053:41;;;;;;;;;;:::i;:::-;;;;;;;;9988:362;10125:30;10116:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;10112:238;;;10172:44;;;;;;;;;;:::i;:::-;;;;;;;;10112:238;10247:30;10238:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;10234:116;;;10294:44;;;;;;;;;;:::i;:::-;;;;;;;;10234:116;9714:643;;:::o;15052:1632::-;15183:7;15192:12;16117:66;16112:1;16104:10;;:79;16100:163;;;16216:1;16220:30;16200:51;;;;;;16100:163;16282:2;16277:1;:7;;;;:18;;;;;16293:2;16288:1;:7;;;;16277:18;16273:102;;;16328:1;16332:30;16312:51;;;;;;16273:102;16472:14;16489:24;16499:4;16505:1;16508;16511;16489:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16472:41;;16546:1;16528:20;;:6;:20;;;16524:103;;;16581:1;16585:29;16565:50;;;;;;;16524:103;16647:6;16655:20;16639:37;;;;;15052:1632;;;;;;;;:::o;14047:391::-;14161:7;14170:12;14195:9;14215:7;14270:66;14266:2;14262:75;14257:80;;14374:2;14369;14364:3;14360:12;14356:21;14351:26;;14405:25;14416:4;14422:1;14425;14428;14405:10;:25::i;:::-;14398:32;;;;;;14047:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:553::-;2435:8;2445:6;2495:3;2488:4;2480:6;2476:17;2472:27;2462:122;;2503:79;;:::i;:::-;2462:122;2616:6;2603:20;2593:30;;2646:18;2638:6;2635:30;2632:117;;;2668:79;;:::i;:::-;2632:117;2782:4;2774:6;2770:17;2758:29;;2836:3;2828:4;2820:6;2816:17;2806:8;2802:32;2799:41;2796:128;;;2843:79;;:::i;:::-;2796:128;2377:553;;;;;:::o;2950:340::-;3006:5;3055:3;3048:4;3040:6;3036:17;3032:27;3022:122;;3063:79;;:::i;:::-;3022:122;3180:6;3167:20;3205:79;3280:3;3272:6;3265:4;3257:6;3253:17;3205:79;:::i;:::-;3196:88;;3012:278;2950:340;;;;:::o;3296:139::-;3342:5;3380:6;3367:20;3358:29;;3396:33;3423:5;3396:33;:::i;:::-;3296:139;;;;:::o;3441:329::-;3500:6;3549:2;3537:9;3528:7;3524:23;3520:32;3517:119;;;3555:79;;:::i;:::-;3517:119;3675:1;3700:53;3745:7;3736:6;3725:9;3721:22;3700:53;:::i;:::-;3690:63;;3646:117;3441:329;;;;:::o;3776:474::-;3844:6;3852;3901:2;3889:9;3880:7;3876:23;3872:32;3869:119;;;3907:79;;:::i;:::-;3869:119;4027:1;4052:53;4097:7;4088:6;4077:9;4073:22;4052:53;:::i;:::-;4042:63;;3998:117;4154:2;4180:53;4225:7;4216:6;4205:9;4201:22;4180:53;:::i;:::-;4170:63;;4125:118;3776:474;;;;;:::o;4256:619::-;4333:6;4341;4349;4398:2;4386:9;4377:7;4373:23;4369:32;4366:119;;;4404:79;;:::i;:::-;4366:119;4524:1;4549:53;4594:7;4585:6;4574:9;4570:22;4549:53;:::i;:::-;4539:63;;4495:117;4651:2;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4622:118;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4256:619;;;;;:::o;4881:943::-;4976:6;4984;4992;5000;5049:3;5037:9;5028:7;5024:23;5020:33;5017:120;;;5056:79;;:::i;:::-;5017:120;5176:1;5201:53;5246:7;5237:6;5226:9;5222:22;5201:53;:::i;:::-;5191:63;;5147:117;5303:2;5329:53;5374:7;5365:6;5354:9;5350:22;5329:53;:::i;:::-;5319:63;;5274:118;5431:2;5457:53;5502:7;5493:6;5482:9;5478:22;5457:53;:::i;:::-;5447:63;;5402:118;5587:2;5576:9;5572:18;5559:32;5618:18;5610:6;5607:30;5604:117;;;5640:79;;:::i;:::-;5604:117;5745:62;5799:7;5790:6;5779:9;5775:22;5745:62;:::i;:::-;5735:72;;5530:287;4881:943;;;;;;;:::o;5830:468::-;5895:6;5903;5952:2;5940:9;5931:7;5927:23;5923:32;5920:119;;;5958:79;;:::i;:::-;5920:119;6078:1;6103:53;6148:7;6139:6;6128:9;6124:22;6103:53;:::i;:::-;6093:63;;6049:117;6205:2;6231:50;6273:7;6264:6;6253:9;6249:22;6231:50;:::i;:::-;6221:60;;6176:115;5830:468;;;;;:::o;6304:474::-;6372:6;6380;6429:2;6417:9;6408:7;6404:23;6400:32;6397:119;;;6435:79;;:::i;:::-;6397:119;6555:1;6580:53;6625:7;6616:6;6605:9;6601:22;6580:53;:::i;:::-;6570:63;;6526:117;6682:2;6708:53;6753:7;6744:6;6733:9;6729:22;6708:53;:::i;:::-;6698:63;;6653:118;6304:474;;;;;:::o;6784:559::-;6870:6;6878;6927:2;6915:9;6906:7;6902:23;6898:32;6895:119;;;6933:79;;:::i;:::-;6895:119;7081:1;7070:9;7066:17;7053:31;7111:18;7103:6;7100:30;7097:117;;;7133:79;;:::i;:::-;7097:117;7246:80;7318:7;7309:6;7298:9;7294:22;7246:80;:::i;:::-;7228:98;;;;7024:312;6784:559;;;;;:::o;7349:327::-;7407:6;7456:2;7444:9;7435:7;7431:23;7427:32;7424:119;;;7462:79;;:::i;:::-;7424:119;7582:1;7607:52;7651:7;7642:6;7631:9;7627:22;7607:52;:::i;:::-;7597:62;;7553:116;7349:327;;;;:::o;7682:349::-;7751:6;7800:2;7788:9;7779:7;7775:23;7771:32;7768:119;;;7806:79;;:::i;:::-;7768:119;7926:1;7951:63;8006:7;7997:6;7986:9;7982:22;7951:63;:::i;:::-;7941:73;;7897:127;7682:349;;;;:::o;8037:652::-;8114:6;8122;8171:2;8159:9;8150:7;8146:23;8142:32;8139:119;;;8177:79;;:::i;:::-;8139:119;8325:1;8314:9;8310:17;8297:31;8355:18;8347:6;8344:30;8341:117;;;8377:79;;:::i;:::-;8341:117;8482:62;8536:7;8527:6;8516:9;8512:22;8482:62;:::i;:::-;8472:72;;8268:286;8593:2;8619:53;8664:7;8655:6;8644:9;8640:22;8619:53;:::i;:::-;8609:63;;8564:118;8037:652;;;;;:::o;8695:529::-;8766:6;8774;8823:2;8811:9;8802:7;8798:23;8794:32;8791:119;;;8829:79;;:::i;:::-;8791:119;8977:1;8966:9;8962:17;8949:31;9007:18;8999:6;8996:30;8993:117;;;9029:79;;:::i;:::-;8993:117;9142:65;9199:7;9190:6;9179:9;9175:22;9142:65;:::i;:::-;9124:83;;;;8920:297;8695:529;;;;;:::o;9230:509::-;9299:6;9348:2;9336:9;9327:7;9323:23;9319:32;9316:119;;;9354:79;;:::i;:::-;9316:119;9502:1;9491:9;9487:17;9474:31;9532:18;9524:6;9521:30;9518:117;;;9554:79;;:::i;:::-;9518:117;9659:63;9714:7;9705:6;9694:9;9690:22;9659:63;:::i;:::-;9649:73;;9445:287;9230:509;;;;:::o;9745:329::-;9804:6;9853:2;9841:9;9832:7;9828:23;9824:32;9821:119;;;9859:79;;:::i;:::-;9821:119;9979:1;10004:53;10049:7;10040:6;10029:9;10025:22;10004:53;:::i;:::-;9994:63;;9950:117;9745:329;;;;:::o;10080:118::-;10167:24;10185:5;10167:24;:::i;:::-;10162:3;10155:37;10080:118;;:::o;10204:157::-;10309:45;10329:24;10347:5;10329:24;:::i;:::-;10309:45;:::i;:::-;10304:3;10297:58;10204:157;;:::o;10367:109::-;10448:21;10463:5;10448:21;:::i;:::-;10443:3;10436:34;10367:109;;:::o;10482:118::-;10569:24;10587:5;10569:24;:::i;:::-;10564:3;10557:37;10482:118;;:::o;10606:157::-;10711:45;10731:24;10749:5;10731:24;:::i;:::-;10711:45;:::i;:::-;10706:3;10699:58;10606:157;;:::o;10769:360::-;10855:3;10883:38;10915:5;10883:38;:::i;:::-;10937:70;11000:6;10995:3;10937:70;:::i;:::-;10930:77;;11016:52;11061:6;11056:3;11049:4;11042:5;11038:16;11016:52;:::i;:::-;11093:29;11115:6;11093:29;:::i;:::-;11088:3;11084:39;11077:46;;10859:270;10769:360;;;;:::o;11135:364::-;11223:3;11251:39;11284:5;11251:39;:::i;:::-;11306:71;11370:6;11365:3;11306:71;:::i;:::-;11299:78;;11386:52;11431:6;11426:3;11419:4;11412:5;11408:16;11386:52;:::i;:::-;11463:29;11485:6;11463:29;:::i;:::-;11458:3;11454:39;11447:46;;11227:272;11135:364;;;;:::o;11505:377::-;11611:3;11639:39;11672:5;11639:39;:::i;:::-;11694:89;11776:6;11771:3;11694:89;:::i;:::-;11687:96;;11792:52;11837:6;11832:3;11825:4;11818:5;11814:16;11792:52;:::i;:::-;11869:6;11864:3;11860:16;11853:23;;11615:267;11505:377;;;;:::o;11912:845::-;12015:3;12052:5;12046:12;12081:36;12107:9;12081:36;:::i;:::-;12133:89;12215:6;12210:3;12133:89;:::i;:::-;12126:96;;12253:1;12242:9;12238:17;12269:1;12264:137;;;;12415:1;12410:341;;;;12231:520;;12264:137;12348:4;12344:9;12333;12329:25;12324:3;12317:38;12384:6;12379:3;12375:16;12368:23;;12264:137;;12410:341;12477:38;12509:5;12477:38;:::i;:::-;12537:1;12551:154;12565:6;12562:1;12559:13;12551:154;;;12639:7;12633:14;12629:1;12624:3;12620:11;12613:35;12689:1;12680:7;12676:15;12665:26;;12587:4;12584:1;12580:12;12575:17;;12551:154;;;12734:6;12729:3;12725:16;12718:23;;12417:334;;12231:520;;12019:738;;11912:845;;;;:::o;12763:366::-;12905:3;12926:67;12990:2;12985:3;12926:67;:::i;:::-;12919:74;;13002:93;13091:3;13002:93;:::i;:::-;13120:2;13115:3;13111:12;13104:19;;12763:366;;;:::o;13135:::-;13277:3;13298:67;13362:2;13357:3;13298:67;:::i;:::-;13291:74;;13374:93;13463:3;13374:93;:::i;:::-;13492:2;13487:3;13483:12;13476:19;;13135:366;;;:::o;13507:::-;13649:3;13670:67;13734:2;13729:3;13670:67;:::i;:::-;13663:74;;13746:93;13835:3;13746:93;:::i;:::-;13864:2;13859:3;13855:12;13848:19;;13507:366;;;:::o;13879:::-;14021:3;14042:67;14106:2;14101:3;14042:67;:::i;:::-;14035:74;;14118:93;14207:3;14118:93;:::i;:::-;14236:2;14231:3;14227:12;14220:19;;13879:366;;;:::o;14251:402::-;14411:3;14432:85;14514:2;14509:3;14432:85;:::i;:::-;14425:92;;14526:93;14615:3;14526:93;:::i;:::-;14644:2;14639:3;14635:12;14628:19;;14251:402;;;:::o;14659:366::-;14801:3;14822:67;14886:2;14881:3;14822:67;:::i;:::-;14815:74;;14898:93;14987:3;14898:93;:::i;:::-;15016:2;15011:3;15007:12;15000:19;;14659:366;;;:::o;15031:::-;15173:3;15194:67;15258:2;15253:3;15194:67;:::i;:::-;15187:74;;15270:93;15359:3;15270:93;:::i;:::-;15388:2;15383:3;15379:12;15372:19;;15031:366;;;:::o;15403:::-;15545:3;15566:67;15630:2;15625:3;15566:67;:::i;:::-;15559:74;;15642:93;15731:3;15642:93;:::i;:::-;15760:2;15755:3;15751:12;15744:19;;15403:366;;;:::o;15775:::-;15917:3;15938:67;16002:2;15997:3;15938:67;:::i;:::-;15931:74;;16014:93;16103:3;16014:93;:::i;:::-;16132:2;16127:3;16123:12;16116:19;;15775:366;;;:::o;16147:::-;16289:3;16310:67;16374:2;16369:3;16310:67;:::i;:::-;16303:74;;16386:93;16475:3;16386:93;:::i;:::-;16504:2;16499:3;16495:12;16488:19;;16147:366;;;:::o;16519:::-;16661:3;16682:67;16746:2;16741:3;16682:67;:::i;:::-;16675:74;;16758:93;16847:3;16758:93;:::i;:::-;16876:2;16871:3;16867:12;16860:19;;16519:366;;;:::o;16891:::-;17033:3;17054:67;17118:2;17113:3;17054:67;:::i;:::-;17047:74;;17130:93;17219:3;17130:93;:::i;:::-;17248:2;17243:3;17239:12;17232:19;;16891:366;;;:::o;17263:::-;17405:3;17426:67;17490:2;17485:3;17426:67;:::i;:::-;17419:74;;17502:93;17591:3;17502:93;:::i;:::-;17620:2;17615:3;17611:12;17604:19;;17263:366;;;:::o;17635:::-;17777:3;17798:67;17862:2;17857:3;17798:67;:::i;:::-;17791:74;;17874:93;17963:3;17874:93;:::i;:::-;17992:2;17987:3;17983:12;17976:19;;17635:366;;;:::o;18007:::-;18149:3;18170:67;18234:2;18229:3;18170:67;:::i;:::-;18163:74;;18246:93;18335:3;18246:93;:::i;:::-;18364:2;18359:3;18355:12;18348:19;;18007:366;;;:::o;18379:::-;18521:3;18542:67;18606:2;18601:3;18542:67;:::i;:::-;18535:74;;18618:93;18707:3;18618:93;:::i;:::-;18736:2;18731:3;18727:12;18720:19;;18379:366;;;:::o;18751:::-;18893:3;18914:67;18978:2;18973:3;18914:67;:::i;:::-;18907:74;;18990:93;19079:3;18990:93;:::i;:::-;19108:2;19103:3;19099:12;19092:19;;18751:366;;;:::o;19123:::-;19265:3;19286:67;19350:2;19345:3;19286:67;:::i;:::-;19279:74;;19362:93;19451:3;19362:93;:::i;:::-;19480:2;19475:3;19471:12;19464:19;;19123:366;;;:::o;19495:::-;19637:3;19658:67;19722:2;19717:3;19658:67;:::i;:::-;19651:74;;19734:93;19823:3;19734:93;:::i;:::-;19852:2;19847:3;19843:12;19836:19;;19495:366;;;:::o;19867:::-;20009:3;20030:67;20094:2;20089:3;20030:67;:::i;:::-;20023:74;;20106:93;20195:3;20106:93;:::i;:::-;20224:2;20219:3;20215:12;20208:19;;19867:366;;;:::o;20239:::-;20381:3;20402:67;20466:2;20461:3;20402:67;:::i;:::-;20395:74;;20478:93;20567:3;20478:93;:::i;:::-;20596:2;20591:3;20587:12;20580:19;;20239:366;;;:::o;20611:::-;20753:3;20774:67;20838:2;20833:3;20774:67;:::i;:::-;20767:74;;20850:93;20939:3;20850:93;:::i;:::-;20968:2;20963:3;20959:12;20952:19;;20611:366;;;:::o;20983:::-;21125:3;21146:67;21210:2;21205:3;21146:67;:::i;:::-;21139:74;;21222:93;21311:3;21222:93;:::i;:::-;21340:2;21335:3;21331:12;21324:19;;20983:366;;;:::o;21355:::-;21497:3;21518:67;21582:2;21577:3;21518:67;:::i;:::-;21511:74;;21594:93;21683:3;21594:93;:::i;:::-;21712:2;21707:3;21703:12;21696:19;;21355:366;;;:::o;21727:::-;21869:3;21890:67;21954:2;21949:3;21890:67;:::i;:::-;21883:74;;21966:93;22055:3;21966:93;:::i;:::-;22084:2;22079:3;22075:12;22068:19;;21727:366;;;:::o;22099:::-;22241:3;22262:67;22326:2;22321:3;22262:67;:::i;:::-;22255:74;;22338:93;22427:3;22338:93;:::i;:::-;22456:2;22451:3;22447:12;22440:19;;22099:366;;;:::o;22471:::-;22613:3;22634:67;22698:2;22693:3;22634:67;:::i;:::-;22627:74;;22710:93;22799:3;22710:93;:::i;:::-;22828:2;22823:3;22819:12;22812:19;;22471:366;;;:::o;22843:::-;22985:3;23006:67;23070:2;23065:3;23006:67;:::i;:::-;22999:74;;23082:93;23171:3;23082:93;:::i;:::-;23200:2;23195:3;23191:12;23184:19;;22843:366;;;:::o;23215:::-;23357:3;23378:67;23442:2;23437:3;23378:67;:::i;:::-;23371:74;;23454:93;23543:3;23454:93;:::i;:::-;23572:2;23567:3;23563:12;23556:19;;23215:366;;;:::o;23587:::-;23729:3;23750:67;23814:2;23809:3;23750:67;:::i;:::-;23743:74;;23826:93;23915:3;23826:93;:::i;:::-;23944:2;23939:3;23935:12;23928:19;;23587:366;;;:::o;23959:::-;24101:3;24122:67;24186:2;24181:3;24122:67;:::i;:::-;24115:74;;24198:93;24287:3;24198:93;:::i;:::-;24316:2;24311:3;24307:12;24300:19;;23959:366;;;:::o;24331:::-;24473:3;24494:67;24558:2;24553:3;24494:67;:::i;:::-;24487:74;;24570:93;24659:3;24570:93;:::i;:::-;24688:2;24683:3;24679:12;24672:19;;24331:366;;;:::o;24703:::-;24845:3;24866:67;24930:2;24925:3;24866:67;:::i;:::-;24859:74;;24942:93;25031:3;24942:93;:::i;:::-;25060:2;25055:3;25051:12;25044:19;;24703:366;;;:::o;25075:398::-;25234:3;25255:83;25336:1;25331:3;25255:83;:::i;:::-;25248:90;;25347:93;25436:3;25347:93;:::i;:::-;25465:1;25460:3;25456:11;25449:18;;25075:398;;;:::o;25479:366::-;25621:3;25642:67;25706:2;25701:3;25642:67;:::i;:::-;25635:74;;25718:93;25807:3;25718:93;:::i;:::-;25836:2;25831:3;25827:12;25820:19;;25479:366;;;:::o;25851:::-;25993:3;26014:67;26078:2;26073:3;26014:67;:::i;:::-;26007:74;;26090:93;26179:3;26090:93;:::i;:::-;26208:2;26203:3;26199:12;26192:19;;25851:366;;;:::o;26223:::-;26365:3;26386:67;26450:2;26445:3;26386:67;:::i;:::-;26379:74;;26462:93;26551:3;26462:93;:::i;:::-;26580:2;26575:3;26571:12;26564:19;;26223:366;;;:::o;26595:::-;26737:3;26758:67;26822:2;26817:3;26758:67;:::i;:::-;26751:74;;26834:93;26923:3;26834:93;:::i;:::-;26952:2;26947:3;26943:12;26936:19;;26595:366;;;:::o;26967:118::-;27054:24;27072:5;27054:24;:::i;:::-;27049:3;27042:37;26967:118;;:::o;27091:112::-;27174:22;27190:5;27174:22;:::i;:::-;27169:3;27162:35;27091:112;;:::o;27209:256::-;27321:3;27336:75;27407:3;27398:6;27336:75;:::i;:::-;27436:2;27431:3;27427:12;27420:19;;27456:3;27449:10;;27209:256;;;;:::o;27471:429::-;27648:3;27670:92;27758:3;27749:6;27670:92;:::i;:::-;27663:99;;27779:95;27870:3;27861:6;27779:95;:::i;:::-;27772:102;;27891:3;27884:10;;27471:429;;;;;:::o;27906:522::-;28119:3;28141:148;28285:3;28141:148;:::i;:::-;28134:155;;28299:75;28370:3;28361:6;28299:75;:::i;:::-;28399:2;28394:3;28390:12;28383:19;;28419:3;28412:10;;27906:522;;;;:::o;28434:379::-;28618:3;28640:147;28783:3;28640:147;:::i;:::-;28633:154;;28804:3;28797:10;;28434:379;;;:::o;28819:222::-;28912:4;28950:2;28939:9;28935:18;28927:26;;28963:71;29031:1;29020:9;29016:17;29007:6;28963:71;:::i;:::-;28819:222;;;;:::o;29047:640::-;29242:4;29280:3;29269:9;29265:19;29257:27;;29294:71;29362:1;29351:9;29347:17;29338:6;29294:71;:::i;:::-;29375:72;29443:2;29432:9;29428:18;29419:6;29375:72;:::i;:::-;29457;29525:2;29514:9;29510:18;29501:6;29457:72;:::i;:::-;29576:9;29570:4;29566:20;29561:2;29550:9;29546:18;29539:48;29604:76;29675:4;29666:6;29604:76;:::i;:::-;29596:84;;29047:640;;;;;;;:::o;29693:210::-;29780:4;29818:2;29807:9;29803:18;29795:26;;29831:65;29893:1;29882:9;29878:17;29869:6;29831:65;:::i;:::-;29693:210;;;;:::o;29909:545::-;30082:4;30120:3;30109:9;30105:19;30097:27;;30134:71;30202:1;30191:9;30187:17;30178:6;30134:71;:::i;:::-;30215:68;30279:2;30268:9;30264:18;30255:6;30215:68;:::i;:::-;30293:72;30361:2;30350:9;30346:18;30337:6;30293:72;:::i;:::-;30375;30443:2;30432:9;30428:18;30419:6;30375:72;:::i;:::-;29909:545;;;;;;;:::o;30460:313::-;30573:4;30611:2;30600:9;30596:18;30588:26;;30660:9;30654:4;30650:20;30646:1;30635:9;30631:17;30624:47;30688:78;30761:4;30752:6;30688:78;:::i;:::-;30680:86;;30460:313;;;;:::o;30779:419::-;30945:4;30983:2;30972:9;30968:18;30960:26;;31032:9;31026:4;31022:20;31018:1;31007:9;31003:17;30996:47;31060:131;31186:4;31060:131;:::i;:::-;31052:139;;30779:419;;;:::o;31204:::-;31370:4;31408:2;31397:9;31393:18;31385:26;;31457:9;31451:4;31447:20;31443:1;31432:9;31428:17;31421:47;31485:131;31611:4;31485:131;:::i;:::-;31477:139;;31204:419;;;:::o;31629:::-;31795:4;31833:2;31822:9;31818:18;31810:26;;31882:9;31876:4;31872:20;31868:1;31857:9;31853:17;31846:47;31910:131;32036:4;31910:131;:::i;:::-;31902:139;;31629:419;;;:::o;32054:::-;32220:4;32258:2;32247:9;32243:18;32235:26;;32307:9;32301:4;32297:20;32293:1;32282:9;32278:17;32271:47;32335:131;32461:4;32335:131;:::i;:::-;32327:139;;32054:419;;;:::o;32479:::-;32645:4;32683:2;32672:9;32668:18;32660:26;;32732:9;32726:4;32722:20;32718:1;32707:9;32703:17;32696:47;32760:131;32886:4;32760:131;:::i;:::-;32752:139;;32479:419;;;:::o;32904:::-;33070:4;33108:2;33097:9;33093:18;33085:26;;33157:9;33151:4;33147:20;33143:1;33132:9;33128:17;33121:47;33185:131;33311:4;33185:131;:::i;:::-;33177:139;;32904:419;;;:::o;33329:::-;33495:4;33533:2;33522:9;33518:18;33510:26;;33582:9;33576:4;33572:20;33568:1;33557:9;33553:17;33546:47;33610:131;33736:4;33610:131;:::i;:::-;33602:139;;33329:419;;;:::o;33754:::-;33920:4;33958:2;33947:9;33943:18;33935:26;;34007:9;34001:4;33997:20;33993:1;33982:9;33978:17;33971:47;34035:131;34161:4;34035:131;:::i;:::-;34027:139;;33754:419;;;:::o;34179:::-;34345:4;34383:2;34372:9;34368:18;34360:26;;34432:9;34426:4;34422:20;34418:1;34407:9;34403:17;34396:47;34460:131;34586:4;34460:131;:::i;:::-;34452:139;;34179:419;;;:::o;34604:::-;34770:4;34808:2;34797:9;34793:18;34785:26;;34857:9;34851:4;34847:20;34843:1;34832:9;34828:17;34821:47;34885:131;35011:4;34885:131;:::i;:::-;34877:139;;34604:419;;;:::o;35029:::-;35195:4;35233:2;35222:9;35218:18;35210:26;;35282:9;35276:4;35272:20;35268:1;35257:9;35253:17;35246:47;35310:131;35436:4;35310:131;:::i;:::-;35302:139;;35029:419;;;:::o;35454:::-;35620:4;35658:2;35647:9;35643:18;35635:26;;35707:9;35701:4;35697:20;35693:1;35682:9;35678:17;35671:47;35735:131;35861:4;35735:131;:::i;:::-;35727:139;;35454:419;;;:::o;35879:::-;36045:4;36083:2;36072:9;36068:18;36060:26;;36132:9;36126:4;36122:20;36118:1;36107:9;36103:17;36096:47;36160:131;36286:4;36160:131;:::i;:::-;36152:139;;35879:419;;;:::o;36304:::-;36470:4;36508:2;36497:9;36493:18;36485:26;;36557:9;36551:4;36547:20;36543:1;36532:9;36528:17;36521:47;36585:131;36711:4;36585:131;:::i;:::-;36577:139;;36304:419;;;:::o;36729:::-;36895:4;36933:2;36922:9;36918:18;36910:26;;36982:9;36976:4;36972:20;36968:1;36957:9;36953:17;36946:47;37010:131;37136:4;37010:131;:::i;:::-;37002:139;;36729:419;;;:::o;37154:::-;37320:4;37358:2;37347:9;37343:18;37335:26;;37407:9;37401:4;37397:20;37393:1;37382:9;37378:17;37371:47;37435:131;37561:4;37435:131;:::i;:::-;37427:139;;37154:419;;;:::o;37579:::-;37745:4;37783:2;37772:9;37768:18;37760:26;;37832:9;37826:4;37822:20;37818:1;37807:9;37803:17;37796:47;37860:131;37986:4;37860:131;:::i;:::-;37852:139;;37579:419;;;:::o;38004:::-;38170:4;38208:2;38197:9;38193:18;38185:26;;38257:9;38251:4;38247:20;38243:1;38232:9;38228:17;38221:47;38285:131;38411:4;38285:131;:::i;:::-;38277:139;;38004:419;;;:::o;38429:::-;38595:4;38633:2;38622:9;38618:18;38610:26;;38682:9;38676:4;38672:20;38668:1;38657:9;38653:17;38646:47;38710:131;38836:4;38710:131;:::i;:::-;38702:139;;38429:419;;;:::o;38854:::-;39020:4;39058:2;39047:9;39043:18;39035:26;;39107:9;39101:4;39097:20;39093:1;39082:9;39078:17;39071:47;39135:131;39261:4;39135:131;:::i;:::-;39127:139;;38854:419;;;:::o;39279:::-;39445:4;39483:2;39472:9;39468:18;39460:26;;39532:9;39526:4;39522:20;39518:1;39507:9;39503:17;39496:47;39560:131;39686:4;39560:131;:::i;:::-;39552:139;;39279:419;;;:::o;39704:::-;39870:4;39908:2;39897:9;39893:18;39885:26;;39957:9;39951:4;39947:20;39943:1;39932:9;39928:17;39921:47;39985:131;40111:4;39985:131;:::i;:::-;39977:139;;39704:419;;;:::o;40129:::-;40295:4;40333:2;40322:9;40318:18;40310:26;;40382:9;40376:4;40372:20;40368:1;40357:9;40353:17;40346:47;40410:131;40536:4;40410:131;:::i;:::-;40402:139;;40129:419;;;:::o;40554:::-;40720:4;40758:2;40747:9;40743:18;40735:26;;40807:9;40801:4;40797:20;40793:1;40782:9;40778:17;40771:47;40835:131;40961:4;40835:131;:::i;:::-;40827:139;;40554:419;;;:::o;40979:::-;41145:4;41183:2;41172:9;41168:18;41160:26;;41232:9;41226:4;41222:20;41218:1;41207:9;41203:17;41196:47;41260:131;41386:4;41260:131;:::i;:::-;41252:139;;40979:419;;;:::o;41404:::-;41570:4;41608:2;41597:9;41593:18;41585:26;;41657:9;41651:4;41647:20;41643:1;41632:9;41628:17;41621:47;41685:131;41811:4;41685:131;:::i;:::-;41677:139;;41404:419;;;:::o;41829:::-;41995:4;42033:2;42022:9;42018:18;42010:26;;42082:9;42076:4;42072:20;42068:1;42057:9;42053:17;42046:47;42110:131;42236:4;42110:131;:::i;:::-;42102:139;;41829:419;;;:::o;42254:::-;42420:4;42458:2;42447:9;42443:18;42435:26;;42507:9;42501:4;42497:20;42493:1;42482:9;42478:17;42471:47;42535:131;42661:4;42535:131;:::i;:::-;42527:139;;42254:419;;;:::o;42679:::-;42845:4;42883:2;42872:9;42868:18;42860:26;;42932:9;42926:4;42922:20;42918:1;42907:9;42903:17;42896:47;42960:131;43086:4;42960:131;:::i;:::-;42952:139;;42679:419;;;:::o;43104:::-;43270:4;43308:2;43297:9;43293:18;43285:26;;43357:9;43351:4;43347:20;43343:1;43332:9;43328:17;43321:47;43385:131;43511:4;43385:131;:::i;:::-;43377:139;;43104:419;;;:::o;43529:::-;43695:4;43733:2;43722:9;43718:18;43710:26;;43782:9;43776:4;43772:20;43768:1;43757:9;43753:17;43746:47;43810:131;43936:4;43810:131;:::i;:::-;43802:139;;43529:419;;;:::o;43954:::-;44120:4;44158:2;44147:9;44143:18;44135:26;;44207:9;44201:4;44197:20;44193:1;44182:9;44178:17;44171:47;44235:131;44361:4;44235:131;:::i;:::-;44227:139;;43954:419;;;:::o;44379:::-;44545:4;44583:2;44572:9;44568:18;44560:26;;44632:9;44626:4;44622:20;44618:1;44607:9;44603:17;44596:47;44660:131;44786:4;44660:131;:::i;:::-;44652:139;;44379:419;;;:::o;44804:::-;44970:4;45008:2;44997:9;44993:18;44985:26;;45057:9;45051:4;45047:20;45043:1;45032:9;45028:17;45021:47;45085:131;45211:4;45085:131;:::i;:::-;45077:139;;44804:419;;;:::o;45229:::-;45395:4;45433:2;45422:9;45418:18;45410:26;;45482:9;45476:4;45472:20;45468:1;45457:9;45453:17;45446:47;45510:131;45636:4;45510:131;:::i;:::-;45502:139;;45229:419;;;:::o;45654:::-;45820:4;45858:2;45847:9;45843:18;45835:26;;45907:9;45901:4;45897:20;45893:1;45882:9;45878:17;45871:47;45935:131;46061:4;45935:131;:::i;:::-;45927:139;;45654:419;;;:::o;46079:222::-;46172:4;46210:2;46199:9;46195:18;46187:26;;46223:71;46291:1;46280:9;46276:17;46267:6;46223:71;:::i;:::-;46079:222;;;;:::o;46307:129::-;46341:6;46368:20;;:::i;:::-;46358:30;;46397:33;46425:4;46417:6;46397:33;:::i;:::-;46307:129;;;:::o;46442:75::-;46475:6;46508:2;46502:9;46492:19;;46442:75;:::o;46523:307::-;46584:4;46674:18;46666:6;46663:30;46660:56;;;46696:18;;:::i;:::-;46660:56;46734:29;46756:6;46734:29;:::i;:::-;46726:37;;46818:4;46812;46808:15;46800:23;;46523:307;;;:::o;46836:308::-;46898:4;46988:18;46980:6;46977:30;46974:56;;;47010:18;;:::i;:::-;46974:56;47048:29;47070:6;47048:29;:::i;:::-;47040:37;;47132:4;47126;47122:15;47114:23;;46836:308;;;:::o;47150:141::-;47199:4;47222:3;47214:11;;47245:3;47242:1;47235:14;47279:4;47276:1;47266:18;47258:26;;47150:141;;;:::o;47297:98::-;47348:6;47382:5;47376:12;47366:22;;47297:98;;;:::o;47401:99::-;47453:6;47487:5;47481:12;47471:22;;47401:99;;;:::o;47506:168::-;47589:11;47623:6;47618:3;47611:19;47663:4;47658:3;47654:14;47639:29;;47506:168;;;;:::o;47680:147::-;47781:11;47818:3;47803:18;;47680:147;;;;:::o;47833:169::-;47917:11;47951:6;47946:3;47939:19;47991:4;47986:3;47982:14;47967:29;;47833:169;;;;:::o;48008:148::-;48110:11;48147:3;48132:18;;48008:148;;;;:::o;48162:305::-;48202:3;48221:20;48239:1;48221:20;:::i;:::-;48216:25;;48255:20;48273:1;48255:20;:::i;:::-;48250:25;;48409:1;48341:66;48337:74;48334:1;48331:81;48328:107;;;48415:18;;:::i;:::-;48328:107;48459:1;48456;48452:9;48445:16;;48162:305;;;;:::o;48473:185::-;48513:1;48530:20;48548:1;48530:20;:::i;:::-;48525:25;;48564:20;48582:1;48564:20;:::i;:::-;48559:25;;48603:1;48593:35;;48608:18;;:::i;:::-;48593:35;48650:1;48647;48643:9;48638:14;;48473:185;;;;:::o;48664:348::-;48704:7;48727:20;48745:1;48727:20;:::i;:::-;48722:25;;48761:20;48779:1;48761:20;:::i;:::-;48756:25;;48949:1;48881:66;48877:74;48874:1;48871:81;48866:1;48859:9;48852:17;48848:105;48845:131;;;48956:18;;:::i;:::-;48845:131;49004:1;49001;48997:9;48986:20;;48664:348;;;;:::o;49018:191::-;49058:4;49078:20;49096:1;49078:20;:::i;:::-;49073:25;;49112:20;49130:1;49112:20;:::i;:::-;49107:25;;49151:1;49148;49145:8;49142:34;;;49156:18;;:::i;:::-;49142:34;49201:1;49198;49194:9;49186:17;;49018:191;;;;:::o;49215:96::-;49252:7;49281:24;49299:5;49281:24;:::i;:::-;49270:35;;49215:96;;;:::o;49317:90::-;49351:7;49394:5;49387:13;49380:21;49369:32;;49317:90;;;:::o;49413:77::-;49450:7;49479:5;49468:16;;49413:77;;;:::o;49496:149::-;49532:7;49572:66;49565:5;49561:78;49550:89;;49496:149;;;:::o;49651:126::-;49688:7;49728:42;49721:5;49717:54;49706:65;;49651:126;;;:::o;49783:77::-;49820:7;49849:5;49838:16;;49783:77;;;:::o;49866:86::-;49901:7;49941:4;49934:5;49930:16;49919:27;;49866:86;;;:::o;49958:154::-;50042:6;50037:3;50032;50019:30;50104:1;50095:6;50090:3;50086:16;50079:27;49958:154;;;:::o;50118:307::-;50186:1;50196:113;50210:6;50207:1;50204:13;50196:113;;;50295:1;50290:3;50286:11;50280:18;50276:1;50271:3;50267:11;50260:39;50232:2;50229:1;50225:10;50220:15;;50196:113;;;50327:6;50324:1;50321:13;50318:101;;;50407:1;50398:6;50393:3;50389:16;50382:27;50318:101;50167:258;50118:307;;;:::o;50431:320::-;50475:6;50512:1;50506:4;50502:12;50492:22;;50559:1;50553:4;50549:12;50580:18;50570:81;;50636:4;50628:6;50624:17;50614:27;;50570:81;50698:2;50690:6;50687:14;50667:18;50664:38;50661:84;;;50717:18;;:::i;:::-;50661:84;50482:269;50431:320;;;:::o;50757:281::-;50840:27;50862:4;50840:27;:::i;:::-;50832:6;50828:40;50970:6;50958:10;50955:22;50934:18;50922:10;50919:34;50916:62;50913:88;;;50981:18;;:::i;:::-;50913:88;51021:10;51017:2;51010:22;50800:238;50757:281;;:::o;51044:233::-;51083:3;51106:24;51124:5;51106:24;:::i;:::-;51097:33;;51152:66;51145:5;51142:77;51139:103;;;51222:18;;:::i;:::-;51139:103;51269:1;51262:5;51258:13;51251:20;;51044:233;;;:::o;51283:100::-;51322:7;51351:26;51371:5;51351:26;:::i;:::-;51340:37;;51283:100;;;:::o;51389:79::-;51428:7;51457:5;51446:16;;51389:79;;;:::o;51474:94::-;51513:7;51542:20;51556:5;51542:20;:::i;:::-;51531:31;;51474:94;;;:::o;51574:176::-;51606:1;51623:20;51641:1;51623:20;:::i;:::-;51618:25;;51657:20;51675:1;51657:20;:::i;:::-;51652:25;;51696:1;51686:35;;51701:18;;:::i;:::-;51686:35;51742:1;51739;51735:9;51730:14;;51574:176;;;;:::o;51756:180::-;51804:77;51801:1;51794:88;51901:4;51898:1;51891:15;51925:4;51922:1;51915:15;51942:180;51990:77;51987:1;51980:88;52087:4;52084:1;52077:15;52111:4;52108:1;52101:15;52128:180;52176:77;52173:1;52166:88;52273:4;52270:1;52263:15;52297:4;52294:1;52287:15;52314:180;52362:77;52359:1;52352:88;52459:4;52456:1;52449:15;52483:4;52480:1;52473:15;52500:180;52548:77;52545:1;52538:88;52645:4;52642:1;52635:15;52669:4;52666:1;52659:15;52686:180;52734:77;52731:1;52724:88;52831:4;52828:1;52821:15;52855:4;52852:1;52845:15;52872:180;52920:77;52917:1;52910:88;53017:4;53014:1;53007:15;53041:4;53038:1;53031:15;53058:117;53167:1;53164;53157:12;53181:117;53290:1;53287;53280:12;53304:117;53413:1;53410;53403:12;53427:117;53536:1;53533;53526:12;53550:117;53659:1;53656;53649:12;53673:117;53782:1;53779;53772:12;53796:102;53837:6;53888:2;53884:7;53879:2;53872:5;53868:14;53864:28;53854:38;;53796:102;;;:::o;53904:94::-;53937:8;53985:5;53981:2;53977:14;53956:35;;53904:94;;;:::o;54004:174::-;54144:26;54140:1;54132:6;54128:14;54121:50;54004:174;:::o;54184:172::-;54324:24;54320:1;54312:6;54308:14;54301:48;54184:172;:::o;54362:169::-;54502:21;54498:1;54490:6;54486:14;54479:45;54362:169;:::o;54537:181::-;54677:33;54673:1;54665:6;54661:14;54654:57;54537:181;:::o;54724:214::-;54864:66;54860:1;54852:6;54848:14;54841:90;54724:214;:::o;54944:167::-;55084:19;55080:1;55072:6;55068:14;55061:43;54944:167;:::o;55117:230::-;55257:34;55253:1;55245:6;55241:14;55234:58;55326:13;55321:2;55313:6;55309:15;55302:38;55117:230;:::o;55353:237::-;55493:34;55489:1;55481:6;55477:14;55470:58;55562:20;55557:2;55549:6;55545:15;55538:45;55353:237;:::o;55596:225::-;55736:34;55732:1;55724:6;55720:14;55713:58;55805:8;55800:2;55792:6;55788:15;55781:33;55596:225;:::o;55827:178::-;55967:30;55963:1;55955:6;55951:14;55944:54;55827:178;:::o;56011:160::-;56151:12;56147:1;56139:6;56135:14;56128:36;56011:160;:::o;56177:164::-;56317:16;56313:1;56305:6;56301:14;56294:40;56177:164;:::o;56347:223::-;56487:34;56483:1;56475:6;56471:14;56464:58;56556:6;56551:2;56543:6;56539:15;56532:31;56347:223;:::o;56576:175::-;56716:27;56712:1;56704:6;56700:14;56693:51;56576:175;:::o;56757:162::-;56897:14;56893:1;56885:6;56881:14;56874:38;56757:162;:::o;56925:221::-;57065:34;57061:1;57053:6;57049:14;57042:58;57134:4;57129:2;57121:6;57117:15;57110:29;56925:221;:::o;57152:161::-;57292:13;57288:1;57280:6;57276:14;57269:37;57152:161;:::o;57319:231::-;57459:34;57455:1;57447:6;57443:14;57436:58;57528:14;57523:2;57515:6;57511:15;57504:39;57319:231;:::o;57556:162::-;57696:14;57692:1;57684:6;57680:14;57673:38;57556:162;:::o;57724:163::-;57864:15;57860:1;57852:6;57848:14;57841:39;57724:163;:::o;57893:243::-;58033:34;58029:1;58021:6;58017:14;58010:58;58102:26;58097:2;58089:6;58085:15;58078:51;57893:243;:::o;58142:229::-;58282:34;58278:1;58270:6;58266:14;58259:58;58351:12;58346:2;58338:6;58334:15;58327:37;58142:229;:::o;58377:228::-;58517:34;58513:1;58505:6;58501:14;58494:58;58586:11;58581:2;58573:6;58569:15;58562:36;58377:228;:::o;58611:168::-;58751:20;58747:1;58739:6;58735:14;58728:44;58611:168;:::o;58785:221::-;58925:34;58921:1;58913:6;58909:14;58902:58;58994:4;58989:2;58981:6;58977:15;58970:29;58785:221;:::o;59012:182::-;59152:34;59148:1;59140:6;59136:14;59129:58;59012:182;:::o;59200:231::-;59340:34;59336:1;59328:6;59324:14;59317:58;59409:14;59404:2;59396:6;59392:15;59385:39;59200:231;:::o;59437:182::-;59577:34;59573:1;59565:6;59561:14;59554:58;59437:182;:::o;59625:228::-;59765:34;59761:1;59753:6;59749:14;59742:58;59834:11;59829:2;59821:6;59817:15;59810:36;59625:228;:::o;59859:168::-;59999:20;59995:1;59987:6;59983:14;59976:44;59859:168;:::o;60033:220::-;60173:34;60169:1;60161:6;60157:14;60150:58;60242:3;60237:2;60229:6;60225:15;60218:28;60033:220;:::o;60259:173::-;60399:25;60395:1;60387:6;60383:14;60376:49;60259:173;:::o;60438:167::-;60578:19;60574:1;60566:6;60562:14;60555:43;60438:167;:::o;60611:114::-;;:::o;60731:236::-;60871:34;60867:1;60859:6;60855:14;60848:58;60940:19;60935:2;60927:6;60923:15;60916:44;60731:236;:::o;60973:231::-;61113:34;61109:1;61101:6;61097:14;61090:58;61182:14;61177:2;61169:6;61165:15;61158:39;60973:231;:::o;61210:167::-;61350:19;61346:1;61338:6;61334:14;61327:43;61210:167;:::o;61383:166::-;61523:18;61519:1;61511:6;61507:14;61500:42;61383:166;:::o;61555:122::-;61628:24;61646:5;61628:24;:::i;:::-;61621:5;61618:35;61608:63;;61667:1;61664;61657:12;61608:63;61555:122;:::o;61683:116::-;61753:21;61768:5;61753:21;:::i;:::-;61746:5;61743:32;61733:60;;61789:1;61786;61779:12;61733:60;61683:116;:::o;61805:120::-;61877:23;61894:5;61877:23;:::i;:::-;61870:5;61867:34;61857:62;;61915:1;61912;61905:12;61857:62;61805:120;:::o;61931:122::-;62004:24;62022:5;62004:24;:::i;:::-;61997:5;61994:35;61984:63;;62043:1;62040;62033:12;61984:63;61931:122;:::o
Swarm Source
ipfs://e0ab97c1240726b45ea4995e4972c03cdc6e342427eba82b2c512f6f1b335c43
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.