Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,870 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Update Valset | 17478703 | 456 days ago | IN | 0 ETH | 0.01587297 | ||||
Update Valset | 17474547 | 456 days ago | IN | 0 ETH | 0.01176838 | ||||
Update Valset | 17472546 | 456 days ago | IN | 0 ETH | 0.00705918 | ||||
Update Valset | 17472545 | 456 days ago | IN | 0 ETH | 0.01335687 | ||||
Update Valset | 17470543 | 457 days ago | IN | 0 ETH | 0.00590225 | ||||
Update Valset | 17470542 | 457 days ago | IN | 0 ETH | 0.00985259 | ||||
Update Valset | 17468539 | 457 days ago | IN | 0 ETH | 0.01249227 | ||||
Update Valset | 17463719 | 458 days ago | IN | 0 ETH | 0.00515988 | ||||
Update Valset | 17463719 | 458 days ago | IN | 0 ETH | 0.01181001 | ||||
Update Valset | 17453525 | 459 days ago | IN | 0 ETH | 0.00670063 | ||||
Update Valset | 17453525 | 459 days ago | IN | 0 ETH | 0.00670063 | ||||
Update Valset | 17453525 | 459 days ago | IN | 0 ETH | 0.01267979 | ||||
Update Valset | 17451523 | 459 days ago | IN | 0 ETH | 0.01288591 | ||||
Update Valset | 17449521 | 460 days ago | IN | 0 ETH | 0.00679318 | ||||
Update Valset | 17449521 | 460 days ago | IN | 0 ETH | 0.00679318 | ||||
Update Valset | 17449521 | 460 days ago | IN | 0 ETH | 0.00679318 | ||||
Update Valset | 17449521 | 460 days ago | IN | 0 ETH | 0.01286881 | ||||
Send To Cosmos | 17447909 | 460 days ago | IN | 0 ETH | 0.00162151 | ||||
Send To Cosmos | 17447892 | 460 days ago | IN | 0 ETH | 0.00187701 | ||||
Update Valset | 17447520 | 460 days ago | IN | 0 ETH | 0.03151846 | ||||
Update Valset | 17447519 | 460 days ago | IN | 0 ETH | 0.05992331 | ||||
Update Valset | 17445517 | 460 days ago | IN | 0 ETH | 0.00789604 | ||||
Update Valset | 17445517 | 460 days ago | IN | 0 ETH | 0.00789604 | ||||
Update Valset | 17445517 | 460 days ago | IN | 0 ETH | 0.01501404 | ||||
Update Valset | 17443515 | 460 days ago | IN | 0 ETH | 0.01256801 |
Latest 9 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
14245963 | 934 days ago | Contract Creation | 0 ETH | |||
14245746 | 934 days ago | Contract Creation | 0 ETH | |||
14245723 | 934 days ago | Contract Creation | 0 ETH | |||
14245720 | 934 days ago | Contract Creation | 0 ETH | |||
14245633 | 934 days ago | Contract Creation | 0 ETH | |||
14245622 | 934 days ago | Contract Creation | 0 ETH | |||
14245498 | 934 days ago | Contract Creation | 0 ETH | |||
14245437 | 934 days ago | Contract Creation | 0 ETH | |||
14212132 | 939 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
Gravity
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-15 */ // Sources flattened with hardhat v2.6.4 https://hardhat.org // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ 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' 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 require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File @openzeppelin/contracts/security/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/utils/cryptography/[email protected] pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File contracts/CosmosToken.sol pragma solidity 0.8.10; contract CosmosERC20 is ERC20 { uint256 MAX_UINT = 2**256 - 1; uint8 private cosmosDecimals; address private gravityAddress; // This override ensures we return the proper number of decimals // for the cosmos token function decimals() public view virtual override returns (uint8) { return cosmosDecimals; } // This is not an accurate total supply. Instead this is the total supply // of the given cosmos asset on Ethereum at this moment in time. Keeping // a totally accurate supply would require constant updates from the Cosmos // side, while in theory this could be piggy-backed on some existing bridge // operation it's a lot of complextiy to add so we chose to forgoe it. function totalSupply() public view virtual override returns (uint256) { return MAX_UINT - balanceOf(gravityAddress); } constructor( address _gravityAddress, string memory _name, string memory _symbol, uint8 _decimals ) ERC20(_name, _symbol) { cosmosDecimals = _decimals; gravityAddress = _gravityAddress; _mint(_gravityAddress, MAX_UINT); } } // File contracts/Gravity.sol //SPDX-License-Identifier: Apache-2.0 pragma solidity 0.8.10; error InvalidSignature(); error InvalidValsetNonce(uint256 newNonce, uint256 currentNonce); error InvalidBatchNonce(uint256 newNonce, uint256 currentNonce); error InvalidLogicCallNonce(uint256 newNonce, uint256 currentNonce); error InvalidLogicCallTransfers(); error InvalidLogicCallFees(); error InvalidSendToCosmos(); error IncorrectCheckpoint(); error MalformedNewValidatorSet(); error MalformedCurrentValidatorSet(); error MalformedBatch(); error InsufficientPower(uint256 cumulativePower, uint256 powerThreshold); error BatchTimedOut(); error LogicCallTimedOut(); // This is being used purely to avoid stack too deep errors struct LogicCallArgs { // Transfers out to the logic contract uint256[] transferAmounts; address[] transferTokenContracts; // The fees (transferred to msg.sender) uint256[] feeAmounts; address[] feeTokenContracts; // The arbitrary logic call address logicContractAddress; bytes payload; // Invalidation metadata uint256 timeOut; bytes32 invalidationId; uint256 invalidationNonce; } // This is used purely to avoid stack too deep errors // represents everything about a given validator set struct ValsetArgs { // the validators in this set, represented by an Ethereum address address[] validators; // the powers of the given validators in the same order as above uint256[] powers; // the nonce of this validator set uint256 valsetNonce; // the reward amount denominated in the below reward token, can be // set to zero uint256 rewardAmount; // the reward token, should be set to the zero address if not being used address rewardToken; } // This represents a validator signature struct Signature { uint8 v; bytes32 r; bytes32 s; } contract Gravity is ReentrancyGuard { using SafeERC20 for IERC20; // The number of 'votes' required to execute a valset // update or batch execution, set to 2/3 of 2^32 uint256 constant constant_powerThreshold = 2863311530; // These are updated often bytes32 public state_lastValsetCheckpoint; mapping(address => uint256) public state_lastBatchNonces; mapping(bytes32 => uint256) public state_invalidationMapping; uint256 public state_lastValsetNonce = 0; // event nonce zero is reserved by the Cosmos module as a special // value indicating that no events have yet been submitted uint256 public state_lastEventNonce = 1; // This is set once at initialization bytes32 public immutable state_gravityId; // TransactionBatchExecutedEvent and SendToCosmosEvent both include the field _eventNonce. // This is incremented every time one of these events is emitted. It is checked by the // Cosmos module to ensure that all events are received in order, and that none are lost. // // ValsetUpdatedEvent does not include the field _eventNonce because it is never submitted to the Cosmos // module. It is purely for the use of relayers to allow them to successfully submit batches. event TransactionBatchExecutedEvent( uint256 indexed _batchNonce, address indexed _token, uint256 _eventNonce ); event SendToCosmosEvent( address indexed _tokenContract, address indexed _sender, string _destination, uint256 _amount, uint256 _eventNonce ); event ERC20DeployedEvent( // FYI: Can't index on a string without doing a bunch of weird stuff string _cosmosDenom, address indexed _tokenContract, string _name, string _symbol, uint8 _decimals, uint256 _eventNonce ); event ValsetUpdatedEvent( uint256 indexed _newValsetNonce, uint256 _eventNonce, uint256 _rewardAmount, address _rewardToken, address[] _validators, uint256[] _powers ); event LogicCallEvent( bytes32 _invalidationId, uint256 _invalidationNonce, bytes _returnData, uint256 _eventNonce ); // TEST FIXTURES // These are here to make it easier to measure gas usage. They should be removed before production function testMakeCheckpoint(ValsetArgs calldata _valsetArgs, bytes32 _gravityId) external pure { makeCheckpoint(_valsetArgs, _gravityId); } function testCheckValidatorSignatures( ValsetArgs calldata _currentValset, Signature[] calldata _sigs, bytes32 _theHash, uint256 _powerThreshold ) external pure { checkValidatorSignatures(_currentValset, _sigs, _theHash, _powerThreshold); } // END TEST FIXTURES function lastBatchNonce(address _erc20Address) external view returns (uint256) { return state_lastBatchNonces[_erc20Address]; } function lastLogicCallNonce(bytes32 _invalidation_id) external view returns (uint256) { return state_invalidationMapping[_invalidation_id]; } // Utility function to verify geth style signatures function verifySig( address _signer, bytes32 _theHash, Signature calldata _sig ) private pure returns (bool) { bytes32 messageDigest = keccak256( abi.encodePacked("\x19Ethereum Signed Message:\n32", _theHash) ); return _signer == ECDSA.recover(messageDigest, _sig.v, _sig.r, _sig.s); } // Utility function to determine that a validator set and signatures are well formed function validateValset(ValsetArgs calldata _valset, Signature[] calldata _sigs) private pure { // Check that current validators, powers, and signatures (v,r,s) set is well-formed if ( _valset.validators.length != _valset.powers.length || _valset.validators.length != _sigs.length ) { revert MalformedCurrentValidatorSet(); } } // Make a new checkpoint from the supplied validator set // A checkpoint is a hash of all relevant information about the valset. This is stored by the contract, // instead of storing the information directly. This saves on storage and gas. // The format of the checkpoint is: // h(gravityId, "checkpoint", valsetNonce, validators[], powers[]) // Where h is the keccak256 hash function. // The validator powers must be decreasing or equal. This is important for checking the signatures on the // next valset, since it allows the caller to stop verifying signatures once a quorum of signatures have been verified. function makeCheckpoint(ValsetArgs memory _valsetArgs, bytes32 _gravityId) private pure returns (bytes32) { // bytes32 encoding of the string "checkpoint" bytes32 methodName = 0x636865636b706f696e7400000000000000000000000000000000000000000000; bytes32 checkpoint = keccak256( abi.encode( _gravityId, methodName, _valsetArgs.valsetNonce, _valsetArgs.validators, _valsetArgs.powers, _valsetArgs.rewardAmount, _valsetArgs.rewardToken ) ); return checkpoint; } function checkValidatorSignatures( // The current validator set and their powers ValsetArgs calldata _currentValset, // The current validator's signatures Signature[] calldata _sigs, // This is what we are checking they have signed bytes32 _theHash, uint256 _powerThreshold ) private pure { uint256 cumulativePower = 0; for (uint256 i = 0; i < _currentValset.validators.length; i++) { // If v is set to 0, this signifies that it was not possible to get a signature from this validator and we skip evaluation // (In a valid signature, it is either 27 or 28) if (_sigs[i].v != 0) { // Check that the current validator has signed off on the hash if (!verifySig(_currentValset.validators[i], _theHash, _sigs[i])) { revert InvalidSignature(); } // Sum up cumulative power cumulativePower = cumulativePower + _currentValset.powers[i]; // Break early to avoid wasting gas if (cumulativePower > _powerThreshold) { break; } } } // Check that there was enough power if (cumulativePower <= _powerThreshold) { revert InsufficientPower(cumulativePower, _powerThreshold); } // Success } // This updates the valset by checking that the validators in the current valset have signed off on the // new valset. The signatures supplied are the signatures of the current valset over the checkpoint hash // generated from the new valset. // Anyone can call this function, but they must supply valid signatures of constant_powerThreshold of the current valset over // the new valset. function updateValset( // The new version of the validator set ValsetArgs calldata _newValset, // The current validators that approve the change ValsetArgs calldata _currentValset, // These are arrays of the parts of the current validator's signatures Signature[] calldata _sigs ) external { // CHECKS // Check that the valset nonce is greater than the old one if (_newValset.valsetNonce <= _currentValset.valsetNonce) { revert InvalidValsetNonce({ newNonce: _newValset.valsetNonce, currentNonce: _currentValset.valsetNonce }); } // Check that the valset nonce is less than a million nonces forward from the old one // this makes it difficult for an attacker to lock out the contract by getting a single // bad validator set through with uint256 max nonce if (_newValset.valsetNonce > _currentValset.valsetNonce + 1000000) { revert InvalidValsetNonce({ newNonce: _newValset.valsetNonce, currentNonce: _currentValset.valsetNonce }); } // Check that new validators and powers set is well-formed if ( _newValset.validators.length != _newValset.powers.length || _newValset.validators.length == 0 ) { revert MalformedNewValidatorSet(); } // Check that current validators, powers, and signatures (v,r,s) set is well-formed validateValset(_currentValset, _sigs); // Check cumulative power to ensure the contract has sufficient power to actually // pass a vote uint256 cumulativePower = 0; for (uint256 i = 0; i < _newValset.powers.length; i++) { cumulativePower = cumulativePower + _newValset.powers[i]; if (cumulativePower > constant_powerThreshold) { break; } } if (cumulativePower <= constant_powerThreshold) { revert InsufficientPower({ cumulativePower: cumulativePower, powerThreshold: constant_powerThreshold }); } // Check that the supplied current validator set matches the saved checkpoint if (makeCheckpoint(_currentValset, state_gravityId) != state_lastValsetCheckpoint) { revert IncorrectCheckpoint(); } // Check that enough current validators have signed off on the new validator set bytes32 newCheckpoint = makeCheckpoint(_newValset, state_gravityId); checkValidatorSignatures(_currentValset, _sigs, newCheckpoint, constant_powerThreshold); // ACTIONS // Stored to be used next time to validate that the valset // supplied by the caller is correct. state_lastValsetCheckpoint = newCheckpoint; // Store new nonce state_lastValsetNonce = _newValset.valsetNonce; // Send submission reward to msg.sender if reward token is a valid value if (_newValset.rewardToken != address(0) && _newValset.rewardAmount != 0) { IERC20(_newValset.rewardToken).safeTransfer(msg.sender, _newValset.rewardAmount); } // LOGS state_lastEventNonce = state_lastEventNonce + 1; emit ValsetUpdatedEvent( _newValset.valsetNonce, state_lastEventNonce, _newValset.rewardAmount, _newValset.rewardToken, _newValset.validators, _newValset.powers ); } // submitBatch processes a batch of Cosmos -> Ethereum transactions by sending the tokens in the transactions // to the destination addresses. It is approved by the current Cosmos validator set. // Anyone can call this function, but they must supply valid signatures of constant_powerThreshold of the current valset over // the batch. function submitBatch( // The validators that approve the batch ValsetArgs calldata _currentValset, // These are arrays of the parts of the validators signatures Signature[] calldata _sigs, // The batch of transactions uint256[] calldata _amounts, address[] calldata _destinations, uint256[] calldata _fees, uint256 _batchNonce, address _tokenContract, // a block height beyond which this batch is not valid // used to provide a fee-free timeout uint256 _batchTimeout ) external nonReentrant { // CHECKS scoped to reduce stack depth { // Check that the batch nonce is higher than the last nonce for this token if (_batchNonce <= state_lastBatchNonces[_tokenContract]) { revert InvalidBatchNonce({ newNonce: _batchNonce, currentNonce: state_lastBatchNonces[_tokenContract] }); } // Check that the batch nonce is less than one million nonces forward from the old one // this makes it difficult for an attacker to lock out the contract by getting a single // bad batch through with uint256 max nonce if (_batchNonce > state_lastBatchNonces[_tokenContract] + 1000000) { revert InvalidBatchNonce({ newNonce: _batchNonce, currentNonce: state_lastBatchNonces[_tokenContract] }); } // Check that the block height is less than the timeout height if (block.number >= _batchTimeout) { revert BatchTimedOut(); } // Check that current validators, powers, and signatures (v,r,s) set is well-formed validateValset(_currentValset, _sigs); // Check that the supplied current validator set matches the saved checkpoint if (makeCheckpoint(_currentValset, state_gravityId) != state_lastValsetCheckpoint) { revert IncorrectCheckpoint(); } // Check that the transaction batch is well-formed if (_amounts.length != _destinations.length || _amounts.length != _fees.length) { revert MalformedBatch(); } // Check that enough current validators have signed off on the transaction batch and valset checkValidatorSignatures( _currentValset, _sigs, // Get hash of the transaction batch and checkpoint keccak256( abi.encode( state_gravityId, // bytes32 encoding of "transactionBatch" 0x7472616e73616374696f6e426174636800000000000000000000000000000000, _amounts, _destinations, _fees, _batchNonce, _tokenContract, _batchTimeout ) ), constant_powerThreshold ); // ACTIONS // Store batch nonce state_lastBatchNonces[_tokenContract] = _batchNonce; { // Send transaction amounts to destinations uint256 totalFee; for (uint256 i = 0; i < _amounts.length; i++) { IERC20(_tokenContract).safeTransfer(_destinations[i], _amounts[i]); totalFee = totalFee + _fees[i]; } // Send transaction fees to msg.sender IERC20(_tokenContract).safeTransfer(msg.sender, totalFee); } } // LOGS scoped to reduce stack depth { state_lastEventNonce = state_lastEventNonce + 1; emit TransactionBatchExecutedEvent(_batchNonce, _tokenContract, state_lastEventNonce); } } // This makes calls to contracts that execute arbitrary logic // First, it gives the logic contract some tokens // Then, it gives msg.senders tokens for fees // Then, it calls an arbitrary function on the logic contract // invalidationId and invalidationNonce are used for replay prevention. // They can be used to implement a per-token nonce by setting the token // address as the invalidationId and incrementing the nonce each call. // They can be used for nonce-free replay prevention by using a different invalidationId // for each call. function submitLogicCall( // The validators that approve the call ValsetArgs calldata _currentValset, // These are arrays of the parts of the validators signatures Signature[] calldata _sigs, LogicCallArgs memory _args ) external nonReentrant { // CHECKS scoped to reduce stack depth { // Check that the call has not timed out if (block.number >= _args.timeOut) { revert LogicCallTimedOut(); } // Check that the invalidation nonce is higher than the last nonce for this invalidation Id if (state_invalidationMapping[_args.invalidationId] >= _args.invalidationNonce) { revert InvalidLogicCallNonce({ newNonce: _args.invalidationNonce, currentNonce: state_invalidationMapping[_args.invalidationId] }); } // note the lack of nonce skipping check, it's not needed here since an attacker // will never be able to fill the invalidationId space, therefore a nonce lockout // is simply not possible // Check that current validators, powers, and signatures (v,r,s) set is well-formed validateValset(_currentValset, _sigs); // Check that the supplied current validator set matches the saved checkpoint if (makeCheckpoint(_currentValset, state_gravityId) != state_lastValsetCheckpoint) { revert IncorrectCheckpoint(); } if (_args.transferAmounts.length != _args.transferTokenContracts.length) { revert InvalidLogicCallTransfers(); } if (_args.feeAmounts.length != _args.feeTokenContracts.length) { revert InvalidLogicCallFees(); } } { bytes32 argsHash = keccak256( abi.encode( state_gravityId, // bytes32 encoding of "logicCall" 0x6c6f67696343616c6c0000000000000000000000000000000000000000000000, _args.transferAmounts, _args.transferTokenContracts, _args.feeAmounts, _args.feeTokenContracts, _args.logicContractAddress, _args.payload, _args.timeOut, _args.invalidationId, _args.invalidationNonce ) ); // Check that enough current validators have signed off on the transaction batch and valset checkValidatorSignatures( _currentValset, _sigs, // Get hash of the transaction batch and checkpoint argsHash, constant_powerThreshold ); } // ACTIONS // Update invaldiation nonce state_invalidationMapping[_args.invalidationId] = _args.invalidationNonce; // Send tokens to the logic contract for (uint256 i = 0; i < _args.transferAmounts.length; i++) { IERC20(_args.transferTokenContracts[i]).safeTransfer( _args.logicContractAddress, _args.transferAmounts[i] ); } // Make call to logic contract bytes memory returnData = Address.functionCall(_args.logicContractAddress, _args.payload); // Send fees to msg.sender for (uint256 i = 0; i < _args.feeAmounts.length; i++) { IERC20(_args.feeTokenContracts[i]).safeTransfer(msg.sender, _args.feeAmounts[i]); } // LOGS scoped to reduce stack depth { state_lastEventNonce = state_lastEventNonce + 1; emit LogicCallEvent( _args.invalidationId, _args.invalidationNonce, returnData, state_lastEventNonce ); } } function sendToCosmos( address _tokenContract, string calldata _destination, uint256 _amount ) external nonReentrant { // we snapshot our current balance of this token uint256 ourStartingBalance = IERC20(_tokenContract).balanceOf(address(this)); // attempt to transfer the user specified amount IERC20(_tokenContract).safeTransferFrom(msg.sender, address(this), _amount); // check what this particular ERC20 implementation actually gave us, since it doesn't // have to be at all related to the _amount uint256 ourEndingBalance = IERC20(_tokenContract).balanceOf(address(this)); // a very strange ERC20 may trigger this condition, if we didn't have this we would // underflow, so it's mostly just an error message printer if (ourEndingBalance <= ourStartingBalance) { revert InvalidSendToCosmos(); } state_lastEventNonce = state_lastEventNonce + 1; // emit to Cosmos the actual amount our balance has changed, rather than the user // provided amount. This protects against a small set of wonky ERC20 behavior, like // burning on send but not tokens that for example change every users balance every day. emit SendToCosmosEvent( _tokenContract, msg.sender, _destination, ourEndingBalance - ourStartingBalance, state_lastEventNonce ); } function deployERC20( string calldata _cosmosDenom, string calldata _name, string calldata _symbol, uint8 _decimals ) external { // Deploy an ERC20 with entire supply granted to Gravity.sol CosmosERC20 erc20 = new CosmosERC20(address(this), _name, _symbol, _decimals); // Fire an event to let the Cosmos module know state_lastEventNonce = state_lastEventNonce + 1; emit ERC20DeployedEvent( _cosmosDenom, address(erc20), _name, _symbol, _decimals, state_lastEventNonce ); } constructor( // A unique identifier for this gravity instance to use in signatures bytes32 _gravityId, // The validator set, not in valset args format since many of it's // arguments would never be used in this case address[] memory _validators, uint256[] memory _powers ) { // CHECKS // Check that validators, powers, and signatures (v,r,s) set is well-formed if (_validators.length != _powers.length || _validators.length == 0) { revert MalformedCurrentValidatorSet(); } // Check cumulative power to ensure the contract has sufficient power to actually // pass a vote uint256 cumulativePower = 0; for (uint256 i = 0; i < _powers.length; i++) { cumulativePower = cumulativePower + _powers[i]; if (cumulativePower > constant_powerThreshold) { break; } } if (cumulativePower <= constant_powerThreshold) { revert InsufficientPower({ cumulativePower: cumulativePower, powerThreshold: constant_powerThreshold }); } ValsetArgs memory _valset; _valset = ValsetArgs(_validators, _powers, 0, 0, address(0)); bytes32 newCheckpoint = makeCheckpoint(_valset, _gravityId); // ACTIONS state_gravityId = _gravityId; state_lastValsetCheckpoint = newCheckpoint; // LOGS emit ValsetUpdatedEvent( state_lastValsetNonce, state_lastEventNonce, 0, address(0), _validators, _powers ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"bytes32","name":"_gravityId","type":"bytes32"},{"internalType":"address[]","name":"_validators","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BatchTimedOut","type":"error"},{"inputs":[],"name":"IncorrectCheckpoint","type":"error"},{"inputs":[{"internalType":"uint256","name":"cumulativePower","type":"uint256"},{"internalType":"uint256","name":"powerThreshold","type":"uint256"}],"name":"InsufficientPower","type":"error"},{"inputs":[{"internalType":"uint256","name":"newNonce","type":"uint256"},{"internalType":"uint256","name":"currentNonce","type":"uint256"}],"name":"InvalidBatchNonce","type":"error"},{"inputs":[],"name":"InvalidLogicCallFees","type":"error"},{"inputs":[{"internalType":"uint256","name":"newNonce","type":"uint256"},{"internalType":"uint256","name":"currentNonce","type":"uint256"}],"name":"InvalidLogicCallNonce","type":"error"},{"inputs":[],"name":"InvalidLogicCallTransfers","type":"error"},{"inputs":[],"name":"InvalidSendToCosmos","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"newNonce","type":"uint256"},{"internalType":"uint256","name":"currentNonce","type":"uint256"}],"name":"InvalidValsetNonce","type":"error"},{"inputs":[],"name":"LogicCallTimedOut","type":"error"},{"inputs":[],"name":"MalformedBatch","type":"error"},{"inputs":[],"name":"MalformedCurrentValidatorSet","type":"error"},{"inputs":[],"name":"MalformedNewValidatorSet","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_cosmosDenom","type":"string"},{"indexed":true,"internalType":"address","name":"_tokenContract","type":"address"},{"indexed":false,"internalType":"string","name":"_name","type":"string"},{"indexed":false,"internalType":"string","name":"_symbol","type":"string"},{"indexed":false,"internalType":"uint8","name":"_decimals","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"_eventNonce","type":"uint256"}],"name":"ERC20DeployedEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_invalidationId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_invalidationNonce","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_returnData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_eventNonce","type":"uint256"}],"name":"LogicCallEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_tokenContract","type":"address"},{"indexed":true,"internalType":"address","name":"_sender","type":"address"},{"indexed":false,"internalType":"string","name":"_destination","type":"string"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_eventNonce","type":"uint256"}],"name":"SendToCosmosEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_batchNonce","type":"uint256"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_eventNonce","type":"uint256"}],"name":"TransactionBatchExecutedEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_newValsetNonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_eventNonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_rewardAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_rewardToken","type":"address"},{"indexed":false,"internalType":"address[]","name":"_validators","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"ValsetUpdatedEvent","type":"event"},{"inputs":[{"internalType":"string","name":"_cosmosDenom","type":"string"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"}],"name":"deployERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc20Address","type":"address"}],"name":"lastBatchNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_invalidation_id","type":"bytes32"}],"name":"lastLogicCallNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"string","name":"_destination","type":"string"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sendToCosmos","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"state_gravityId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"state_invalidationMapping","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"state_lastBatchNonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"state_lastEventNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"state_lastValsetCheckpoint","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"state_lastValsetNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address[]","name":"validators","type":"address[]"},{"internalType":"uint256[]","name":"powers","type":"uint256[]"},{"internalType":"uint256","name":"valsetNonce","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"address","name":"rewardToken","type":"address"}],"internalType":"struct ValsetArgs","name":"_currentValset","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct Signature[]","name":"_sigs","type":"tuple[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"address[]","name":"_destinations","type":"address[]"},{"internalType":"uint256[]","name":"_fees","type":"uint256[]"},{"internalType":"uint256","name":"_batchNonce","type":"uint256"},{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_batchTimeout","type":"uint256"}],"name":"submitBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address[]","name":"validators","type":"address[]"},{"internalType":"uint256[]","name":"powers","type":"uint256[]"},{"internalType":"uint256","name":"valsetNonce","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"address","name":"rewardToken","type":"address"}],"internalType":"struct ValsetArgs","name":"_currentValset","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct Signature[]","name":"_sigs","type":"tuple[]"},{"components":[{"internalType":"uint256[]","name":"transferAmounts","type":"uint256[]"},{"internalType":"address[]","name":"transferTokenContracts","type":"address[]"},{"internalType":"uint256[]","name":"feeAmounts","type":"uint256[]"},{"internalType":"address[]","name":"feeTokenContracts","type":"address[]"},{"internalType":"address","name":"logicContractAddress","type":"address"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"uint256","name":"timeOut","type":"uint256"},{"internalType":"bytes32","name":"invalidationId","type":"bytes32"},{"internalType":"uint256","name":"invalidationNonce","type":"uint256"}],"internalType":"struct LogicCallArgs","name":"_args","type":"tuple"}],"name":"submitLogicCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address[]","name":"validators","type":"address[]"},{"internalType":"uint256[]","name":"powers","type":"uint256[]"},{"internalType":"uint256","name":"valsetNonce","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"address","name":"rewardToken","type":"address"}],"internalType":"struct ValsetArgs","name":"_currentValset","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct Signature[]","name":"_sigs","type":"tuple[]"},{"internalType":"bytes32","name":"_theHash","type":"bytes32"},{"internalType":"uint256","name":"_powerThreshold","type":"uint256"}],"name":"testCheckValidatorSignatures","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address[]","name":"validators","type":"address[]"},{"internalType":"uint256[]","name":"powers","type":"uint256[]"},{"internalType":"uint256","name":"valsetNonce","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"address","name":"rewardToken","type":"address"}],"internalType":"struct ValsetArgs","name":"_valsetArgs","type":"tuple"},{"internalType":"bytes32","name":"_gravityId","type":"bytes32"}],"name":"testMakeCheckpoint","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address[]","name":"validators","type":"address[]"},{"internalType":"uint256[]","name":"powers","type":"uint256[]"},{"internalType":"uint256","name":"valsetNonce","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"address","name":"rewardToken","type":"address"}],"internalType":"struct ValsetArgs","name":"_newValset","type":"tuple"},{"components":[{"internalType":"address[]","name":"validators","type":"address[]"},{"internalType":"uint256[]","name":"powers","type":"uint256[]"},{"internalType":"uint256","name":"valsetNonce","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"address","name":"rewardToken","type":"address"}],"internalType":"struct ValsetArgs","name":"_currentValset","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct Signature[]","name":"_sigs","type":"tuple[]"}],"name":"updateValset","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a0604052600060045560016005553480156200001b57600080fd5b5060405162003ac238038062003ac28339810160408190526200003e916200032f565b6001600055805182511415806200005457508151155b15620000735760405163c6617b7b60e01b815260040160405180910390fd5b6000805b8251811015620000d55782818151811062000096576200009662000418565b602002602001015182620000ab919062000444565b915063aaaaaaaa821115620000c057620000d5565b80620000cc816200045f565b91505062000077565b5063aaaaaaaa81116200010b5760405162bfb6ab60e01b81526004810182905263aaaaaaaa602482015260440160405180910390fd5b620001476040518060a001604052806060815260200160608152602001600081526020016000815260200160006001600160a01b031681525090565b506040805160a0810182528481526020810184905260009181018290526060810182905260808101829052906200017f8287620001e1565b6080879052600181905560045460055460405192935090917f76d08978c024a4bf8cbb30c67fd78fcaa1827cbc533e4e175f36d07e64ccf96a91620001cd9160009081908b908b90620004f5565b60405180910390a2505050505050620005a4565b6000806918da1958dadc1bda5b9d60b21b60001b90506000838286604001518760000151886020015189606001518a608001516040516020016200022c979695949392919062000544565b60408051808303601f19018152919052805160209091012095945050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200028e576200028e6200024d565b604052919050565b60006001600160401b03821115620002b257620002b26200024d565b5060051b60200190565b600082601f830112620002ce57600080fd5b81516020620002e7620002e18362000296565b62000263565b82815260059290921b840181019181810190868411156200030757600080fd5b8286015b848110156200032457805183529183019183016200030b565b509695505050505050565b6000806000606084860312156200034557600080fd5b8351602080860151919450906001600160401b03808211156200036757600080fd5b818701915087601f8301126200037c57600080fd5b81516200038d620002e18262000296565b81815260059190911b8301840190848101908a831115620003ad57600080fd5b938501935b82851015620003e45784516001600160a01b0381168114620003d45760008081fd5b82529385019390850190620003b2565b60408a01519097509450505080831115620003fe57600080fd5b50506200040e86828701620002bc565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156200045a576200045a6200042e565b500190565b60006000198214156200047657620004766200042e565b5060010190565b600081518084526020808501945080840160005b83811015620004b85781516001600160a01b03168752958201959082019060010162000491565b509495945050505050565b600081518084526020808501945080840160005b83811015620004b857815187529582019590820190600101620004d7565b85815284602082015260018060a01b038416604082015260a0606082015260006200052460a08301856200047d565b8281036080840152620005388185620004c3565b98975050505050505050565b87815286602082015285604082015260e0606082015260006200056b60e08301876200047d565b82810360808401526200057f8187620004c3565b60a084019590955250506001600160a01b039190911660c09091015295945050505050565b6080516134ed620005d5600039600081816102140152818161055e015281816105f901526109b501526134ed6000f3fe60806040523480156200001157600080fd5b5060043610620001085760003560e01c80638690ff9811620000a3578063c9d194d5116200006e578063c9d194d51462000236578063df97174b1462000259578063f2b53307146200027c578063f7955637146200028657600080fd5b80638690ff9814620001d6578063aca6b1c114620001ed578063b56561fe1462000204578063bdda81d4146200020e57600080fd5b80630f21235711620000e45780630f212357146200017b5780636941db93146200019257806373b2054714620001a95780637dfb6f8614620001b357600080fd5b8062901153146200010d578063010315251462000126578063011b2174146200013d575b600080fd5b620001246200011e36600462001893565b6200029d565b005b620001246200013736600462001914565b620002b3565b620001696200014e36600462001979565b6001600160a01b031660009081526002602052604090205490565b60405190815260200160405180910390f35b620001246200018c366004620019db565b620002ce565b62000124620001a336600462001c29565b62000490565b6200016960055481565b62000169620001c436600462001dc5565b60036020526000908152604090205481565b62000124620001e736600462001e26565b62000825565b62000124620001fe36600462001f5f565b62000b7a565b6200016960045481565b620001697f000000000000000000000000000000000000000000000000000000000000000081565b620001696200024736600462001dc5565b60009081526003602052604090205490565b620001696200026a36600462001979565b60026020526000908152604090205481565b6200016960015481565b620001246200029736600462002005565b62000e69565b620002ac858585858562000f21565b5050505050565b620002c9620002c283620020bb565b826200107b565b505050565b60026000541415620002fd5760405162461bcd60e51b8152600401620002f49062002171565b60405180910390fd5b600260009081556040516370a0823160e01b81523060048201526001600160a01b038616906370a0823190602401602060405180830381865afa15801562000349573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200036f9190620021a8565b9050620003886001600160a01b038616333085620010e7565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a0823190602401602060405180830381865afa158015620003d0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003f69190620021a8565b905081811162000419576040516321739d9b60e01b815260040160405180910390fd5b60055462000429906001620021d8565b600555336001600160a01b0387167f9e9794dbf94b0a0aa31a480f5b38550eda7f89115ac8fbf4953fa4dd219900c98787620004668787620021f3565b6005546040516200047b949392919062002236565b60405180910390a35050600160005550505050565b60026000541415620004b65760405162461bcd60e51b8152600401620002f49062002171565b600260005560c08101514310620004e05760405163bcf37c2560e01b815260040160405180910390fd5b61010081015160e0820151600090815260036020526040902054106200053d5761010081015160e082015160009081526003602052604090819020549051629427e960e11b815260048101929092526024820152604401620002f4565b6200054a8484846200115a565b600154620005836200055c86620020bb565b7f00000000000000000000000000000000000000000000000000000000000000006200107b565b14620005a25760405163723a340360e01b815260040160405180910390fd5b60208101515181515114620005ca57604051634298a95160e11b815260040160405180910390fd5b80606001515181604001515114620005f557604051634829247960e01b815260040160405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000681b1bd9da58d0d85b1b60ba1b836000015184602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001516040516020016200066f9b9a9998979695949392919062002334565b6040516020818303038152906040528051906020012090506200069a8585858463aaaaaaaa62000f21565b5061010081015160e08201516000908152600360205260408120919091555b8151518110156200073d5762000728826080015183600001518381518110620006e657620006e6620023e4565b602002602001015184602001518481518110620007075762000707620023e4565b60200260200101516001600160a01b0316620011b39092919063ffffffff16565b806200073481620023fa565b915050620006b9565b5060006200075482608001518360a00151620011e5565b905060005b826040015151811015620007bb57620007a63384604001518381518110620007855762000785620023e4565b602002602001015185606001518481518110620007075762000707620023e4565b80620007b281620023fa565b91505062000759565b50600554620007cc906001620021d8565b600581905560e08301516101008401516040517f7c2bb24f8e1b3725cb613d7f11ef97d9745cc97a0e40f730621c052d684077a1936200081193929186919062002418565b60405180910390a150506001600055505050565b600260005414156200084b5760405162461bcd60e51b8152600401620002f49062002171565b600260008181556001600160a01b038416815260209190915260409020548311620008af576001600160a01b0382166000908152600260205260409081902054905163f7f920ad60e01b8152620002f4918591600401918252602082015260400190565b6001600160a01b038216600090815260026020526040902054620008d790620f4240620021d8565b8311156200091e576001600160a01b0382166000908152600260205260409081902054905163f7f920ad60e01b8152620002f4918591600401918252602082015260400190565b8043106200093f576040516308b9266360e11b815260040160405180910390fd5b6200094c8c8c8c6200115a565b6001546200095e6200055c8e620020bb565b146200097d5760405163723a340360e01b815260040160405180910390fd5b87861415806200098d5750878414155b15620009ac5760405163c1f97e3560e01b815260040160405180910390fd5b62000a2e8c8c8c7f00000000000000000000000000000000000000000000000000000000000000006f0e8e4c2dce6c2c6e8d2dedc84c2e8c6d60831b8e8e8e8e8e8e8e8e8e60405160200162000a0d9b9a99989796959493929190620024c1565b6040516020818303038152906040528051906020012063aaaaaaaa62000f21565b6001600160a01b0382166000908152600260205260408120849055805b8981101562000afa5762000aba89898381811062000a6d5762000a6d620023e4565b905060200201602081019062000a84919062001979565b8c8c8481811062000a995762000a99620023e4565b90506020020135866001600160a01b0316620011b39092919063ffffffff16565b86868281811062000acf5762000acf620023e4565b905060200201358262000ae39190620021d8565b91508062000af181620023fa565b91505062000a4b565b5062000b116001600160a01b0384163383620011b3565b5060055462000b22906001620021d8565b60058190556040519081526001600160a01b0383169084907f02c7e81975f8edb86e2a0c038b7b86a49c744236abf0f6177ff5afc6986ab7089060200160405180910390a35050600160005550505050505050505050565b826040013584604001351162000bb3576040805163e0e8edf360e01b8152818601356004820152908401356024820152604401620002f4565b62000bc66040840135620f4240620021d8565b8460400135111562000bfb576040805163e0e8edf360e01b8152818601356004820152908401356024820152604401620002f4565b62000c0a60208501856200253f565b905062000c1885806200253f565b905014158062000c33575062000c2f84806200253f565b1590505b1562000c525760405163c01ba0ab60e01b815260040160405180910390fd5b62000c5f8383836200115a565b6000805b62000c7260208701876200253f565b905081101562000cdc5762000c8b60208701876200253f565b8281811062000c9e5762000c9e620023e4565b905060200201358262000cb29190620021d8565b915063aaaaaaaa82111562000cc75762000cdc565b8062000cd381620023fa565b91505062000c63565b5063aaaaaaaa811162000d0f5760405162bfb6ab60e01b81526004810182905263aaaaaaaa6024820152604401620002f4565b60015462000d216200055c86620020bb565b1462000d405760405163723a340360e01b815260040160405180910390fd5b600062000d516200055c87620020bb565b905062000d668585858463aaaaaaaa62000f21565b60018190556040860135600455600062000d8760a088016080890162001979565b6001600160a01b03161415801562000da25750606086013515155b1562000dd55762000dd533606088013562000dc460a08a0160808b0162001979565b6001600160a01b03169190620011b3565b60055462000de5906001620021d8565b60058190556040870135907f76d08978c024a4bf8cbb30c67fd78fcaa1827cbc533e4e175f36d07e64ccf96a90606089013562000e2960a08b0160808c0162001979565b62000e358b806200253f565b62000e4460208e018e6200253f565b60405162000e5997969594939291906200258b565b60405180910390a2505050505050565b600030868686868660405162000e7f906200181e565b62000e9096959493929190620025de565b604051809103906000f08015801562000ead573d6000803e3d6000fd5b509050600554600162000ec19190620021d8565b60058190556040516001600160a01b038316917f82fe3a4fa49c6382d0c085746698ddbbafe6c2bf61285b19410644b5b26287c79162000f0f918c918c918c918c918c918c918c9162002631565b60405180910390a25050505050505050565b6000805b62000f3187806200253f565b9050811015620010475785858281811062000f505762000f50620023e4565b62000f6892602060609092020190810191506200268e565b60ff1615620010325762000fcd62000f8188806200253f565b8381811062000f945762000f94620023e4565b905060200201602081019062000fab919062001979565b8588888581811062000fc15762000fc1620023e4565b90506060020162001230565b62000feb57604051638baa579f60e01b815260040160405180910390fd5b62000ffa60208801886200253f565b828181106200100d576200100d620023e4565b9050602002013582620010219190620021d8565b915082821115620010325762001047565b806200103e81620023fa565b91505062000f25565b50818111620010735760405162bfb6ab60e01b81526004810182905260248101839052604401620002f4565b505050505050565b6000806918da1958dadc1bda5b9d60b21b60001b90506000838286604001518760000151886020015189606001518a60800151604051602001620010c69796959493929190620026ac565b60408051808303601f19018152919052805160209091012095945050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620011549085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152620012c5565b50505050565b6200116960208401846200253f565b90506200117784806200253f565b9050141580620011945750806200118f84806200253f565b905014155b15620002c95760405163c6617b7b60e01b815260040160405180910390fd5b6040516001600160a01b038316602482015260448101829052620002c990849063a9059cbb60e01b906064016200111c565b60606200122983836040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c656400008152506200139e565b9392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018390526000908190605c0160408051601f1981840301815291905280516020918201209150620012a790829062001297908601866200268e565b85602001358660400135620013b7565b6001600160a01b0316856001600160a01b0316149150509392505050565b60006200131c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200139e9092919063ffffffff16565b805190915015620002c957808060200190518101906200133d91906200270c565b620002c95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620002f4565b6060620013af8484600085620013e3565b949350505050565b6000806000620013ca8787878762001515565b91509150620013d9816200160a565b5095945050505050565b606082471015620014465760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401620002f4565b843b620014965760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620002f4565b600080866001600160a01b03168587604051620014b4919062002730565b60006040518083038185875af1925050503d8060008114620014f3576040519150601f19603f3d011682016040523d82523d6000602084013e620014f8565b606091505b50915091506200150a828286620017e0565b979650505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156200154e575060009050600362001601565b8460ff16601b141580156200156757508460ff16601c14155b156200157a575060009050600462001601565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015620015cf573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116620015fa5760006001925092505062001601565b9150600090505b94509492505050565b60008160048111156200162157620016216200274e565b14156200162b5750565b60018160048111156200164257620016426200274e565b1415620016925760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401620002f4565b6002816004811115620016a957620016a96200274e565b1415620016f95760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401620002f4565b60038160048111156200171057620017106200274e565b14156200176b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401620002f4565b60048160048111156200178257620017826200274e565b1415620017dd5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401620002f4565b50565b60608315620017f157508162001229565b825115620018025782518084602001fd5b8160405162461bcd60e51b8152600401620002f4919062002764565b610d3e806200277a83390190565b600060a082840312156200183f57600080fd5b50919050565b60008083601f8401126200185857600080fd5b5081356001600160401b038111156200187057600080fd5b6020830191508360206060830285010111156200188c57600080fd5b9250929050565b600080600080600060808688031215620018ac57600080fd5b85356001600160401b0380821115620018c457600080fd5b620018d289838a016200182c565b96506020880135915080821115620018e957600080fd5b50620018f88882890162001845565b9699909850959660408101359660609091013595509350505050565b600080604083850312156200192857600080fd5b82356001600160401b038111156200193f57600080fd5b6200194d858286016200182c565b95602094909401359450505050565b80356001600160a01b03811681146200197457600080fd5b919050565b6000602082840312156200198c57600080fd5b62001229826200195c565b60008083601f840112620019aa57600080fd5b5081356001600160401b03811115620019c257600080fd5b6020830191508360208285010111156200188c57600080fd5b60008060008060608587031215620019f257600080fd5b620019fd856200195c565b935060208501356001600160401b0381111562001a1957600080fd5b62001a278782880162001997565b9598909750949560400135949350505050565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b038111828210171562001a765762001a7662001a3a565b60405290565b604051601f8201601f191681016001600160401b038111828210171562001aa75762001aa762001a3a565b604052919050565b60006001600160401b0382111562001acb5762001acb62001a3a565b5060051b60200190565b600082601f83011262001ae757600080fd5b8135602062001b0062001afa8362001aaf565b62001a7c565b82815260059290921b8401810191818101908684111562001b2057600080fd5b8286015b8481101562001b3d578035835291830191830162001b24565b509695505050505050565b600082601f83011262001b5a57600080fd5b8135602062001b6d62001afa8362001aaf565b82815260059290921b8401810191818101908684111562001b8d57600080fd5b8286015b8481101562001b3d5762001ba5816200195c565b835291830191830162001b91565b600082601f83011262001bc557600080fd5b81356001600160401b0381111562001be15762001be162001a3a565b62001bf6601f8201601f191660200162001a7c565b81815284602083860101111562001c0c57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806060858703121562001c4057600080fd5b84356001600160401b038082111562001c5857600080fd5b62001c66888389016200182c565b9550602087013591508082111562001c7d57600080fd5b62001c8b8883890162001845565b9095509350604087013591508082111562001ca557600080fd5b90860190610120828903121562001cbb57600080fd5b62001cc562001a50565b82358281111562001cd557600080fd5b62001ce38a82860162001ad5565b82525060208301358281111562001cf957600080fd5b62001d078a82860162001b48565b60208301525060408301358281111562001d2057600080fd5b62001d2e8a82860162001ad5565b60408301525060608301358281111562001d4757600080fd5b62001d558a82860162001b48565b60608301525062001d69608084016200195c565b608082015260a08301358281111562001d8157600080fd5b62001d8f8a82860162001bb3565b60a08301525060c083013560c082015260e083013560e08201526101009150818301358282015280935050505092959194509250565b60006020828403121562001dd857600080fd5b5035919050565b60008083601f84011262001df257600080fd5b5081356001600160401b0381111562001e0a57600080fd5b6020830191508360208260051b85010111156200188c57600080fd5b6000806000806000806000806000806000806101008d8f03121562001e4a57600080fd5b6001600160401b038d35111562001e6057600080fd5b62001e6f8e8e358f016200182c565b9b506001600160401b0360208e0135111562001e8a57600080fd5b62001e9c8e60208f01358f0162001845565b909b5099506001600160401b0360408e0135111562001eba57600080fd5b62001ecc8e60408f01358f0162001ddf565b90995097506001600160401b0360608e0135111562001eea57600080fd5b62001efc8e60608f01358f0162001ddf565b90975095506001600160401b0360808e0135111562001f1a57600080fd5b62001f2c8e60808f01358f0162001ddf565b909550935060a08d0135925062001f4660c08e016200195c565b915060e08d013590509295989b509295989b509295989b565b6000806000806060858703121562001f7657600080fd5b84356001600160401b038082111562001f8e57600080fd5b62001f9c888389016200182c565b9550602087013591508082111562001fb357600080fd5b62001fc1888389016200182c565b9450604087013591508082111562001fd857600080fd5b5062001fe78782880162001845565b95989497509550505050565b803560ff811681146200197457600080fd5b60008060008060008060006080888a0312156200202157600080fd5b87356001600160401b03808211156200203957600080fd5b620020478b838c0162001997565b909950975060208a01359150808211156200206157600080fd5b6200206f8b838c0162001997565b909750955060408a01359150808211156200208957600080fd5b50620020988a828b0162001997565b9094509250620020ad90506060890162001ff3565b905092959891949750929550565b600060a08236031215620020ce57600080fd5b60405160a081016001600160401b038282108183111715620020f457620020f462001a3a565b8160405284359150808211156200210a57600080fd5b620021183683870162001b48565b835260208501359150808211156200212f57600080fd5b506200213e3682860162001ad5565b602083015250604083013560408201526060830135606082015262002166608084016200195c565b608082015292915050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600060208284031215620021bb57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115620021ee57620021ee620021c2565b500190565b600082821015620022085762002208620021c2565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006200224c6060830186886200220d565b6020830194909452506040015292915050565b600081518084526020808501945080840160005b83811015620022915781518752958201959082019060010162002273565b509495945050505050565b600081518084526020808501945080840160005b83811015620022915781516001600160a01b031687529582019590820190600101620022b0565b60005b83811015620022f4578181015183820152602001620022da565b83811115620011545750506000910152565b6000815180845262002320816020860160208601620022d7565b601f01601f19169290920160200192915050565b60006101608d83528c6020840152806040840152620023568184018d6200225f565b905082810360608401526200236c818c6200229c565b9050828103608084015262002382818b6200225f565b905082810360a084015262002398818a6200229c565b6001600160a01b03891660c085015283810360e08501529050620023bd818862002306565b61010084019690965250506101208101929092526101409091015298975050505050505050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415620024115762002411620021c2565b5060010190565b84815283602082015260806040820152600062002439608083018562002306565b905082606083015295945050505050565b81835260006001600160fb1b038311156200246457600080fd5b8260051b8083602087013760009401602001938452509192915050565b8183526000602080850194508260005b8581101562002291576001600160a01b03620024ad836200195c565b168752958201959082019060010162002491565b60006101008d83528c6020840152806040840152620024e48184018c8e6200244a565b90508281036060840152620024fb818a8c62002481565b905082810360808401526200251281888a6200244a565b60a084019690965250506001600160a01b039290921660c083015260e09091015298975050505050505050565b6000808335601e198436030181126200255757600080fd5b8301803591506001600160401b038211156200257257600080fd5b6020019150600581901b36038213156200188c57600080fd5b87815286602082015260018060a01b038616604082015260a060608201526000620025bb60a08301868862002481565b8281036080840152620025d08185876200244a565b9a9950505050505050505050565b6001600160a01b03871681526080602082018190526000906200260590830187896200220d565b82810360408401526200261a8186886200220d565b91505060ff83166060830152979650505050505050565b60a0815260006200264760a083018a8c6200220d565b82810360208401526200265c81898b6200220d565b90508281036040840152620026738187896200220d565b60ff9590951660608401525050608001529695505050505050565b600060208284031215620026a157600080fd5b620012298262001ff3565b87815286602082015285604082015260e060608201526000620026d360e08301876200229c565b8281036080840152620026e781876200225f565b60a084019590955250506001600160a01b039190911660c09091015295945050505050565b6000602082840312156200271f57600080fd5b815180151581146200122957600080fd5b6000825162002744818460208701620022d7565b9190910192915050565b634e487b7160e01b600052602160045260246000fd5b6020815260006200122960208301846200230656fe60806040526000196005553480156200001757600080fd5b5060405162000d3e38038062000d3e8339810160408190526200003a9162000307565b8251839083906200005390600390602085019062000194565b5080516200006990600490602084019062000194565b5050600680546001600160a01b038716610100026001600160a81b031990911660ff85161717905550600554620000a2908590620000ac565b505050506200040f565b6001600160a01b038216620001075760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b80600260008282546200011b9190620003ab565b90915550506001600160a01b038216600090815260208190526040812080548392906200014a908490620003ab565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054620001a290620003d2565b90600052602060002090601f016020900481019282620001c6576000855562000211565b82601f10620001e157805160ff191683800117855562000211565b8280016001018555821562000211579182015b8281111562000211578251825591602001919060010190620001f4565b506200021f92915062000223565b5090565b5b808211156200021f576000815560010162000224565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200026257600080fd5b81516001600160401b03808211156200027f576200027f6200023a565b604051601f8301601f19908116603f01168101908282118183101715620002aa57620002aa6200023a565b81604052838152602092508683858801011115620002c757600080fd5b600091505b83821015620002eb5785820183015181830184015290820190620002cc565b83821115620002fd5760008385830101525b9695505050505050565b600080600080608085870312156200031e57600080fd5b84516001600160a01b03811681146200033657600080fd5b60208601519094506001600160401b03808211156200035457600080fd5b620003628883890162000250565b945060408701519150808211156200037957600080fd5b50620003888782880162000250565b925050606085015160ff81168114620003a057600080fd5b939692955090935050565b60008219821115620003cd57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620003e757607f821691505b602082108114156200040957634e487b7160e01b600052602260045260246000fd5b50919050565b61091f806200041f6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461012d57806370a082311461014057806395d89b4114610169578063a457c2d714610171578063a9059cbb14610184578063dd62ed3e1461019757600080fd5b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100ef57806323b872dd14610105578063313ce56714610118575b600080fd5b6100b66101d0565b6040516100c3919061073d565b60405180910390f35b6100df6100da3660046107ae565b610262565b60405190151581526020016100c3565b6100f7610278565b6040519081526020016100c3565b6100df6101133660046107d8565b6102aa565b60065460405160ff90911681526020016100c3565b6100df61013b3660046107ae565b610359565b6100f761014e366004610814565b6001600160a01b031660009081526020819052604090205490565b6100b6610395565b6100df61017f3660046107ae565b6103a4565b6100df6101923660046107ae565b61043d565b6100f76101a5366004610836565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101df90610869565b80601f016020809104026020016040519081016040528092919081815260200182805461020b90610869565b80156102585780601f1061022d57610100808354040283529160200191610258565b820191906000526020600020905b81548152906001019060200180831161023b57829003601f168201915b5050505050905090565b600061026f33848461044a565b50600192915050565b60065461010090046001600160a01b03166000908152602081905260408120546005546102a591906108ba565b905090565b60006102b784848461056e565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156103415760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b61034e853385840361044a565b506001949350505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161026f9185906103909086906108d1565b61044a565b6060600480546101df90610869565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156104265760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610338565b610433338585840361044a565b5060019392505050565b600061026f33848461056e565b6001600160a01b0383166104ac5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610338565b6001600160a01b03821661050d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610338565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166105d25760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610338565b6001600160a01b0382166106345760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610338565b6001600160a01b038316600090815260208190526040902054818110156106ac5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610338565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906106e39084906108d1565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161072f91815260200190565b60405180910390a350505050565b600060208083528351808285015260005b8181101561076a5785810183015185820160400152820161074e565b8181111561077c576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b03811681146107a957600080fd5b919050565b600080604083850312156107c157600080fd5b6107ca83610792565b946020939093013593505050565b6000806000606084860312156107ed57600080fd5b6107f684610792565b925061080460208501610792565b9150604084013590509250925092565b60006020828403121561082657600080fd5b61082f82610792565b9392505050565b6000806040838503121561084957600080fd5b61085283610792565b915061086060208401610792565b90509250929050565b600181811c9082168061087d57607f821691505b6020821081141561089e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156108cc576108cc6108a4565b500390565b600082198211156108e4576108e46108a4565b50019056fea26469706673582212206b3bf1a166b949cd18353b6d94b554999b8e89c754be4601220c3be4b82168a264736f6c634300080a0033a2646970667358221220f67b85cde71509af3b69e23a70a8d2edf79e584fb932eba1c9dd0668f0286f1f64736f6c634300080a0033756d65652d31000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000c60000000000000000000000000000000000000000000000000000000000000005f0000000000000000000000002963dd11b4c127a761b3af199862dd5919b1876d000000000000000000000000c90bcf9de4f342ef996897a0faed092c1c90c15e0000000000000000000000008478f135377f85b3b64a0df15a30542a61e8f262000000000000000000000000a64c628befd8d8155b0d2df03a02554281c75c6f000000000000000000000000fd316257b518ffe7a70122bcbe01d22d2c09a7b30000000000000000000000001e7b7a07551c9d80f3f0bb416dc39f37a45c2ba7000000000000000000000000615e62fc2ab666383d28c29019e085b50f0a55b20000000000000000000000008a308e02844bd3166e0a9354718f029d0b6b811f00000000000000000000000059695e392c561ec0fc4684b1d162fd347f57d24a0000000000000000000000001ec1312903117511f08f4a92479154dc3093ffb10000000000000000000000004d6637ace87524bf36e6f9f30f0baddd5a9c3fed0000000000000000000000009003411094b4384c6211eee977f2ce9019ed24cf0000000000000000000000004a363bae2763f7e932a8c649f01c759f7bee10980000000000000000000000007be1199687b5f3b1c99d4b5c4e5f46227affa3dc0000000000000000000000008c4cc69c137bc3d9566aba0c9d73e977c37263b50000000000000000000000001adbbd0cb3f7323a40c970291c703b5144db1e65000000000000000000000000fd669d32564d2762256257021a693c3f4a934487000000000000000000000000189d77ae52ac0efbe175313682414c411b6cfc4900000000000000000000000060f4bb38ee01f77b503fb19b42f3c8c84b799e2c000000000000000000000000c1991cc0b50c55f338f54aee399a0473fa3752dc0000000000000000000000007f5bc7da5d9cd40e7d3e500acf127ed7d44c2d4b000000000000000000000000cafefef5b02608fc18c99b0995f71d408ae2272000000000000000000000000034e53c5d145fb2ca0376832392f802095a6ea72a0000000000000000000000002cdbb93892961c11ae95bcc4cb916b0bb9c6a5ec000000000000000000000000bc5ed70eeace4bbe268b5a7b5426ea761ff0fde2000000000000000000000000f404080e350e2e7a7ad8e72b6bf5cb3ac8c1caec000000000000000000000000207b8560966ba68dfd6e8026a0a29093df500bfb000000000000000000000000b2f3ad626e7dced875b8f28b844dac931fcf111d000000000000000000000000e87065b88507de9579af6a93363201c2507be565000000000000000000000000e104e2c853e67b1fedbe68523b3083a592f1e97b0000000000000000000000002a9b1170b373951838b2aaa6928917f6503892b200000000000000000000000029051f290c1f5f563286164dc8fa0c33ee70366a000000000000000000000000317245422cef19674593f2997f2490a6dc3ba7ea00000000000000000000000020f3e88bccebc0b6d268f57f73fbc3dbe386698900000000000000000000000000123453c85b1f18a7c11b163bbadfce009ecb4d0000000000000000000000006df637989f8464e46223fe5e9db916251fbd9b170000000000000000000000002023dee3ae77c7c31b0d24545753b4ab8f89f96b000000000000000000000000a4b477489dc89313da2a8eadfde689d1b2020665000000000000000000000000182ab18c41bcf7f3db018159a62900906f719649000000000000000000000000c152b5046d690fd9e40a720be2b35a9048b34afc000000000000000000000000e63f6e6adb60c4449d36e39778bc4ceb928836300000000000000000000000005d490a0c6347db722a55068e5c3be5ee459da92a00000000000000000000000079d1769330d66ab3bf1a4c69c359d4b89530d335000000000000000000000000039c34e3cbcf4d6f32b4cb1b5df9d93e415a486200000000000000000000000080c43dbe50bfdd0f1e59e717dc11334156d5969100000000000000000000000091da10335df87924c907c29e74fc82d67410f8c900000000000000000000000005ba7a3af02cd86e60e803ab3bbaaa64afeadf2100000000000000000000000005ecef0db679dd9ab0985df5f1d78c5fbe7dcf760000000000000000000000000a1ce21f51c708dcc99549d85ffc21e4f0c0302a0000000000000000000000000a70098ebb8d9a9b02356d3aaff786eabccfd81e0000000000000000000000000e3f38bc4bb2d8924b4cedb82f52a2bd8fc32e3d0000000000000000000000001aacd42b608626953964fca1a0a4ec924a82407b0000000000000000000000002598f7feff0b12ea3c17f9270c7199c78dede90f00000000000000000000000029b63a7bd276f9df7e87efba07b34b92b9418eb90000000000000000000000002c89b757842b70261e1a394eb7a9e1f20b7185a800000000000000000000000033ea9eebf8f712fb9745d8ccaacd5298eeaf2eff000000000000000000000000360b492a9713f02bbb262c88f1f7653df11c43bd0000000000000000000000003cdc56b3b599df34188bdff4cc847d86b891872b00000000000000000000000045eb5e207e5dd7cd773750eae63b867f1f54d8220000000000000000000000004e6aa73cbb43c30069d54303e16f767ac32de064000000000000000000000000517593dcc43b2ac25463a6c874d315a714f644e100000000000000000000000054c800f2570fe8b3ec07f3aa92dbec448acc2efe00000000000000000000000060962ceafae64153054e1f03fff6acbaece0ddd00000000000000000000000006129a4b88af189df6dc7702381e0a8e9243c31aa0000000000000000000000006d588c5ddb0fff0c2723e0cfdc019b885daba4740000000000000000000000006dbdcb3f1f76e1589c93f09b13f109a2425041b10000000000000000000000006ec17a931af7fce45a859de77761b696c6be0bc5000000000000000000000000797b8fae19d4fc23bc166b04ea40f958f2f3c62f0000000000000000000000007f20b1e6d3cd50e7b51ddba958ee9201e81ec1f60000000000000000000000007ed76c0edc7d44e5d28735b9d720753d0b4f4f250000000000000000000000008265c07930a507059e7fdd36ab9dc3876c00f0390000000000000000000000008a70fe949435d37028f216cf3174fb584ba40a2400000000000000000000000092ce6d61637f9fa82fa85aa1786f3c0bc143c28b00000000000000000000000098a877dc459f5a71f0e367ccba870e97a20e1f8f0000000000000000000000009d8f2bc6be2a6695b1843b8631d277e472604f750000000000000000000000009fb438f1a292fbdaf4f569a8f2e2e2972c0172ec0000000000000000000000009e9959fee01da59b42853329422bd20355f90a4f0000000000000000000000009fa93dfafd7bc5ad9cb2128331cb5acae2ec36a40000000000000000000000009fe2b5a8f63d475e17e39235c6a0c13bc1bfe1c8000000000000000000000000a1a61a1f19ff98186d261c9b579cd1f1fa2304d4000000000000000000000000a602d18eec7565766df301bf4ef18253dde19ec1000000000000000000000000aa6f1cbaf011bd15a79b0545dbaaa4f068727d81000000000000000000000000b09a7beabf4b6b474ec4dab1d9b5f426be81b97b000000000000000000000000b9ba33b91aab0ac46870a8b7d7a3c719cce3cf92000000000000000000000000bbb07921101dde205cc1701ea1d6521d34f8d70a000000000000000000000000bd1d5cd181377383a645e87cd4351ae32b42ad2b000000000000000000000000bfc00b89fc699fcac355f9ff1681e65c91118268000000000000000000000000c8e0f3af24f4d1b96d12262f90213fbf81d3ea71000000000000000000000000d27c60e8bea725dc9e540289dd1dbeb0ccc3e9f8000000000000000000000000d6d0f36bc04e1861a1ed683b4ce550440b49c507000000000000000000000000e21fcb8aff718e47723ffed559da2bf2d66882c2000000000000000000000000eeeee5e7fa69a5d258b1377b116b4a0020cbca1b000000000000000000000000a7705d98610c146438e04fed78e6c7d2e1d8dcdd000000000000000000000000c8924c7ff40cd8c66987dac23ccc78191fb3ce0c000000000000000000000000f9290ba316efcd0190a93beac53e7bde19b33665000000000000000000000000000000000000000000000000000000000000005f000000000000000000000000000000000000000000000000000000007acefae1000000000000000000000000000000000000000000000000000000000ca928e3000000000000000000000000000000000000000000000000000000000a7defd50000000000000000000000000000000000000000000000000000000008395d1b0000000000000000000000000000000000000000000000000000000005b6478400000000000000000000000000000000000000000000000000000000056c8e110000000000000000000000000000000000000000000000000000000004b52930000000000000000000000000000000000000000000000000000000000456ead500000000000000000000000000000000000000000000000000000000043767ac000000000000000000000000000000000000000000000000000000000417f74b000000000000000000000000000000000000000000000000000000000417f74b0000000000000000000000000000000000000000000000000000000003c9995e0000000000000000000000000000000000000000000000000000000003af2b5d00000000000000000000000000000000000000000000000000000000039f732d00000000000000000000000000000000000000000000000000000000038540310000000000000000000000000000000000000000000000000000000003704a9b00000000000000000000000000000000000000000000000000000000034ec1ab000000000000000000000000000000000000000000000000000000000324d67f0000000000000000000000000000000000000000000000000000000002dd93810000000000000000000000000000000000000000000000000000000002bce3e0000000000000000000000000000000000000000000000000000000000284e5b6000000000000000000000000000000000000000000000000000000000284d040000000000000000000000000000000000000000000000000000000000280d4ca000000000000000000000000000000000000000000000000000000000274c79300000000000000000000000000000000000000000000000000000000024247320000000000000000000000000000000000000000000000000000000002262ea100000000000000000000000000000000000000000000000000000000021ba3bd0000000000000000000000000000000000000000000000000000000002196afd0000000000000000000000000000000000000000000000000000000002196afd000000000000000000000000000000000000000000000000000000000219659f00000000000000000000000000000000000000000000000000000000020bfba5000000000000000000000000000000000000000000000000000000000198b23e00000000000000000000000000000000000000000000000000000000018e3a2100000000000000000000000000000000000000000000000000000000016ec9c00000000000000000000000000000000000000000000000000000000001490fb2000000000000000000000000000000000000000000000000000000000143da5900000000000000000000000000000000000000000000000000000000013a63c900000000000000000000000000000000000000000000000000000000013a63c900000000000000000000000000000000000000000000000000000000010c9aaa000000000000000000000000000000000000000000000000000000000105fdd20000000000000000000000000000000000000000000000000000000000ca16fa0000000000000000000000000000000000000000000000000000000000c71a6200000000000000000000000000000000000000000000000000000000009d31e4000000000000000000000000000000000000000000000000000000000068cbed0000000000000000000000000000000000000000000000000000000000010c470000000000000000000000000000000000000000000000000000000000001ad300000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae
Deployed Bytecode
0x60806040523480156200001157600080fd5b5060043610620001085760003560e01c80638690ff9811620000a3578063c9d194d5116200006e578063c9d194d51462000236578063df97174b1462000259578063f2b53307146200027c578063f7955637146200028657600080fd5b80638690ff9814620001d6578063aca6b1c114620001ed578063b56561fe1462000204578063bdda81d4146200020e57600080fd5b80630f21235711620000e45780630f212357146200017b5780636941db93146200019257806373b2054714620001a95780637dfb6f8614620001b357600080fd5b8062901153146200010d578063010315251462000126578063011b2174146200013d575b600080fd5b620001246200011e36600462001893565b6200029d565b005b620001246200013736600462001914565b620002b3565b620001696200014e36600462001979565b6001600160a01b031660009081526002602052604090205490565b60405190815260200160405180910390f35b620001246200018c366004620019db565b620002ce565b62000124620001a336600462001c29565b62000490565b6200016960055481565b62000169620001c436600462001dc5565b60036020526000908152604090205481565b62000124620001e736600462001e26565b62000825565b62000124620001fe36600462001f5f565b62000b7a565b6200016960045481565b620001697f756d65652d31000000000000000000000000000000000000000000000000000081565b620001696200024736600462001dc5565b60009081526003602052604090205490565b620001696200026a36600462001979565b60026020526000908152604090205481565b6200016960015481565b620001246200029736600462002005565b62000e69565b620002ac858585858562000f21565b5050505050565b620002c9620002c283620020bb565b826200107b565b505050565b60026000541415620002fd5760405162461bcd60e51b8152600401620002f49062002171565b60405180910390fd5b600260009081556040516370a0823160e01b81523060048201526001600160a01b038616906370a0823190602401602060405180830381865afa15801562000349573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200036f9190620021a8565b9050620003886001600160a01b038616333085620010e7565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a0823190602401602060405180830381865afa158015620003d0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003f69190620021a8565b905081811162000419576040516321739d9b60e01b815260040160405180910390fd5b60055462000429906001620021d8565b600555336001600160a01b0387167f9e9794dbf94b0a0aa31a480f5b38550eda7f89115ac8fbf4953fa4dd219900c98787620004668787620021f3565b6005546040516200047b949392919062002236565b60405180910390a35050600160005550505050565b60026000541415620004b65760405162461bcd60e51b8152600401620002f49062002171565b600260005560c08101514310620004e05760405163bcf37c2560e01b815260040160405180910390fd5b61010081015160e0820151600090815260036020526040902054106200053d5761010081015160e082015160009081526003602052604090819020549051629427e960e11b815260048101929092526024820152604401620002f4565b6200054a8484846200115a565b600154620005836200055c86620020bb565b7f756d65652d3100000000000000000000000000000000000000000000000000006200107b565b14620005a25760405163723a340360e01b815260040160405180910390fd5b60208101515181515114620005ca57604051634298a95160e11b815260040160405180910390fd5b80606001515181604001515114620005f557604051634829247960e01b815260040160405180910390fd5b60007f756d65652d310000000000000000000000000000000000000000000000000000681b1bd9da58d0d85b1b60ba1b836000015184602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001516040516020016200066f9b9a9998979695949392919062002334565b6040516020818303038152906040528051906020012090506200069a8585858463aaaaaaaa62000f21565b5061010081015160e08201516000908152600360205260408120919091555b8151518110156200073d5762000728826080015183600001518381518110620006e657620006e6620023e4565b602002602001015184602001518481518110620007075762000707620023e4565b60200260200101516001600160a01b0316620011b39092919063ffffffff16565b806200073481620023fa565b915050620006b9565b5060006200075482608001518360a00151620011e5565b905060005b826040015151811015620007bb57620007a63384604001518381518110620007855762000785620023e4565b602002602001015185606001518481518110620007075762000707620023e4565b80620007b281620023fa565b91505062000759565b50600554620007cc906001620021d8565b600581905560e08301516101008401516040517f7c2bb24f8e1b3725cb613d7f11ef97d9745cc97a0e40f730621c052d684077a1936200081193929186919062002418565b60405180910390a150506001600055505050565b600260005414156200084b5760405162461bcd60e51b8152600401620002f49062002171565b600260008181556001600160a01b038416815260209190915260409020548311620008af576001600160a01b0382166000908152600260205260409081902054905163f7f920ad60e01b8152620002f4918591600401918252602082015260400190565b6001600160a01b038216600090815260026020526040902054620008d790620f4240620021d8565b8311156200091e576001600160a01b0382166000908152600260205260409081902054905163f7f920ad60e01b8152620002f4918591600401918252602082015260400190565b8043106200093f576040516308b9266360e11b815260040160405180910390fd5b6200094c8c8c8c6200115a565b6001546200095e6200055c8e620020bb565b146200097d5760405163723a340360e01b815260040160405180910390fd5b87861415806200098d5750878414155b15620009ac5760405163c1f97e3560e01b815260040160405180910390fd5b62000a2e8c8c8c7f756d65652d3100000000000000000000000000000000000000000000000000006f0e8e4c2dce6c2c6e8d2dedc84c2e8c6d60831b8e8e8e8e8e8e8e8e8e60405160200162000a0d9b9a99989796959493929190620024c1565b6040516020818303038152906040528051906020012063aaaaaaaa62000f21565b6001600160a01b0382166000908152600260205260408120849055805b8981101562000afa5762000aba89898381811062000a6d5762000a6d620023e4565b905060200201602081019062000a84919062001979565b8c8c8481811062000a995762000a99620023e4565b90506020020135866001600160a01b0316620011b39092919063ffffffff16565b86868281811062000acf5762000acf620023e4565b905060200201358262000ae39190620021d8565b91508062000af181620023fa565b91505062000a4b565b5062000b116001600160a01b0384163383620011b3565b5060055462000b22906001620021d8565b60058190556040519081526001600160a01b0383169084907f02c7e81975f8edb86e2a0c038b7b86a49c744236abf0f6177ff5afc6986ab7089060200160405180910390a35050600160005550505050505050505050565b826040013584604001351162000bb3576040805163e0e8edf360e01b8152818601356004820152908401356024820152604401620002f4565b62000bc66040840135620f4240620021d8565b8460400135111562000bfb576040805163e0e8edf360e01b8152818601356004820152908401356024820152604401620002f4565b62000c0a60208501856200253f565b905062000c1885806200253f565b905014158062000c33575062000c2f84806200253f565b1590505b1562000c525760405163c01ba0ab60e01b815260040160405180910390fd5b62000c5f8383836200115a565b6000805b62000c7260208701876200253f565b905081101562000cdc5762000c8b60208701876200253f565b8281811062000c9e5762000c9e620023e4565b905060200201358262000cb29190620021d8565b915063aaaaaaaa82111562000cc75762000cdc565b8062000cd381620023fa565b91505062000c63565b5063aaaaaaaa811162000d0f5760405162bfb6ab60e01b81526004810182905263aaaaaaaa6024820152604401620002f4565b60015462000d216200055c86620020bb565b1462000d405760405163723a340360e01b815260040160405180910390fd5b600062000d516200055c87620020bb565b905062000d668585858463aaaaaaaa62000f21565b60018190556040860135600455600062000d8760a088016080890162001979565b6001600160a01b03161415801562000da25750606086013515155b1562000dd55762000dd533606088013562000dc460a08a0160808b0162001979565b6001600160a01b03169190620011b3565b60055462000de5906001620021d8565b60058190556040870135907f76d08978c024a4bf8cbb30c67fd78fcaa1827cbc533e4e175f36d07e64ccf96a90606089013562000e2960a08b0160808c0162001979565b62000e358b806200253f565b62000e4460208e018e6200253f565b60405162000e5997969594939291906200258b565b60405180910390a2505050505050565b600030868686868660405162000e7f906200181e565b62000e9096959493929190620025de565b604051809103906000f08015801562000ead573d6000803e3d6000fd5b509050600554600162000ec19190620021d8565b60058190556040516001600160a01b038316917f82fe3a4fa49c6382d0c085746698ddbbafe6c2bf61285b19410644b5b26287c79162000f0f918c918c918c918c918c918c918c9162002631565b60405180910390a25050505050505050565b6000805b62000f3187806200253f565b9050811015620010475785858281811062000f505762000f50620023e4565b62000f6892602060609092020190810191506200268e565b60ff1615620010325762000fcd62000f8188806200253f565b8381811062000f945762000f94620023e4565b905060200201602081019062000fab919062001979565b8588888581811062000fc15762000fc1620023e4565b90506060020162001230565b62000feb57604051638baa579f60e01b815260040160405180910390fd5b62000ffa60208801886200253f565b828181106200100d576200100d620023e4565b9050602002013582620010219190620021d8565b915082821115620010325762001047565b806200103e81620023fa565b91505062000f25565b50818111620010735760405162bfb6ab60e01b81526004810182905260248101839052604401620002f4565b505050505050565b6000806918da1958dadc1bda5b9d60b21b60001b90506000838286604001518760000151886020015189606001518a60800151604051602001620010c69796959493929190620026ac565b60408051808303601f19018152919052805160209091012095945050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620011549085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152620012c5565b50505050565b6200116960208401846200253f565b90506200117784806200253f565b9050141580620011945750806200118f84806200253f565b905014155b15620002c95760405163c6617b7b60e01b815260040160405180910390fd5b6040516001600160a01b038316602482015260448101829052620002c990849063a9059cbb60e01b906064016200111c565b60606200122983836040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c656400008152506200139e565b9392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018390526000908190605c0160408051601f1981840301815291905280516020918201209150620012a790829062001297908601866200268e565b85602001358660400135620013b7565b6001600160a01b0316856001600160a01b0316149150509392505050565b60006200131c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200139e9092919063ffffffff16565b805190915015620002c957808060200190518101906200133d91906200270c565b620002c95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620002f4565b6060620013af8484600085620013e3565b949350505050565b6000806000620013ca8787878762001515565b91509150620013d9816200160a565b5095945050505050565b606082471015620014465760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401620002f4565b843b620014965760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620002f4565b600080866001600160a01b03168587604051620014b4919062002730565b60006040518083038185875af1925050503d8060008114620014f3576040519150601f19603f3d011682016040523d82523d6000602084013e620014f8565b606091505b50915091506200150a828286620017e0565b979650505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156200154e575060009050600362001601565b8460ff16601b141580156200156757508460ff16601c14155b156200157a575060009050600462001601565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015620015cf573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116620015fa5760006001925092505062001601565b9150600090505b94509492505050565b60008160048111156200162157620016216200274e565b14156200162b5750565b60018160048111156200164257620016426200274e565b1415620016925760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401620002f4565b6002816004811115620016a957620016a96200274e565b1415620016f95760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401620002f4565b60038160048111156200171057620017106200274e565b14156200176b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401620002f4565b60048160048111156200178257620017826200274e565b1415620017dd5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401620002f4565b50565b60608315620017f157508162001229565b825115620018025782518084602001fd5b8160405162461bcd60e51b8152600401620002f4919062002764565b610d3e806200277a83390190565b600060a082840312156200183f57600080fd5b50919050565b60008083601f8401126200185857600080fd5b5081356001600160401b038111156200187057600080fd5b6020830191508360206060830285010111156200188c57600080fd5b9250929050565b600080600080600060808688031215620018ac57600080fd5b85356001600160401b0380821115620018c457600080fd5b620018d289838a016200182c565b96506020880135915080821115620018e957600080fd5b50620018f88882890162001845565b9699909850959660408101359660609091013595509350505050565b600080604083850312156200192857600080fd5b82356001600160401b038111156200193f57600080fd5b6200194d858286016200182c565b95602094909401359450505050565b80356001600160a01b03811681146200197457600080fd5b919050565b6000602082840312156200198c57600080fd5b62001229826200195c565b60008083601f840112620019aa57600080fd5b5081356001600160401b03811115620019c257600080fd5b6020830191508360208285010111156200188c57600080fd5b60008060008060608587031215620019f257600080fd5b620019fd856200195c565b935060208501356001600160401b0381111562001a1957600080fd5b62001a278782880162001997565b9598909750949560400135949350505050565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b038111828210171562001a765762001a7662001a3a565b60405290565b604051601f8201601f191681016001600160401b038111828210171562001aa75762001aa762001a3a565b604052919050565b60006001600160401b0382111562001acb5762001acb62001a3a565b5060051b60200190565b600082601f83011262001ae757600080fd5b8135602062001b0062001afa8362001aaf565b62001a7c565b82815260059290921b8401810191818101908684111562001b2057600080fd5b8286015b8481101562001b3d578035835291830191830162001b24565b509695505050505050565b600082601f83011262001b5a57600080fd5b8135602062001b6d62001afa8362001aaf565b82815260059290921b8401810191818101908684111562001b8d57600080fd5b8286015b8481101562001b3d5762001ba5816200195c565b835291830191830162001b91565b600082601f83011262001bc557600080fd5b81356001600160401b0381111562001be15762001be162001a3a565b62001bf6601f8201601f191660200162001a7c565b81815284602083860101111562001c0c57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806060858703121562001c4057600080fd5b84356001600160401b038082111562001c5857600080fd5b62001c66888389016200182c565b9550602087013591508082111562001c7d57600080fd5b62001c8b8883890162001845565b9095509350604087013591508082111562001ca557600080fd5b90860190610120828903121562001cbb57600080fd5b62001cc562001a50565b82358281111562001cd557600080fd5b62001ce38a82860162001ad5565b82525060208301358281111562001cf957600080fd5b62001d078a82860162001b48565b60208301525060408301358281111562001d2057600080fd5b62001d2e8a82860162001ad5565b60408301525060608301358281111562001d4757600080fd5b62001d558a82860162001b48565b60608301525062001d69608084016200195c565b608082015260a08301358281111562001d8157600080fd5b62001d8f8a82860162001bb3565b60a08301525060c083013560c082015260e083013560e08201526101009150818301358282015280935050505092959194509250565b60006020828403121562001dd857600080fd5b5035919050565b60008083601f84011262001df257600080fd5b5081356001600160401b0381111562001e0a57600080fd5b6020830191508360208260051b85010111156200188c57600080fd5b6000806000806000806000806000806000806101008d8f03121562001e4a57600080fd5b6001600160401b038d35111562001e6057600080fd5b62001e6f8e8e358f016200182c565b9b506001600160401b0360208e0135111562001e8a57600080fd5b62001e9c8e60208f01358f0162001845565b909b5099506001600160401b0360408e0135111562001eba57600080fd5b62001ecc8e60408f01358f0162001ddf565b90995097506001600160401b0360608e0135111562001eea57600080fd5b62001efc8e60608f01358f0162001ddf565b90975095506001600160401b0360808e0135111562001f1a57600080fd5b62001f2c8e60808f01358f0162001ddf565b909550935060a08d0135925062001f4660c08e016200195c565b915060e08d013590509295989b509295989b509295989b565b6000806000806060858703121562001f7657600080fd5b84356001600160401b038082111562001f8e57600080fd5b62001f9c888389016200182c565b9550602087013591508082111562001fb357600080fd5b62001fc1888389016200182c565b9450604087013591508082111562001fd857600080fd5b5062001fe78782880162001845565b95989497509550505050565b803560ff811681146200197457600080fd5b60008060008060008060006080888a0312156200202157600080fd5b87356001600160401b03808211156200203957600080fd5b620020478b838c0162001997565b909950975060208a01359150808211156200206157600080fd5b6200206f8b838c0162001997565b909750955060408a01359150808211156200208957600080fd5b50620020988a828b0162001997565b9094509250620020ad90506060890162001ff3565b905092959891949750929550565b600060a08236031215620020ce57600080fd5b60405160a081016001600160401b038282108183111715620020f457620020f462001a3a565b8160405284359150808211156200210a57600080fd5b620021183683870162001b48565b835260208501359150808211156200212f57600080fd5b506200213e3682860162001ad5565b602083015250604083013560408201526060830135606082015262002166608084016200195c565b608082015292915050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600060208284031215620021bb57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115620021ee57620021ee620021c2565b500190565b600082821015620022085762002208620021c2565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006200224c6060830186886200220d565b6020830194909452506040015292915050565b600081518084526020808501945080840160005b83811015620022915781518752958201959082019060010162002273565b509495945050505050565b600081518084526020808501945080840160005b83811015620022915781516001600160a01b031687529582019590820190600101620022b0565b60005b83811015620022f4578181015183820152602001620022da565b83811115620011545750506000910152565b6000815180845262002320816020860160208601620022d7565b601f01601f19169290920160200192915050565b60006101608d83528c6020840152806040840152620023568184018d6200225f565b905082810360608401526200236c818c6200229c565b9050828103608084015262002382818b6200225f565b905082810360a084015262002398818a6200229c565b6001600160a01b03891660c085015283810360e08501529050620023bd818862002306565b61010084019690965250506101208101929092526101409091015298975050505050505050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415620024115762002411620021c2565b5060010190565b84815283602082015260806040820152600062002439608083018562002306565b905082606083015295945050505050565b81835260006001600160fb1b038311156200246457600080fd5b8260051b8083602087013760009401602001938452509192915050565b8183526000602080850194508260005b8581101562002291576001600160a01b03620024ad836200195c565b168752958201959082019060010162002491565b60006101008d83528c6020840152806040840152620024e48184018c8e6200244a565b90508281036060840152620024fb818a8c62002481565b905082810360808401526200251281888a6200244a565b60a084019690965250506001600160a01b039290921660c083015260e09091015298975050505050505050565b6000808335601e198436030181126200255757600080fd5b8301803591506001600160401b038211156200257257600080fd5b6020019150600581901b36038213156200188c57600080fd5b87815286602082015260018060a01b038616604082015260a060608201526000620025bb60a08301868862002481565b8281036080840152620025d08185876200244a565b9a9950505050505050505050565b6001600160a01b03871681526080602082018190526000906200260590830187896200220d565b82810360408401526200261a8186886200220d565b91505060ff83166060830152979650505050505050565b60a0815260006200264760a083018a8c6200220d565b82810360208401526200265c81898b6200220d565b90508281036040840152620026738187896200220d565b60ff9590951660608401525050608001529695505050505050565b600060208284031215620026a157600080fd5b620012298262001ff3565b87815286602082015285604082015260e060608201526000620026d360e08301876200229c565b8281036080840152620026e781876200225f565b60a084019590955250506001600160a01b039190911660c09091015295945050505050565b6000602082840312156200271f57600080fd5b815180151581146200122957600080fd5b6000825162002744818460208701620022d7565b9190910192915050565b634e487b7160e01b600052602160045260246000fd5b6020815260006200122960208301846200230656fe60806040526000196005553480156200001757600080fd5b5060405162000d3e38038062000d3e8339810160408190526200003a9162000307565b8251839083906200005390600390602085019062000194565b5080516200006990600490602084019062000194565b5050600680546001600160a01b038716610100026001600160a81b031990911660ff85161717905550600554620000a2908590620000ac565b505050506200040f565b6001600160a01b038216620001075760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b80600260008282546200011b9190620003ab565b90915550506001600160a01b038216600090815260208190526040812080548392906200014a908490620003ab565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054620001a290620003d2565b90600052602060002090601f016020900481019282620001c6576000855562000211565b82601f10620001e157805160ff191683800117855562000211565b8280016001018555821562000211579182015b8281111562000211578251825591602001919060010190620001f4565b506200021f92915062000223565b5090565b5b808211156200021f576000815560010162000224565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200026257600080fd5b81516001600160401b03808211156200027f576200027f6200023a565b604051601f8301601f19908116603f01168101908282118183101715620002aa57620002aa6200023a565b81604052838152602092508683858801011115620002c757600080fd5b600091505b83821015620002eb5785820183015181830184015290820190620002cc565b83821115620002fd5760008385830101525b9695505050505050565b600080600080608085870312156200031e57600080fd5b84516001600160a01b03811681146200033657600080fd5b60208601519094506001600160401b03808211156200035457600080fd5b620003628883890162000250565b945060408701519150808211156200037957600080fd5b50620003888782880162000250565b925050606085015160ff81168114620003a057600080fd5b939692955090935050565b60008219821115620003cd57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620003e757607f821691505b602082108114156200040957634e487b7160e01b600052602260045260246000fd5b50919050565b61091f806200041f6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461012d57806370a082311461014057806395d89b4114610169578063a457c2d714610171578063a9059cbb14610184578063dd62ed3e1461019757600080fd5b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100ef57806323b872dd14610105578063313ce56714610118575b600080fd5b6100b66101d0565b6040516100c3919061073d565b60405180910390f35b6100df6100da3660046107ae565b610262565b60405190151581526020016100c3565b6100f7610278565b6040519081526020016100c3565b6100df6101133660046107d8565b6102aa565b60065460405160ff90911681526020016100c3565b6100df61013b3660046107ae565b610359565b6100f761014e366004610814565b6001600160a01b031660009081526020819052604090205490565b6100b6610395565b6100df61017f3660046107ae565b6103a4565b6100df6101923660046107ae565b61043d565b6100f76101a5366004610836565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6060600380546101df90610869565b80601f016020809104026020016040519081016040528092919081815260200182805461020b90610869565b80156102585780601f1061022d57610100808354040283529160200191610258565b820191906000526020600020905b81548152906001019060200180831161023b57829003601f168201915b5050505050905090565b600061026f33848461044a565b50600192915050565b60065461010090046001600160a01b03166000908152602081905260408120546005546102a591906108ba565b905090565b60006102b784848461056e565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156103415760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b61034e853385840361044a565b506001949350505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161026f9185906103909086906108d1565b61044a565b6060600480546101df90610869565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156104265760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610338565b610433338585840361044a565b5060019392505050565b600061026f33848461056e565b6001600160a01b0383166104ac5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610338565b6001600160a01b03821661050d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610338565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166105d25760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610338565b6001600160a01b0382166106345760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610338565b6001600160a01b038316600090815260208190526040902054818110156106ac5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610338565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906106e39084906108d1565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161072f91815260200190565b60405180910390a350505050565b600060208083528351808285015260005b8181101561076a5785810183015185820160400152820161074e565b8181111561077c576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b03811681146107a957600080fd5b919050565b600080604083850312156107c157600080fd5b6107ca83610792565b946020939093013593505050565b6000806000606084860312156107ed57600080fd5b6107f684610792565b925061080460208501610792565b9150604084013590509250925092565b60006020828403121561082657600080fd5b61082f82610792565b9392505050565b6000806040838503121561084957600080fd5b61085283610792565b915061086060208401610792565b90509250929050565b600181811c9082168061087d57607f821691505b6020821081141561089e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156108cc576108cc6108a4565b500390565b600082198211156108e4576108e46108a4565b50019056fea26469706673582212206b3bf1a166b949cd18353b6d94b554999b8e89c754be4601220c3be4b82168a264736f6c634300080a0033a2646970667358221220f67b85cde71509af3b69e23a70a8d2edf79e584fb932eba1c9dd0668f0286f1f64736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
756d65652d31000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000c60000000000000000000000000000000000000000000000000000000000000005f0000000000000000000000002963dd11b4c127a761b3af199862dd5919b1876d000000000000000000000000c90bcf9de4f342ef996897a0faed092c1c90c15e0000000000000000000000008478f135377f85b3b64a0df15a30542a61e8f262000000000000000000000000a64c628befd8d8155b0d2df03a02554281c75c6f000000000000000000000000fd316257b518ffe7a70122bcbe01d22d2c09a7b30000000000000000000000001e7b7a07551c9d80f3f0bb416dc39f37a45c2ba7000000000000000000000000615e62fc2ab666383d28c29019e085b50f0a55b20000000000000000000000008a308e02844bd3166e0a9354718f029d0b6b811f00000000000000000000000059695e392c561ec0fc4684b1d162fd347f57d24a0000000000000000000000001ec1312903117511f08f4a92479154dc3093ffb10000000000000000000000004d6637ace87524bf36e6f9f30f0baddd5a9c3fed0000000000000000000000009003411094b4384c6211eee977f2ce9019ed24cf0000000000000000000000004a363bae2763f7e932a8c649f01c759f7bee10980000000000000000000000007be1199687b5f3b1c99d4b5c4e5f46227affa3dc0000000000000000000000008c4cc69c137bc3d9566aba0c9d73e977c37263b50000000000000000000000001adbbd0cb3f7323a40c970291c703b5144db1e65000000000000000000000000fd669d32564d2762256257021a693c3f4a934487000000000000000000000000189d77ae52ac0efbe175313682414c411b6cfc4900000000000000000000000060f4bb38ee01f77b503fb19b42f3c8c84b799e2c000000000000000000000000c1991cc0b50c55f338f54aee399a0473fa3752dc0000000000000000000000007f5bc7da5d9cd40e7d3e500acf127ed7d44c2d4b000000000000000000000000cafefef5b02608fc18c99b0995f71d408ae2272000000000000000000000000034e53c5d145fb2ca0376832392f802095a6ea72a0000000000000000000000002cdbb93892961c11ae95bcc4cb916b0bb9c6a5ec000000000000000000000000bc5ed70eeace4bbe268b5a7b5426ea761ff0fde2000000000000000000000000f404080e350e2e7a7ad8e72b6bf5cb3ac8c1caec000000000000000000000000207b8560966ba68dfd6e8026a0a29093df500bfb000000000000000000000000b2f3ad626e7dced875b8f28b844dac931fcf111d000000000000000000000000e87065b88507de9579af6a93363201c2507be565000000000000000000000000e104e2c853e67b1fedbe68523b3083a592f1e97b0000000000000000000000002a9b1170b373951838b2aaa6928917f6503892b200000000000000000000000029051f290c1f5f563286164dc8fa0c33ee70366a000000000000000000000000317245422cef19674593f2997f2490a6dc3ba7ea00000000000000000000000020f3e88bccebc0b6d268f57f73fbc3dbe386698900000000000000000000000000123453c85b1f18a7c11b163bbadfce009ecb4d0000000000000000000000006df637989f8464e46223fe5e9db916251fbd9b170000000000000000000000002023dee3ae77c7c31b0d24545753b4ab8f89f96b000000000000000000000000a4b477489dc89313da2a8eadfde689d1b2020665000000000000000000000000182ab18c41bcf7f3db018159a62900906f719649000000000000000000000000c152b5046d690fd9e40a720be2b35a9048b34afc000000000000000000000000e63f6e6adb60c4449d36e39778bc4ceb928836300000000000000000000000005d490a0c6347db722a55068e5c3be5ee459da92a00000000000000000000000079d1769330d66ab3bf1a4c69c359d4b89530d335000000000000000000000000039c34e3cbcf4d6f32b4cb1b5df9d93e415a486200000000000000000000000080c43dbe50bfdd0f1e59e717dc11334156d5969100000000000000000000000091da10335df87924c907c29e74fc82d67410f8c900000000000000000000000005ba7a3af02cd86e60e803ab3bbaaa64afeadf2100000000000000000000000005ecef0db679dd9ab0985df5f1d78c5fbe7dcf760000000000000000000000000a1ce21f51c708dcc99549d85ffc21e4f0c0302a0000000000000000000000000a70098ebb8d9a9b02356d3aaff786eabccfd81e0000000000000000000000000e3f38bc4bb2d8924b4cedb82f52a2bd8fc32e3d0000000000000000000000001aacd42b608626953964fca1a0a4ec924a82407b0000000000000000000000002598f7feff0b12ea3c17f9270c7199c78dede90f00000000000000000000000029b63a7bd276f9df7e87efba07b34b92b9418eb90000000000000000000000002c89b757842b70261e1a394eb7a9e1f20b7185a800000000000000000000000033ea9eebf8f712fb9745d8ccaacd5298eeaf2eff000000000000000000000000360b492a9713f02bbb262c88f1f7653df11c43bd0000000000000000000000003cdc56b3b599df34188bdff4cc847d86b891872b00000000000000000000000045eb5e207e5dd7cd773750eae63b867f1f54d8220000000000000000000000004e6aa73cbb43c30069d54303e16f767ac32de064000000000000000000000000517593dcc43b2ac25463a6c874d315a714f644e100000000000000000000000054c800f2570fe8b3ec07f3aa92dbec448acc2efe00000000000000000000000060962ceafae64153054e1f03fff6acbaece0ddd00000000000000000000000006129a4b88af189df6dc7702381e0a8e9243c31aa0000000000000000000000006d588c5ddb0fff0c2723e0cfdc019b885daba4740000000000000000000000006dbdcb3f1f76e1589c93f09b13f109a2425041b10000000000000000000000006ec17a931af7fce45a859de77761b696c6be0bc5000000000000000000000000797b8fae19d4fc23bc166b04ea40f958f2f3c62f0000000000000000000000007f20b1e6d3cd50e7b51ddba958ee9201e81ec1f60000000000000000000000007ed76c0edc7d44e5d28735b9d720753d0b4f4f250000000000000000000000008265c07930a507059e7fdd36ab9dc3876c00f0390000000000000000000000008a70fe949435d37028f216cf3174fb584ba40a2400000000000000000000000092ce6d61637f9fa82fa85aa1786f3c0bc143c28b00000000000000000000000098a877dc459f5a71f0e367ccba870e97a20e1f8f0000000000000000000000009d8f2bc6be2a6695b1843b8631d277e472604f750000000000000000000000009fb438f1a292fbdaf4f569a8f2e2e2972c0172ec0000000000000000000000009e9959fee01da59b42853329422bd20355f90a4f0000000000000000000000009fa93dfafd7bc5ad9cb2128331cb5acae2ec36a40000000000000000000000009fe2b5a8f63d475e17e39235c6a0c13bc1bfe1c8000000000000000000000000a1a61a1f19ff98186d261c9b579cd1f1fa2304d4000000000000000000000000a602d18eec7565766df301bf4ef18253dde19ec1000000000000000000000000aa6f1cbaf011bd15a79b0545dbaaa4f068727d81000000000000000000000000b09a7beabf4b6b474ec4dab1d9b5f426be81b97b000000000000000000000000b9ba33b91aab0ac46870a8b7d7a3c719cce3cf92000000000000000000000000bbb07921101dde205cc1701ea1d6521d34f8d70a000000000000000000000000bd1d5cd181377383a645e87cd4351ae32b42ad2b000000000000000000000000bfc00b89fc699fcac355f9ff1681e65c91118268000000000000000000000000c8e0f3af24f4d1b96d12262f90213fbf81d3ea71000000000000000000000000d27c60e8bea725dc9e540289dd1dbeb0ccc3e9f8000000000000000000000000d6d0f36bc04e1861a1ed683b4ce550440b49c507000000000000000000000000e21fcb8aff718e47723ffed559da2bf2d66882c2000000000000000000000000eeeee5e7fa69a5d258b1377b116b4a0020cbca1b000000000000000000000000a7705d98610c146438e04fed78e6c7d2e1d8dcdd000000000000000000000000c8924c7ff40cd8c66987dac23ccc78191fb3ce0c000000000000000000000000f9290ba316efcd0190a93beac53e7bde19b33665000000000000000000000000000000000000000000000000000000000000005f000000000000000000000000000000000000000000000000000000007acefae1000000000000000000000000000000000000000000000000000000000ca928e3000000000000000000000000000000000000000000000000000000000a7defd50000000000000000000000000000000000000000000000000000000008395d1b0000000000000000000000000000000000000000000000000000000005b6478400000000000000000000000000000000000000000000000000000000056c8e110000000000000000000000000000000000000000000000000000000004b52930000000000000000000000000000000000000000000000000000000000456ead500000000000000000000000000000000000000000000000000000000043767ac000000000000000000000000000000000000000000000000000000000417f74b000000000000000000000000000000000000000000000000000000000417f74b0000000000000000000000000000000000000000000000000000000003c9995e0000000000000000000000000000000000000000000000000000000003af2b5d00000000000000000000000000000000000000000000000000000000039f732d00000000000000000000000000000000000000000000000000000000038540310000000000000000000000000000000000000000000000000000000003704a9b00000000000000000000000000000000000000000000000000000000034ec1ab000000000000000000000000000000000000000000000000000000000324d67f0000000000000000000000000000000000000000000000000000000002dd93810000000000000000000000000000000000000000000000000000000002bce3e0000000000000000000000000000000000000000000000000000000000284e5b6000000000000000000000000000000000000000000000000000000000284d040000000000000000000000000000000000000000000000000000000000280d4ca000000000000000000000000000000000000000000000000000000000274c79300000000000000000000000000000000000000000000000000000000024247320000000000000000000000000000000000000000000000000000000002262ea100000000000000000000000000000000000000000000000000000000021ba3bd0000000000000000000000000000000000000000000000000000000002196afd0000000000000000000000000000000000000000000000000000000002196afd000000000000000000000000000000000000000000000000000000000219659f00000000000000000000000000000000000000000000000000000000020bfba5000000000000000000000000000000000000000000000000000000000198b23e00000000000000000000000000000000000000000000000000000000018e3a2100000000000000000000000000000000000000000000000000000000016ec9c00000000000000000000000000000000000000000000000000000000001490fb2000000000000000000000000000000000000000000000000000000000143da5900000000000000000000000000000000000000000000000000000000013a63c900000000000000000000000000000000000000000000000000000000013a63c900000000000000000000000000000000000000000000000000000000010c9aaa000000000000000000000000000000000000000000000000000000000105fdd20000000000000000000000000000000000000000000000000000000000ca16fa0000000000000000000000000000000000000000000000000000000000c71a6200000000000000000000000000000000000000000000000000000000009d31e4000000000000000000000000000000000000000000000000000000000068cbed0000000000000000000000000000000000000000000000000000000000010c470000000000000000000000000000000000000000000000000000000000001ad300000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002ae
-----Decoded View---------------
Arg [0] : _gravityId (bytes32): 0x756d65652d310000000000000000000000000000000000000000000000000000
Arg [1] : _validators (address[]): 0x2963dD11B4C127A761b3af199862dD5919b1876D,0xc90Bcf9de4f342eF996897a0faed092C1C90c15e,0x8478F135377F85b3B64a0Df15A30542A61E8F262,0xa64C628BEfd8D8155B0D2DF03A02554281c75C6F,0xFd316257b518ffe7A70122bcbe01D22D2C09A7b3,0x1E7b7A07551c9D80f3F0bB416dc39F37A45c2ba7,0x615e62fC2Ab666383D28c29019e085b50f0A55b2,0x8A308e02844BD3166E0A9354718F029d0b6b811F,0x59695E392c561eC0fc4684B1d162Fd347F57d24a,0x1EC1312903117511F08F4A92479154dc3093FFB1,0x4D6637ACe87524Bf36E6f9f30f0BaDDD5A9C3FEd,0x9003411094b4384C6211eee977F2cE9019eD24Cf,0x4a363BAe2763f7E932A8c649F01C759f7bEE1098,0x7bE1199687b5F3B1c99d4b5C4E5f46227afFa3dC,0x8c4cc69c137BC3d9566aBA0C9d73E977c37263b5,0x1adbBd0cB3f7323a40C970291C703b5144dB1E65,0xFD669D32564D2762256257021A693c3f4a934487,0x189D77aE52ac0eFBe175313682414c411b6CFc49,0x60f4BB38EE01f77B503fb19b42F3C8c84b799e2c,0xc1991CC0B50c55F338F54AeE399A0473fa3752Dc,0x7F5bc7da5d9Cd40e7D3E500Acf127ED7D44C2d4B,0xcAFEfeF5B02608FC18c99B0995f71D408Ae22720,0x34E53C5D145fB2ca0376832392f802095A6eA72A,0x2Cdbb93892961C11AE95bCC4Cb916b0bb9c6A5ec,0xbc5ed70eEace4bBE268b5a7b5426ea761fF0fDE2,0xF404080E350E2E7A7Ad8E72b6bf5CB3aC8C1Caec,0x207B8560966ba68DFD6E8026a0a29093Df500BFb,0xB2F3ad626e7DcEd875B8f28B844dAc931FCF111d,0xE87065B88507dE9579Af6a93363201C2507BE565,0xE104e2c853e67B1fEDbe68523B3083a592f1E97B,0x2a9b1170b373951838b2aaa6928917F6503892b2,0x29051F290C1f5f563286164DC8fa0C33eE70366a,0x317245422ceF19674593F2997f2490a6Dc3bA7Ea,0x20F3e88bccEBC0B6D268f57f73FBC3DbE3866989,0x00123453c85B1f18A7C11B163bBADFCE009ecB4D,0x6df637989f8464e46223fE5e9db916251fbD9b17,0x2023Dee3ae77C7C31B0d24545753B4ab8F89F96b,0xA4B477489dc89313da2a8eAdFdE689d1B2020665,0x182Ab18c41Bcf7f3dB018159A62900906f719649,0xC152B5046d690FD9E40a720BE2B35A9048B34AFC,0xe63F6E6aDb60c4449D36e39778bc4CEb92883630,0x5D490A0c6347DB722A55068e5c3be5ee459Da92A,0x79D1769330D66AB3bF1a4C69c359d4b89530D335,0x039C34e3cbCf4d6f32b4cB1B5df9d93E415A4862,0x80C43DBe50Bfdd0f1e59E717Dc11334156d59691,0x91DA10335DF87924c907c29e74fC82d67410F8c9,0x05bA7a3AF02Cd86E60E803Ab3BbaaA64AFeadf21,0x05ecEf0dB679dd9Ab0985DF5f1d78C5fBe7dcf76,0x0A1Ce21f51C708DcC99549D85fFc21E4f0c0302a,0x0A70098EBb8D9a9B02356D3AAfF786EaBCCFd81e,0x0E3f38Bc4bb2D8924b4CEdb82F52a2Bd8fC32E3d,0x1Aacd42B608626953964FCA1a0A4EC924A82407b,0x2598F7fEFF0B12ea3C17F9270C7199c78dEdE90f,0x29B63a7BD276f9dF7e87efBA07b34B92B9418EB9,0x2C89B757842b70261e1A394Eb7A9e1F20b7185A8,0x33eA9eebf8F712fB9745d8CCAACD5298eeAF2efF,0x360B492A9713F02BbB262C88f1f7653dF11C43bD,0x3cDC56b3b599DF34188BDFf4cc847D86b891872b,0x45Eb5E207e5Dd7cD773750eae63B867F1f54D822,0x4E6AA73Cbb43C30069D54303e16f767ac32De064,0x517593dcc43b2ac25463A6C874d315A714F644E1,0x54C800F2570fE8B3EC07F3AA92dBEC448AcC2EfE,0x60962CeAfaE64153054e1f03fFF6ACBaECE0ddD0,0x6129a4B88AF189Df6dC7702381e0a8e9243C31Aa,0x6D588c5ddB0FfF0C2723e0cFDc019b885DaBa474,0x6dBdCb3f1f76E1589c93F09B13f109A2425041B1,0x6ec17a931AF7FcE45A859DE77761B696c6bE0bC5,0x797B8FAe19D4Fc23BC166b04Ea40f958f2f3C62f,0x7F20b1e6d3Cd50E7B51Ddba958Ee9201E81ec1f6,0x7ed76C0edC7D44E5D28735b9d720753d0b4F4F25,0x8265C07930a507059E7FdD36AB9DC3876c00F039,0x8a70fE949435d37028F216CF3174fb584Ba40A24,0x92ce6d61637F9fA82fa85Aa1786f3C0bC143c28B,0x98A877dC459f5a71f0e367Ccba870E97a20e1F8f,0x9D8f2bc6Be2a6695b1843B8631d277e472604f75,0x9FB438f1a292fbdaF4f569a8f2e2E2972c0172eC,0x9e9959fEE01dA59b42853329422bd20355f90a4F,0x9fA93DFaFd7BC5ad9CB2128331Cb5acAE2Ec36A4,0x9fE2b5A8f63d475E17E39235c6A0c13bC1Bfe1C8,0xA1a61a1F19ff98186D261C9b579Cd1f1FA2304d4,0xA602D18eec7565766DF301Bf4ef18253dde19Ec1,0xAa6f1Cbaf011bd15a79B0545dbAaa4F068727D81,0xB09a7BEAbF4B6B474EC4DaB1D9b5F426Be81B97b,0xB9bA33b91Aab0ac46870a8b7D7a3c719CcE3cf92,0xBbB07921101Dde205Cc1701EA1D6521d34f8d70a,0xBd1D5Cd181377383a645E87cD4351ae32B42aD2B,0xBfc00B89fC699fCaC355f9ff1681e65C91118268,0xC8E0F3aF24f4d1B96d12262f90213FbF81d3ea71,0xD27C60e8BEa725Dc9e540289DD1dBEb0CCC3E9f8,0xD6D0F36bC04E1861A1ED683B4Ce550440b49C507,0xE21fcb8aff718E47723fFEd559DA2Bf2D66882C2,0xEEEEE5E7Fa69A5D258b1377b116b4A0020cBcA1B,0xa7705d98610c146438E04feD78e6c7d2E1d8DCDd,0xC8924C7FF40cD8c66987DAc23ccc78191fB3ce0C,0xf9290bA316EfCD0190A93beAc53e7BDe19b33665
Arg [2] : _powers (uint256[]): 2060384993,212412643,176025557,137977115,95831940,91000337,78981424,72805077,70739884,68679499,68679499,63543646,61811549,60781357,59064369,57690779,55493035,52745855,48075649,45933536,42263990,42258496,41997514,41207699,37898034,36056737,35365821,35220221,35220221,35218847,34339749,26784318,26098209,24037824,21565362,21224025,20603849,20603849,17603242,17169874,13244154,13048418,10301924,6867949,68679,6867,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686
-----Encoded View---------------
195 Constructor Arguments found :
Arg [0] : 756d65652d310000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000c60
Arg [3] : 000000000000000000000000000000000000000000000000000000000000005f
Arg [4] : 0000000000000000000000002963dd11b4c127a761b3af199862dd5919b1876d
Arg [5] : 000000000000000000000000c90bcf9de4f342ef996897a0faed092c1c90c15e
Arg [6] : 0000000000000000000000008478f135377f85b3b64a0df15a30542a61e8f262
Arg [7] : 000000000000000000000000a64c628befd8d8155b0d2df03a02554281c75c6f
Arg [8] : 000000000000000000000000fd316257b518ffe7a70122bcbe01d22d2c09a7b3
Arg [9] : 0000000000000000000000001e7b7a07551c9d80f3f0bb416dc39f37a45c2ba7
Arg [10] : 000000000000000000000000615e62fc2ab666383d28c29019e085b50f0a55b2
Arg [11] : 0000000000000000000000008a308e02844bd3166e0a9354718f029d0b6b811f
Arg [12] : 00000000000000000000000059695e392c561ec0fc4684b1d162fd347f57d24a
Arg [13] : 0000000000000000000000001ec1312903117511f08f4a92479154dc3093ffb1
Arg [14] : 0000000000000000000000004d6637ace87524bf36e6f9f30f0baddd5a9c3fed
Arg [15] : 0000000000000000000000009003411094b4384c6211eee977f2ce9019ed24cf
Arg [16] : 0000000000000000000000004a363bae2763f7e932a8c649f01c759f7bee1098
Arg [17] : 0000000000000000000000007be1199687b5f3b1c99d4b5c4e5f46227affa3dc
Arg [18] : 0000000000000000000000008c4cc69c137bc3d9566aba0c9d73e977c37263b5
Arg [19] : 0000000000000000000000001adbbd0cb3f7323a40c970291c703b5144db1e65
Arg [20] : 000000000000000000000000fd669d32564d2762256257021a693c3f4a934487
Arg [21] : 000000000000000000000000189d77ae52ac0efbe175313682414c411b6cfc49
Arg [22] : 00000000000000000000000060f4bb38ee01f77b503fb19b42f3c8c84b799e2c
Arg [23] : 000000000000000000000000c1991cc0b50c55f338f54aee399a0473fa3752dc
Arg [24] : 0000000000000000000000007f5bc7da5d9cd40e7d3e500acf127ed7d44c2d4b
Arg [25] : 000000000000000000000000cafefef5b02608fc18c99b0995f71d408ae22720
Arg [26] : 00000000000000000000000034e53c5d145fb2ca0376832392f802095a6ea72a
Arg [27] : 0000000000000000000000002cdbb93892961c11ae95bcc4cb916b0bb9c6a5ec
Arg [28] : 000000000000000000000000bc5ed70eeace4bbe268b5a7b5426ea761ff0fde2
Arg [29] : 000000000000000000000000f404080e350e2e7a7ad8e72b6bf5cb3ac8c1caec
Arg [30] : 000000000000000000000000207b8560966ba68dfd6e8026a0a29093df500bfb
Arg [31] : 000000000000000000000000b2f3ad626e7dced875b8f28b844dac931fcf111d
Arg [32] : 000000000000000000000000e87065b88507de9579af6a93363201c2507be565
Arg [33] : 000000000000000000000000e104e2c853e67b1fedbe68523b3083a592f1e97b
Arg [34] : 0000000000000000000000002a9b1170b373951838b2aaa6928917f6503892b2
Arg [35] : 00000000000000000000000029051f290c1f5f563286164dc8fa0c33ee70366a
Arg [36] : 000000000000000000000000317245422cef19674593f2997f2490a6dc3ba7ea
Arg [37] : 00000000000000000000000020f3e88bccebc0b6d268f57f73fbc3dbe3866989
Arg [38] : 00000000000000000000000000123453c85b1f18a7c11b163bbadfce009ecb4d
Arg [39] : 0000000000000000000000006df637989f8464e46223fe5e9db916251fbd9b17
Arg [40] : 0000000000000000000000002023dee3ae77c7c31b0d24545753b4ab8f89f96b
Arg [41] : 000000000000000000000000a4b477489dc89313da2a8eadfde689d1b2020665
Arg [42] : 000000000000000000000000182ab18c41bcf7f3db018159a62900906f719649
Arg [43] : 000000000000000000000000c152b5046d690fd9e40a720be2b35a9048b34afc
Arg [44] : 000000000000000000000000e63f6e6adb60c4449d36e39778bc4ceb92883630
Arg [45] : 0000000000000000000000005d490a0c6347db722a55068e5c3be5ee459da92a
Arg [46] : 00000000000000000000000079d1769330d66ab3bf1a4c69c359d4b89530d335
Arg [47] : 000000000000000000000000039c34e3cbcf4d6f32b4cb1b5df9d93e415a4862
Arg [48] : 00000000000000000000000080c43dbe50bfdd0f1e59e717dc11334156d59691
Arg [49] : 00000000000000000000000091da10335df87924c907c29e74fc82d67410f8c9
Arg [50] : 00000000000000000000000005ba7a3af02cd86e60e803ab3bbaaa64afeadf21
Arg [51] : 00000000000000000000000005ecef0db679dd9ab0985df5f1d78c5fbe7dcf76
Arg [52] : 0000000000000000000000000a1ce21f51c708dcc99549d85ffc21e4f0c0302a
Arg [53] : 0000000000000000000000000a70098ebb8d9a9b02356d3aaff786eabccfd81e
Arg [54] : 0000000000000000000000000e3f38bc4bb2d8924b4cedb82f52a2bd8fc32e3d
Arg [55] : 0000000000000000000000001aacd42b608626953964fca1a0a4ec924a82407b
Arg [56] : 0000000000000000000000002598f7feff0b12ea3c17f9270c7199c78dede90f
Arg [57] : 00000000000000000000000029b63a7bd276f9df7e87efba07b34b92b9418eb9
Arg [58] : 0000000000000000000000002c89b757842b70261e1a394eb7a9e1f20b7185a8
Arg [59] : 00000000000000000000000033ea9eebf8f712fb9745d8ccaacd5298eeaf2eff
Arg [60] : 000000000000000000000000360b492a9713f02bbb262c88f1f7653df11c43bd
Arg [61] : 0000000000000000000000003cdc56b3b599df34188bdff4cc847d86b891872b
Arg [62] : 00000000000000000000000045eb5e207e5dd7cd773750eae63b867f1f54d822
Arg [63] : 0000000000000000000000004e6aa73cbb43c30069d54303e16f767ac32de064
Arg [64] : 000000000000000000000000517593dcc43b2ac25463a6c874d315a714f644e1
Arg [65] : 00000000000000000000000054c800f2570fe8b3ec07f3aa92dbec448acc2efe
Arg [66] : 00000000000000000000000060962ceafae64153054e1f03fff6acbaece0ddd0
Arg [67] : 0000000000000000000000006129a4b88af189df6dc7702381e0a8e9243c31aa
Arg [68] : 0000000000000000000000006d588c5ddb0fff0c2723e0cfdc019b885daba474
Arg [69] : 0000000000000000000000006dbdcb3f1f76e1589c93f09b13f109a2425041b1
Arg [70] : 0000000000000000000000006ec17a931af7fce45a859de77761b696c6be0bc5
Arg [71] : 000000000000000000000000797b8fae19d4fc23bc166b04ea40f958f2f3c62f
Arg [72] : 0000000000000000000000007f20b1e6d3cd50e7b51ddba958ee9201e81ec1f6
Arg [73] : 0000000000000000000000007ed76c0edc7d44e5d28735b9d720753d0b4f4f25
Arg [74] : 0000000000000000000000008265c07930a507059e7fdd36ab9dc3876c00f039
Arg [75] : 0000000000000000000000008a70fe949435d37028f216cf3174fb584ba40a24
Arg [76] : 00000000000000000000000092ce6d61637f9fa82fa85aa1786f3c0bc143c28b
Arg [77] : 00000000000000000000000098a877dc459f5a71f0e367ccba870e97a20e1f8f
Arg [78] : 0000000000000000000000009d8f2bc6be2a6695b1843b8631d277e472604f75
Arg [79] : 0000000000000000000000009fb438f1a292fbdaf4f569a8f2e2e2972c0172ec
Arg [80] : 0000000000000000000000009e9959fee01da59b42853329422bd20355f90a4f
Arg [81] : 0000000000000000000000009fa93dfafd7bc5ad9cb2128331cb5acae2ec36a4
Arg [82] : 0000000000000000000000009fe2b5a8f63d475e17e39235c6a0c13bc1bfe1c8
Arg [83] : 000000000000000000000000a1a61a1f19ff98186d261c9b579cd1f1fa2304d4
Arg [84] : 000000000000000000000000a602d18eec7565766df301bf4ef18253dde19ec1
Arg [85] : 000000000000000000000000aa6f1cbaf011bd15a79b0545dbaaa4f068727d81
Arg [86] : 000000000000000000000000b09a7beabf4b6b474ec4dab1d9b5f426be81b97b
Arg [87] : 000000000000000000000000b9ba33b91aab0ac46870a8b7d7a3c719cce3cf92
Arg [88] : 000000000000000000000000bbb07921101dde205cc1701ea1d6521d34f8d70a
Arg [89] : 000000000000000000000000bd1d5cd181377383a645e87cd4351ae32b42ad2b
Arg [90] : 000000000000000000000000bfc00b89fc699fcac355f9ff1681e65c91118268
Arg [91] : 000000000000000000000000c8e0f3af24f4d1b96d12262f90213fbf81d3ea71
Arg [92] : 000000000000000000000000d27c60e8bea725dc9e540289dd1dbeb0ccc3e9f8
Arg [93] : 000000000000000000000000d6d0f36bc04e1861a1ed683b4ce550440b49c507
Arg [94] : 000000000000000000000000e21fcb8aff718e47723ffed559da2bf2d66882c2
Arg [95] : 000000000000000000000000eeeee5e7fa69a5d258b1377b116b4a0020cbca1b
Arg [96] : 000000000000000000000000a7705d98610c146438e04fed78e6c7d2e1d8dcdd
Arg [97] : 000000000000000000000000c8924c7ff40cd8c66987dac23ccc78191fb3ce0c
Arg [98] : 000000000000000000000000f9290ba316efcd0190a93beac53e7bde19b33665
Arg [99] : 000000000000000000000000000000000000000000000000000000000000005f
Arg [100] : 000000000000000000000000000000000000000000000000000000007acefae1
Arg [101] : 000000000000000000000000000000000000000000000000000000000ca928e3
Arg [102] : 000000000000000000000000000000000000000000000000000000000a7defd5
Arg [103] : 0000000000000000000000000000000000000000000000000000000008395d1b
Arg [104] : 0000000000000000000000000000000000000000000000000000000005b64784
Arg [105] : 00000000000000000000000000000000000000000000000000000000056c8e11
Arg [106] : 0000000000000000000000000000000000000000000000000000000004b52930
Arg [107] : 000000000000000000000000000000000000000000000000000000000456ead5
Arg [108] : 00000000000000000000000000000000000000000000000000000000043767ac
Arg [109] : 000000000000000000000000000000000000000000000000000000000417f74b
Arg [110] : 000000000000000000000000000000000000000000000000000000000417f74b
Arg [111] : 0000000000000000000000000000000000000000000000000000000003c9995e
Arg [112] : 0000000000000000000000000000000000000000000000000000000003af2b5d
Arg [113] : 00000000000000000000000000000000000000000000000000000000039f732d
Arg [114] : 0000000000000000000000000000000000000000000000000000000003854031
Arg [115] : 0000000000000000000000000000000000000000000000000000000003704a9b
Arg [116] : 00000000000000000000000000000000000000000000000000000000034ec1ab
Arg [117] : 000000000000000000000000000000000000000000000000000000000324d67f
Arg [118] : 0000000000000000000000000000000000000000000000000000000002dd9381
Arg [119] : 0000000000000000000000000000000000000000000000000000000002bce3e0
Arg [120] : 000000000000000000000000000000000000000000000000000000000284e5b6
Arg [121] : 000000000000000000000000000000000000000000000000000000000284d040
Arg [122] : 000000000000000000000000000000000000000000000000000000000280d4ca
Arg [123] : 000000000000000000000000000000000000000000000000000000000274c793
Arg [124] : 0000000000000000000000000000000000000000000000000000000002424732
Arg [125] : 0000000000000000000000000000000000000000000000000000000002262ea1
Arg [126] : 00000000000000000000000000000000000000000000000000000000021ba3bd
Arg [127] : 0000000000000000000000000000000000000000000000000000000002196afd
Arg [128] : 0000000000000000000000000000000000000000000000000000000002196afd
Arg [129] : 000000000000000000000000000000000000000000000000000000000219659f
Arg [130] : 00000000000000000000000000000000000000000000000000000000020bfba5
Arg [131] : 000000000000000000000000000000000000000000000000000000000198b23e
Arg [132] : 00000000000000000000000000000000000000000000000000000000018e3a21
Arg [133] : 00000000000000000000000000000000000000000000000000000000016ec9c0
Arg [134] : 0000000000000000000000000000000000000000000000000000000001490fb2
Arg [135] : 000000000000000000000000000000000000000000000000000000000143da59
Arg [136] : 00000000000000000000000000000000000000000000000000000000013a63c9
Arg [137] : 00000000000000000000000000000000000000000000000000000000013a63c9
Arg [138] : 00000000000000000000000000000000000000000000000000000000010c9aaa
Arg [139] : 000000000000000000000000000000000000000000000000000000000105fdd2
Arg [140] : 0000000000000000000000000000000000000000000000000000000000ca16fa
Arg [141] : 0000000000000000000000000000000000000000000000000000000000c71a62
Arg [142] : 00000000000000000000000000000000000000000000000000000000009d31e4
Arg [143] : 000000000000000000000000000000000000000000000000000000000068cbed
Arg [144] : 0000000000000000000000000000000000000000000000000000000000010c47
Arg [145] : 0000000000000000000000000000000000000000000000000000000000001ad3
Arg [146] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [147] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [148] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [149] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [150] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [151] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [152] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [153] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [154] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [155] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [156] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [157] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [158] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [159] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [160] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [161] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [162] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [163] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [164] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [165] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [166] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [167] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [168] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [169] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [170] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [171] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [172] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [173] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [174] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [175] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [176] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [177] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [178] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [179] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [180] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [181] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [182] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [183] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [184] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [185] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [186] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [187] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [188] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [189] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [190] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [191] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [192] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [193] : 00000000000000000000000000000000000000000000000000000000000002ae
Arg [194] : 00000000000000000000000000000000000000000000000000000000000002ae
Deployed Bytecode Sourcemap
43202:20274:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45550:259;;;;;;:::i;:::-;;:::i;:::-;;45401:144;;;;;;:::i;:::-;;:::i;45839:132::-;;;;;;:::i;:::-;-1:-1:-1;;;;;45930:36:0;45909:7;45930:36;;;:21;:36;;;;;;;45839:132;;;;2408:25:1;;;2396:2;2381:18;45839:132:0;;;;;;;60175:1331;;;;;;:::i;:::-;;:::i;56941:3229::-;;;;;;:::i;:::-;;:::i;43811:39::-;;;;;;43574:60;;;;;;:::i;:::-;;;;;;;;;;;;;;53165:3211;;;;;;:::i;:::-;;:::i;49707:3110::-;;;;;;:::i;:::-;;:::i;43638:40::-;;;;;;43896;;;;;45976:146;;;;;;:::i;:::-;46053:7;46074:43;;;:25;:43;;;;;;;45976:146;43514:56;;;;;;:::i;:::-;;;;;;;;;;;;;;43469:41;;;;;;61511:532;;;;;;:::i;:::-;;:::i;45550:259::-;45730:74;45755:14;45771:5;;45778:8;45788:15;45730:24;:74::i;:::-;45550:259;;;;;:::o;45401:144::-;45501:39;;45516:11;45501:39;:::i;:::-;45529:10;45501:14;:39::i;:::-;;45401:144;;:::o;60175:1331::-;16690:1;17286:7;;:19;;17278:63;;;;-1:-1:-1;;;17278:63:0;;;;;;;:::i;:::-;;;;;;;;;16690:1;17419:7;:18;;;60389:47:::1;::::0;-1:-1:-1;;;60389:47:0;;60430:4:::1;60389:47;::::0;::::1;14728:51:1::0;-1:-1:-1;;;;;60389:32:0;::::1;::::0;::::1;::::0;14701:18:1;;60389:47:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60360:76:::0;-1:-1:-1;60495:75:0::1;-1:-1:-1::0;;;;;60495:39:0;::::1;60535:10;60555:4;60562:7:::0;60495:39:::1;:75::i;:::-;60740:47;::::0;-1:-1:-1;;;60740:47:0;;60781:4:::1;60740:47;::::0;::::1;14728:51:1::0;60713:24:0::1;::::0;-1:-1:-1;;;;;60740:32:0;::::1;::::0;::::1;::::0;14701:18:1;;60740:47:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60713:74;;60967:18;60947:16;:38;60943:84;;61000:21;;-1:-1:-1::0;;;61000:21:0::1;;;;;;;;;;;60943:84;61056:20;::::0;:24:::1;::::0;61079:1:::1;61056:24;:::i;:::-;61033:20;:47:::0;61399:10:::1;-1:-1:-1::0;;;;;61356:145:0;::::1;;61415:12:::0;;61433:37:::1;61452:18:::0;61433:16;:37:::1;:::i;:::-;61476:20;;61356:145;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;16646:1:0;17598:7;:22;-1:-1:-1;;;;60175:1331:0:o;56941:3229::-;16690:1;17286:7;;:19;;17278:63;;;;-1:-1:-1;;;17278:63:0;;;;;;;:::i;:::-;16690:1;17419:7;:18;57319:13:::1;::::0;::::1;::::0;57303:12:::1;:29;57299:75;;57348:19;;-1:-1:-1::0;;;57348:19:0::1;;;;;;;;;;;57299:75;57532:23;::::0;::::1;::::0;57507:20:::1;::::0;::::1;::::0;57481:47:::1;::::0;;;:25:::1;:47;::::0;;;;;:74:::1;57477:241;;57611:23;::::0;::::1;::::0;57682:20:::1;::::0;::::1;::::0;57656:47:::1;::::0;;;:25:::1;:47;::::0;;;;;;;57571:140;;-1:-1:-1;;;57571:140:0;;::::1;::::0;::::1;16214:25:1::0;;;;16255:18;;;16248:34;16187:18;;57571:140:0::1;16040:248:1::0;57477:241:0::1;58016:37;58031:14;58047:5;;58016:14;:37::i;:::-;58198:26;::::0;58147:47:::1;;58162:14:::0;58147:47:::1;:::i;:::-;58178:15;58147:14;:47::i;:::-;:77;58143:125;;58240:21;;-1:-1:-1::0;;;58240:21:0::1;;;;;;;;;;;58143:125;58311:28;::::0;::::1;::::0;:35;58279:21;;:28;:67:::1;58275:121;;58362:27;;-1:-1:-1::0;;;58362:27:0::1;;;;;;;;;;;58275:121;58434:5;:23;;;:30;58407:5;:16;;;:23;:57;58403:106;;58480:22;;-1:-1:-1::0;;;58480:22:0::1;;;;;;;;;;;58403:106;58524:16;58577:15;-1:-1:-1::0;;;58715:5:0::1;:21;;;58744:5;:28;;;58780:5;:16;;;58804:5;:23;;;58835:5;:26;;;58869:5;:13;;;58890:5;:13;;;58911:5;:20;;;58939:5;:23;;;58559:410;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58543:432;;;;;;58524:451;;59079:165;59110:14;59131:5;;59200:8;43424:10;59079:24;:165::i;:::-;-1:-1:-1::0;59354:23:0::1;::::0;::::1;::::0;59330:20:::1;::::0;::::1;::::0;59304:47:::1;::::0;;;:25:::1;:47;::::0;;;;:73;;;;59424:193:::1;59448:21:::0;;:28;59444:32;::::1;59424:193;;;59489:122;59548:5;:26;;;59581:5;:21;;;59603:1;59581:24;;;;;;;;:::i;:::-;;;;;;;59496:5;:28;;;59525:1;59496:31;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;59489:52:0::1;;;:122;;;;;:::i;:::-;59478:3:::0;::::1;::::0;::::1;:::i;:::-;;;;59424:193;;;;59657:23;59683:63;59704:5;:26;;;59732:5;:13;;;59683:20;:63::i;:::-;59657:89;;59788:9;59783:146;59807:5;:16;;;:23;59803:1;:27;59783:146;;;59843:80;59891:10;59903:5;:16;;;59920:1;59903:19;;;;;;;;:::i;:::-;;;;;;;59850:5;:23;;;59874:1;59850:26;;;;;;;;:::i;59843:80::-;59832:3:::0;::::1;::::0;::::1;:::i;:::-;;;;59783:146;;;-1:-1:-1::0;60004:20:0::1;::::0;:24:::1;::::0;60027:1:::1;60004:24;:::i;:::-;59981:20;:47:::0;;;60060:20:::1;::::0;::::1;::::0;60087:23:::1;::::0;::::1;::::0;60039:121:::1;::::0;::::1;::::0;::::1;::::0;60060:20;60087:23;60117:10;;59981:47;60039:121:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;16646:1:0;17598:7;:22;-1:-1:-1;;;56941:3229:0:o;53165:3211::-;16690:1;17286:7;;:19;;17278:63;;;;-1:-1:-1;;;17278:63:0;;;;;;;:::i;:::-;16690:1;17419:7;:18;;;-1:-1:-1;;;;;53848:37:0;::::1;::::0;;::::1;::::0;;;;;;;;53833:52;::::1;53829:193;;-1:-1:-1::0;;;;;53970:37:0;::::1;;::::0;;;:21:::1;:37;::::0;;;;;;;53901:114;;-1:-1:-1;;;53901:114:0;;::::1;::::0;53937:11;;53901:114:::1;;16214:25:1::0;;;16270:2;16255:18;;16248:34;16202:2;16187:18;;16040:248;53829:193:0::1;-1:-1:-1::0;;;;;54278:37:0;::::1;;::::0;;;:21:::1;:37;::::0;;;;;:47:::1;::::0;54318:7:::1;54278:47;:::i;:::-;54264:11;:61;54260:202;;;-1:-1:-1::0;;;;;54410:37:0;::::1;;::::0;;;:21:::1;:37;::::0;;;;;;;54341:114;;-1:-1:-1;;;54341:114:0;;::::1;::::0;54377:11;;54341:114:::1;;16214:25:1::0;;;16270:2;16255:18;;16248:34;16202:2;16187:18;;16040:248;54260:202:0::1;54556:13;54540:12;:29;54536:71;;54585:15;;-1:-1:-1::0;;;54585:15:0::1;;;;;;;;;;;54536:71;54702:37;54717:14;54733:5;;54702:14;:37::i;:::-;54884:26;::::0;54833:47:::1;;54848:14:::0;54833:47:::1;:::i;:::-;:77;54829:125;;54926:21;;-1:-1:-1::0;;;54926:21:0::1;;;;;;;;;;;54829:125;55020:39:::0;;::::1;;::::0;:74:::1;;-1:-1:-1::0;55063:31:0;;::::1;;55020:74;55016:117;;;55110:16;;-1:-1:-1::0;;;55110:16:0::1;;;;;;;;;;;55016:117;55236:465;55267:14;55288:5;;55393:15;-1:-1:-1::0;;;55541:8:0::1;;55558:13;;55580:5;;55594:11;55614:14;55637:13;55374:284;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55357:308;;;;;;43424:10;55236:24;:465::i;:::-;-1:-1:-1::0;;;;;55751:37:0;::::1;;::::0;;;:21:::1;:37;::::0;;;;:51;;;:37;55889:166:::1;55909:19:::0;;::::1;55889:166;;;55943:66;55979:13;;55993:1;55979:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;55997:8;;56006:1;55997:11;;;;;;;:::i;:::-;;;;;;;55950:14;-1:-1:-1::0;;;;;55943:35:0::1;;;:66;;;;;:::i;:::-;56039:5;;56045:1;56039:8;;;;;;;:::i;:::-;;;;;;;56028;:19;;;;:::i;:::-;56017:30:::0;-1:-1:-1;55930:3:0;::::1;::::0;::::1;:::i;:::-;;;;55889:166;;;-1:-1:-1::0;56107:57:0::1;-1:-1:-1::0;;;;;56107:35:0;::::1;56143:10;56155:8:::0;56107:35:::1;:57::i;:::-;-1:-1:-1::0;56251:20:0::1;::::0;:24:::1;::::0;56274:1:::1;56251:24;:::i;:::-;56228:20;:47:::0;;;56286:80:::1;::::0;2408:25:1;;;-1:-1:-1;;;;;56286:80:0;::::1;::::0;56316:11;;56286:80:::1;::::0;2396:2:1;2381:18;56286:80:0::1;;;;;;;-1:-1:-1::0;;16646:1:0;17598:7;:22;-1:-1:-1;;;;;;;;;;53165:3211:0:o;49707:3110::-;50129:14;:26;;;50103:10;:22;;;:52;50099:189;;50206:22;50170:112;;-1:-1:-1;;;50170:112:0;;50206:22;;;;50170:112;;;16214:25:1;50249:26:0;;;;16255:18:1;;;16248:34;16187:18;;50170:112:0;16040:248:1;50099:189:0;50558:36;:26;;;;50587:7;50558:36;:::i;:::-;50533:10;:22;;;:61;50529:198;;;50645:22;50609:112;;-1:-1:-1;;;50609:112:0;;50645:22;;;;50609:112;;;16214:25:1;50688:26:0;;;;16255:18:1;;;16248:34;16187:18;;50609:112:0;16040:248:1;50529:198:0;50836:17;;;;:10;:17;:::i;:::-;:24;-1:-1:-1;50804:21:0;:10;;:21;:::i;:::-;:28;;:56;;:97;;;-1:-1:-1;50868:21:0;:10;;:21;:::i;:::-;:33;;-1:-1:-1;50804:97:0;50795:157;;;50920:26;;-1:-1:-1;;;50920:26:0;;;;;;;;;;;50795:157;51045:37;51060:14;51076:5;;51045:14;:37::i;:::-;51192:23;51229:9;51224:194;51248:17;;;;:10;:17;:::i;:::-;:24;;51244:1;:28;51224:194;;;51321:17;;;;:10;:17;:::i;:::-;51339:1;51321:20;;;;;;;:::i;:::-;;;;;;;51303:15;:38;;;;:::i;:::-;51285:56;;43424:10;51351:15;:41;51347:66;;;51401:5;;51347:66;51274:3;;;;:::i;:::-;;;;51224:194;;;;43424:10;51426:15;:42;51422:177;;51483:110;;-1:-1:-1;;;51483:110:0;;;;;16214:25:1;;;43424:10:0;16255:18:1;;;16248:34;16187:18;;51483:110:0;16040:248:1;51422:177:0;51741:26;;51690:47;;51705:14;51690:47;:::i;:::-;:77;51686:123;;51782:21;;-1:-1:-1;;;51782:21:0;;;;;;;;;;;51686:123;51899:21;51923:43;;51938:10;51923:43;:::i;:::-;51899:67;;51973:87;51998:14;52014:5;;52021:13;43424:10;51973:24;:87::i;:::-;52186:26;:42;;;52281:22;;;;52257:21;:46;-1:-1:-1;52390:22:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52390:36:0;;;:68;;;;-1:-1:-1;52430:23:0;;;;:28;;52390:68;52386:166;;;52466:80;52510:10;52522:23;;;;52473:22;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52466:43:0;;:80;:43;:80::i;:::-;52594:20;;:24;;52617:1;52594:24;:::i;:::-;52571:20;:47;;;52652:22;;;;;52628:184;;52706:23;;;;52735:22;;;;;;;;:::i;:::-;52763:21;:10;;:21;:::i;:::-;52790:17;;;;:10;:17;:::i;:::-;52628:184;;;;;;;;;;;;:::i;:::-;;;;;;;;50017:2800;;49707:3110;;;;:::o;61511:532::-;61721:17;61765:4;61772:5;;61779:7;;61788:9;61741:57;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;61721:77;;61878:20;;61901:1;61878:24;;;;:::i;:::-;61855:20;:47;;;61912:126;;-1:-1:-1;;;;;61912:126:0;;;;;;;61936:12;;;;61974:5;;;;61985:7;;;;61998:9;;61912:126;:::i;:::-;;;;;;;;61652:391;61511:532;;;;;;;:::o;48106:1198::-;48423:23;48462:9;48457:673;48481:25;:14;;:25;:::i;:::-;:32;;48477:1;:36;48457:673;;;48710:5;;48716:1;48710:8;;;;;;;:::i;:::-;:10;;;:8;;;;;:10;;;;-1:-1:-1;48710:10:0;:::i;:::-;:15;;;48706:419;;48807:59;48817:25;:14;;:25;:::i;:::-;48843:1;48817:28;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;48847:8;48857:5;;48863:1;48857:8;;;;;;;:::i;:::-;;;;;;48807:9;:59::i;:::-;48802:107;;48883:18;;-1:-1:-1;;;48883:18:0;;;;;;;;;;;48802:107;48985:21;;;;:14;:21;:::i;:::-;49007:1;48985:24;;;;;;;:::i;:::-;;;;;;;48967:15;:42;;;;:::i;:::-;48949:60;;49081:15;49063;:33;49059:60;;;49106:5;;49059:60;48515:3;;;;:::i;:::-;;;;48457:673;;;;49199:15;49180;:34;49176:110;;49229:51;;-1:-1:-1;;;49229:51:0;;;;;16214:25:1;;;16255:18;;;16248:34;;;16187:18;;49229:51:0;16040:248:1;49176:110:0;48418:886;48106:1198;;;;;:::o;47570:531::-;47676:7;47742:18;-1:-1:-1;;;47742:87:0;;;;47836:18;47889:10;47906;47923:11;:23;;;47953:11;:22;;;47982:11;:18;;;48007:11;:24;;;48038:11;:23;;;47872:195;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;47872:195:0;;;;;;47857:215;;47872:195;47857:215;;;;;47570:531;-1:-1:-1;;;;;47570:531:0:o;11860:248::-;12031:68;;-1:-1:-1;;;;;26667:15:1;;;12031:68:0;;;26649:34:1;26719:15;;26699:18;;;26692:43;26751:18;;;26744:34;;;12004:96:0;;12024:5;;-1:-1:-1;;;12054:27:0;26584:18:1;;12031:68:0;;;;-1:-1:-1;;12031:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;12031:68:0;-1:-1:-1;;;;;;12031:68:0;;;;;;;;;;12004:19;:96::i;:::-;11860:248;;;;:::o;46584:353::-;46808:14;;;;:7;:14;:::i;:::-;:21;-1:-1:-1;46779:18:0;:7;;:18;:::i;:::-;:25;;:50;;:99;;;-1:-1:-1;46866:5:0;46837:18;:7;;:18;:::i;:::-;:25;;:41;;46779:99;46770:163;;;46897:30;;-1:-1:-1;;;46897:30:0;;;;;;;;;;;11641:211;11785:58;;-1:-1:-1;;;;;26981:32:1;;11785:58:0;;;26963:51:1;27030:18;;;27023:34;;;11758:86:0;;11778:5;;-1:-1:-1;;;11808:23:0;26936:18:1;;11785:58:0;26789:274:1;6078:175:0;6153:12;6185:60;6198:6;6206:4;6185:60;;;;;;;;;;;;;;;;;:12;:60::i;:::-;6178:67;6078:175;-1:-1:-1;;;6078:175:0:o;46181:311::-;46345:62;;27310:66:1;46345:62:0;;;27298:79:1;27393:12;;;27386:28;;;46295:4:0;;;;27430:12:1;;46345:62:0;;;-1:-1:-1;;46345:62:0;;;;;;;;;46330:82;;46345:62;46330:82;;;;;-1:-1:-1;46435:52:0;;46330:82;;46464:6;;;;:4;:6;:::i;:::-;46472:4;:6;;;46480:4;:6;;;46435:13;:52::i;:::-;-1:-1:-1;;;;;46424:63:0;:7;-1:-1:-1;;;;;46424:63:0;;46417:70;;;46181:311;;;;;:::o;14214:716::-;14638:23;14664:69;14692:4;14664:69;;;;;;;;;;;;;;;;;14672:5;-1:-1:-1;;;;;14664:27:0;;;:69;;;;;:::i;:::-;14748:17;;14638:95;;-1:-1:-1;14748:21:0;14744:179;;14845:10;14834:30;;;;;;;;;;;;:::i;:::-;14826:85;;;;-1:-1:-1;;;14826:85:0;;27937:2:1;14826:85:0;;;27919:21:1;27976:2;27956:18;;;27949:30;28015:34;27995:18;;;27988:62;-1:-1:-1;;;28066:18:1;;;28059:40;28116:19;;14826:85:0;27735:406:1;6483:229:0;6620:12;6652:52;6674:6;6682:4;6688:1;6691:12;6652:21;:52::i;:::-;6645:59;6483:229;-1:-1:-1;;;;6483:229:0:o;25246:279::-;25374:7;25395:17;25414:18;25436:25;25447:4;25453:1;25456;25459;25436:10;:25::i;:::-;25394:67;;;;25472:18;25484:5;25472:11;:18::i;:::-;-1:-1:-1;25508:9:0;25246:279;-1:-1:-1;;;;;25246:279:0:o;7603:510::-;7773:12;7831:5;7806:21;:30;;7798:81;;;;-1:-1:-1;;;7798:81:0;;28348:2:1;7798:81:0;;;28330:21:1;28387:2;28367:18;;;28360:30;28426:34;28406:18;;;28399:62;-1:-1:-1;;;28477:18:1;;;28470:36;28523:19;;7798:81:0;28146:402:1;7798:81:0;4000:20;;7890:60;;;;-1:-1:-1;;;7890:60:0;;28755:2:1;7890:60:0;;;28737:21:1;28794:2;28774:18;;;28767:30;28833:31;28813:18;;;28806:59;28882:18;;7890:60:0;28553:353:1;7890:60:0;7964:12;7978:23;8005:6;-1:-1:-1;;;;;8005:11:0;8024:5;8031:4;8005:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7963:73;;;;8054:51;8071:7;8080:10;8092:12;8054:16;:51::i;:::-;8047:58;7603:510;-1:-1:-1;;;;;;;7603:510:0:o;23475:1632::-;23606:7;;24540:66;24527:79;;24523:163;;;-1:-1:-1;24639:1:0;;-1:-1:-1;24643:30:0;24623:51;;24523:163;24700:1;:7;;24705:2;24700:7;;:18;;;;;24711:1;:7;;24716:2;24711:7;;24700:18;24696:102;;;-1:-1:-1;24751:1:0;;-1:-1:-1;24755:30:0;24735:51;;24696:102;24912:24;;;24895:14;24912:24;;;;;;;;;29417:25:1;;;29490:4;29478:17;;29458:18;;;29451:45;;;;29512:18;;;29505:34;;;29555:18;;;29548:34;;;24912:24:0;;29389:19:1;;24912:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24912:24:0;;-1:-1:-1;;24912:24:0;;;-1:-1:-1;;;;;;;24951:20:0;;24947:103;;25004:1;25008:29;24988:50;;;;;;;24947:103;25070:6;-1:-1:-1;25078:20:0;;-1:-1:-1;23475:1632:0;;;;;;;;:::o;18137:643::-;18215:20;18206:5;:29;;;;;;;;:::i;:::-;;18202:571;;;18137:643;:::o;18202:571::-;18313:29;18304:5;:38;;;;;;;;:::i;:::-;;18300:473;;;18359:34;;-1:-1:-1;;;18359:34:0;;29927:2:1;18359:34:0;;;29909:21:1;29966:2;29946:18;;;29939:30;30005:26;29985:18;;;29978:54;30049:18;;18359:34:0;29725:348:1;18300:473:0;18424:35;18415:5;:44;;;;;;;;:::i;:::-;;18411:362;;;18476:41;;-1:-1:-1;;;18476:41:0;;30280:2:1;18476:41:0;;;30262:21:1;30319:2;30299:18;;;30292:30;30358:33;30338:18;;;30331:61;30409:18;;18476:41:0;30078:355:1;18411:362:0;18548:30;18539:5;:39;;;;;;;;:::i;:::-;;18535:238;;;18595:44;;-1:-1:-1;;;18595:44:0;;30640:2:1;18595:44:0;;;30622:21:1;30679:2;30659:18;;;30652:30;30718:34;30698:18;;;30691:62;-1:-1:-1;;;30769:18:1;;;30762:32;30811:19;;18595:44:0;30438:398:1;18535:238:0;18670:30;18661:5;:39;;;;;;;;:::i;:::-;;18657:116;;;18717:44;;-1:-1:-1;;;18717:44:0;;31043:2:1;18717:44:0;;;31025:21:1;31082:2;31062:18;;;31055:30;31121:34;31101:18;;;31094:62;-1:-1:-1;;;31172:18:1;;;31165:32;31214:19;;18717:44:0;30841:398:1;18657:116:0;18137:643;:::o;10289:712::-;10439:12;10468:7;10464:530;;;-1:-1:-1;10499:10:0;10492:17;;10464:530;10613:17;;:21;10609:374;;10811:10;10805:17;10872:15;10859:10;10855:2;10851:19;10844:44;10609:374;10954:12;10947:20;;-1:-1:-1;;;10947:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;:::o;14:159:1:-;77:5;122:3;113:6;108:3;104:16;100:26;97:46;;;139:1;136;129:12;97:46;-1:-1:-1;161:6:1;14:159;-1:-1:-1;14:159:1:o;178:388::-;259:8;269:6;323:3;316:4;308:6;304:17;300:27;290:55;;341:1;338;331:12;290:55;-1:-1:-1;364:20:1;;-1:-1:-1;;;;;396:30:1;;393:50;;;439:1;436;429:12;393:50;476:4;468:6;464:17;452:29;;539:3;532:4;524;516:6;512:17;504:6;500:30;496:41;493:50;490:70;;;556:1;553;546:12;490:70;178:388;;;;;:::o;571:882::-;743:6;751;759;767;775;828:3;816:9;807:7;803:23;799:33;796:53;;;845:1;842;835:12;796:53;885:9;872:23;-1:-1:-1;;;;;955:2:1;947:6;944:14;941:34;;;971:1;968;961:12;941:34;994:70;1056:7;1047:6;1036:9;1032:22;994:70;:::i;:::-;984:80;;1117:2;1106:9;1102:18;1089:32;1073:48;;1146:2;1136:8;1133:16;1130:36;;;1162:1;1159;1152:12;1130:36;;1201:90;1283:7;1272:8;1261:9;1257:24;1201:90;:::i;:::-;571:882;;1310:8;;-1:-1:-1;1175:116:1;;1392:2;1377:18;;1364:32;;1443:2;1428:18;;;1415:32;;-1:-1:-1;571:882:1;-1:-1:-1;;;;571:882:1:o;1458:430::-;1556:6;1564;1617:2;1605:9;1596:7;1592:23;1588:32;1585:52;;;1633:1;1630;1623:12;1585:52;1673:9;1660:23;-1:-1:-1;;;;;1698:6:1;1695:30;1692:50;;;1738:1;1735;1728:12;1692:50;1761:70;1823:7;1814:6;1803:9;1799:22;1761:70;:::i;:::-;1751:80;1878:2;1863:18;;;;1850:32;;-1:-1:-1;;;;1458:430:1:o;1893:173::-;1961:20;;-1:-1:-1;;;;;2010:31:1;;2000:42;;1990:70;;2056:1;2053;2046:12;1990:70;1893:173;;;:::o;2071:186::-;2130:6;2183:2;2171:9;2162:7;2158:23;2154:32;2151:52;;;2199:1;2196;2189:12;2151:52;2222:29;2241:9;2222:29;:::i;2444:348::-;2496:8;2506:6;2560:3;2553:4;2545:6;2541:17;2537:27;2527:55;;2578:1;2575;2568:12;2527:55;-1:-1:-1;2601:20:1;;-1:-1:-1;;;;;2633:30:1;;2630:50;;;2676:1;2673;2666:12;2630:50;2713:4;2705:6;2701:17;2689:29;;2765:3;2758:4;2749:6;2741;2737:19;2733:30;2730:39;2727:59;;;2782:1;2779;2772:12;2797:553;2886:6;2894;2902;2910;2963:2;2951:9;2942:7;2938:23;2934:32;2931:52;;;2979:1;2976;2969:12;2931:52;3002:29;3021:9;3002:29;:::i;:::-;2992:39;;3082:2;3071:9;3067:18;3054:32;-1:-1:-1;;;;;3101:6:1;3098:30;3095:50;;;3141:1;3138;3131:12;3095:50;3180:59;3231:7;3222:6;3211:9;3207:22;3180:59;:::i;:::-;2797:553;;3258:8;;-1:-1:-1;3154:85:1;;3340:2;3325:18;3312:32;;2797:553;-1:-1:-1;;;;2797:553:1:o;3355:127::-;3416:10;3411:3;3407:20;3404:1;3397:31;3447:4;3444:1;3437:15;3471:4;3468:1;3461:15;3487:255;3559:2;3553:9;3601:6;3589:19;;-1:-1:-1;;;;;3623:34:1;;3659:22;;;3620:62;3617:88;;;3685:18;;:::i;:::-;3721:2;3714:22;3487:255;:::o;3747:275::-;3818:2;3812:9;3883:2;3864:13;;-1:-1:-1;;3860:27:1;3848:40;;-1:-1:-1;;;;;3903:34:1;;3939:22;;;3900:62;3897:88;;;3965:18;;:::i;:::-;4001:2;3994:22;3747:275;;-1:-1:-1;3747:275:1:o;4027:183::-;4087:4;-1:-1:-1;;;;;4112:6:1;4109:30;4106:56;;;4142:18;;:::i;:::-;-1:-1:-1;4187:1:1;4183:14;4199:4;4179:25;;4027:183::o;4215:662::-;4269:5;4322:3;4315:4;4307:6;4303:17;4299:27;4289:55;;4340:1;4337;4330:12;4289:55;4376:6;4363:20;4402:4;4426:60;4442:43;4482:2;4442:43;:::i;:::-;4426:60;:::i;:::-;4520:15;;;4606:1;4602:10;;;;4590:23;;4586:32;;;4551:12;;;;4630:15;;;4627:35;;;4658:1;4655;4648:12;4627:35;4694:2;4686:6;4682:15;4706:142;4722:6;4717:3;4714:15;4706:142;;;4788:17;;4776:30;;4826:12;;;;4739;;4706:142;;;-1:-1:-1;4866:5:1;4215:662;-1:-1:-1;;;;;;4215:662:1:o;4882:668::-;4936:5;4989:3;4982:4;4974:6;4970:17;4966:27;4956:55;;5007:1;5004;4997:12;4956:55;5043:6;5030:20;5069:4;5093:60;5109:43;5149:2;5109:43;:::i;5093:60::-;5187:15;;;5273:1;5269:10;;;;5257:23;;5253:32;;;5218:12;;;;5297:15;;;5294:35;;;5325:1;5322;5315:12;5294:35;5361:2;5353:6;5349:15;5373:148;5389:6;5384:3;5381:15;5373:148;;;5455:23;5474:3;5455:23;:::i;:::-;5443:36;;5499:12;;;;5406;;5373:148;;5555:530;5597:5;5650:3;5643:4;5635:6;5631:17;5627:27;5617:55;;5668:1;5665;5658:12;5617:55;5704:6;5691:20;-1:-1:-1;;;;;5726:2:1;5723:26;5720:52;;;5752:18;;:::i;:::-;5796:55;5839:2;5820:13;;-1:-1:-1;;5816:27:1;5845:4;5812:38;5796:55;:::i;:::-;5876:2;5867:7;5860:19;5922:3;5915:4;5910:2;5902:6;5898:15;5894:26;5891:35;5888:55;;;5939:1;5936;5929:12;5888:55;6004:2;5997:4;5989:6;5985:17;5978:4;5969:7;5965:18;5952:55;6052:1;6027:16;;;6045:4;6023:27;6016:38;;;;6031:7;5555:530;-1:-1:-1;;;5555:530:1:o;6090:2222::-;6284:6;6292;6300;6308;6361:2;6349:9;6340:7;6336:23;6332:32;6329:52;;;6377:1;6374;6367:12;6329:52;6417:9;6404:23;-1:-1:-1;;;;;6487:2:1;6479:6;6476:14;6473:34;;;6503:1;6500;6493:12;6473:34;6526:70;6588:7;6579:6;6568:9;6564:22;6526:70;:::i;:::-;6516:80;;6649:2;6638:9;6634:18;6621:32;6605:48;;6678:2;6668:8;6665:16;6662:36;;;6694:1;6691;6684:12;6662:36;6733:90;6815:7;6804:8;6793:9;6789:24;6733:90;:::i;:::-;6842:8;;-1:-1:-1;6707:116:1;-1:-1:-1;6930:2:1;6915:18;;6902:32;;-1:-1:-1;6946:16:1;;;6943:36;;;6975:1;6972;6965:12;6943:36;6998:24;;;;7056:6;7038:16;;;7034:29;7031:49;;;7076:1;7073;7066:12;7031:49;7102:22;;:::i;:::-;7162:2;7149:16;7190:2;7180:8;7177:16;7174:36;;;7206:1;7203;7196:12;7174:36;7233:56;7281:7;7270:8;7266:2;7262:17;7233:56;:::i;:::-;7226:5;7219:71;;7336:2;7332;7328:11;7315:25;7365:2;7355:8;7352:16;7349:36;;;7381:1;7378;7371:12;7349:36;7417:56;7465:7;7454:8;7450:2;7446:17;7417:56;:::i;:::-;7412:2;7405:5;7401:14;7394:80;;7520:2;7516;7512:11;7499:25;7549:2;7539:8;7536:16;7533:36;;;7565:1;7562;7555:12;7533:36;7601:56;7649:7;7638:8;7634:2;7630:17;7601:56;:::i;:::-;7596:2;7589:5;7585:14;7578:80;;7704:2;7700;7696:11;7683:25;7733:2;7723:8;7720:16;7717:36;;;7749:1;7746;7739:12;7717:36;7785:56;7833:7;7822:8;7818:2;7814:17;7785:56;:::i;:::-;7780:2;7773:5;7769:14;7762:80;;7875:32;7902:3;7898:2;7894:12;7875:32;:::i;:::-;7869:3;7862:5;7858:15;7851:57;7954:3;7950:2;7946:12;7933:26;7984:2;7974:8;7971:16;7968:36;;;8000:1;7997;7990:12;7968:36;8037:44;8073:7;8062:8;8058:2;8054:17;8037:44;:::i;:::-;8031:3;8024:5;8020:15;8013:69;;8136:3;8132:2;8128:12;8115:26;8109:3;8102:5;8098:15;8091:51;8196:3;8192:2;8188:12;8175:26;8169:3;8162:5;8158:15;8151:51;8221:3;8211:13;;8277:2;8273;8269:11;8256:25;8251:2;8244:5;8240:14;8233:49;8301:5;8291:15;;;;;6090:2222;;;;;;;:::o;8317:180::-;8376:6;8429:2;8417:9;8408:7;8404:23;8400:32;8397:52;;;8445:1;8442;8435:12;8397:52;-1:-1:-1;8468:23:1;;8317:180;-1:-1:-1;8317:180:1:o;8502:367::-;8565:8;8575:6;8629:3;8622:4;8614:6;8610:17;8606:27;8596:55;;8647:1;8644;8637:12;8596:55;-1:-1:-1;8670:20:1;;-1:-1:-1;;;;;8702:30:1;;8699:50;;;8745:1;8742;8735:12;8699:50;8782:4;8774:6;8770:17;8758:29;;8842:3;8835:4;8825:6;8822:1;8818:14;8810:6;8806:27;8802:38;8799:47;8796:67;;;8859:1;8856;8849:12;8874:1905;9163:6;9171;9179;9187;9195;9203;9211;9219;9227;9235;9243:7;9252;9306:3;9294:9;9285:7;9281:23;9277:33;9274:53;;;9323:1;9320;9313:12;9274:53;-1:-1:-1;;;;;9355:9:1;9342:23;9339:47;9336:67;;;9399:1;9396;9389:12;9336:67;9422:87;9501:7;9488:9;9475:23;9464:9;9460:39;9422:87;:::i;:::-;9412:97;;-1:-1:-1;;;;;9552:2:1;9541:9;9537:18;9524:32;9521:56;9518:76;;;9590:1;9587;9580:12;9518:76;9629:114;9735:7;9728:2;9717:9;9713:18;9700:32;9689:9;9685:48;9629:114;:::i;:::-;9762:8;;-1:-1:-1;9789:8:1;-1:-1:-1;;;;;;9840:2:1;9825:18;;9812:32;9809:56;9806:76;;;9878:1;9875;9868:12;9806:76;9917:96;10005:7;9998:2;9987:9;9983:18;9970:32;9959:9;9955:48;9917:96;:::i;:::-;10032:8;;-1:-1:-1;10059:8:1;-1:-1:-1;;;;;;10110:2:1;10095:18;;10082:32;10079:56;10076:76;;;10148:1;10145;10138:12;10076:76;10187:96;10275:7;10268:2;10257:9;10253:18;10240:32;10229:9;10225:48;10187:96;:::i;:::-;10302:8;;-1:-1:-1;10329:8:1;-1:-1:-1;;;;;;10380:3:1;10365:19;;10352:33;10349:57;10346:77;;;10419:1;10416;10409:12;10346:77;10458:97;10547:7;10539:3;10528:9;10524:19;10511:33;10500:9;10496:49;10458:97;:::i;:::-;10574:8;;-1:-1:-1;10601:8:1;-1:-1:-1;10656:3:1;10641:19;;10628:33;;-1:-1:-1;10681:39:1;10715:3;10700:19;;10681:39;:::i;:::-;10670:50;;10768:3;10757:9;10753:19;10740:33;10729:44;;8874:1905;;;;;;;;;;;;;;:::o;10784:985::-;10977:6;10985;10993;11001;11054:2;11042:9;11033:7;11029:23;11025:32;11022:52;;;11070:1;11067;11060:12;11022:52;11110:9;11097:23;-1:-1:-1;;;;;11180:2:1;11172:6;11169:14;11166:34;;;11196:1;11193;11186:12;11166:34;11219:70;11281:7;11272:6;11261:9;11257:22;11219:70;:::i;:::-;11209:80;;11342:2;11331:9;11327:18;11314:32;11298:48;;11371:2;11361:8;11358:16;11355:36;;;11387:1;11384;11377:12;11355:36;11410:72;11474:7;11463:8;11452:9;11448:24;11410:72;:::i;:::-;11400:82;;11535:2;11524:9;11520:18;11507:32;11491:48;;11564:2;11554:8;11551:16;11548:36;;;11580:1;11577;11570:12;11548:36;;11619:90;11701:7;11690:8;11679:9;11675:24;11619:90;:::i;:::-;10784:985;;;;-1:-1:-1;11728:8:1;-1:-1:-1;;;;10784:985:1:o;11956:156::-;12022:20;;12082:4;12071:16;;12061:27;;12051:55;;12102:1;12099;12092:12;12117:1081;12237:6;12245;12253;12261;12269;12277;12285;12338:3;12326:9;12317:7;12313:23;12309:33;12306:53;;;12355:1;12352;12345:12;12306:53;12395:9;12382:23;-1:-1:-1;;;;;12465:2:1;12457:6;12454:14;12451:34;;;12481:1;12478;12471:12;12451:34;12520:59;12571:7;12562:6;12551:9;12547:22;12520:59;:::i;:::-;12598:8;;-1:-1:-1;12494:85:1;-1:-1:-1;12686:2:1;12671:18;;12658:32;;-1:-1:-1;12702:16:1;;;12699:36;;;12731:1;12728;12721:12;12699:36;12770:61;12823:7;12812:8;12801:9;12797:24;12770:61;:::i;:::-;12850:8;;-1:-1:-1;12744:87:1;-1:-1:-1;12938:2:1;12923:18;;12910:32;;-1:-1:-1;12954:16:1;;;12951:36;;;12983:1;12980;12973:12;12951:36;;13022:61;13075:7;13064:8;13053:9;13049:24;13022:61;:::i;:::-;13102:8;;-1:-1:-1;12996:87:1;-1:-1:-1;13156:36:1;;-1:-1:-1;13188:2:1;13173:18;;13156:36;:::i;:::-;13146:46;;12117:1081;;;;;;;;;;:::o;13203:1014::-;13311:9;13370:4;13362:5;13346:14;13342:26;13338:37;13335:57;;;13388:1;13385;13378:12;13335:57;13421:2;13415:9;13463:4;13455:6;13451:17;-1:-1:-1;;;;;13555:6:1;13543:10;13540:22;13535:2;13523:10;13520:18;13517:46;13514:72;;;13566:18;;:::i;:::-;13606:10;13602:2;13595:22;13653:5;13640:19;13626:33;;13682:2;13674:6;13671:14;13668:34;;;13698:1;13695;13688:12;13668:34;13726:64;13775:14;13766:6;13759:5;13755:18;13726:64;:::i;:::-;13718:6;13711:80;13840:2;13833:5;13829:14;13816:28;13800:44;;13869:2;13859:8;13856:16;13853:36;;;13885:1;13882;13875:12;13853:36;;13922:66;13973:14;13962:8;13955:5;13951:20;13922:66;:::i;:::-;13917:2;13909:6;13905:15;13898:91;;14046:2;14039:5;14035:14;14022:28;14017:2;14009:6;14005:15;13998:53;14108:2;14101:5;14097:14;14084:28;14079:2;14071:6;14067:15;14060:53;14147:35;14177:3;14170:5;14166:15;14147:35;:::i;:::-;14141:3;14129:16;;14122:61;14133:6;13203:1014;-1:-1:-1;;13203:1014:1:o;14222:355::-;14424:2;14406:21;;;14463:2;14443:18;;;14436:30;14502:33;14497:2;14482:18;;14475:61;14568:2;14553:18;;14222:355::o;14790:184::-;14860:6;14913:2;14901:9;14892:7;14888:23;14884:32;14881:52;;;14929:1;14926;14919:12;14881:52;-1:-1:-1;14952:16:1;;14790:184;-1:-1:-1;14790:184:1:o;14979:127::-;15040:10;15035:3;15031:20;15028:1;15021:31;15071:4;15068:1;15061:15;15095:4;15092:1;15085:15;15111:128;15151:3;15182:1;15178:6;15175:1;15172:13;15169:39;;;15188:18;;:::i;:::-;-1:-1:-1;15224:9:1;;15111:128::o;15244:125::-;15284:4;15312:1;15309;15306:8;15303:34;;;15317:18;;:::i;:::-;-1:-1:-1;15354:9:1;;15244:125::o;15374:267::-;15463:6;15458:3;15451:19;15515:6;15508:5;15501:4;15496:3;15492:14;15479:43;-1:-1:-1;15567:1:1;15542:16;;;15560:4;15538:27;;;15531:38;;;;15623:2;15602:15;;;-1:-1:-1;;15598:29:1;15589:39;;;15585:50;;15374:267::o;15646:389::-;15861:2;15850:9;15843:21;15824:4;15881:62;15939:2;15928:9;15924:18;15916:6;15908;15881:62;:::i;:::-;15974:2;15959:18;;15952:34;;;;-1:-1:-1;16017:2:1;16002:18;15995:34;15873:70;15646:389;-1:-1:-1;;15646:389:1:o;16293:435::-;16346:3;16384:5;16378:12;16411:6;16406:3;16399:19;16437:4;16466:2;16461:3;16457:12;16450:19;;16503:2;16496:5;16492:14;16524:1;16534:169;16548:6;16545:1;16542:13;16534:169;;;16609:13;;16597:26;;16643:12;;;;16678:15;;;;16570:1;16563:9;16534:169;;;-1:-1:-1;16719:3:1;;16293:435;-1:-1:-1;;;;;16293:435:1:o;16733:461::-;16786:3;16824:5;16818:12;16851:6;16846:3;16839:19;16877:4;16906:2;16901:3;16897:12;16890:19;;16943:2;16936:5;16932:14;16964:1;16974:195;16988:6;16985:1;16982:13;16974:195;;;17053:13;;-1:-1:-1;;;;;17049:39:1;17037:52;;17109:12;;;;17144:15;;;;17085:1;17003:9;16974:195;;17199:258;17271:1;17281:113;17295:6;17292:1;17289:13;17281:113;;;17371:11;;;17365:18;17352:11;;;17345:39;17317:2;17310:10;17281:113;;;17412:6;17409:1;17406:13;17403:48;;;-1:-1:-1;;17447:1:1;17429:16;;17422:27;17199:258::o;17462:257::-;17503:3;17541:5;17535:12;17568:6;17563:3;17556:19;17584:63;17640:6;17633:4;17628:3;17624:14;17617:4;17610:5;17606:16;17584:63;:::i;:::-;17701:2;17680:15;-1:-1:-1;;17676:29:1;17667:39;;;;17708:4;17663:50;;17462:257;-1:-1:-1;;17462:257:1:o;17724:1600::-;18399:4;18428:3;18458:6;18447:9;18440:25;18501:6;18496:2;18485:9;18481:18;18474:34;18544:2;18539;18528:9;18524:18;18517:30;18570:56;18622:2;18611:9;18607:18;18599:6;18570:56;:::i;:::-;18556:70;;18674:9;18666:6;18662:22;18657:2;18646:9;18642:18;18635:50;18708:44;18745:6;18737;18708:44;:::i;:::-;18694:58;;18801:9;18793:6;18789:22;18783:3;18772:9;18768:19;18761:51;18835:44;18872:6;18864;18835:44;:::i;:::-;18821:58;;18928:9;18920:6;18916:22;18910:3;18899:9;18895:19;18888:51;18962:44;18999:6;18991;18962:44;:::i;:::-;-1:-1:-1;;;;;19043:32:1;;19037:3;19022:19;;19015:61;19113:22;;;19107:3;19092:19;;19085:51;18948:58;-1:-1:-1;19153:32:1;18948:58;19170:6;19153:32;:::i;:::-;19216:3;19201:19;;19194:35;;;;-1:-1:-1;;19260:3:1;19245:19;;19238:35;;;;19304:3;19289:19;;;19282:36;19145:40;17724:1600;-1:-1:-1;;;;;;;;17724:1600:1:o;19329:127::-;19390:10;19385:3;19381:20;19378:1;19371:31;19421:4;19418:1;19411:15;19445:4;19442:1;19435:15;19461:135;19500:3;-1:-1:-1;;19521:17:1;;19518:43;;;19541:18;;:::i;:::-;-1:-1:-1;19588:1:1;19577:13;;19461:135::o;19601:432::-;19832:6;19821:9;19814:25;19875:6;19870:2;19859:9;19855:18;19848:34;19918:3;19913:2;19902:9;19898:18;19891:31;19795:4;19939:45;19979:3;19968:9;19964:19;19956:6;19939:45;:::i;:::-;19931:53;;20020:6;20015:2;20004:9;20000:18;19993:34;19601:432;;;;;;;:::o;20038:354::-;20126:19;;;20108:3;-1:-1:-1;;;;;20157:31:1;;20154:51;;;20201:1;20198;20191:12;20154:51;20237:6;20234:1;20230:14;20289:8;20282:5;20275:4;20270:3;20266:14;20253:45;20366:1;20321:18;;20341:4;20317:29;20355:13;;;-1:-1:-1;20317:29:1;;20038:354;-1:-1:-1;;20038:354:1:o;20397:447::-;20497:6;20492:3;20485:19;20467:3;20523:4;20552:2;20547:3;20543:12;20536:19;;20578:5;20601:1;20611:208;20625:6;20622:1;20619:13;20611:208;;;-1:-1:-1;;;;;20690:26:1;20709:6;20690:26;:::i;:::-;20686:52;20674:65;;20759:12;;;;20794:15;;;;20647:1;20640:9;20611:208;;20849:1243;21402:4;21431:3;21461:6;21450:9;21443:25;21504:6;21499:2;21488:9;21484:18;21477:34;21547:2;21542;21531:9;21527:18;21520:30;21573:73;21642:2;21631:9;21627:18;21619:6;21611;21573:73;:::i;:::-;21559:87;;21694:9;21686:6;21682:22;21677:2;21666:9;21662:18;21655:50;21728:61;21782:6;21774;21766;21728:61;:::i;:::-;21714:75;;21838:9;21830:6;21826:22;21820:3;21809:9;21805:19;21798:51;21866:61;21920:6;21912;21904;21866:61;:::i;:::-;21958:3;21943:19;;21936:35;;;;-1:-1:-1;;;;;;;22008:32:1;;;;22002:3;21987:19;;21980:61;22072:3;22057:19;;;22050:36;21858:69;20849:1243;-1:-1:-1;;;;;;;;20849:1243:1:o;22097:545::-;22190:4;22196:6;22256:11;22243:25;22350:2;22346:7;22335:8;22319:14;22315:29;22311:43;22291:18;22287:68;22277:96;;22369:1;22366;22359:12;22277:96;22396:33;;22448:20;;;-1:-1:-1;;;;;;22480:30:1;;22477:50;;;22523:1;22520;22513:12;22477:50;22556:4;22544:17;;-1:-1:-1;22607:1:1;22603:14;;;22587;22583:35;22573:46;;22570:66;;;22632:1;22629;22622:12;23197:761;23558:6;23547:9;23540:25;23601:6;23596:2;23585:9;23581:18;23574:34;23673:1;23669;23664:3;23660:11;23656:19;23648:6;23644:32;23639:2;23628:9;23624:18;23617:60;23713:3;23708:2;23697:9;23693:18;23686:31;23521:4;23740:74;23809:3;23798:9;23794:19;23786:6;23778;23740:74;:::i;:::-;23863:9;23855:6;23851:22;23845:3;23834:9;23830:19;23823:51;23891:61;23945:6;23937;23929;23891:61;:::i;:::-;23883:69;23197:761;-1:-1:-1;;;;;;;;;;23197:761:1:o;23963:614::-;-1:-1:-1;;;;;24232:32:1;;24214:51;;24301:3;24296:2;24281:18;;24274:31;;;-1:-1:-1;;24328:63:1;;24371:19;;24363:6;24355;24328:63;:::i;:::-;24439:9;24431:6;24427:22;24422:2;24411:9;24407:18;24400:50;24467;24510:6;24502;24494;24467:50;:::i;:::-;24459:58;;;24565:4;24557:6;24553:17;24548:2;24537:9;24533:18;24526:45;23963:614;;;;;;;;;:::o;24582:779::-;24909:3;24898:9;24891:22;24872:4;24936:63;24994:3;24983:9;24979:19;24971:6;24963;24936:63;:::i;:::-;25047:9;25039:6;25035:22;25030:2;25019:9;25015:18;25008:50;25081;25124:6;25116;25108;25081:50;:::i;:::-;25067:64;;25179:9;25171:6;25167:22;25162:2;25151:9;25147:18;25140:50;25207;25250:6;25242;25234;25207:50;:::i;:::-;25305:4;25293:17;;;;25288:2;25273:18;;25266:45;-1:-1:-1;;25342:3:1;25327:19;25320:35;25199:58;24582:779;-1:-1:-1;;;;;;24582:779:1:o;25366:182::-;25423:6;25476:2;25464:9;25455:7;25451:23;25447:32;25444:52;;;25492:1;25489;25482:12;25444:52;25515:27;25532:9;25515:27;:::i;25553:851::-;25950:6;25939:9;25932:25;25993:6;25988:2;25977:9;25973:18;25966:34;26036:6;26031:2;26020:9;26016:18;26009:34;26079:3;26074:2;26063:9;26059:18;26052:31;25913:4;26106:57;26158:3;26147:9;26143:19;26135:6;26106:57;:::i;:::-;26212:9;26204:6;26200:22;26194:3;26183:9;26179:19;26172:51;26240:44;26277:6;26269;26240:44;:::i;:::-;26315:3;26300:19;;26293:35;;;;-1:-1:-1;;;;;;;26365:32:1;;;;26359:3;26344:19;;;26337:61;26232:52;25553:851;-1:-1:-1;;;;;25553:851:1:o;27453:277::-;27520:6;27573:2;27561:9;27552:7;27548:23;27544:32;27541:52;;;27589:1;27586;27579:12;27541:52;27621:9;27615:16;27674:5;27667:13;27660:21;27653:5;27650:32;27640:60;;27696:1;27693;27686:12;28911:274;29040:3;29078:6;29072:13;29094:53;29140:6;29135:3;29128:4;29120:6;29116:17;29094:53;:::i;:::-;29163:16;;;;;28911:274;-1:-1:-1;;28911:274:1:o;29593:127::-;29654:10;29649:3;29645:20;29642:1;29635:31;29685:4;29682:1;29675:15;29709:4;29706:1;29699:15;31244:219;31393:2;31382:9;31375:21;31356:4;31413:44;31453:2;31442:9;31438:18;31430:6;31413:44;:::i
Swarm Source
ipfs://f67b85cde71509af3b69e23a70a8d2edf79e584fb932eba1c9dd0668f0286f1f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.