Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,022 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Create Trade | 19142298 | 219 days ago | IN | 0 ETH | 0.00052208 | ||||
Create Trade | 19122238 | 221 days ago | IN | 0 ETH | 0.00048345 | ||||
Create Trade | 19122196 | 221 days ago | IN | 0 ETH | 0.00060281 | ||||
Create Trade | 19007717 | 237 days ago | IN | 0 ETH | 0.00050772 | ||||
Create Trade | 18911350 | 251 days ago | IN | 0 ETH | 0.00022735 | ||||
Create Trade | 18903607 | 252 days ago | IN | 0 ETH | 0.00029353 | ||||
Create Trade | 18903599 | 252 days ago | IN | 0 ETH | 0.00027115 | ||||
Add Coin | 18880625 | 255 days ago | IN | 0 ETH | 0.00241774 | ||||
Deauthorize NFT | 18880116 | 255 days ago | IN | 0 ETH | 0.00170135 | ||||
Deauthorize NFT | 18880106 | 255 days ago | IN | 0 ETH | 0.00165313 | ||||
Receive Approval | 18868001 | 257 days ago | IN | 0 ETH | 0.00437457 | ||||
Create Trade | 18867999 | 257 days ago | IN | 0 ETH | 0.00669793 | ||||
Receive Approval | 18867998 | 257 days ago | IN | 0 ETH | 0.00437039 | ||||
Create Trade | 18867995 | 257 days ago | IN | 0 ETH | 0.00669793 | ||||
Receive Approval | 18867993 | 257 days ago | IN | 0 ETH | 0.00455659 | ||||
Create Trade | 18867991 | 257 days ago | IN | 0 ETH | 0.00669793 | ||||
Receive Approval | 18867982 | 257 days ago | IN | 0 ETH | 0.00437039 | ||||
Create Trade | 18867980 | 257 days ago | IN | 0 ETH | 0.00669793 | ||||
Receive Approval | 18867979 | 257 days ago | IN | 0 ETH | 0.00437039 | ||||
Create Trade | 18867977 | 257 days ago | IN | 0 ETH | 0.00669793 | ||||
Receive Approval | 18867976 | 257 days ago | IN | 0 ETH | 0.00437039 | ||||
Create Trade | 18867974 | 257 days ago | IN | 0 ETH | 0.00669793 | ||||
Receive Approval | 18867973 | 257 days ago | IN | 0 ETH | 0.00437039 | ||||
Create Trade | 18867971 | 257 days ago | IN | 0 ETH | 0.00669793 | ||||
Receive Approval | 18867970 | 257 days ago | IN | 0 ETH | 0.00455659 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Market
Compiler Version
v0.8.2+commit.661d1103
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-07-01 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.2; interface IERC721 { function ownerOf(uint256 tokenId) external view returns (address owner); function safeTransferFrom(address from, address to, uint256 tokenId) external; function transferFrom(address from, address to, uint256 tokenId) external; function isApprovedForAll(address owner, address operator) external view returns (bool); } interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } interface FeesContract { function calcByToken(address _seller, address _token, uint256 _amount) external view returns (uint256 fee); function calcByEth(address _seller, uint256 _amount) external view returns (uint256 fee); } library EnumerableMap { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct MapEntry { bytes32 _key; bytes32 _value; } struct Map { // Storage of map keys and values MapEntry[] _entries; // Position of the entry defined by a key in the `entries` array, plus 1 // because index 0 means a key is not in the map. mapping (bytes32 => uint256) _indexes; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) { // Equivalent to !contains(map, key) map._entries.push(MapEntry({ _key: key, _value: value })); // The entry is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value map._indexes[key] = map._entries.length; return true; } else { map._entries[keyIndex - 1]._value = value; return false; } } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex != 0) { // Equivalent to contains(map, key) // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one // in the array, and then remove the last entry (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = keyIndex - 1; uint256 lastIndex = map._entries.length - 1; // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. MapEntry storage lastEntry = map._entries[lastIndex]; // Move the last entry to the index where the entry to delete is map._entries[toDeleteIndex] = lastEntry; // Update the index for the moved entry map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved entry was stored map._entries.pop(); // Delete the index for the deleted slot delete map._indexes[key]; return true; } else { return false; } } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._indexes[key] != 0; } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._entries.length; } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { require(map._entries.length > index, "EnumerableMap: index out of bounds"); MapEntry storage entry = map._entries[index]; return (entry._key, entry._value); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) { uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key) return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } // UintToB32Map struct UintToB32Map { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set(UintToB32Map storage map, uint256 key, bytes32 value) internal returns (bool) { return _set(map._inner, bytes32(key), value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToB32Map storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToB32Map storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToB32Map storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintToB32Map storage map, uint256 index) internal view returns (uint256, bytes32) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), value); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToB32Map storage map, uint256 key) internal view returns (bool, bytes32) { (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key)); return (success, value); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToB32Map storage map, uint256 key) internal view returns (bytes32) { return _get(map._inner, bytes32(key)); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get(UintToB32Map storage map, uint256 key, string memory errorMessage) internal view returns (bytes32) { return _get(map._inner, bytes32(key), errorMessage); } } library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } library Address { 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; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } 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"); } 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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } library SafeERC20 { using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } library ECDSA { /** * @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. * * 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] */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // 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) { // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } } else if (signature.length == 64) { // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { let vs := mload(add(signature, 0x40)) r := mload(add(signature, 0x20)) s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } } else { revert("ECDSA: invalid signature length"); } return recover(hash, v, r, s); } /** * @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) { // 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 (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): 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. require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value"); require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @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 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)); } } contract Market { using EnumerableSet for EnumerableSet.Bytes32Set ; using EnumerableMap for EnumerableMap.UintToB32Map; using SafeERC20 for IERC20; struct Coin { bool active; address tokenAddress; string symbol; string name; } mapping (uint256 => Coin) public tradeCoins; struct Trade { uint256 indexedBy; bool active; address nftAddress; address seller; address buyer; uint256 assetId; uint256 end; uint256 stime; uint256 price; uint256 coinIndex; } mapping (uint8 => address) public managers; mapping (bytes32 => bool) public executedTask; uint16 public taskIndex; mapping (address => bool) public authorizedERC721; mapping (uint256 => bytes32) public tradeIndex; mapping (bytes32 => Trade) public trades; mapping (bytes32 => bool) public tradingCheck; EnumerableMap.UintToB32Map private tradesMap; mapping (address => EnumerableSet.Bytes32Set) private userTrades; uint256 nextTrade; FeesContract feesContract; address payable walletAddress; modifier isManager() { require(managers[0] == msg.sender || managers[1] == msg.sender || managers[2] == msg.sender, "Not manager"); _; } constructor() { // include ETH as coin tradeCoins[1].tokenAddress = address(0x0); tradeCoins[1].symbol = "ETH"; tradeCoins[1].name = "Ethereum"; tradeCoins[1].active = true; // include POLC as coin tradeCoins[2].tokenAddress = 0xaA8330FB2B4D5D07ABFE7A72262752a8505C6B37; tradeCoins[2].symbol = "POLC"; tradeCoins[2].name = "Polka City Token"; tradeCoins[2].active = true; // POlka City NFT 3D authorizedERC721[0xB20217bf3d89667Fa15907971866acD6CcD570C8] = true; // POlka City NFT authorizedERC721[0x57E9a39aE8eC404C08f88740A9e6E306f50c937f] = true; walletAddress = payable(0xf7A9F6001ff8b499149569C54852226d719f2D76); managers[0] = msg.sender; managers[1] = 0xeA50CE6EBb1a5E4A8F90Bfb35A2fb3c3F0C673ec; managers[2] = 0xB1A951141F1b3A16824241f687C3741459E33225; feesContract = FeesContract(0xc10881fa05CE734336A153c72999eE91A287cC30); } function createTrade(address _nftAddress, uint256 _assetId, uint256 _price, uint256 _coinIndex, uint256 _end) public { require(authorizedERC721[_nftAddress] == true, "Unauthorized asset"); require(tradeCoins[_coinIndex].active == true, "Invalid payment coin"); require(_end == 0 || _end > block.timestamp, "Invalid end time"); bytes32 atCheck = keccak256(abi.encode(_nftAddress, _assetId, msg.sender)); require(tradingCheck[atCheck] == false, "This asset is already listed"); IERC721 nftContract = IERC721(_nftAddress); require(nftContract.ownerOf(_assetId) == msg.sender, "Only asset owner can sell"); require(nftContract.isApprovedForAll(msg.sender, address(this)), "Market needs operator approval"); insertTrade(_nftAddress, _assetId, _price, _coinIndex, _end, atCheck); } function insertTrade(address _nftAddress, uint256 _assetId, uint256 _price, uint256 _coinIndex, uint256 _end, bytes32 _atCheck) private { Trade memory trade = Trade(nextTrade, true, _nftAddress, msg.sender, address(0x0), _assetId, _end, block.timestamp, _price, _coinIndex); bytes32 tradeHash = keccak256(abi.encode(_nftAddress, _assetId, nextTrade)); tradeIndex[nextTrade] = tradeHash; trades[tradeHash] = trade; tradesMap.set(nextTrade, tradeHash); userTrades[msg.sender].add(tradeHash); tradingCheck[_atCheck] == true; nextTrade += 1; } function allTradesCount() public view returns (uint256) { return (nextTrade); } function tradesCount() public view returns (uint256) { return (tradesMap.length()); } function _getTrade(bytes32 _tradeId) private view returns (uint256 indexedBy, address nftToken, address seller, address buyer, uint256 assetId, uint256 end, uint256 sTime, uint256 price, uint256 coinIndex, bool active) { Trade memory _trade = trades[_tradeId]; return ( _trade.indexedBy, _trade.nftAddress, _trade.seller, _trade.buyer, _trade.assetId, _trade.end, _trade.stime, _trade.price, _trade.coinIndex, _trade.active ); } function getTrade(bytes32 _tradeId) public view returns (uint256 indexedBy, address nftToken, address seller, address buyer, uint256 assetId, uint256 end, uint256 sTime, uint256 price, uint256 coinIndex, bool active) { return _getTrade(_tradeId); } function getTradeByIndex(uint256 _index) public view returns (uint256 indexedBy, address nftToken, address seller, address buyer, uint256 assetId, uint256 end, uint256 sTime, uint256 price, uint256 coinIndex, bool active) { (, bytes32 tradeId) = tradesMap.at(_index); return _getTrade(tradeId); } function parseBytes(bytes memory data) private pure returns (bytes32){ bytes32 parsed; assembly {parsed := mload(add(data, 32))} return parsed; } function receiveApproval(address _from, uint256 _value, address _token, bytes memory _extraData) public returns (bool) { bytes32 _tradeId = parseBytes(_extraData); Trade memory trade = trades[_tradeId]; require(tradeCoins[trade.coinIndex].tokenAddress == _token, "Invalid coin"); require(trade.active == true, "Trade not available"); require(_value == trade.price, "Invalid price"); if (verifyTrade(_tradeId, trade.seller, trade.nftAddress, trade.assetId, trade.end)) { uint256 tradeFee = feesContract.calcByToken(trade.seller, tradeCoins[trade.coinIndex].tokenAddress , _value); executeTrade(_tradeId, _from, trade.seller, trade.nftAddress, trade.assetId); IERC20 erc20Token = IERC20(_token); if (tradeFee > 0) { erc20Token.safeTransferFrom(_from, walletAddress, (tradeFee)); erc20Token.safeTransferFrom(_from, trade.seller, (trade.price-tradeFee)); } else { erc20Token.safeTransferFrom(_from, trade.seller, (trade.price)); } transferAsset(_from, trade.seller, trade.nftAddress, trade.assetId); return (true); } else { return (false); } } function buyWithEth(bytes32 _tradeId) public payable returns (bool) { Trade memory trade = trades[_tradeId]; require(trade.coinIndex == 1, "Invalid coin"); require(trade.active == true, "Trade not available"); require(msg.value == trade.price, "Invalid price"); if (verifyTrade(_tradeId, trade.seller, trade.nftAddress, trade.assetId, trade.end)) { uint256 tradeFee = feesContract.calcByEth(trade.seller, msg.value); executeTrade(_tradeId, msg.sender, trade.seller, trade.nftAddress, trade.assetId); if (tradeFee > 0) { Address.sendValue(payable(walletAddress), tradeFee); Address.sendValue(payable(trade.seller),(msg.value-tradeFee)); } else { Address.sendValue(payable(trade.seller),(msg.value)); } transferAsset(msg.sender, trade.seller, trade.nftAddress, trade.assetId); return (true); } else { return (false); } } function executeTrade(bytes32 _tradeId, address _buyer, address _seller, address _contract, uint256 _assetId) private { trades[_tradeId].buyer = _buyer; trades[_tradeId].active = false; trades[_tradeId].stime = block.timestamp; userTrades[_seller].remove(_tradeId); tradesMap.remove(trades[_tradeId].indexedBy); tradingCheck[keccak256(abi.encode(_contract, _assetId, _seller))] = false; } function transferAsset(address _buyer, address _seller, address _contract, uint256 _assetId) private { IERC721 nftToken = IERC721(_contract); nftToken.safeTransferFrom(_seller, _buyer, _assetId); } function verifyTrade(bytes32 _tradeId, address _seller, address _contract, uint256 _assetId, uint256 _endTime) private returns (bool) { IERC721 nftToken = IERC721(_contract); address assetOwner = nftToken.ownerOf(_assetId); if (assetOwner != _seller || (_endTime > 0 && _endTime < block.timestamp)) { trades[_tradeId].active = false; userTrades[_seller].remove(_tradeId); tradesMap.remove(trades[_tradeId].indexedBy); return false; } else { return true; } } function cancelTrade(bytes32 _tradeId) public returns (bool) { Trade memory trade = trades[_tradeId]; require(trade.seller == msg.sender, "Only asset seller can cancel the trade"); trades[_tradeId].active = false; userTrades[trade.seller].remove(_tradeId); tradesMap.remove(trade.indexedBy); tradingCheck[keccak256(abi.encode(trade.nftAddress, trade.assetId, trade.seller))] = false; return true; } function adminCancelTrade(bytes32 _tradeId, bytes memory _sig) public isManager { uint8 mId = 1; bytes32 taskHash = keccak256(abi.encode(_tradeId, taskIndex, mId)); verifyApproval(taskHash, _sig); Trade memory trade = trades[_tradeId]; trades[_tradeId].active = false; userTrades[trade.seller].remove(_tradeId); tradesMap.remove(trade.indexedBy); tradingCheck[keccak256(abi.encode(trade.nftAddress, trade.assetId, trade.seller))] = false; } function tradesCountOf(address _from) public view returns (uint256) { return (userTrades[_from].length()); } function tradeOfByIndex(address _from, uint256 _index) public view returns (bytes32 _trade) { return (userTrades[_from].at(_index)); } function addCoin(uint256 _coinIndex, address _tokenAddress, string memory _tokenSymbol, string memory _tokenName, bool _active, bytes memory _sig) public isManager { uint8 mId = 2; bytes32 taskHash = keccak256(abi.encode(_coinIndex, _tokenAddress, _tokenSymbol, _tokenName, _active, taskIndex, mId)); verifyApproval(taskHash, _sig); tradeCoins[_coinIndex].tokenAddress = _tokenAddress; tradeCoins[_coinIndex].symbol = _tokenSymbol; tradeCoins[_coinIndex].name = _tokenName; tradeCoins[_coinIndex].active = _active; } function authorizeNFT(address _nftAddress, bytes memory _sig) public isManager { uint8 mId = 3; bytes32 taskHash = keccak256(abi.encode(_nftAddress, taskIndex, mId)); verifyApproval(taskHash, _sig); authorizedERC721[_nftAddress] = true; } function deauthorizeNFT(address _nftAddress, bytes memory _sig) public isManager { uint8 mId = 4; bytes32 taskHash = keccak256(abi.encode(_nftAddress, taskIndex, mId)); verifyApproval(taskHash, _sig); authorizedERC721[_nftAddress] = false; } function setFeesContract(address _contract, bytes memory _sig) public isManager { uint8 mId = 5; bytes32 taskHash = keccak256(abi.encode(_contract, taskIndex, mId)); verifyApproval(taskHash, _sig); feesContract = FeesContract(_contract); } function setWallet(address _wallet, bytes memory _sig) public isManager { uint8 mId = 6; bytes32 taskHash = keccak256(abi.encode(_wallet, taskIndex, mId)); verifyApproval(taskHash, _sig); walletAddress = payable(_wallet); } function verifyApproval(bytes32 _taskHash, bytes memory _sig) private { require(executedTask[_taskHash] == false, "Task already executed"); address mSigner = ECDSA.recover(ECDSA.toEthSignedMessageHash(_taskHash), _sig); require(mSigner == managers[0] || mSigner == managers[1] || mSigner == managers[2], "Invalid signature" ); require(mSigner != msg.sender, "Signature from different managers required"); executedTask[_taskHash] = true; taskIndex += 1; } function changeManager(address _manager, uint8 _index, bytes memory _sig) public isManager { require(_index >= 0 && _index <= 2, "Invalid index"); uint8 mId = 100; bytes32 taskHash = keccak256(abi.encode(_manager, taskIndex, mId)); verifyApproval(taskHash, _sig); managers[_index] = _manager; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"_coinIndex","type":"uint256"},{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"bool","name":"_active","type":"bool"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"addCoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_tradeId","type":"bytes32"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"adminCancelTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allTradesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nftAddress","type":"address"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"authorizeNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorizedERC721","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_tradeId","type":"bytes32"}],"name":"buyWithEth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_tradeId","type":"bytes32"}],"name":"cancelTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"},{"internalType":"uint8","name":"_index","type":"uint8"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"changeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nftAddress","type":"address"},{"internalType":"uint256","name":"_assetId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_coinIndex","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"}],"name":"createTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nftAddress","type":"address"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"deauthorizeNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"executedTask","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_tradeId","type":"bytes32"}],"name":"getTrade","outputs":[{"internalType":"uint256","name":"indexedBy","type":"uint256"},{"internalType":"address","name":"nftToken","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256","name":"assetId","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"uint256","name":"sTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"coinIndex","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getTradeByIndex","outputs":[{"internalType":"uint256","name":"indexedBy","type":"uint256"},{"internalType":"address","name":"nftToken","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256","name":"assetId","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"uint256","name":"sTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"coinIndex","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"managers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"receiveApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"setFeesContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"setWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"taskIndex","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tradeCoins","outputs":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tradeIndex","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tradeOfByIndex","outputs":[{"internalType":"bytes32","name":"_trade","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"trades","outputs":[{"internalType":"uint256","name":"indexedBy","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256","name":"assetId","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"uint256","name":"stime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"coinIndex","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"}],"name":"tradesCountOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"tradingCheck","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506000805160206200396e8339815191528054610100600160a81b031916905560408051808201909152600381526208aa8960eb1b6020828101918252600160009081529052905162000086917fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7e916200035e565b50604080518082019091526008815267457468657265756d60c01b60208083019182526001600090815290529051620000e1917fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7f916200035e565b506000805160206200396e833981519152805460ff191660011790556000805160206200394e833981519152805474aa8330fb2b4d5d07abfe7a72262752a8505c6b3700610100600160a81b0319909116179055604080518082019091526004815263504f4c4360e01b602082810191825260026000908152905290516200018b917fabbb5caa7dda850e60932de0934eb1f9d0f59695050f761dc64e443e5030a56a916200035e565b5060408051808201909152601081526f2837b635b09021b4ba3c902a37b5b2b760811b60208083019182526002600090815290529051620001ee917fabbb5caa7dda850e60932de0934eb1f9d0f59695050f761dc64e443e5030a56b916200035e565b506000805160206200394e833981519152805460ff1990811660019081179092557f0812b87dd7d6098823fe8cc503397e572029b181be6352969e2e5daa2d2438cc80548216831790557f65d6a2a2a4f259458add3defff696fc45b8af9b5687dde319ec147100bb06a8a805490911682179055600d80546001600160a01b031990811673f7a9f6001ff8b499149569c54852226d719f2d76179091556020919091527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4980548216331790557fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f8054821673ea50ce6ebb1a5e4a8f90bfb35a2fb3c3f0c673ec17905560026000527fd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f8054821673b1a951141f1b3a16824241f687c3741459e33225179055600c805490911673c10881fa05ce734336a153c72999ee91a287cc3017905562000441565b8280546200036c9062000404565b90600052602060002090601f016020900481019282620003905760008555620003db565b82601f10620003ab57805160ff1916838001178555620003db565b82800160010185558215620003db579182015b82811115620003db578251825591602001919060010190620003be565b50620003e9929150620003ed565b5090565b5b80821115620003e95760008155600101620003ee565b6002810460018216806200041957607f821691505b602082108114156200043b57634e487b7160e01b600052602260045260246000fd5b50919050565b6134fd80620004516000396000f3fe6080604052600436106101655760003560e01c806387b993d4116100d1578063a3b137991161008a578063ce886bbc11610064578063ce886bbc146105a2578063ec58d180146105c2578063f5e86893146105e2578063ff0f0a831461060257610165565b8063a3b1379914610506578063b76bb61014610526578063b84254d71461057457610165565b806387b993d4146104465780638e570bf7146104665780638f4ffcb11461047957806390b60b84146104995780639bf4e575146104b95780639ced4190146104d957610165565b806326e6c94e1161012357806326e6c94e1461037157806336ffbc77146103915780634236847a146103c15780635932c02c146103e15780637c5959a8146103f65780637cfb41b81461042657610165565b80621624201461016a57806302ea4d511461024557806311b7a5a21461028557806311cec8f0146102a45780631b9ab6851461031f5780632626b4461461034f575b600080fd5b34801561017657600080fd5b506101e76101853660046130c6565b6006602081905260009182526040909120805460018201546002830154600384015460048501546005860154968601546007870154600890970154959760ff8616976101009096046001600160a01b039081169795811696941694929390928a565b604080519a8b5298151560208b01526001600160a01b03978816988a0198909852948616606089015294909216608087015260a086015260c085015260e0840191909152610100830152610120820152610140015b60405180910390f35b34801561025157600080fd5b506102756102603660046130c6565b60076020526000908152604090205460ff1681565b604051901515815260200161023c565b34801561029157600080fd5b50600b545b60405190815260200161023c565b3480156102b057600080fd5b506102c46102bf3660046130c6565b610622565b604080519a8b526001600160a01b03998a1660208c0152978916978a0197909752969094166060880152608087019290925260a086015260c085015260e084015261010083019190915215156101208201526101400161023c565b34801561032b57600080fd5b5061027561033a3660046130c6565b60026020526000908152604090205460ff1681565b34801561035b57600080fd5b5061036f61036a366004612f26565b610667565b005b34801561037d57600080fd5b5061029661038c366004612eee565b610773565b34801561039d57600080fd5b506103b16103ac3660046130c6565b61079c565b60405161023c9493929190613286565b3480156103cd57600080fd5b5061036f6103dc366004612f26565b6108e3565b3480156103ed57600080fd5b506102966109e4565b34801561040257600080fd5b50610275610411366004612eee565b60046020526000908152604090205460ff1681565b34801561043257600080fd5b506102756104413660046130c6565b6109f5565b34801561045257600080fd5b5061036f610461366004612f26565b610b9b565b6102756104743660046130c6565b610c9e565b34801561048557600080fd5b50610275610494366004612f9f565b610f46565b3480156104a557600080fd5b506102966104b4366004612f74565b611258565b3480156104c557600080fd5b5061036f6104d4366004613125565b611283565b3480156104e557600080fd5b506102966104f43660046130c6565b60056020526000908152604090205481565b34801561051257600080fd5b506102c46105213660046130c6565b6113f5565b34801561053257600080fd5b5061055c6105413660046131d9565b6001602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161023c565b34801561058057600080fd5b5060035461058f9061ffff1681565b60405161ffff909116815260200161023c565b3480156105ae57600080fd5b5061036f6105bd3660046130de565b61142e565b3480156105ce57600080fd5b5061036f6105dd36600461304c565b611637565b3480156105ee57600080fd5b5061036f6105fd366004612f26565b61178c565b34801561060e57600080fd5b5061036f61061d366004613009565b61188c565b60008080808080808080808061063960088d611bd4565b91505061064581611bf0565b9a509a509a509a509a509a509a509a509a509a50509193959799509193959799565b600080526001602052600080516020613468833981519152546001600160a01b03163314806106b7575060016000819052602052600080516020613488833981519152546001600160a01b031633145b806106e35750600260005260016020526000805160206134a8833981519152546001600160a01b031633145b6107085760405162461bcd60e51b81526004016106ff906132d7565b60405180910390fd5b60035460405160059160009161072b91869161ffff90911690859060200161323b565b60405160208183030381529060405280519060200120905061074d8184611ca2565b5050600c80546001600160a01b0319166001600160a01b03939093169290921790915550565b6001600160a01b0381166000908152600a6020526040812061079490611ee1565b90505b919050565b6000602081905290815260409020805460018201805460ff8316936101009093046001600160a01b03169291906107d2906133e0565b80601f01602080910402602001604051908101604052809291908181526020018280546107fe906133e0565b801561084b5780601f106108205761010080835404028352916020019161084b565b820191906000526020600020905b81548152906001019060200180831161082e57829003601f168201915b505050505090806002018054610860906133e0565b80601f016020809104026020016040519081016040528092919081815260200182805461088c906133e0565b80156108d95780601f106108ae576101008083540402835291602001916108d9565b820191906000526020600020905b8154815290600101906020018083116108bc57829003601f168201915b5050505050905084565b600080526001602052600080516020613468833981519152546001600160a01b0316331480610933575060016000819052602052600080516020613488833981519152546001600160a01b031633145b8061095f5750600260005260016020526000805160206134a8833981519152546001600160a01b031633145b61097b5760405162461bcd60e51b81526004016106ff906132d7565b60035460405160049160009161099e91869161ffff90911690859060200161323b565b6040516020818303038152906040528051906020012090506109c08184611ca2565b5050506001600160a01b03166000908152600460205260409020805460ff19169055565b60006109f06008611ee1565b905090565b600081815260066020818152604080842081516101408101835281548152600182015460ff81161515948201949094526001600160a01b0361010094859004811693820193909352600282015483166060820181905260038301549093166080820152600482015460a0820152600582015460c08201529381015460e08501526007810154928401929092526008909101546101208301523314610aea5760405162461bcd60e51b815260206004820152602660248201527f4f6e6c792061737365742073656c6c65722063616e2063616e63656c2074686560448201526520747261646560d01b60648201526084016106ff565b6000838152600660209081526040808320600101805460ff1916905560608401516001600160a01b03168352600a9091529020610b279084611eeb565b508051610b3690600890611ef7565b5060006007600083604001518460a001518560600151604051602001610b5e93929190613263565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff191691151591909117905550600192915050565b600080526001602052600080516020613468833981519152546001600160a01b0316331480610beb575060016000819052602052600080516020613488833981519152546001600160a01b031633145b80610c175750600260005260016020526000805160206134a8833981519152546001600160a01b031633145b610c335760405162461bcd60e51b81526004016106ff906132d7565b600354604051600691600091610c5691869161ffff90911690859060200161323b565b604051602081830303815290604052805190602001209050610c788184611ca2565b5050600d80546001600160a01b0319166001600160a01b03939093169290921790915550565b60008181526006602081815260408084208151610140810183528154815260018083015460ff81161515958301959095526001600160a01b036101009586900481169483019490945260028301548416606083015260038301549093166080820152600482015460a0820152600582015460c08201529381015460e0850152600781015492840192909252600890910154610120830181905214610d735760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b21031b7b4b760a11b60448201526064016106ff565b60208101511515600114610dbf5760405162461bcd60e51b81526020600482015260136024820152725472616465206e6f7420617661696c61626c6560681b60448201526064016106ff565b8061010001513414610e035760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b60448201526064016106ff565b610e2083826060015183604001518460a001518560c00151611f03565b15610f3657600c5460608201516040516338cfe04560e01b81526001600160a01b03918216600482015234602482015260009291909116906338cfe0459060440160206040518083038186803b158015610e7957600080fd5b505afa158015610e8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb1919061310d565b9050610ecc8433846060015185604001518660a00151612025565b8015610f0557600d54610ee8906001600160a01b0316826120b7565b6060820151610f0090610efb833461339d565b6120b7565b610f13565b610f138260600151346120b7565b610f2b33836060015184604001518560a001516121d5565b600192505050610797565b6000915050610797565b50919050565b600080610f54836020015190565b600081815260066020818152604080842081516101408101835281548152600182015460ff8116151582860152610100908190046001600160a01b0390811683860152600284015481166060840152600384015481166080840152600484015460a0840152600584015460c08401529583015460e083015260078301548183015260089092015461012082018190528652928590529320549394509287821692900416146110335760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b21031b7b4b760a11b60448201526064016106ff565b6020810151151560011461107f5760405162461bcd60e51b81526020600482015260136024820152725472616465206e6f7420617661696c61626c6560681b60448201526064016106ff565b80610100015186146110c35760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b60448201526064016106ff565b6110e082826060015183604001518460a001518560c00151611f03565b1561124957600c54606082015161012083015160009081526020819052604080822054905163018edaa760e11b81526001600160a01b03938416600482015261010090910483166024820152604481018a90529092919091169063031db54e9060640160206040518083038186803b15801561115b57600080fd5b505afa15801561116f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611193919061310d565b90506111ae8389846060015185604001518660a00151612025565b85811561120257600d546111d1906001600160a01b03838116918c911685612249565b6111fd898460600151848661010001516111eb919061339d565b6001600160a01b038516929190612249565b611224565b6060830151610100840151611224916001600160a01b038416918c9190612249565b61123c89846060015185604001518660a001516121d5565b6001945050505050611250565b6000925050505b949350505050565b6001600160a01b0382166000908152600a6020526040812061127a90836122a9565b90505b92915050565b600080526001602052600080516020613468833981519152546001600160a01b03163314806112d3575060016000819052602052600080516020613488833981519152546001600160a01b031633145b806112ff5750600260005260016020526000805160206134a8833981519152546001600160a01b031633145b61131b5760405162461bcd60e51b81526004016106ff906132d7565b600354604051600291600091611346918a918a918a918a918a9161ffff9091169089906020016132fc565b6040516020818303038152906040528051906020012090506113688184611ca2565b6000888152602081815260409091208054610100600160a81b0319166101006001600160a01b038b160217815587516113a992600190920191890190612dbd565b5060008881526020818152604090912086516113cd92600290920191880190612dbd565b50505060009586525060208590526040909420805460ff191694151594909417909355505050565b60008060008060008060008060008061140d8b611bf0565b99509950995099509950995099509950995099509193959799509193959799565b600080526001602052600080516020613468833981519152546001600160a01b031633148061147e575060016000819052602052600080516020613488833981519152546001600160a01b031633145b806114aa5750600260005260016020526000805160206134a8833981519152546001600160a01b031633145b6114c65760405162461bcd60e51b81526004016106ff906132d7565b600354604080516020810185905261ffff90921690820152600160608201819052906000906080016040516020818303038152906040528051906020012090506115108184611ca2565b60008481526006602081815260408084208151610140810183528154815260018201805460ff81161515838701526101008082046001600160a01b03908116858801526002860154811660608601908152600387015482166080870152600487015460a0870152600587015460c0870152868a015460e08701526007870154928601929092526008909501546101208501528c895296865260ff191690559351168452600a9091529091206115c59086611eeb565b5080516115d490600890611ef7565b5060006007600083604001518460a0015185606001516040516020016115fc93929190613263565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff19169115159190911790555050505050565b600080526001602052600080516020613468833981519152546001600160a01b0316331480611687575060016000819052602052600080516020613488833981519152546001600160a01b031633145b806116b35750600260005260016020526000805160206134a8833981519152546001600160a01b031633145b6116cf5760405162461bcd60e51b81526004016106ff906132d7565b60028260ff1611156117135760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016106ff565b60035460405160649160009161173691879161ffff90911690859060200161323b565b6040516020818303038152906040528051906020012090506117588184611ca2565b50505060ff16600090815260016020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b600080526001602052600080516020613468833981519152546001600160a01b03163314806117dc575060016000819052602052600080516020613488833981519152546001600160a01b031633145b806118085750600260005260016020526000805160206134a8833981519152546001600160a01b031633145b6118245760405162461bcd60e51b81526004016106ff906132d7565b6003805460405160009161184391869161ffff1690859060200161323b565b6040516020818303038152906040528051906020012090506118658184611ca2565b5050506001600160a01b03166000908152600460205260409020805460ff19166001179055565b6001600160a01b03851660009081526004602052604090205460ff1615156001146118ee5760405162461bcd60e51b8152602060048201526012602482015271155b985d5d1a1bdc9a5e995908185cdcd95d60721b60448201526064016106ff565b60008281526020819052604090205460ff1615156001146119485760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b2103830bcb6b2b73a1031b7b4b760611b60448201526064016106ff565b80158061195457504281115b6119935760405162461bcd60e51b815260206004820152601060248201526f496e76616c696420656e642074696d6560801b60448201526064016106ff565b60008585336040516020016119aa93929190613263565b60408051601f1981840301815291815281516020928301206000818152600790935291205490915060ff1615611a225760405162461bcd60e51b815260206004820152601c60248201527f5468697320617373657420697320616c7265616479206c69737465640000000060448201526064016106ff565b6040516331a9108f60e11b815260048101869052869033906001600160a01b03831690636352211e9060240160206040518083038186803b158015611a6657600080fd5b505afa158015611a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9e9190612f0a565b6001600160a01b031614611af45760405162461bcd60e51b815260206004820152601960248201527f4f6e6c79206173736574206f776e65722063616e2073656c6c0000000000000060448201526064016106ff565b60405163e985e9c560e01b81523360048201523060248201526001600160a01b0382169063e985e9c59060440160206040518083038186803b158015611b3957600080fd5b505afa158015611b4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7191906130aa565b611bbd5760405162461bcd60e51b815260206004820152601e60248201527f4d61726b6574206e65656473206f70657261746f7220617070726f76616c000060448201526064016106ff565b611bcb8787878787876122b5565b50505050505050565b6000808080611be38686612477565b9097909650945050505050565b6000908152600660208181526040928390208351610140810185528154808252600183015460ff811615159483018590526001600160a01b036101009182900481169784018890526002850154811660608501819052600386015490911660808501819052600486015460a08601819052600587015460c087018190529887015460e0870181905260078801549487018590526008909701546101209096018690529399919790969395909490939091565b60008281526002602052604090205460ff1615611cf95760405162461bcd60e51b815260206004820152601560248201527415185cdac8185b1c9958591e48195e1958dd5d1959605a1b60448201526064016106ff565b6000611d5b611d55846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b83612522565b600080526001602052600080516020613468833981519152549091506001600160a01b0380831691161480611db4575060016000819052602052600080516020613488833981519152546001600160a01b038281169116145b80611de35750600260005260016020526000805160206134a8833981519152546001600160a01b038281169116145b611e235760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b60448201526064016106ff565b6001600160a01b038116331415611e8f5760405162461bcd60e51b815260206004820152602a60248201527f5369676e61747572652066726f6d20646966666572656e74206d616e616765726044820152691cc81c995c5d5a5c995960b21b60648201526084016106ff565b6000838152600260205260408120805460ff191660019081179091556003805491929091611ec290849061ffff1661335f565b92506101000a81548161ffff021916908361ffff160217905550505050565b6000610794825490565b600061127a83836125d8565b600061127a83836126f5565b6040516331a9108f60e11b815260048101839052600090849082906001600160a01b03831690636352211e9060240160206040518083038186803b158015611f4a57600080fd5b505afa158015611f5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f829190612f0a565b9050866001600160a01b0316816001600160a01b0316141580611faf5750600084118015611faf57504284105b15612015576000888152600660209081526040808320600101805460ff191690556001600160a01b038a168352600a9091529020611fed9089611eeb565b5060008881526006602052604090205461200990600890611ef7565b5060009250505061201c565b6001925050505b95945050505050565b60008581526006602081815260408084206003810180546001600160a01b0319166001600160a01b038b81169190911790915560018201805460ff191690554291909401559186168352600a9052902061207f9086611eeb565b5060008581526006602052604090205461209b90600890611ef7565b506000600760008484876040516020016115fc93929190613263565b804710156121075760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016106ff565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612154576040519150601f19603f3d011682016040523d82523d6000602084013e612159565b606091505b50509050806121d05760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016106ff565b505050565b604051632142170760e11b81526001600160a01b0384811660048301528581166024830152604482018390528391908216906342842e0e90606401600060405180830381600087803b15801561222a57600080fd5b505af115801561223e573d6000803e3d6000fd5b505050505050505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526122a3908590612826565b50505050565b600061127a83836128f8565b6040805161014081018252600b5480825260016020808401919091526001600160a01b038a168385015233606084015260006080840181905260a084018a905260c084018790524260e0850152610100840189905261012084018890529351929392612341928b928b92016001600160a01b039390931683526020830191909152604082015260600190565b60408051601f198184030181529181528151602092830120600b8054600090815260058086528482208490558382526006808752918590208851815595880151600187018054968a01516001600160a01b03908116610100908102610100600160a81b031994151560ff19909a16999099179390931697909717905560608901516002880180549188166001600160a01b031992831617905560808a01516003890180549190981691161790955560a0880151600487015560c08801519086015560e087015190850155918501516007840155610120850151600893840155905490925061243091908361298c565b50336000908152600a6020526040902061244a90826129a3565b5060008381526007602052600b805460019290612468908490613385565b90915550505050505050505050565b8154600090819083106124d75760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016106ff565b60008460000184815481106124fc57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008060008084516041141561254c5750505060208201516040830151606084015160001a6125c2565b84516040141561257a5750505060408201516020830151906001600160ff1b0381169060ff1c601b016125c2565b60405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106ff565b6125ce868285856129af565b9695505050505050565b600081815260018301602052604081205480156126eb5760006125fc60018361339d565b85549091506000906126109060019061339d565b9050600086600001828154811061263757634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061266857634e487b7160e01b600052603260045260246000fd5b60009182526020909120015561267f836001613385565b600082815260018901602052604090205586548790806126af57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061127d565b600091505061127d565b600081815260018301602052604081205480156126eb57600061271960018361339d565b855490915060009061272d9060019061339d565b9050600086600001828154811061275457634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020190508087600001848154811061278857634e487b7160e01b600052603260045260246000fd5b600091825260209091208254600290920201908155600191820154908201556127b2908490613385565b8154600090815260018901602052604090205586548790806127e457634e487b7160e01b600052603160045260246000fd5b600082815260208082206002600019909401938402018281556001908101839055929093558881528982019092526040822091909155945061127d9350505050565b600061287b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612b4f9092919063ffffffff16565b8051909150156121d0578080602001905181019061289991906130aa565b6121d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106ff565b815460009082106129565760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016106ff565b82600001828154811061297957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6000612999848484612b5e565b90505b9392505050565b600061127a8383612c0d565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115612a2c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106ff565b8360ff16601b1480612a4157508360ff16601c145b612a985760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016106ff565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015612aec573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661201c5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106ff565b60606129998484600085612c5c565b600082815260018401602052604081205480612bc357505060408051808201825283815260208082018481528654600181810189556000898152848120955160029093029095019182559151908201558654868452818801909252929091205561299c565b8285612bd060018461339d565b81548110612bee57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010181905550600091505061299c565b6000818152600183016020526040812054612c545750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561127d565b50600061127d565b606082471015612cbd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106ff565b843b612d0b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106ff565b600080866001600160a01b03168587604051612d27919061321f565b60006040518083038185875af1925050503d8060008114612d64576040519150601f19603f3d011682016040523d82523d6000602084013e612d69565b606091505b5091509150612d79828286612d84565b979650505050505050565b60608315612d9357508161299c565b825115612da35782518084602001fd5b8160405162461bcd60e51b81526004016106ff91906132c4565b828054612dc9906133e0565b90600052602060002090601f016020900481019282612deb5760008555612e31565b82601f10612e0457805160ff1916838001178555612e31565b82800160010185558215612e31579182015b82811115612e31578251825591602001919060010190612e16565b50612e3d929150612e41565b5090565b5b80821115612e3d5760008155600101612e42565b600082601f830112612e66578081fd5b813567ffffffffffffffff80821115612e8157612e8161342b565b604051601f8301601f19908116603f01168101908282118183101715612ea957612ea961342b565b81604052838152866020858801011115612ec1578485fd5b8360208701602083013792830160200193909352509392505050565b803560ff8116811461079757600080fd5b600060208284031215612eff578081fd5b813561299c81613441565b600060208284031215612f1b578081fd5b815161299c81613441565b60008060408385031215612f38578081fd5b8235612f4381613441565b9150602083013567ffffffffffffffff811115612f5e578182fd5b612f6a85828601612e56565b9150509250929050565b60008060408385031215612f86578182fd5b8235612f9181613441565b946020939093013593505050565b60008060008060808587031215612fb4578182fd5b8435612fbf81613441565b9350602085013592506040850135612fd681613441565b9150606085013567ffffffffffffffff811115612ff1578182fd5b612ffd87828801612e56565b91505092959194509250565b600080600080600060a08688031215613020578081fd5b853561302b81613441565b97602087013597506040870135966060810135965060800135945092505050565b600080600060608486031215613060578283fd5b833561306b81613441565b925061307960208501612edd565b9150604084013567ffffffffffffffff811115613094578182fd5b6130a086828701612e56565b9150509250925092565b6000602082840312156130bb578081fd5b815161299c81613459565b6000602082840312156130d7578081fd5b5035919050565b600080604083850312156130f0578182fd5b82359150602083013567ffffffffffffffff811115612f5e578182fd5b60006020828403121561311e578081fd5b5051919050565b60008060008060008060c0878903121561313d578384fd5b86359550602087013561314f81613441565b9450604087013567ffffffffffffffff8082111561316b578586fd5b6131778a838b01612e56565b9550606089013591508082111561318c578283fd5b6131988a838b01612e56565b9450608089013591506131aa82613459565b90925060a088013590808211156131bf578283fd5b506131cc89828a01612e56565b9150509295509295509295565b6000602082840312156131ea578081fd5b61127a82612edd565b6000815180845261320b8160208601602086016133b4565b601f01601f19169290920160200192915050565b600082516132318184602087016133b4565b9190910192915050565b6001600160a01b0393909316835261ffff91909116602083015260ff16604082015260600190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b84151581526001600160a01b03841660208201526080604082018190526000906132b2908301856131f3565b8281036060840152612d7981856131f3565b60006020825261127a60208301846131f3565b6020808252600b908201526a2737ba1036b0b730b3b2b960a91b604082015260600190565b8781526001600160a01b038716602082015260e060408201819052600090613326908301886131f3565b828103606084015261333881886131f3565b9515156080840152505061ffff9290921660a083015260ff1660c090910152949350505050565b600061ffff80831681851680830382111561337c5761337c613415565b01949350505050565b6000821982111561339857613398613415565b500190565b6000828210156133af576133af613415565b500390565b60005b838110156133cf5781810151838201526020016133b7565b838111156122a35750506000910152565b6002810460018216806133f457607f821691505b60208210811415610f4057634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461345657600080fd5b50565b801515811461345657600080fdfea6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49cc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792fd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330fa26469706673582212204c5fe76ad0d6129eee67c7087d424086077e067b6b48fb394f01293613d8023a64736f6c63430008020033abbb5caa7dda850e60932de0934eb1f9d0f59695050f761dc64e443e5030a569ada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d
Deployed Bytecode
0x6080604052600436106101655760003560e01c806387b993d4116100d1578063a3b137991161008a578063ce886bbc11610064578063ce886bbc146105a2578063ec58d180146105c2578063f5e86893146105e2578063ff0f0a831461060257610165565b8063a3b1379914610506578063b76bb61014610526578063b84254d71461057457610165565b806387b993d4146104465780638e570bf7146104665780638f4ffcb11461047957806390b60b84146104995780639bf4e575146104b95780639ced4190146104d957610165565b806326e6c94e1161012357806326e6c94e1461037157806336ffbc77146103915780634236847a146103c15780635932c02c146103e15780637c5959a8146103f65780637cfb41b81461042657610165565b80621624201461016a57806302ea4d511461024557806311b7a5a21461028557806311cec8f0146102a45780631b9ab6851461031f5780632626b4461461034f575b600080fd5b34801561017657600080fd5b506101e76101853660046130c6565b6006602081905260009182526040909120805460018201546002830154600384015460048501546005860154968601546007870154600890970154959760ff8616976101009096046001600160a01b039081169795811696941694929390928a565b604080519a8b5298151560208b01526001600160a01b03978816988a0198909852948616606089015294909216608087015260a086015260c085015260e0840191909152610100830152610120820152610140015b60405180910390f35b34801561025157600080fd5b506102756102603660046130c6565b60076020526000908152604090205460ff1681565b604051901515815260200161023c565b34801561029157600080fd5b50600b545b60405190815260200161023c565b3480156102b057600080fd5b506102c46102bf3660046130c6565b610622565b604080519a8b526001600160a01b03998a1660208c0152978916978a0197909752969094166060880152608087019290925260a086015260c085015260e084015261010083019190915215156101208201526101400161023c565b34801561032b57600080fd5b5061027561033a3660046130c6565b60026020526000908152604090205460ff1681565b34801561035b57600080fd5b5061036f61036a366004612f26565b610667565b005b34801561037d57600080fd5b5061029661038c366004612eee565b610773565b34801561039d57600080fd5b506103b16103ac3660046130c6565b61079c565b60405161023c9493929190613286565b3480156103cd57600080fd5b5061036f6103dc366004612f26565b6108e3565b3480156103ed57600080fd5b506102966109e4565b34801561040257600080fd5b50610275610411366004612eee565b60046020526000908152604090205460ff1681565b34801561043257600080fd5b506102756104413660046130c6565b6109f5565b34801561045257600080fd5b5061036f610461366004612f26565b610b9b565b6102756104743660046130c6565b610c9e565b34801561048557600080fd5b50610275610494366004612f9f565b610f46565b3480156104a557600080fd5b506102966104b4366004612f74565b611258565b3480156104c557600080fd5b5061036f6104d4366004613125565b611283565b3480156104e557600080fd5b506102966104f43660046130c6565b60056020526000908152604090205481565b34801561051257600080fd5b506102c46105213660046130c6565b6113f5565b34801561053257600080fd5b5061055c6105413660046131d9565b6001602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161023c565b34801561058057600080fd5b5060035461058f9061ffff1681565b60405161ffff909116815260200161023c565b3480156105ae57600080fd5b5061036f6105bd3660046130de565b61142e565b3480156105ce57600080fd5b5061036f6105dd36600461304c565b611637565b3480156105ee57600080fd5b5061036f6105fd366004612f26565b61178c565b34801561060e57600080fd5b5061036f61061d366004613009565b61188c565b60008080808080808080808061063960088d611bd4565b91505061064581611bf0565b9a509a509a509a509a509a509a509a509a509a50509193959799509193959799565b600080526001602052600080516020613468833981519152546001600160a01b03163314806106b7575060016000819052602052600080516020613488833981519152546001600160a01b031633145b806106e35750600260005260016020526000805160206134a8833981519152546001600160a01b031633145b6107085760405162461bcd60e51b81526004016106ff906132d7565b60405180910390fd5b60035460405160059160009161072b91869161ffff90911690859060200161323b565b60405160208183030381529060405280519060200120905061074d8184611ca2565b5050600c80546001600160a01b0319166001600160a01b03939093169290921790915550565b6001600160a01b0381166000908152600a6020526040812061079490611ee1565b90505b919050565b6000602081905290815260409020805460018201805460ff8316936101009093046001600160a01b03169291906107d2906133e0565b80601f01602080910402602001604051908101604052809291908181526020018280546107fe906133e0565b801561084b5780601f106108205761010080835404028352916020019161084b565b820191906000526020600020905b81548152906001019060200180831161082e57829003601f168201915b505050505090806002018054610860906133e0565b80601f016020809104026020016040519081016040528092919081815260200182805461088c906133e0565b80156108d95780601f106108ae576101008083540402835291602001916108d9565b820191906000526020600020905b8154815290600101906020018083116108bc57829003601f168201915b5050505050905084565b600080526001602052600080516020613468833981519152546001600160a01b0316331480610933575060016000819052602052600080516020613488833981519152546001600160a01b031633145b8061095f5750600260005260016020526000805160206134a8833981519152546001600160a01b031633145b61097b5760405162461bcd60e51b81526004016106ff906132d7565b60035460405160049160009161099e91869161ffff90911690859060200161323b565b6040516020818303038152906040528051906020012090506109c08184611ca2565b5050506001600160a01b03166000908152600460205260409020805460ff19169055565b60006109f06008611ee1565b905090565b600081815260066020818152604080842081516101408101835281548152600182015460ff81161515948201949094526001600160a01b0361010094859004811693820193909352600282015483166060820181905260038301549093166080820152600482015460a0820152600582015460c08201529381015460e08501526007810154928401929092526008909101546101208301523314610aea5760405162461bcd60e51b815260206004820152602660248201527f4f6e6c792061737365742073656c6c65722063616e2063616e63656c2074686560448201526520747261646560d01b60648201526084016106ff565b6000838152600660209081526040808320600101805460ff1916905560608401516001600160a01b03168352600a9091529020610b279084611eeb565b508051610b3690600890611ef7565b5060006007600083604001518460a001518560600151604051602001610b5e93929190613263565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff191691151591909117905550600192915050565b600080526001602052600080516020613468833981519152546001600160a01b0316331480610beb575060016000819052602052600080516020613488833981519152546001600160a01b031633145b80610c175750600260005260016020526000805160206134a8833981519152546001600160a01b031633145b610c335760405162461bcd60e51b81526004016106ff906132d7565b600354604051600691600091610c5691869161ffff90911690859060200161323b565b604051602081830303815290604052805190602001209050610c788184611ca2565b5050600d80546001600160a01b0319166001600160a01b03939093169290921790915550565b60008181526006602081815260408084208151610140810183528154815260018083015460ff81161515958301959095526001600160a01b036101009586900481169483019490945260028301548416606083015260038301549093166080820152600482015460a0820152600582015460c08201529381015460e0850152600781015492840192909252600890910154610120830181905214610d735760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b21031b7b4b760a11b60448201526064016106ff565b60208101511515600114610dbf5760405162461bcd60e51b81526020600482015260136024820152725472616465206e6f7420617661696c61626c6560681b60448201526064016106ff565b8061010001513414610e035760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b60448201526064016106ff565b610e2083826060015183604001518460a001518560c00151611f03565b15610f3657600c5460608201516040516338cfe04560e01b81526001600160a01b03918216600482015234602482015260009291909116906338cfe0459060440160206040518083038186803b158015610e7957600080fd5b505afa158015610e8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb1919061310d565b9050610ecc8433846060015185604001518660a00151612025565b8015610f0557600d54610ee8906001600160a01b0316826120b7565b6060820151610f0090610efb833461339d565b6120b7565b610f13565b610f138260600151346120b7565b610f2b33836060015184604001518560a001516121d5565b600192505050610797565b6000915050610797565b50919050565b600080610f54836020015190565b600081815260066020818152604080842081516101408101835281548152600182015460ff8116151582860152610100908190046001600160a01b0390811683860152600284015481166060840152600384015481166080840152600484015460a0840152600584015460c08401529583015460e083015260078301548183015260089092015461012082018190528652928590529320549394509287821692900416146110335760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b21031b7b4b760a11b60448201526064016106ff565b6020810151151560011461107f5760405162461bcd60e51b81526020600482015260136024820152725472616465206e6f7420617661696c61626c6560681b60448201526064016106ff565b80610100015186146110c35760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b60448201526064016106ff565b6110e082826060015183604001518460a001518560c00151611f03565b1561124957600c54606082015161012083015160009081526020819052604080822054905163018edaa760e11b81526001600160a01b03938416600482015261010090910483166024820152604481018a90529092919091169063031db54e9060640160206040518083038186803b15801561115b57600080fd5b505afa15801561116f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611193919061310d565b90506111ae8389846060015185604001518660a00151612025565b85811561120257600d546111d1906001600160a01b03838116918c911685612249565b6111fd898460600151848661010001516111eb919061339d565b6001600160a01b038516929190612249565b611224565b6060830151610100840151611224916001600160a01b038416918c9190612249565b61123c89846060015185604001518660a001516121d5565b6001945050505050611250565b6000925050505b949350505050565b6001600160a01b0382166000908152600a6020526040812061127a90836122a9565b90505b92915050565b600080526001602052600080516020613468833981519152546001600160a01b03163314806112d3575060016000819052602052600080516020613488833981519152546001600160a01b031633145b806112ff5750600260005260016020526000805160206134a8833981519152546001600160a01b031633145b61131b5760405162461bcd60e51b81526004016106ff906132d7565b600354604051600291600091611346918a918a918a918a918a9161ffff9091169089906020016132fc565b6040516020818303038152906040528051906020012090506113688184611ca2565b6000888152602081815260409091208054610100600160a81b0319166101006001600160a01b038b160217815587516113a992600190920191890190612dbd565b5060008881526020818152604090912086516113cd92600290920191880190612dbd565b50505060009586525060208590526040909420805460ff191694151594909417909355505050565b60008060008060008060008060008061140d8b611bf0565b99509950995099509950995099509950995099509193959799509193959799565b600080526001602052600080516020613468833981519152546001600160a01b031633148061147e575060016000819052602052600080516020613488833981519152546001600160a01b031633145b806114aa5750600260005260016020526000805160206134a8833981519152546001600160a01b031633145b6114c65760405162461bcd60e51b81526004016106ff906132d7565b600354604080516020810185905261ffff90921690820152600160608201819052906000906080016040516020818303038152906040528051906020012090506115108184611ca2565b60008481526006602081815260408084208151610140810183528154815260018201805460ff81161515838701526101008082046001600160a01b03908116858801526002860154811660608601908152600387015482166080870152600487015460a0870152600587015460c0870152868a015460e08701526007870154928601929092526008909501546101208501528c895296865260ff191690559351168452600a9091529091206115c59086611eeb565b5080516115d490600890611ef7565b5060006007600083604001518460a0015185606001516040516020016115fc93929190613263565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff19169115159190911790555050505050565b600080526001602052600080516020613468833981519152546001600160a01b0316331480611687575060016000819052602052600080516020613488833981519152546001600160a01b031633145b806116b35750600260005260016020526000805160206134a8833981519152546001600160a01b031633145b6116cf5760405162461bcd60e51b81526004016106ff906132d7565b60028260ff1611156117135760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016106ff565b60035460405160649160009161173691879161ffff90911690859060200161323b565b6040516020818303038152906040528051906020012090506117588184611ca2565b50505060ff16600090815260016020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b600080526001602052600080516020613468833981519152546001600160a01b03163314806117dc575060016000819052602052600080516020613488833981519152546001600160a01b031633145b806118085750600260005260016020526000805160206134a8833981519152546001600160a01b031633145b6118245760405162461bcd60e51b81526004016106ff906132d7565b6003805460405160009161184391869161ffff1690859060200161323b565b6040516020818303038152906040528051906020012090506118658184611ca2565b5050506001600160a01b03166000908152600460205260409020805460ff19166001179055565b6001600160a01b03851660009081526004602052604090205460ff1615156001146118ee5760405162461bcd60e51b8152602060048201526012602482015271155b985d5d1a1bdc9a5e995908185cdcd95d60721b60448201526064016106ff565b60008281526020819052604090205460ff1615156001146119485760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b2103830bcb6b2b73a1031b7b4b760611b60448201526064016106ff565b80158061195457504281115b6119935760405162461bcd60e51b815260206004820152601060248201526f496e76616c696420656e642074696d6560801b60448201526064016106ff565b60008585336040516020016119aa93929190613263565b60408051601f1981840301815291815281516020928301206000818152600790935291205490915060ff1615611a225760405162461bcd60e51b815260206004820152601c60248201527f5468697320617373657420697320616c7265616479206c69737465640000000060448201526064016106ff565b6040516331a9108f60e11b815260048101869052869033906001600160a01b03831690636352211e9060240160206040518083038186803b158015611a6657600080fd5b505afa158015611a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9e9190612f0a565b6001600160a01b031614611af45760405162461bcd60e51b815260206004820152601960248201527f4f6e6c79206173736574206f776e65722063616e2073656c6c0000000000000060448201526064016106ff565b60405163e985e9c560e01b81523360048201523060248201526001600160a01b0382169063e985e9c59060440160206040518083038186803b158015611b3957600080fd5b505afa158015611b4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7191906130aa565b611bbd5760405162461bcd60e51b815260206004820152601e60248201527f4d61726b6574206e65656473206f70657261746f7220617070726f76616c000060448201526064016106ff565b611bcb8787878787876122b5565b50505050505050565b6000808080611be38686612477565b9097909650945050505050565b6000908152600660208181526040928390208351610140810185528154808252600183015460ff811615159483018590526001600160a01b036101009182900481169784018890526002850154811660608501819052600386015490911660808501819052600486015460a08601819052600587015460c087018190529887015460e0870181905260078801549487018590526008909701546101209096018690529399919790969395909490939091565b60008281526002602052604090205460ff1615611cf95760405162461bcd60e51b815260206004820152601560248201527415185cdac8185b1c9958591e48195e1958dd5d1959605a1b60448201526064016106ff565b6000611d5b611d55846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b83612522565b600080526001602052600080516020613468833981519152549091506001600160a01b0380831691161480611db4575060016000819052602052600080516020613488833981519152546001600160a01b038281169116145b80611de35750600260005260016020526000805160206134a8833981519152546001600160a01b038281169116145b611e235760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b60448201526064016106ff565b6001600160a01b038116331415611e8f5760405162461bcd60e51b815260206004820152602a60248201527f5369676e61747572652066726f6d20646966666572656e74206d616e616765726044820152691cc81c995c5d5a5c995960b21b60648201526084016106ff565b6000838152600260205260408120805460ff191660019081179091556003805491929091611ec290849061ffff1661335f565b92506101000a81548161ffff021916908361ffff160217905550505050565b6000610794825490565b600061127a83836125d8565b600061127a83836126f5565b6040516331a9108f60e11b815260048101839052600090849082906001600160a01b03831690636352211e9060240160206040518083038186803b158015611f4a57600080fd5b505afa158015611f5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f829190612f0a565b9050866001600160a01b0316816001600160a01b0316141580611faf5750600084118015611faf57504284105b15612015576000888152600660209081526040808320600101805460ff191690556001600160a01b038a168352600a9091529020611fed9089611eeb565b5060008881526006602052604090205461200990600890611ef7565b5060009250505061201c565b6001925050505b95945050505050565b60008581526006602081815260408084206003810180546001600160a01b0319166001600160a01b038b81169190911790915560018201805460ff191690554291909401559186168352600a9052902061207f9086611eeb565b5060008581526006602052604090205461209b90600890611ef7565b506000600760008484876040516020016115fc93929190613263565b804710156121075760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016106ff565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612154576040519150601f19603f3d011682016040523d82523d6000602084013e612159565b606091505b50509050806121d05760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016106ff565b505050565b604051632142170760e11b81526001600160a01b0384811660048301528581166024830152604482018390528391908216906342842e0e90606401600060405180830381600087803b15801561222a57600080fd5b505af115801561223e573d6000803e3d6000fd5b505050505050505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526122a3908590612826565b50505050565b600061127a83836128f8565b6040805161014081018252600b5480825260016020808401919091526001600160a01b038a168385015233606084015260006080840181905260a084018a905260c084018790524260e0850152610100840189905261012084018890529351929392612341928b928b92016001600160a01b039390931683526020830191909152604082015260600190565b60408051601f198184030181529181528151602092830120600b8054600090815260058086528482208490558382526006808752918590208851815595880151600187018054968a01516001600160a01b03908116610100908102610100600160a81b031994151560ff19909a16999099179390931697909717905560608901516002880180549188166001600160a01b031992831617905560808a01516003890180549190981691161790955560a0880151600487015560c08801519086015560e087015190850155918501516007840155610120850151600893840155905490925061243091908361298c565b50336000908152600a6020526040902061244a90826129a3565b5060008381526007602052600b805460019290612468908490613385565b90915550505050505050505050565b8154600090819083106124d75760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016106ff565b60008460000184815481106124fc57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008060008084516041141561254c5750505060208201516040830151606084015160001a6125c2565b84516040141561257a5750505060408201516020830151906001600160ff1b0381169060ff1c601b016125c2565b60405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106ff565b6125ce868285856129af565b9695505050505050565b600081815260018301602052604081205480156126eb5760006125fc60018361339d565b85549091506000906126109060019061339d565b9050600086600001828154811061263757634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061266857634e487b7160e01b600052603260045260246000fd5b60009182526020909120015561267f836001613385565b600082815260018901602052604090205586548790806126af57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061127d565b600091505061127d565b600081815260018301602052604081205480156126eb57600061271960018361339d565b855490915060009061272d9060019061339d565b9050600086600001828154811061275457634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020190508087600001848154811061278857634e487b7160e01b600052603260045260246000fd5b600091825260209091208254600290920201908155600191820154908201556127b2908490613385565b8154600090815260018901602052604090205586548790806127e457634e487b7160e01b600052603160045260246000fd5b600082815260208082206002600019909401938402018281556001908101839055929093558881528982019092526040822091909155945061127d9350505050565b600061287b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612b4f9092919063ffffffff16565b8051909150156121d0578080602001905181019061289991906130aa565b6121d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106ff565b815460009082106129565760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016106ff565b82600001828154811061297957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6000612999848484612b5e565b90505b9392505050565b600061127a8383612c0d565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115612a2c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106ff565b8360ff16601b1480612a4157508360ff16601c145b612a985760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016106ff565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015612aec573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661201c5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106ff565b60606129998484600085612c5c565b600082815260018401602052604081205480612bc357505060408051808201825283815260208082018481528654600181810189556000898152848120955160029093029095019182559151908201558654868452818801909252929091205561299c565b8285612bd060018461339d565b81548110612bee57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010181905550600091505061299c565b6000818152600183016020526040812054612c545750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561127d565b50600061127d565b606082471015612cbd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106ff565b843b612d0b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106ff565b600080866001600160a01b03168587604051612d27919061321f565b60006040518083038185875af1925050503d8060008114612d64576040519150601f19603f3d011682016040523d82523d6000602084013e612d69565b606091505b5091509150612d79828286612d84565b979650505050505050565b60608315612d9357508161299c565b825115612da35782518084602001fd5b8160405162461bcd60e51b81526004016106ff91906132c4565b828054612dc9906133e0565b90600052602060002090601f016020900481019282612deb5760008555612e31565b82601f10612e0457805160ff1916838001178555612e31565b82800160010185558215612e31579182015b82811115612e31578251825591602001919060010190612e16565b50612e3d929150612e41565b5090565b5b80821115612e3d5760008155600101612e42565b600082601f830112612e66578081fd5b813567ffffffffffffffff80821115612e8157612e8161342b565b604051601f8301601f19908116603f01168101908282118183101715612ea957612ea961342b565b81604052838152866020858801011115612ec1578485fd5b8360208701602083013792830160200193909352509392505050565b803560ff8116811461079757600080fd5b600060208284031215612eff578081fd5b813561299c81613441565b600060208284031215612f1b578081fd5b815161299c81613441565b60008060408385031215612f38578081fd5b8235612f4381613441565b9150602083013567ffffffffffffffff811115612f5e578182fd5b612f6a85828601612e56565b9150509250929050565b60008060408385031215612f86578182fd5b8235612f9181613441565b946020939093013593505050565b60008060008060808587031215612fb4578182fd5b8435612fbf81613441565b9350602085013592506040850135612fd681613441565b9150606085013567ffffffffffffffff811115612ff1578182fd5b612ffd87828801612e56565b91505092959194509250565b600080600080600060a08688031215613020578081fd5b853561302b81613441565b97602087013597506040870135966060810135965060800135945092505050565b600080600060608486031215613060578283fd5b833561306b81613441565b925061307960208501612edd565b9150604084013567ffffffffffffffff811115613094578182fd5b6130a086828701612e56565b9150509250925092565b6000602082840312156130bb578081fd5b815161299c81613459565b6000602082840312156130d7578081fd5b5035919050565b600080604083850312156130f0578182fd5b82359150602083013567ffffffffffffffff811115612f5e578182fd5b60006020828403121561311e578081fd5b5051919050565b60008060008060008060c0878903121561313d578384fd5b86359550602087013561314f81613441565b9450604087013567ffffffffffffffff8082111561316b578586fd5b6131778a838b01612e56565b9550606089013591508082111561318c578283fd5b6131988a838b01612e56565b9450608089013591506131aa82613459565b90925060a088013590808211156131bf578283fd5b506131cc89828a01612e56565b9150509295509295509295565b6000602082840312156131ea578081fd5b61127a82612edd565b6000815180845261320b8160208601602086016133b4565b601f01601f19169290920160200192915050565b600082516132318184602087016133b4565b9190910192915050565b6001600160a01b0393909316835261ffff91909116602083015260ff16604082015260600190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b84151581526001600160a01b03841660208201526080604082018190526000906132b2908301856131f3565b8281036060840152612d7981856131f3565b60006020825261127a60208301846131f3565b6020808252600b908201526a2737ba1036b0b730b3b2b960a91b604082015260600190565b8781526001600160a01b038716602082015260e060408201819052600090613326908301886131f3565b828103606084015261333881886131f3565b9515156080840152505061ffff9290921660a083015260ff1660c090910152949350505050565b600061ffff80831681851680830382111561337c5761337c613415565b01949350505050565b6000821982111561339857613398613415565b500190565b6000828210156133af576133af613415565b500390565b60005b838110156133cf5781810151838201526020016133b7565b838111156122a35750506000910152565b6002810460018216806133f457607f821691505b60208210811415610f4057634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461345657600080fd5b50565b801515811461345657600080fdfea6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49cc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792fd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330fa26469706673582212204c5fe76ad0d6129eee67c7087d424086077e067b6b48fb394f01293613d8023a64736f6c63430008020033
Deployed Bytecode Sourcemap
31851:13081:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32755:40;;;;;;;;;;-1:-1:-1;32755:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32755:40:0;;;;;;;;;;;;;;;;;;;;;24036:25:1;;;24104:14;;24097:22;24092:2;24077:18;;24070:50;-1:-1:-1;;;;;24194:15:1;;;24174:18;;;24167:43;;;;24246:15;;;24241:2;24226:18;;24219:43;24299:15;;;;24293:3;24278:19;;24271:44;24147:3;24331:19;;24324:35;24390:3;24375:19;;24368:35;24434:3;24419:19;;24412:35;;;;24478:3;24463:19;;24456:35;24522:3;24507:19;;24500:35;24023:3;24008:19;32755:40:0;;;;;;;;32802:45;;;;;;;;;;-1:-1:-1;32802:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10192:14:1;;10185:22;10167:41;;10155:2;10140:18;32802:45:0;10122:92:1;35826:93:0;;;;;;;;;;-1:-1:-1;35901:9:0;;35826:93;;;10933:25:1;;;10921:2;10906:18;35826:93:0;10888:76:1;36872:319:0;;;;;;;;;;-1:-1:-1;36872:319:0;;;;;:::i;:::-;;:::i;:::-;;;;22331:25:1;;;-1:-1:-1;;;;;22430:15:1;;;22425:2;22410:18;;22403:43;22482:15;;;22462:18;;;22455:43;;;;22534:15;;;;22529:2;22514:18;;22507:43;22581:3;22566:19;;22559:35;;;;22383:3;22610:19;;22603:35;22669:3;22654:19;;22647:35;22713:3;22698:19;;22691:35;22757:3;22742:19;;22735:35;;;;22814:14;22807:22;22801:3;22786:19;;22779:51;22318:3;22303:19;36872:319:0;22285:551:1;32558:45:0;;;;;;;;;;-1:-1:-1;32558:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;43482:280;;;;;;;;;;-1:-1:-1;43482:280:0;;;;;:::i;:::-;;:::i;:::-;;42011:122;;;;;;;;;;-1:-1:-1;42011:122:0;;;;;:::i;:::-;;:::i;32157:43::-;;;;;;;;;;-1:-1:-1;32157:43:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;43188:282::-;;;;;;;;;;-1:-1:-1;43188:282:0;;;;;:::i;:::-;;:::i;35927:99::-;;;;;;;;;;;;;:::i;32646:49::-;;;;;;;;;;-1:-1:-1;32646:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;41008:466;;;;;;;;;;-1:-1:-1;41008:466:0;;;;;:::i;:::-;;:::i;43774:265::-;;;;;;;;;;-1:-1:-1;43774:265:0;;;;;:::i;:::-;;:::i;38688:1037::-;;;;;;:::i;:::-;;:::i;37388:1288::-;;;;;;;;;;-1:-1:-1;37388:1288:0;;;;;:::i;:::-;;:::i;42145:148::-;;;;;;;;;;-1:-1:-1;42145:148:0;;;;;:::i;:::-;;:::i;42305:584::-;;;;;;;;;;-1:-1:-1;42305:584:0;;;;;:::i;:::-;;:::i;32702:46::-;;;;;;;;;;-1:-1:-1;32702:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;36598:262;;;;;;;;;;-1:-1:-1;36598:262:0;;;;;:::i;:::-;;:::i;32509:42::-;;;;;;;;;;-1:-1:-1;32509:42:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;32509:42:0;;;;;;-1:-1:-1;;;;;7917:32:1;;;7899:51;;7887:2;7872:18;32509:42:0;7854:102:1;32610:23:0;;;;;;;;;;-1:-1:-1;32610:23:0;;;;;;;;;;;21737:6:1;21725:19;;;21707:38;;21695:2;21680:18;32610:23:0;21662:89:1;41482:517:0;;;;;;;;;;-1:-1:-1;41482:517:0;;;;;:::i;:::-;;:::i;44577:344::-;;;;;;;;;;-1:-1:-1;44577:344:0;;;;;:::i;:::-;;:::i;42897:279::-;;;;;;;;;;-1:-1:-1;42897:279:0;;;;;:::i;:::-;;:::i;34325:861::-;;;;;;;;;;-1:-1:-1;34325:861:0;;;;;:::i;:::-;;:::i;36872:319::-;36934:17;;;;;;;;;;;37127:20;:9;37140:6;37127:12;:20::i;:::-;37105:42;;;37165:18;37175:7;37165:9;:18::i;:::-;37158:25;;;;;;;;;;;;;;;;;;;;;36872:319;;;;;;;;;;;:::o;43482:280::-;33122:11;;;:8;:11;;-1:-1:-1;;;;;;;;;;;33122:11:0;-1:-1:-1;;;;;33122:11:0;33137:10;33122:25;;:54;;-1:-1:-1;33151:8:0;:11;;;;;;-1:-1:-1;;;;;;;;;;;33151:11:0;-1:-1:-1;;;;;33151:11:0;33166:10;33151:25;33122:54;:83;;;-1:-1:-1;33189:1:0;33180:11;;:8;:11;;-1:-1:-1;;;;;;;;;;;33180:11:0;-1:-1:-1;;;;;33180:11:0;33195:10;33180:25;33122:83;33114:107;;;;-1:-1:-1;;;33114:107:0;;;;;;;:::i;:::-;;;;;;;;;43648:9:::1;::::0;43626:37:::1;::::0;43585:1:::1;::::0;43573:9:::1;::::0;43626:37:::1;::::0;43637:9;;43648::::1;::::0;;::::1;::::0;43585:1;;43626:37:::1;;;:::i;:::-;;;;;;;;;;;;;43616:48;;;;;;43597:67;;43675:30;43690:8;43700:4;43675:14;:30::i;:::-;-1:-1:-1::0;;43716:12:0::1;:38:::0;;-1:-1:-1;;;;;;43716:38:0::1;-1:-1:-1::0;;;;;43716:38:0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;43482:280:0:o;42011:122::-;-1:-1:-1;;;;;42098:17:0;;42070:7;42098:17;;;:10;:17;;;;;:26;;:24;:26::i;:::-;42090:35;;42011:122;;;;:::o;32157:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32157:43:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43188:282::-;33122:11;;;:8;:11;;-1:-1:-1;;;;;;;;;;;33122:11:0;-1:-1:-1;;;;;33122:11:0;33137:10;33122:25;;:54;;-1:-1:-1;33151:8:0;:11;;;;;;-1:-1:-1;;;;;;;;;;;33151:11:0;-1:-1:-1;;;;;33151:11:0;33166:10;33151:25;33122:54;:83;;;-1:-1:-1;33189:1:0;33180:11;;:8;:11;;-1:-1:-1;;;;;;;;;;;33180:11:0;-1:-1:-1;;;;;33180:11:0;33195:10;33180:25;33122:83;33114:107;;;;-1:-1:-1;;;33114:107:0;;;;;;;:::i;:::-;43357:9:::1;::::0;43333:39:::1;::::0;43292:1:::1;::::0;43280:9:::1;::::0;43333:39:::1;::::0;43344:11;;43357:9:::1;::::0;;::::1;::::0;43292:1;;43333:39:::1;;;:::i;:::-;;;;;;;;;;;;;43323:50;;;;;;43304:69;;43384:30;43399:8;43409:4;43384:14;:30::i;:::-;-1:-1:-1::0;;;;;;;;43425:29:0::1;43457:5;43425:29:::0;;;:16:::1;:29;::::0;;;;:37;;-1:-1:-1;;43425:37:0::1;::::0;;43188:282::o;35927:99::-;35971:7;35999:18;:9;:16;:18::i;:::-;35991:27;;35927:99;:::o;41008:466::-;41063:4;41101:16;;;:6;:16;;;;;;;;41080:37;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41080:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41152:10;41136:26;41128:77;;;;-1:-1:-1;;;41128:77:0;;18837:2:1;41128:77:0;;;18819:21:1;18876:2;18856:18;;;18849:30;18915:34;18895:18;;;18888:62;-1:-1:-1;;;18966:18:1;;;18959:36;19012:19;;41128:77:0;18809:228:1;41128:77:0;41242:5;41216:16;;;:6;:16;;;;;;;;:23;;:31;;-1:-1:-1;;41216:31:0;;;41269:12;;;;-1:-1:-1;;;;;41258:24:0;;;:10;:24;;;;;:41;;41223:8;41258:31;:41::i;:::-;-1:-1:-1;41327:15:0;;41310:33;;:9;;:16;:33::i;:::-;;41439:5;41354:12;:82;41388:5;:16;;;41406:5;:13;;;41421:5;:12;;;41377:57;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;41377:57:0;;;;;;41367:68;;41377:57;41367:68;;;;41354:82;;;;;;;;;;-1:-1:-1;41354:82:0;:90;;-1:-1:-1;;41354:90:0;;;;;;;;;;-1:-1:-1;;;41008:466:0;-1:-1:-1;;41008:466:0:o;43774:265::-;33122:11;;;:8;:11;;-1:-1:-1;;;;;;;;;;;33122:11:0;-1:-1:-1;;;;;33122:11:0;33137:10;33122:25;;:54;;-1:-1:-1;33151:8:0;:11;;;;;;-1:-1:-1;;;;;;;;;;;33151:11:0;-1:-1:-1;;;;;33151:11:0;33166:10;33151:25;33122:54;:83;;;-1:-1:-1;33189:1:0;33180:11;;:8;:11;;-1:-1:-1;;;;;;;;;;;33180:11:0;-1:-1:-1;;;;;33180:11:0;33195:10;33180:25;33122:83;33114:107;;;;-1:-1:-1;;;33114:107:0;;;;;;;:::i;:::-;43931:9:::1;::::0;43911:35:::1;::::0;43870:1:::1;::::0;43858:9:::1;::::0;43911:35:::1;::::0;43922:7;;43931:9:::1;::::0;;::::1;::::0;43870:1;;43911:35:::1;;;:::i;:::-;;;;;;;;;;;;;43901:46;;;;;;43882:65;;43958:30;43973:8;43983:4;43958:14;:30::i;:::-;-1:-1:-1::0;;43999:13:0::1;:32:::0;;-1:-1:-1;;;;;;43999:32:0::1;-1:-1:-1::0;;;;;43999:32:0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;43774:265:0:o;38688:1037::-;38750:4;38788:16;;;:6;:16;;;;;;;;38767:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38767:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38823:20;38815:45;;;;-1:-1:-1;;;38815:45:0;;18496:2:1;38815:45:0;;;18478:21:1;18535:2;18515:18;;;18508:30;-1:-1:-1;;;18554:18:1;;;18547:42;18606:18;;38815:45:0;18468:162:1;38815:45:0;38879:12;;;;:20;;38895:4;38879:20;38871:52;;;;-1:-1:-1;;;38871:52:0;;16931:2:1;38871:52:0;;;16913:21:1;16970:2;16950:18;;;16943:30;-1:-1:-1;;;16989:18:1;;;16982:49;17048:18;;38871:52:0;16903:169:1;38871:52:0;38955:5;:11;;;38942:9;:24;38934:50;;;;-1:-1:-1;;;38934:50:0;;20721:2:1;38934:50:0;;;20703:21:1;20760:2;20740:18;;;20733:30;-1:-1:-1;;;20779:18:1;;;20772:43;20832:18;;38934:50:0;20693:163:1;38934:50:0;38999:79;39011:8;39021:5;:12;;;39035:5;:16;;;39053:5;:13;;;39068:5;:9;;;38999:11;:79::i;:::-;38995:721;;;39114:12;;39137;;;;39114:47;;-1:-1:-1;;;39114:47:0;;-1:-1:-1;;;;;9210:32:1;;;39114:47:0;;;9192:51:1;39151:9:0;9259:18:1;;;9252:34;39095:16:0;;39114:12;;;;;:22;;9165:18:1;;39114:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39095:66;;39176:81;39189:8;39199:10;39211:5;:12;;;39225:5;:16;;;39243:5;:13;;;39176:12;:81::i;:::-;39276:12;;39272:271;;39333:13;;39307:51;;-1:-1:-1;;;;;39333:13:0;39349:8;39307:17;:51::i;:::-;39401:12;;;;39375:61;;39416:18;39426:8;39416:9;:18;:::i;:::-;39375:17;:61::i;:::-;39272:271;;;39475:52;39501:5;:12;;;39516:9;39475:17;:52::i;:::-;39557:72;39571:10;39583:5;:12;;;39597:5;:16;;;39615:5;:13;;;39557;:72::i;:::-;39652:4;39644:13;;;;;;38995:721;39698:5;39690:14;;;;;38995:721;38688:1037;;;;:::o;37388:1288::-;37501:4;37518:16;37537:22;37548:10;37340:2;37330:13;37324:20;;37199:177;37537:22;37570:18;37591:16;;;:6;:16;;;;;;;;37570:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37570:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37626:27;;;;;;;;:40;37591:16;;-1:-1:-1;37570:37:0;37626:50;;;:40;;;;:50;37618:75;;;;-1:-1:-1;;;37618:75:0;;18496:2:1;37618:75:0;;;18478:21:1;18535:2;18515:18;;;18508:30;-1:-1:-1;;;18554:18:1;;;18547:42;18606:18;;37618:75:0;18468:162:1;37618:75:0;37712:12;;;;:20;;37728:4;37712:20;37704:52;;;;-1:-1:-1;;;37704:52:0;;16931:2:1;37704:52:0;;;16913:21:1;16970:2;16950:18;;;16943:30;-1:-1:-1;;;16989:18:1;;;16982:49;17048:18;;37704:52:0;16903:169:1;37704:52:0;37785:5;:11;;;37775:6;:21;37767:47;;;;-1:-1:-1;;;37767:47:0;;20721:2:1;37767:47:0;;;20703:21:1;20760:2;20740:18;;;20733:30;-1:-1:-1;;;20779:18:1;;;20772:43;20832:18;;37767:47:0;20693:163:1;37767:47:0;37829:79;37841:8;37851:5;:12;;;37865:5;:16;;;37883:5;:13;;;37898:5;:9;;;37829:11;:79::i;:::-;37825:842;;;37944:12;;37969;;;;37994:15;;;;37925:16;37983:27;;;;;;;;;;;:40;37944:89;;-1:-1:-1;;;37944:89:0;;-1:-1:-1;;;;;8528:15:1;;;37944:89:0;;;8510:34:1;37944:12:0;37983:40;;;;;8560:18:1;;;8553:43;8612:18;;;8605:34;;;37925:16:0;;37944:12;;;;;:24;;8445:18:1;;37944:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37925:108;;38049:76;38062:8;38072:5;38079;:12;;;38093:5;:16;;;38111:5;:13;;;38049:12;:76::i;:::-;38167:6;38194:12;;38190:309;;38262:13;;38227:61;;-1:-1:-1;;;;;38227:27:0;;;;38255:5;;38262:13;38278:8;38227:27;:61::i;:::-;38307:72;38335:5;38342;:12;;;38369:8;38357:5;:11;;;:20;;;;:::i;:::-;-1:-1:-1;;;;;38307:27:0;;;:72;;:27;:72::i;:::-;38190:309;;;38455:12;;;;38470:11;;;;38420:63;;-1:-1:-1;;;;;38420:27:0;;;38448:5;;38455:12;38420:27;:63::i;:::-;38513:67;38527:5;38534;:12;;;38548:5;:16;;;38566:5;:13;;;38513;:67::i;:::-;38603:4;38595:13;;;;;;;;37825:842;38649:5;38641:14;;;;37388:1288;;;;;;;:::o;42145:148::-;-1:-1:-1;;;;;42256:17:0;;42221:14;42256:17;;;:10;:17;;;;;:28;;42277:6;42256:20;:28::i;:::-;42248:37;;42145:148;;;;;:::o;42305:584::-;33122:11;;;:8;:11;;-1:-1:-1;;;;;;;;;;;33122:11:0;-1:-1:-1;;;;;33122:11:0;33137:10;33122:25;;:54;;-1:-1:-1;33151:8:0;:11;;;;;;-1:-1:-1;;;;;;;;;;;33151:11:0;-1:-1:-1;;;;;33151:11:0;33166:10;33151:25;33122:54;:83;;;-1:-1:-1;33189:1:0;33180:11;;:8;:11;;-1:-1:-1;;;;;;;;;;;33180:11:0;-1:-1:-1;;;;;33180:11:0;33195:10;33180:25;33122:83;33114:107;;;;-1:-1:-1;;;33114:107:0;;;;;;;:::i;:::-;42606:9:::1;::::0;42533:88:::1;::::0;42492:1:::1;::::0;42480:9:::1;::::0;42533:88:::1;::::0;42544:10;;42556:13;;42571:12;;42585:10;;42597:7;;42606:9:::1;::::0;;::::1;::::0;42492:1;;42533:88:::1;;;:::i;:::-;;;;;;;;;;;;;42523:99;;;;;;42504:118;;42633:30;42648:8;42658:4;42633:14;:30::i;:::-;42674:10;:22:::0;;;::::1;::::0;;;;;;;:51;;-1:-1:-1;;;;;;42674:51:0::1;;-1:-1:-1::0;;;;;42674:51:0;::::1;;;::::0;;42736:44;;::::1;::::0;-1:-1:-1;42736:29:0;;::::1;::::0;:44;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;42791:10:0::1;:22:::0;;;::::1;::::0;;;;;;;:40;;::::1;::::0;:27:::1;::::0;;::::1;::::0;:40;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;42842:10:0::1;:22:::0;;;-1:-1:-1;42842:22:0::1;::::0;;;;;;;:39;;-1:-1:-1;;42842:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;;;42305:584:0:o;36598:262::-;36655:17;36674:16;36692:14;36708:13;36723:15;36740:11;36753:13;36768;36783:17;36802:11;36833:19;36843:8;36833:9;:19::i;:::-;36826:26;;;;;;;;;;;;;;;;;;;;36598:262;;;;;;;;;;;:::o;41482:517::-;33122:11;;;:8;:11;;-1:-1:-1;;;;;;;;;;;33122:11:0;-1:-1:-1;;;;;33122:11:0;33137:10;33122:25;;:54;;-1:-1:-1;33151:8:0;:11;;;;;;-1:-1:-1;;;;;;;;;;;33151:11:0;-1:-1:-1;;;;;33151:11:0;33166:10;33151:25;33122:54;:83;;;-1:-1:-1;33189:1:0;33180:11;;:8;:11;;-1:-1:-1;;;;;;;;;;;33180:11:0;-1:-1:-1;;;;;33180:11:0;33195:10;33180:25;33122:83;33114:107;;;;-1:-1:-1;;;33114:107:0;;;;;;;:::i;:::-;41647:9:::1;::::0;41626:36:::1;::::0;;::::1;::::0;::::1;11165:25:1::0;;;41647:9:0::1;::::0;;::::1;11206:18:1::0;;;11199:47;41585:1:0::1;11262:18:1::0;;;11255:45;;;41585:1:0;41573:9:::1;::::0;11138:18:1;;41626:36:0::1;;;;;;;;;;;;41616:47;;;;;;41597:66;;41674:30;41689:8;41699:4;41674:14;:30::i;:::-;41715:18;41736:16:::0;;;:6:::1;:16;::::0;;;;;;;41715:37;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;;::::0;;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;;;;41715:37:0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;;;;41763:16;;;;;;-1:-1:-1;;41763:31:0::1;::::0;;41816:12;;41805:24:::1;::::0;;:10:::1;:24:::0;;;;;;:41:::1;::::0;41736:16;41805:31:::1;:41::i;:::-;-1:-1:-1::0;41874:15:0;;41857:33:::1;::::0;:9:::1;::::0;:16:::1;:33::i;:::-;;41986:5;41901:12;:82;41935:5;:16;;;41953:5;:13;;;41968:5;:12;;;41924:57;;;;;;;;;;:::i;:::-;;::::0;;;;::::1;-1:-1:-1::0;;41924:57:0;;;;;;41914:68;;41924:57:::1;41914:68:::0;;::::1;::::0;41901:82;;;;::::1;::::0;;;;;-1:-1:-1;41901:82:0;:90;;-1:-1:-1;;41901:90:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;;;;;41482:517:0:o;44577:344::-;33122:11;;;:8;:11;;-1:-1:-1;;;;;;;;;;;33122:11:0;-1:-1:-1;;;;;33122:11:0;33137:10;33122:25;;:54;;-1:-1:-1;33151:8:0;:11;;;;;;-1:-1:-1;;;;;;;;;;;33151:11:0;-1:-1:-1;;;;;33151:11:0;33166:10;33151:25;33122:54;:83;;;-1:-1:-1;33189:1:0;33180:11;;:8;:11;;-1:-1:-1;;;;;;;;;;;33180:11:0;-1:-1:-1;;;;;33180:11:0;33195:10;33180:25;33122:83;33114:107;;;;-1:-1:-1;;;33114:107:0;;;;;;;:::i;:::-;44712:1:::1;44702:6;:11;;;;44679:52;;;::::0;-1:-1:-1;;;44679:52:0;;13944:2:1;44679:52:0::1;::::0;::::1;13926:21:1::0;13983:2;13963:18;;;13956:30;-1:-1:-1;;;14002:18:1;;;13995:43;14055:18;;44679:52:0::1;13916:163:1::0;44679:52:0::1;44818:9;::::0;44797:36:::1;::::0;44754:3:::1;::::0;44742:9:::1;::::0;44797:36:::1;::::0;44808:8;;44818:9:::1;::::0;;::::1;::::0;44754:3;;44797:36:::1;;;:::i;:::-;;;;;;;;;;;;;44787:47;;;;;;44768:66;;44845:30;44860:8;44870:4;44845:14;:30::i;:::-;-1:-1:-1::0;;;44886:16:0::1;;;::::0;;;:8:::1;:16;::::0;;;;:27;;-1:-1:-1;;;;;;44886:27:0::1;-1:-1:-1::0;;;;;44886:27:0;;;::::1;::::0;;;::::1;::::0;;44577:344::o;42897:279::-;33122:11;;;:8;:11;;-1:-1:-1;;;;;;;;;;;33122:11:0;-1:-1:-1;;;;;33122:11:0;33137:10;33122:25;;:54;;-1:-1:-1;33151:8:0;:11;;;;;;-1:-1:-1;;;;;;;;;;;33151:11:0;-1:-1:-1;;;;;33151:11:0;33166:10;33151:25;33122:54;:83;;;-1:-1:-1;33189:1:0;33180:11;;:8;:11;;-1:-1:-1;;;;;;;;;;;33180:11:0;-1:-1:-1;;;;;33180:11:0;33195:10;33180:25;33122:83;33114:107;;;;-1:-1:-1;;;33114:107:0;;;;;;;:::i;:::-;42999:1:::1;43064:9:::0;;43040:39:::1;::::0;42987:9:::1;::::0;43040:39:::1;::::0;43051:11;;43064:9:::1;;::::0;42999:1;;43040:39:::1;;;:::i;:::-;;;;;;;;;;;;;43030:50;;;;;;43011:69;;43091:30;43106:8;43116:4;43091:14;:30::i;:::-;-1:-1:-1::0;;;;;;;;43132:29:0::1;;::::0;;;:16:::1;:29;::::0;;;;:36;;-1:-1:-1;;43132:36:0::1;43164:4;43132:36;::::0;;42897:279::o;34325:861::-;-1:-1:-1;;;;;34461:29:0;;;;;;:16;:29;;;;;;;;:37;;:29;:37;34453:68;;;;-1:-1:-1;;;34453:68:0;;13597:2:1;34453:68:0;;;13579:21:1;13636:2;13616:18;;;13609:30;-1:-1:-1;;;13655:18:1;;;13648:48;13713:18;;34453:68:0;13569:168:1;34453:68:0;34540:10;:22;;;;;;;;;;:29;;;:37;;:29;:37;34532:70;;;;-1:-1:-1;;;34532:70:0;;19244:2:1;34532:70:0;;;19226:21:1;19283:2;19263:18;;;19256:30;-1:-1:-1;;;19302:18:1;;;19295:50;19362:18;;34532:70:0;19216:170:1;34532:70:0;34621:9;;;:35;;;34641:15;34634:4;:22;34621:35;34613:64;;;;-1:-1:-1;;;34613:64:0;;21063:2:1;34613:64:0;;;21045:21:1;21102:2;21082:18;;;21075:30;-1:-1:-1;;;21121:18:1;;;21114:46;21177:18;;34613:64:0;21035:166:1;34613:64:0;34688:15;34727:11;34740:8;34750:10;34716:45;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;34716:45:0;;;;;;;;;34706:56;;34716:45;34706:56;;;;34781:21;;;;:12;:21;;;;;;34706:56;;-1:-1:-1;34781:21:0;;:30;34773:71;;;;-1:-1:-1;;;34773:71:0;;21408:2:1;34773:71:0;;;21390:21:1;21447:2;21427:18;;;21420:30;21486;21466:18;;;21459:58;21534:18;;34773:71:0;21380:178:1;34773:71:0;34916:29;;-1:-1:-1;;;34916:29:0;;;;;10933:25:1;;;34885:11:0;;34949:10;;-1:-1:-1;;;;;34916:19:0;;;;;10906:18:1;;34916:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34916:43:0;;34908:81;;;;-1:-1:-1;;;34908:81:0;;15812:2:1;34908:81:0;;;15794:21:1;15851:2;15831:18;;;15824:30;15890:27;15870:18;;;15863:55;15935:18;;34908:81:0;15784:175:1;34908:81:0;35008:55;;-1:-1:-1;;;35008:55:0;;35037:10;35008:55;;;8173:34:1;35057:4:0;8223:18:1;;;8216:43;-1:-1:-1;;;;;35008:28:0;;;;;8108:18:1;;35008:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35000:98;;;;-1:-1:-1;;;35000:98:0;;19951:2:1;35000:98:0;;;19933:21:1;19990:2;19970:18;;;19963:30;20029:32;20009:18;;;20002:60;20079:18;;35000:98:0;19923:180:1;35000:98:0;35109:69;35121:11;35134:8;35144:6;35152:10;35164:4;35170:7;35109:11;:69::i;:::-;34325:861;;;;;;;:::o;8988:205::-;9064:7;;;;9124:22;9128:3;9140:5;9124:3;:22::i;:::-;9093:53;;;;-1:-1:-1;8988:205:0;-1:-1:-1;;;;;8988:205:0:o;36038:552::-;36097:17;36290:16;;;:6;:16;;;;;;;;;36268:38;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36268:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36038:552::o;44051:514::-;44140:23;;;;:12;:23;;;;;;;;:32;44132:66;;;;-1:-1:-1;;;44132:66:0;;14286:2:1;44132:66:0;;;14268:21:1;14325:2;14305:18;;;14298:30;-1:-1:-1;;;14344:18:1;;;14337:51;14405:18;;44132:66:0;14258:171:1;44132:66:0;44209:15;44227:60;44241:39;44270:9;31231:58;;7400:66:1;31231:58:0;;;7388:79:1;7483:12;;;7476:28;;;31098:7:0;;7520:12:1;;31231:58:0;;;;;;;;;;;;31221:69;;;;;;31214:76;;31029:269;;;;44241:39;44282:4;44227:13;:60::i;:::-;44317:11;;;:8;:11;;-1:-1:-1;;;;;;;;;;;44317:11:0;44209:78;;-1:-1:-1;;;;;;44306:22:0;;;44317:11;;44306:22;;:48;;-1:-1:-1;44343:8:0;:11;;;;;;-1:-1:-1;;;;;;;;;;;44343:11:0;-1:-1:-1;;;;;44332:22:0;;;44343:11;;44332:22;44306:48;:74;;;-1:-1:-1;44378:1:0;44369:11;;:8;:11;;-1:-1:-1;;;;;;;;;;;44369:11:0;-1:-1:-1;;;;;44358:22:0;;;44369:11;;44358:22;44306:74;44298:106;;;;-1:-1:-1;;;44298:106:0;;14636:2:1;44298:106:0;;;14618:21:1;14675:2;14655:18;;;14648:30;-1:-1:-1;;;14694:18:1;;;14687:47;14751:18;;44298:106:0;14608:167:1;44298:106:0;-1:-1:-1;;;;;44423:21:0;;44434:10;44423:21;;44415:76;;;;-1:-1:-1;;;44415:76:0;;17279:2:1;44415:76:0;;;17261:21:1;17318:2;17298:18;;;17291:30;17357:34;17337:18;;;17330:62;-1:-1:-1;;;17408:18:1;;;17401:40;17458:19;;44415:76:0;17251:232:1;44415:76:0;44502:23;;;;:12;:23;;;;;:30;;-1:-1:-1;;44502:30:0;44528:4;44502:30;;;;;;44543:9;:14;;44528:4;;44543:9;;:14;;44528:4;;44543:14;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;44051:514;;;:::o;15372:117::-;15435:7;15462:19;15470:3;13800:18;;13717:109;14929:131;15002:4;15026:26;15034:3;15046:5;15026:7;:26::i;8073:138::-;8146:4;8170:33;8178:3;8198;8170:7;:33::i;40428:572::-;40642:26;;-1:-1:-1;;;40642:26:0;;;;;10933:25:1;;;40556:4:0;;40600:9;;40556:4;;-1:-1:-1;;;;;40642:16:0;;;;;10906:18:1;;40642:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40621:47;;40697:7;-1:-1:-1;;;;;40683:21:0;:10;-1:-1:-1;;;;;40683:21:0;;;:69;;;;40720:1;40709:8;:12;:42;;;;;40736:15;40725:8;:26;40709:42;40679:314;;;40795:5;40769:16;;;:6;:16;;;;;;;;:23;;:31;;-1:-1:-1;;40769:31:0;;;-1:-1:-1;;;;;40815:19:0;;;;:10;:19;;;;;:36;;40776:8;40815:26;:36::i;:::-;-1:-1:-1;40883:16:0;;;;:6;:16;;;;;:26;40866:44;;:9;;:16;:44::i;:::-;;40932:5;40925:12;;;;;;40679:314;40977:4;40970:11;;;;40428:572;;;;;;;;:::o;39737:447::-;39866:16;;;;:6;:16;;;;;;;;:22;;;:31;;-1:-1:-1;;;;;;39866:31:0;-1:-1:-1;;;;;39866:31:0;;;;;;;;;;-1:-1:-1;39908:23:0;;:31;;-1:-1:-1;;39908:31:0;;;39975:15;39950:22;;;;:40;40001:19;;;;;:10;:19;;;;:36;;39866:16;40001:26;:36::i;:::-;-1:-1:-1;40065:16:0;;;;:6;:16;;;;;:26;40048:44;;:9;;:16;:44::i;:::-;;40171:5;40103:12;:65;40137:9;40148:8;40158:7;40126:40;;;;;;;;;;:::i;19733:397::-;19848:6;19823:21;:31;;19815:73;;;;-1:-1:-1;;;19815:73:0;;16166:2:1;19815:73:0;;;16148:21:1;16205:2;16185:18;;;16178:30;16244:31;16224:18;;;16217:59;16293:18;;19815:73:0;16138:179:1;19815:73:0;19980:12;19998:9;-1:-1:-1;;;;;19998:14:0;20021:6;19998:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19979:54;;;20052:7;20044:78;;;;-1:-1:-1;;;20044:78:0;;14982:2:1;20044:78:0;;;14964:21:1;15021:2;15001:18;;;14994:30;15060:34;15040:18;;;15033:62;15131:28;15111:18;;;15104:56;15177:19;;20044:78:0;14954:248:1;20044:78:0;19733:397;;;:::o;40196:220::-;40356:52;;-1:-1:-1;;;40356:52:0;;-1:-1:-1;;;;;8528:15:1;;;40356:52:0;;;8510:34:1;8580:15;;;8560:18;;;8553:43;8612:18;;;8605:34;;;40335:9:0;;40356:25;;;;;;8445:18:1;;40356:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40196:220;;;;;:::o;23606:205::-;23734:68;;;-1:-1:-1;;;;;8528:15:1;;;23734:68:0;;;8510:34:1;8580:15;;8560:18;;;8553:43;8612:18;;;;8605:34;;;23734:68:0;;;;;;;;;;8445:18:1;;;;23734:68:0;;;;;;;;-1:-1:-1;;;;;23734:68:0;-1:-1:-1;;;23734:68:0;;;23707:96;;23727:5;;23707:19;:96::i;:::-;23606:205;;;;:::o;15833:131::-;15907:7;15934:22;15938:3;15950:5;15934:3;:22::i;35198:616::-;35366:114;;;;;;;;35372:9;;35366:114;;;35383:4;35366:114;;;;;;;;-1:-1:-1;;;;;35366:114:0;;;;;;35402:10;35366:114;;;;35345:18;35366:114;;;;;;;;;;;;;;;;;;35444:15;35366:114;;;;;;;;;;;;;;;;35521:44;;35366:114;;35345:18;35521:44;;35389:11;;35428:8;;35521:44;-1:-1:-1;;;;;9897:32:1;;;;9879:51;;9961:2;9946:18;;9939:34;;;;10004:2;9989:18;;9982:34;9867:2;9852:18;;9834:188;35521:44:0;;;;-1:-1:-1;;35521:44:0;;;;;;;;;35511:55;;35521:44;35511:55;;;;35588:9;;;35577:21;;;;:10;:21;;;;;;:33;;;35621:17;;;:6;:17;;;;;;;:25;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35621:25:0;;;;;;;-1:-1:-1;;;;;;35621:25:0;;;-1:-1:-1;;35621:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35621:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35671:9;;35511:55;;-1:-1:-1;35657:35:0;;35621:25;35511:55;35657:13;:35::i;:::-;-1:-1:-1;35714:10:0;35703:22;;;;:10;:22;;;;;:37;;35730:9;35703:26;:37::i;:::-;-1:-1:-1;35751:22:0;;;;:12;:22;;35792:9;:14;;35751:22;;;35792:14;;35751:22;;35792:14;:::i;:::-;;;;-1:-1:-1;;;;;;;;;;35198:616:0:o;5621:279::-;5725:19;;5688:7;;;;5725:27;-1:-1:-1;5717:74:0;;;;-1:-1:-1;;;5717:74:0;;18093:2:1;5717:74:0;;;18075:21:1;18132:2;18112:18;;;18105:30;18171:34;18151:18;;;18144:62;-1:-1:-1;;;18222:18:1;;;18215:32;18264:19;;5717:74:0;18065:224:1;5717:74:0;5804:22;5829:3;:12;;5842:5;5829:19;;;;;;-1:-1:-1;;;5829:19:0;;;;;;;;;;;;;;;;;;;5804:44;;5867:5;:10;;;5879:5;:12;;;5859:33;;;;;5621:279;;;;;:::o;27666:1492::-;27744:7;27821:9;27841;27861:7;28081:9;:16;28101:2;28081:22;28077:1032;;;-1:-1:-1;;;28368:4:0;28353:20;;28347:27;28418:4;28403:20;;28397:27;28476:4;28461:20;;28455:27;28452:1;28447:36;28323:175;;;28519:9;:16;28539:2;28519:22;28515:594;;;-1:-1:-1;;;28811:4:0;28796:20;;28790:27;28861:4;28846:20;;28840:27;;-1:-1:-1;;;;;28890:75:0;;;28996:3;28992:12;29006:2;28988:21;28761:263;;;29056:41;;-1:-1:-1;;;29056:41:0;;13237:2:1;29056:41:0;;;13219:21:1;13276:2;13256:18;;;13249:30;13315:33;13295:18;;;13288:61;13366:18;;29056:41:0;13209:181:1;28515:594:0;29128:22;29136:4;29142:1;29145;29148;29128:7;:22::i;:::-;29121:29;27666:1492;-1:-1:-1;;;;;;27666:1492:0:o;11872:1544::-;11938:4;12077:19;;;:12;;;:19;;;;;;12113:15;;12109:1300;;12475:21;12499:14;12512:1;12499:10;:14;:::i;:::-;12548:18;;12475:38;;-1:-1:-1;12528:17:0;;12548:22;;12569:1;;12548:22;:::i;:::-;12528:42;;12815:17;12835:3;:11;;12847:9;12835:22;;;;;;-1:-1:-1;;;12835:22:0;;;;;;;;;;;;;;;;;12815:42;;12981:9;12952:3;:11;;12964:13;12952:26;;;;;;-1:-1:-1;;;12952:26:0;;;;;;;;;;;;;;;;;;:38;13084:17;:13;13100:1;13084:17;:::i;:::-;13058:23;;;;:12;;;:23;;;;;:43;13210:17;;13058:3;;13210:17;;;-1:-1:-1;;;13210:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;13305:3;:12;;:19;13318:5;13305:19;;;;;;;;;;;13298:26;;;13348:4;13341:11;;;;;;;;12109:1300;13392:5;13385:12;;;;;3303:1549;3367:4;3502:17;;;:12;;;:17;;;;;;3536:13;;3532:1313;;3897:21;3921:12;3932:1;3921:8;:12;:::i;:::-;3968:19;;3897:36;;-1:-1:-1;3948:17:0;;3968:23;;3990:1;;3968:23;:::i;:::-;3948:43;;4236:26;4265:3;:12;;4278:9;4265:23;;;;;;-1:-1:-1;;;4265:23:0;;;;;;;;;;;;;;;;;;;4236:52;;4413:9;4383:3;:12;;4396:13;4383:27;;;;;;-1:-1:-1;;;4383:27:0;;;;;;;;;;;;;;;;;:39;;:27;;;;;:39;;;;;;;;;;;;4521:17;;:13;;:17;:::i;:::-;4503:14;;4490:28;;;;:12;;;:28;;;;;:48;4647:18;;4490:3;;4647:18;;;-1:-1:-1;;;4647:18:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;4647:18:0;;;;;;;;;;;;;;;;;;;;;4743:17;;;:12;;;:17;;;;;;4736:24;;;;4647:18;-1:-1:-1;4777:11:0;;-1:-1:-1;;;;4777:11:0;25855:761;26279:23;26305:69;26333:4;26305:69;;;;;;;;;;;;;;;;;26313:5;-1:-1:-1;;;;;26305:27:0;;;:69;;;;;:::i;:::-;26389:17;;26279:95;;-1:-1:-1;26389:21:0;26385:224;;26531:10;26520:30;;;;;;;;;;;;:::i;:::-;26512:85;;;;-1:-1:-1;;;26512:85:0;;20310:2:1;26512:85:0;;;20292:21:1;20349:2;20329:18;;;20322:30;20388:34;20368:18;;;20361:62;-1:-1:-1;;;20439:18:1;;;20432:40;20489:19;;26512:85:0;20282:232:1;14170:204:0;14265:18;;14237:7;;14265:26;-1:-1:-1;14257:73:0;;;;-1:-1:-1;;;14257:73:0;;12494:2:1;14257:73:0;;;12476:21:1;12533:2;12513:18;;;12506:30;12572:34;12552:18;;;12545:62;-1:-1:-1;;;12623:18:1;;;12616:32;12665:19;;14257:73:0;12466:224:1;14257:73:0;14348:3;:11;;14360:5;14348:18;;;;;;-1:-1:-1;;;14348:18:0;;;;;;;;;;;;;;;;;14341:25;;14170:204;;;;:::o;7753:154::-;7838:4;7862:37;7867:3;7887;7893:5;7862:4;:37::i;:::-;7855:44;;7753:154;;;;;;:::o;14628:125::-;14698:4;14722:23;14727:3;14739:5;14722:4;:23::i;29297:1432::-;29382:7;30307:66;30293:80;;;30285:127;;;;-1:-1:-1;;;30285:127:0;;15409:2:1;30285:127:0;;;15391:21:1;15448:2;15428:18;;;15421:30;15487:34;15467:18;;;15460:62;-1:-1:-1;;;15538:18:1;;;15531:32;15580:19;;30285:127:0;15381:224:1;30285:127:0;30431:1;:7;;30436:2;30431:7;:18;;;;30442:1;:7;;30447:2;30442:7;30431:18;30423:65;;;;-1:-1:-1;;;30423:65:0;;17690:2:1;30423:65:0;;;17672:21:1;17729:2;17709:18;;;17702:30;17768:34;17748:18;;;17741:62;-1:-1:-1;;;17819:18:1;;;17812:32;17861:19;;30423:65:0;17662:224:1;30423:65:0;30603:24;;;30586:14;30603:24;;;;;;;;;11538:25:1;;;11611:4;11599:17;;11579:18;;;11572:45;;;;11633:18;;;11626:34;;;11676:18;;;11669:34;;;30603:24:0;;11510:19:1;;30603:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30603:24:0;;-1:-1:-1;;30603:24:0;;;-1:-1:-1;;;;;;;30646:20:0;;30638:57;;;;-1:-1:-1;;;30638:57:0;;12141:2:1;30638:57:0;;;12123:21:1;12180:2;12160:18;;;12153:30;12219:26;12199:18;;;12192:54;12263:18;;30638:57:0;12113:174:1;20330:195:0;20433:12;20465:52;20487:6;20495:4;20501:1;20504:12;20465:21;:52::i;2436:692::-;2512:4;2647:17;;;:12;;;:17;;;;;;2681:13;2677:444;;-1:-1:-1;;2766:38:0;;;;;;;;;;;;;;;;;;2748:57;;;;;;;;:12;:57;;;;;;;;;;;;;;;;;;;;;;;;2963:19;;2943:17;;;:12;;;:17;;;;;;;:39;2997:11;;2677:444;3077:5;3041:3;3054:12;3065:1;3054:8;:12;:::i;:::-;3041:26;;;;;;-1:-1:-1;;;3041:26:0;;;;;;;;;;;;;;;;;;;:33;;:41;;;;3104:5;3097:12;;;;;11282:414;11345:4;13599:19;;;:12;;;:19;;;;;;11362:327;;-1:-1:-1;11405:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;11588:18;;11566:19;;;:12;;;:19;;;;;;:40;;;;11621:11;;11362:327;-1:-1:-1;11672:5:0;11665:12;;20779:530;20906:12;20964:5;20939:21;:30;;20931:81;;;;-1:-1:-1;;;20931:81:0;;16524:2:1;20931:81:0;;;16506:21:1;16563:2;16543:18;;;16536:30;16602:34;16582:18;;;16575:62;-1:-1:-1;;;16653:18:1;;;16646:36;16699:19;;20931:81:0;16496:228:1;20931:81:0;19668:20;;21023:60;;;;-1:-1:-1;;;21023:60:0;;19593:2:1;21023:60:0;;;19575:21:1;19632:2;19612:18;;;19605:30;19671:31;19651:18;;;19644:59;19720:18;;21023:60:0;19565:179:1;21023:60:0;21157:12;21171:23;21198:6;-1:-1:-1;;;;;21198:11:0;21218:5;21226:4;21198:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21156:75;;;;21249:52;21267:7;21276:10;21288:12;21249:17;:52::i;:::-;21242:59;20779:530;-1:-1:-1;;;;;;;20779:530:0:o;22613:742::-;22728:12;22757:7;22753:595;;;-1:-1:-1;22788:10:0;22781:17;;22753:595;22902:17;;:21;22898:439;;23165:10;23159:17;23226:15;23213:10;23209:2;23205:19;23198:44;23113:148;23308:12;23301:20;;-1:-1:-1;;;23301:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:738:1;;109:3;102:4;94:6;90:17;86:27;76:2;;131:5;124;117:20;76:2;171:6;158:20;197:18;234:2;230;227:10;224:2;;;240:18;;:::i;:::-;315:2;309:9;283:2;369:13;;-1:-1:-1;;365:22:1;;;389:2;361:31;357:40;345:53;;;413:18;;;433:22;;;410:46;407:2;;;459:18;;:::i;:::-;499:10;495:2;488:22;534:2;526:6;519:18;580:3;573:4;568:2;560:6;556:15;552:26;549:35;546:2;;;601:5;594;587:20;546:2;669;662:4;654:6;650:17;643:4;635:6;631:17;618:54;692:15;;;709:4;688:26;681:41;;;;-1:-1:-1;696:6:1;66:686;-1:-1:-1;;;66:686:1:o;757:156::-;823:20;;883:4;872:16;;862:27;;852:2;;903:1;900;893:12;918:257;;1030:2;1018:9;1009:7;1005:23;1001:32;998:2;;;1051:6;1043;1036:22;998:2;1095:9;1082:23;1114:31;1139:5;1114:31;:::i;1180:261::-;;1303:2;1291:9;1282:7;1278:23;1274:32;1271:2;;;1324:6;1316;1309:22;1271:2;1361:9;1355:16;1380:31;1405:5;1380:31;:::i;1446:475::-;;;1584:2;1572:9;1563:7;1559:23;1555:32;1552:2;;;1605:6;1597;1590:22;1552:2;1649:9;1636:23;1668:31;1693:5;1668:31;:::i;:::-;1718:5;-1:-1:-1;1774:2:1;1759:18;;1746:32;1801:18;1790:30;;1787:2;;;1838:6;1830;1823:22;1787:2;1866:49;1907:7;1898:6;1887:9;1883:22;1866:49;:::i;:::-;1856:59;;;1542:379;;;;;:::o;1926:325::-;;;2055:2;2043:9;2034:7;2030:23;2026:32;2023:2;;;2076:6;2068;2061:22;2023:2;2120:9;2107:23;2139:31;2164:5;2139:31;:::i;:::-;2189:5;2241:2;2226:18;;;;2213:32;;-1:-1:-1;;;2013:238:1:o;2256:685::-;;;;;2428:3;2416:9;2407:7;2403:23;2399:33;2396:2;;;2450:6;2442;2435:22;2396:2;2494:9;2481:23;2513:31;2538:5;2513:31;:::i;:::-;2563:5;-1:-1:-1;2615:2:1;2600:18;;2587:32;;-1:-1:-1;2671:2:1;2656:18;;2643:32;2684:33;2643:32;2684:33;:::i;:::-;2736:7;-1:-1:-1;2794:2:1;2779:18;;2766:32;2821:18;2810:30;;2807:2;;;2858:6;2850;2843:22;2807:2;2886:49;2927:7;2918:6;2907:9;2903:22;2886:49;:::i;:::-;2876:59;;;2386:555;;;;;;;:::o;2946:531::-;;;;;;3126:3;3114:9;3105:7;3101:23;3097:33;3094:2;;;3148:6;3140;3133:22;3094:2;3192:9;3179:23;3211:31;3236:5;3211:31;:::i;:::-;3261:5;3313:2;3298:18;;3285:32;;-1:-1:-1;3364:2:1;3349:18;;3336:32;;3415:2;3400:18;;3387:32;;-1:-1:-1;3466:3:1;3451:19;3438:33;;-1:-1:-1;3084:393:1;-1:-1:-1;;;3084:393:1:o;3482:545::-;;;;3635:2;3623:9;3614:7;3610:23;3606:32;3603:2;;;3656:6;3648;3641:22;3603:2;3700:9;3687:23;3719:31;3744:5;3719:31;:::i;:::-;3769:5;-1:-1:-1;3793:36:1;3825:2;3810:18;;3793:36;:::i;:::-;3783:46;;3880:2;3869:9;3865:18;3852:32;3907:18;3899:6;3896:30;3893:2;;;3944:6;3936;3929:22;3893:2;3972:49;4013:7;4004:6;3993:9;3989:22;3972:49;:::i;:::-;3962:59;;;3593:434;;;;;:::o;4032:255::-;;4152:2;4140:9;4131:7;4127:23;4123:32;4120:2;;;4173:6;4165;4158:22;4120:2;4210:9;4204:16;4229:28;4251:5;4229:28;:::i;4292:190::-;;4404:2;4392:9;4383:7;4379:23;4375:32;4372:2;;;4425:6;4417;4410:22;4372:2;-1:-1:-1;4453:23:1;;4362:120;-1:-1:-1;4362:120:1:o;4487:408::-;;;4625:2;4613:9;4604:7;4600:23;4596:32;4593:2;;;4646:6;4638;4631:22;4593:2;4687:9;4674:23;4664:33;;4748:2;4737:9;4733:18;4720:32;4775:18;4767:6;4764:30;4761:2;;;4812:6;4804;4797:22;5095:194;;5218:2;5206:9;5197:7;5193:23;5189:32;5186:2;;;5239:6;5231;5224:22;5186:2;-1:-1:-1;5267:16:1;;5176:113;-1:-1:-1;5176:113:1:o;5294:1120::-;;;;;;;5517:3;5505:9;5496:7;5492:23;5488:33;5485:2;;;5539:6;5531;5524:22;5485:2;5580:9;5567:23;5557:33;;5640:2;5629:9;5625:18;5612:32;5653:31;5678:5;5653:31;:::i;:::-;5703:5;-1:-1:-1;5759:2:1;5744:18;;5731:32;5782:18;5812:14;;;5809:2;;;5844:6;5836;5829:22;5809:2;5872:49;5913:7;5904:6;5893:9;5889:22;5872:49;:::i;:::-;5862:59;;5974:2;5963:9;5959:18;5946:32;5930:48;;6003:2;5993:8;5990:16;5987:2;;;6024:6;6016;6009:22;5987:2;6052:51;6095:7;6084:8;6073:9;6069:24;6052:51;:::i;:::-;6042:61;;6155:3;6144:9;6140:19;6127:33;6112:48;;6169:30;6191:7;6169:30;:::i;:::-;6218:7;;-1:-1:-1;6278:3:1;6263:19;;6250:33;;6295:16;;;6292:2;;;6329:6;6321;6314:22;6292:2;;6357:51;6400:7;6389:8;6378:9;6374:24;6357:51;:::i;:::-;6347:61;;;5475:939;;;;;;;;:::o;6419:192::-;;6529:2;6517:9;6508:7;6504:23;6500:32;6497:2;;;6550:6;6542;6535:22;6497:2;6578:27;6595:9;6578:27;:::i;6616:258::-;;6696:5;6690:12;6723:6;6718:3;6711:19;6739:63;6795:6;6788:4;6783:3;6779:14;6772:4;6765:5;6761:16;6739:63;:::i;:::-;6856:2;6835:15;-1:-1:-1;;6831:29:1;6822:39;;;;6863:4;6818:50;;6666:208;-1:-1:-1;;6666:208:1:o;6879:274::-;;7046:6;7040:13;7062:53;7108:6;7103:3;7096:4;7088:6;7084:17;7062:53;:::i;:::-;7131:16;;;;;7016:137;-1:-1:-1;;7016:137:1:o;8650:363::-;-1:-1:-1;;;;;8864:32:1;;;;8846:51;;8945:6;8933:19;;;;8928:2;8913:18;;8906:47;9001:4;8989:17;8984:2;8969:18;;8962:45;8834:2;8819:18;;8801:212::o;9297:375::-;-1:-1:-1;;;;;9555:15:1;;;9537:34;;9602:2;9587:18;;9580:34;;;;9650:15;;;9645:2;9630:18;;9623:43;9487:2;9472:18;;9454:218::o;10219:563::-;10473:14;;10466:22;10448:41;;-1:-1:-1;;;;;10525:32:1;;10520:2;10505:18;;10498:60;10594:3;10589:2;10574:18;;10567:31;;;10219:563;;10621:46;;10647:19;;10639:6;10621:46;:::i;:::-;10715:9;10707:6;10703:22;10698:2;10687:9;10683:18;10676:50;10743:33;10769:6;10761;10743:33;:::i;11714:220::-;;11863:2;11852:9;11845:21;11883:45;11924:2;11913:9;11909:18;11901:6;11883:45;:::i;12695:335::-;12897:2;12879:21;;;12936:2;12916:18;;;12909:30;-1:-1:-1;;;12970:2:1;12955:18;;12948:41;13021:2;13006:18;;12869:161::o;22841:797::-;23148:25;;;-1:-1:-1;;;;;23209:32:1;;23204:2;23189:18;;23182:60;23278:3;23273:2;23258:18;;23251:31;;;22841:797;;23305:46;;23331:19;;23323:6;23305:46;:::i;:::-;23399:9;23391:6;23387:22;23382:2;23371:9;23367:18;23360:50;23427:33;23453:6;23445;23427:33;:::i;:::-;23504:14;;23497:22;23491:3;23476:19;;23469:51;-1:-1:-1;;23569:6:1;23557:19;;;;23551:3;23536:19;;23529:48;23626:4;23614:17;23608:3;23593:19;;;23586:46;23419:41;23138:500;-1:-1:-1;;;;23138:500:1:o;24546:224::-;;24613:6;24646:2;24643:1;24639:10;24676:2;24673:1;24669:10;24707:3;24703:2;24699:12;24694:3;24691:21;24688:2;;;24715:18;;:::i;:::-;24751:13;;24593:177;-1:-1:-1;;;;24593:177:1:o;24775:128::-;;24846:1;24842:6;24839:1;24836:13;24833:2;;;24852:18;;:::i;:::-;-1:-1:-1;24888:9:1;;24823:80::o;24908:125::-;;24976:1;24973;24970:8;24967:2;;;24981:18;;:::i;:::-;-1:-1:-1;25018:9:1;;24957:76::o;25038:258::-;25110:1;25120:113;25134:6;25131:1;25128:13;25120:113;;;25210:11;;;25204:18;25191:11;;;25184:39;25156:2;25149:10;25120:113;;;25251:6;25248:1;25245:13;25242:2;;;-1:-1:-1;;25286:1:1;25268:16;;25261:27;25091:205::o;25301:380::-;25386:1;25376:12;;25433:1;25423:12;;;25444:2;;25498:4;25490:6;25486:17;25476:27;;25444:2;25551;25543:6;25540:14;25520:18;25517:38;25514:2;;;25597:10;25592:3;25588:20;25585:1;25578:31;25632:4;25629:1;25622:15;25660:4;25657:1;25650:15;25686:127;25747:10;25742:3;25738:20;25735:1;25728:31;25778:4;25775:1;25768:15;25802:4;25799:1;25792:15;25818:127;25879:10;25874:3;25870:20;25867:1;25860:31;25910:4;25907:1;25900:15;25934:4;25931:1;25924:15;25950:131;-1:-1:-1;;;;;26025:31:1;;26015:42;;26005:2;;26071:1;26068;26061:12;26005:2;25995:86;:::o;26086:118::-;26172:5;26165:13;26158:21;26151:5;26148:32;26138:2;;26194:1;26191;26184:12
Swarm Source
ipfs://4c5fe76ad0d6129eee67c7087d424086077e067b6b48fb394f01293613d8023a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.