ERC-721
Overview
Max Total Supply
2 Ftm4
Holders
2
Market
Fully Diluted Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
0 Ftm4Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
MapleBank
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2021-11-28 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: tests/PriceSource.sol pragma solidity >=0.8.0; interface PriceSource { function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.0 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol) 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 making 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/Address.sol // OpenZeppelin Contracts v4.4.0 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `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/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/utils/SafeERC20.sol) 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/utils/Context.sol // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: tests/MyVaultV4.sol pragma solidity >=0.8.0; contract VaultNFTv4 is ERC721Enumerable { string public uri; constructor(string memory name, string memory symbol, string memory _uri) ERC721(name, symbol) { uri = _uri; } } // File: tests/MapleVault.sol //SPDX-License-Identifier: MIT pragma solidity >=0.8.0; interface GRNCRD { function deposit() payable external returns (uint256); function withdraw(uint256 amount) external returns (uint256); } interface IMapleDollar { function mint(address _to, uint256 _amount) external; function burn(address _from, uint256 _amount) external; function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } contract MapleVault is ReentrancyGuard, VaultNFTv4 { PriceSource public ethPriceSource; using SafeMath for uint256; using SafeERC20 for IERC20; uint256 public _minimumCollateralPercentage; uint256 public vaultCount; uint256 public debtCeiling; uint256 public closingFee; uint256 public openingFee; uint256 public treasury; uint256 public tokenPeg; mapping(uint256 => uint256) public vaultCollateral; mapping(uint256 => uint256) public vaultDebt; uint256 public debtRatio; uint256 public gainRatio; address public stabilityPool; IERC20 public collateral; IERC20Metadata private collateralInfo; IMapleDollar public mai; IERC20Metadata private maiInfo; uint256 public priceSourceDecimals; uint256 public totalBorrowed; event CreateVault(uint256 vaultID, address creator); event DestroyVault(uint256 vaultID); event TransferVault(uint256 vaultID, address from, address to); event DepositCollateral(uint256 vaultID, uint256 amount); event WithdrawCollateral(uint256 vaultID, uint256 amount); event BorrowToken(uint256 vaultID, uint256 amount); event PayBackToken(uint256 vaultID, uint256 amount, uint256 closingFee); event LiquidateVault(uint256 vaultID, address owner, address buyer, uint256 debtRepaid, uint256 collateralLiquidated, uint256 closingFee); mapping(address => uint256) public maticDebt; constructor( address ethPriceSourceAddress, uint256 minimumCollateralPercentage, string memory name, string memory symbol, address _mai, address _collateral, string memory baseURI ) VaultNFTv4(name, symbol, baseURI) { assert(ethPriceSourceAddress != address(0)); assert(minimumCollateralPercentage != 0); // | decimals start here debtCeiling=10000000000000000000;// 10 dollars closingFee=50; // 0.5% openingFee=0; // 0.0% ethPriceSource = PriceSource(ethPriceSourceAddress); stabilityPool = address(0); tokenPeg = 100000000; // $1 debtRatio = 2; // 1/2, pay back 50% gainRatio = 1100;// /10 so 1.1 _minimumCollateralPercentage = minimumCollateralPercentage; collateral = IERC20(_collateral); collateralInfo = IERC20Metadata(_collateral); mai = IMapleDollar(_mai); maiInfo = IERC20Metadata(_mai); priceSourceDecimals = 8; } modifier onlyVaultOwner(uint256 vaultID) { require(_exists(vaultID), "Vault does not exist"); require(ownerOf(vaultID) == msg.sender, "Vault is not owned by you"); _; } function getDebtCeiling() public view returns (uint256){ return debtCeiling; } function exists(uint256 vaultID) external view returns (bool){ return _exists(vaultID); } function getClosingFee() external view returns (uint256){ return closingFee; } function getOpeningFee() external view returns (uint256){ return openingFee; } function getTokenPriceSource() public view returns (uint256){ return tokenPeg; } function getEthPriceSource() public view returns (uint256){ (,int256 price,,,) = ethPriceSource.latestRoundData(); return uint256(price); } function calculateCollateralProperties(uint256 _collateral, uint256 _debt) private view returns (uint256, uint256) { assert(getEthPriceSource() != 0); assert(getTokenPriceSource() != 0); uint256 collateralValue = _collateral.mul(getEthPriceSource()).mul(10**(uint256(maiInfo.decimals()).sub(uint256(collateralInfo.decimals())))); assert(collateralValue >= _collateral); uint256 debtValue = _debt.mul(getTokenPriceSource()); assert(debtValue >= _debt); uint256 collateralValueTimes100 = collateralValue.mul(100); assert(collateralValueTimes100 > collateralValue); return (collateralValueTimes100, debtValue); } function isValidCollateral(uint256 _collateral, uint256 debt) private view returns (bool) { (uint256 collateralValueTimes100, uint256 debtValue) = calculateCollateralProperties(_collateral, debt); uint256 collateralPercentage = collateralValueTimes100.div(debtValue); return collateralPercentage >= _minimumCollateralPercentage; } function createVault() external returns (uint256) { uint256 id = vaultCount; vaultCount = vaultCount.add(1); assert(vaultCount >= id); _mint(msg.sender,id); emit CreateVault(id, msg.sender); return id; } function destroyVault(uint256 vaultID) external onlyVaultOwner(vaultID) nonReentrant { require(vaultDebt[vaultID] == 0, "Vault has outstanding debt"); if(vaultCollateral[vaultID]!=0) { // withdraw leftover collateral collateral.safeTransfer(ownerOf(vaultID), vaultCollateral[vaultID]); } _burn(vaultID); delete vaultCollateral[vaultID]; delete vaultDebt[vaultID]; emit DestroyVault(vaultID); } function depositNative(uint256 vaultID) public payable nonReentrant { GRNCRD(0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83).deposit{value: msg.value}(); collateral.approve(address(this), 0xffffffffffffffffffffffffffffffffffff); collateral.safeTransferFrom(address(this), msg.sender, msg.value); depositCollateral(vaultID, msg.value); } function depositCollateral(uint256 vaultID, uint256 amount) public { collateral.safeTransferFrom(msg.sender, address(this), amount); uint256 newCollateral = vaultCollateral[vaultID].add(amount); assert(newCollateral >= vaultCollateral[vaultID]); vaultCollateral[vaultID] = newCollateral; emit DepositCollateral(vaultID, amount); } function withdrawCollateral(uint256 vaultID, uint256 amount, bool unwrap) public onlyVaultOwner(vaultID) nonReentrant { require(vaultCollateral[vaultID] >= amount, "Vault does not have enough collateral"); uint256 newCollateral = vaultCollateral[vaultID].sub(amount); if(vaultDebt[vaultID] != 0) { require(isValidCollateral(newCollateral, vaultDebt[vaultID]), "Withdrawal would put vault below minimum collateral percentage"); } vaultCollateral[vaultID] = newCollateral; if(unwrap){ GRNCRD(0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83).withdraw(amount); payable(msg.sender).transfer(amount); } else{ collateral.safeTransfer(msg.sender, amount); } emit WithdrawCollateral(vaultID, amount); } receive() external payable {} function borrowToken(uint256 vaultID, uint256 amount) external onlyVaultOwner(vaultID) { require(amount > 0, "Must borrow non-zero amount"); require(mai.totalSupply().add(amount) <= debtCeiling, "borrowToken: Cannot mint over available supply."); uint256 newDebt = vaultDebt[vaultID].add(amount); assert(newDebt > vaultDebt[vaultID]); require(isValidCollateral(vaultCollateral[vaultID], newDebt), "Borrow would put vault below minimum collateral percentage"); vaultDebt[vaultID] = newDebt; totalBorrowed = totalBorrowed.add(newDebt); // mai mai.mint(msg.sender, amount); emit BorrowToken(vaultID, amount); } function payBackToken(uint256 vaultID, uint256 amount) external { require(mai.balanceOf(msg.sender) >= amount, "Token balance too low"); require(vaultDebt[vaultID] >= amount, "Vault debt less than amount to pay back"); uint256 _closingFee = (amount.mul(closingFee).mul(getTokenPriceSource())).div(getEthPriceSource().mul(10000)); vaultDebt[vaultID] = vaultDebt[vaultID].sub(amount); vaultCollateral[vaultID]=vaultCollateral[vaultID].sub(_closingFee); vaultCollateral[treasury]=vaultCollateral[treasury].add(_closingFee); totalBorrowed = totalBorrowed.sub(amount); //mai mai.burn(msg.sender, amount); emit PayBackToken(vaultID, amount, _closingFee); } function getPaid() public nonReentrant { require(maticDebt[msg.sender]!=0, "Don't have anything for you."); uint256 amount = maticDebt[msg.sender]; maticDebt[msg.sender]=0; collateral.safeTransfer(msg.sender, amount); } function checkCost(uint256 vaultID) public view returns (uint256) { if(vaultCollateral[vaultID] == 0 || vaultDebt[vaultID]==0 || !checkLiquidation(vaultID) ){ return 0; } (uint256 collateralValueTimes100, uint256 debtValue) = calculateCollateralProperties(vaultCollateral[vaultID], vaultDebt[vaultID]); if(debtValue==0){ return 0; } uint256 collateralPercentage = collateralValueTimes100.div(debtValue); debtValue = debtValue.div(10 ** priceSourceDecimals); uint256 halfDebt = debtValue.div(debtRatio); //debtRatio (2) return(halfDebt); } function checkExtract(uint256 vaultID) public view returns (uint256) { if(vaultCollateral[vaultID] == 0|| !checkLiquidation(vaultID) ) { return 0; } (uint256 collateralValueTimes100, uint256 debtValue) = calculateCollateralProperties(vaultCollateral[vaultID], vaultDebt[vaultID]); uint256 halfDebt = debtValue.div(debtRatio); //debtRatio (2) if(halfDebt==0){ return 0; } return halfDebt.mul(gainRatio).div(1000).div(getEthPriceSource()); } function checkCollateralPercentage(uint256 vaultID) public view returns(uint256){ require(_exists(vaultID), "Vault does not exist"); if(vaultCollateral[vaultID] == 0 || vaultDebt[vaultID]==0){ return 0; } (uint256 collateralValueTimes100, uint256 debtValue) = calculateCollateralProperties(vaultCollateral[vaultID], vaultDebt[vaultID]); return collateralValueTimes100.div(debtValue); } function checkLiquidation(uint256 vaultID) public view returns (bool) { require(_exists(vaultID), "Vault does not exist"); if(vaultCollateral[vaultID] == 0 || vaultDebt[vaultID]==0){ return false; } (uint256 collateralValueTimes100, uint256 debtValue) = calculateCollateralProperties(vaultCollateral[vaultID], vaultDebt[vaultID]); uint256 collateralPercentage = collateralValueTimes100.div(debtValue); if(collateralPercentage < _minimumCollateralPercentage){ return true; } else{ return false; } } function liquidateVault(uint256 vaultID) external { require(_exists(vaultID), "Vault does not exist"); require(stabilityPool==address(0) || msg.sender == stabilityPool, "liquidation is disabled for public"); (uint256 collateralValueTimes100, uint256 debtValue) = calculateCollateralProperties(vaultCollateral[vaultID], vaultDebt[vaultID]); uint256 collateralPercentage = collateralValueTimes100.div(debtValue); require(collateralPercentage < _minimumCollateralPercentage, "Vault is not below minimum collateral percentage"); debtValue = debtValue.div(10 ** priceSourceDecimals); uint256 halfDebt = debtValue.div(debtRatio); //debtRatio (2) require(mai.balanceOf(msg.sender) >= halfDebt, "Token balance too low to pay off outstanding debt"); //mai mai.burn(msg.sender, halfDebt); totalBorrowed = totalBorrowed.sub(halfDebt); uint256 maticExtract = checkExtract(vaultID); vaultDebt[vaultID] = vaultDebt[vaultID].sub(halfDebt); // we paid back half of its debt. uint256 _closingFee = (halfDebt.mul(closingFee).mul(getTokenPriceSource()) ).div(getEthPriceSource().mul(10000)); vaultCollateral[vaultID]=vaultCollateral[vaultID].sub(_closingFee); vaultCollateral[treasury]=vaultCollateral[treasury].add(_closingFee); // deduct the amount from the vault's collateral vaultCollateral[vaultID] = vaultCollateral[vaultID].sub(maticExtract); // let liquidator take the collateral maticDebt[msg.sender] = maticDebt[msg.sender].add(maticExtract); emit LiquidateVault(vaultID, ownerOf(vaultID), msg.sender, halfDebt, maticExtract, _closingFee); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: tests/MapleBank.sol pragma solidity >=0.8.0; contract MapleBank is MapleVault, Ownable { constructor( address ethPriceSourceAddress, uint256 minimumCollateralPercentage, string memory name, string memory symbol, address _mai, address _collateral, string memory baseURI ) MapleVault( ethPriceSourceAddress, minimumCollateralPercentage, name, symbol, _mai, _collateral, baseURI ) { treasury=0; } function setGainRatio(uint256 _gainRatio) external onlyOwner() { gainRatio=_gainRatio; } function setDebtRatio(uint256 _debtRatio) external onlyOwner() { debtRatio=_debtRatio; } function changeEthPriceSource(address ethPriceSourceAddress) external onlyOwner() { ethPriceSource = PriceSource(ethPriceSourceAddress); } function setTokenPeg(uint256 _tokenPeg) external onlyOwner() { tokenPeg = _tokenPeg; } function setStabilityPool(address _pool) external onlyOwner() { stabilityPool = _pool; } function setDebtCeiling(uint256 amount) external onlyOwner() { require(mai.totalSupply()<=amount, "setCeiling: Must be over the amount of outstanding debt."); debtCeiling = amount; } function setMinCollateralRatio(uint256 minimumCollateralPercentage) external onlyOwner() { _minimumCollateralPercentage = minimumCollateralPercentage; } function setClosingFee(uint256 amount) external onlyOwner() { closingFee = amount; } function setOpeningFee(uint256 amount) external onlyOwner() { openingFee = amount; } function setTreasury(uint256 _treasury) external onlyOwner() { require(_exists(_treasury), "Vault does not exist"); treasury = _treasury; } function setTokenURI(string memory _uri) public onlyOwner() { uri = _uri; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"ethPriceSourceAddress","type":"address"},{"internalType":"uint256","name":"minimumCollateralPercentage","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"_mai","type":"address"},{"internalType":"address","name":"_collateral","type":"address"},{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"vaultID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BorrowToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"vaultID","type":"uint256"},{"indexed":false,"internalType":"address","name":"creator","type":"address"}],"name":"CreateVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"vaultID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DepositCollateral","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"vaultID","type":"uint256"}],"name":"DestroyVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"vaultID","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"debtRepaid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"collateralLiquidated","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"closingFee","type":"uint256"}],"name":"LiquidateVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"vaultID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"closingFee","type":"uint256"}],"name":"PayBackToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"vaultID","type":"uint256"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"TransferVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"vaultID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawCollateral","type":"event"},{"inputs":[],"name":"_minimumCollateralPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultID","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"borrowToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ethPriceSourceAddress","type":"address"}],"name":"changeEthPriceSource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultID","type":"uint256"}],"name":"checkCollateralPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultID","type":"uint256"}],"name":"checkCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultID","type":"uint256"}],"name":"checkExtract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultID","type":"uint256"}],"name":"checkLiquidation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateral","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"debtCeiling","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultID","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultID","type":"uint256"}],"name":"depositNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultID","type":"uint256"}],"name":"destroyVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ethPriceSource","outputs":[{"internalType":"contract PriceSource","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultID","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gainRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClosingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDebtCeiling","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEthPriceSource","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOpeningFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPaid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTokenPriceSource","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultID","type":"uint256"}],"name":"liquidateVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mai","outputs":[{"internalType":"contract IMapleDollar","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maticDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultID","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"payBackToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"priceSourceDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setClosingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setDebtCeiling","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_debtRatio","type":"uint256"}],"name":"setDebtRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gainRatio","type":"uint256"}],"name":"setGainRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minimumCollateralPercentage","type":"uint256"}],"name":"setMinCollateralRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setOpeningFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"setStabilityPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenPeg","type":"uint256"}],"name":"setTokenPeg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_treasury","type":"uint256"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stabilityPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPeg","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBorrowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vaultCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vaultDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultID","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"unwrap","type":"bool"}],"name":"withdrawCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620048d3380380620048d383398101604081905262000034916200034e565b8686868686868684848282826001600081905550816001908051906020019062000060929190620001be565b50805162000076906002906020840190620001be565b505081516200008e9150600b906020840190620001be565b505050506001600160a01b038716620000ab57620000ab62000422565b85620000bb57620000bb62000422565b50678ac7230489e80000600f5560326010556000601155600c80546001600160a01b03199081166001600160a01b039889161790915560188054821690556305f5e100601355600260165561044c601755600d959095556019805486169187169182179055601a805486169091179055601b80548516919095169081179094555050601c805490911690911790556008601d5562000159336200016c565b5050600060125550620004759350505050565b602080546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001cc9062000438565b90600052602060002090601f016020900481019282620001f057600085556200023b565b82601f106200020b57805160ff19168380011785556200023b565b828001600101855582156200023b579182015b828111156200023b5782518255916020019190600101906200021e565b50620002499291506200024d565b5090565b5b808211156200024957600081556001016200024e565b80516001600160a01b03811681146200027c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620002a957600080fd5b81516001600160401b0380821115620002c657620002c662000281565b604051601f8301601f19908116603f01168101908282118183101715620002f157620002f162000281565b816040528381526020925086838588010111156200030e57600080fd5b600091505b8382101562000332578582018301518183018401529082019062000313565b83821115620003445760008385830101525b9695505050505050565b600080600080600080600060e0888a0312156200036a57600080fd5b620003758862000264565b602089015160408a015191985096506001600160401b03808211156200039a57600080fd5b620003a88b838c0162000297565b965060608a0151915080821115620003bf57600080fd5b620003cd8b838c0162000297565b9550620003dd60808b0162000264565b9450620003ed60a08b0162000264565b935060c08a01519150808211156200040457600080fd5b50620004138a828b0162000297565b91505092959891949750929550565b634e487b7160e01b600052600160045260246000fd5b600181811c908216806200044d57607f821691505b602082108114156200046f57634e487b7160e01b600052602260045260246000fd5b50919050565b61444e80620004856000396000f3fe6080604052600436106103f35760003560e01c80638637599411610208578063cd44db1b11610118578063e0df5b6f116100ab578063eac989f81161007a578063eac989f814610b83578063eb6a887d14610b98578063ece1373214610bb8578063f2fde38b14610bd8578063ffc73da714610bf857600080fd5b8063e0df5b6f14610aee578063e1c84ea414610b0e578063e5f4dc9214610b24578063e985e9c514610b3a57600080fd5b8063d310f49b116100e7578063d310f49b14610a54578063d4a9b2c514610a81578063d8dfeb4514610aae578063df98784614610ace57600080fd5b8063cd44db1b146109fe578063cdfedd6314610a13578063cea55f5714610a29578063cf41d6f814610a3f57600080fd5b8063a5e988371161019b578063b165ff0b1161016a578063b165ff0b1461095b578063b86f6aef14610988578063b88d4fde146109a8578063c71abb32146109c8578063c87b56dd146109de57600080fd5b8063a5e98837146108fb578063a7c6a10014610910578063ab806f1514610926578063b1511cc91461093b57600080fd5b806395d89b41116101d757806395d89b411461089157806398c3f2db146108a657806398d721e0146108bb578063a22cb465146108db57600080fd5b8063863759941461081e5780638da5cb5b1461083e57806390cf0bba1461085c57806394cd4ba71461087c57600080fd5b806342842e0e11610303578063608fc37a116102965780637139c929116102655780637139c92914610793578063715018a6146107b3578063728bbbb5146107c857806385af3c16146107de57806385e290a3146107fe57600080fd5b8063608fc37a1461072a57806361d027b31461073d5780636352211e1461075357806370a082311461077357600080fd5b80634f6ccce7116102d25780634f6ccce7146106b557806356572ac0146106d5578063570b2b84146106f55780635d12928b1461071557600080fd5b806342842e0e1461063f57806342f371c61461065f5780634c19386c1461067f5780634f558e791461069557600080fd5b806311b4a8321161038657806323b872dd1161035557806323b872dd146105a95780632f745c59146105c9578063311f392a146105e957806338536275146105ff5780633db991771461061f57600080fd5b806311b4a8321461053057806318160ddd1461055e5780631c883e7b1461057357806322adad3e1461058957600080fd5b806307960532116103c257806307960532146104b0578063081812fc146104d057806308ec5927146104f0578063095ea7b31461051057600080fd5b806301e49d0a146103ff57806301ffc9a714610421578063048c661d1461045657806306fdde031461048e57600080fd5b366103fa57005b600080fd5b34801561040b57600080fd5b5061041f61041a366004613ba4565b610c18565b005b34801561042d57600080fd5b5061044161043c366004613bd3565b610c50565b60405190151581526020015b60405180910390f35b34801561046257600080fd5b50601854610476906001600160a01b031681565b6040516001600160a01b03909116815260200161044d565b34801561049a57600080fd5b506104a3610c7b565b60405161044d9190613c48565b3480156104bc57600080fd5b5061041f6104cb366004613c77565b610d0d565b3480156104dc57600080fd5b506104766104eb366004613ba4565b610d59565b3480156104fc57600080fd5b5061041f61050b366004613c92565b610de1565b34801561051c57600080fd5b5061041f61052b366004613cb4565b6110fa565b34801561053c57600080fd5b5061055061054b366004613ba4565b611210565b60405190815260200161044d565b34801561056a57600080fd5b50600954610550565b34801561057f57600080fd5b5061055060105481565b34801561059557600080fd5b5061041f6105a4366004613cec565b6112db565b3480156105b557600080fd5b5061041f6105c4366004613d25565b61159e565b3480156105d557600080fd5b506105506105e4366004613cb4565b6115cf565b3480156105f557600080fd5b5061055060175481565b34801561060b57600080fd5b5061041f61061a366004613ba4565b611665565b34801561062b57600080fd5b5061041f61063a366004613ba4565b611694565b34801561064b57600080fd5b5061041f61065a366004613d25565b6116c3565b34801561066b57600080fd5b50600c54610476906001600160a01b031681565b34801561068b57600080fd5b50610550601e5481565b3480156106a157600080fd5b506104416106b0366004613ba4565b6116de565b3480156106c157600080fd5b506105506106d0366004613ba4565b6116e9565b3480156106e157600080fd5b506105506106f0366004613ba4565b61177c565b34801561070157600080fd5b50601b54610476906001600160a01b031681565b34801561072157600080fd5b50610550611831565b61041f610738366004613ba4565b61189d565b34801561074957600080fd5b5061055060125481565b34801561075f57600080fd5b5061047661076e366004613ba4565b6119f3565b34801561077f57600080fd5b5061055061078e366004613c77565b611a6a565b34801561079f57600080fd5b5061041f6107ae366004613ba4565b611af1565b3480156107bf57600080fd5b5061041f611b45565b3480156107d457600080fd5b5061055060115481565b3480156107ea57600080fd5b5061041f6107f9366004613c92565b611b7b565b34801561080a57600080fd5b5061041f610819366004613ba4565b611e01565b34801561082a57600080fd5b5061041f610839366004613ba4565b611f7e565b34801561084a57600080fd5b506020546001600160a01b0316610476565b34801561086857600080fd5b5061041f610877366004613ba4565b611fad565b34801561088857600080fd5b50600f54610550565b34801561089d57600080fd5b506104a36123d7565b3480156108b257600080fd5b506105506123e6565b3480156108c757600080fd5b5061041f6108d6366004613c77565b61246b565b3480156108e757600080fd5b5061041f6108f6366004613d61565b6124b7565b34801561090757600080fd5b50601054610550565b34801561091c57600080fd5b50610550600e5481565b34801561093257600080fd5b50601154610550565b34801561094757600080fd5b5061041f610956366004613ba4565b6124c6565b34801561096757600080fd5b50610550610976366004613c77565b601f6020526000908152604090205481565b34801561099457600080fd5b506104416109a3366004613ba4565b6125d6565b3480156109b457600080fd5b5061041f6109c3366004613e24565b612689565b3480156109d457600080fd5b50610550601d5481565b3480156109ea57600080fd5b506104a36109f9366004613ba4565b6126c1565b348015610a0a57600080fd5b50601354610550565b348015610a1f57600080fd5b5061055060135481565b348015610a3557600080fd5b5061055060165481565b348015610a4b57600080fd5b5061041f612799565b348015610a6057600080fd5b50610550610a6f366004613ba4565b60156020526000908152604090205481565b348015610a8d57600080fd5b50610550610a9c366004613ba4565b60146020526000908152604090205481565b348015610aba57600080fd5b50601954610476906001600160a01b031681565b348015610ada57600080fd5b50610550610ae9366004613ba4565b612849565b348015610afa57600080fd5b5061041f610b09366004613ea0565b6128e0565b348015610b1a57600080fd5b50610550600f5481565b348015610b3057600080fd5b50610550600d5481565b348015610b4657600080fd5b50610441610b55366004613ee9565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610b8f57600080fd5b506104a361291d565b348015610ba457600080fd5b5061041f610bb3366004613ba4565b6129ab565b348015610bc457600080fd5b5061041f610bd3366004613c92565b6129da565b348015610be457600080fd5b5061041f610bf3366004613c77565b612a74565b348015610c0457600080fd5b5061041f610c13366004613ba4565b612b0f565b6020546001600160a01b03163314610c4b5760405162461bcd60e51b8152600401610c4290613f1c565b60405180910390fd5b601355565b60006001600160e01b0319821663780e9d6360e01b1480610c755750610c7582612b3e565b92915050565b606060018054610c8a90613f51565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb690613f51565b8015610d035780601f10610cd857610100808354040283529160200191610d03565b820191906000526020600020905b815481529060010190602001808311610ce657829003601f168201915b5050505050905090565b6020546001600160a01b03163314610d375760405162461bcd60e51b8152600401610c4290613f1c565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000610d6482612b8e565b610dc55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c42565b506000908152600560205260409020546001600160a01b031690565b81610deb81612b8e565b610e075760405162461bcd60e51b8152600401610c4290613f8c565b33610e11826119f3565b6001600160a01b031614610e375760405162461bcd60e51b8152600401610c4290613fba565b60008211610e875760405162461bcd60e51b815260206004820152601b60248201527f4d75737420626f72726f77206e6f6e2d7a65726f20616d6f756e7400000000006044820152606401610c42565b600f54610f0b83601b60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ee1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f059190613ff1565b90612bab565b1115610f715760405162461bcd60e51b815260206004820152602f60248201527f626f72726f77546f6b656e3a2043616e6e6f74206d696e74206f76657220617660448201526e30b4b630b136329039bab838363c9760891b6064820152608401610c42565b600083815260156020526040812054610f8a9084612bab565b6000858152601560205260409020549091508111610faa57610faa61400a565b600084815260146020526040902054610fc39082612bb7565b6110355760405162461bcd60e51b815260206004820152603a60248201527f426f72726f7720776f756c6420707574207661756c742062656c6f77206d696e60448201527f696d756d20636f6c6c61746572616c2070657263656e746167650000000000006064820152608401610c42565b6000848152601560205260409020819055601e546110539082612bab565b601e55601b546040516340c10f1960e01b8152336004820152602481018590526001600160a01b03909116906340c10f1990604401600060405180830381600087803b1580156110a257600080fd5b505af11580156110b6573d6000803e3d6000fd5b505060408051878152602081018790527f3e08df88d8e28f37df9bf227d3142ac506a364403445661a60891a49ed6792ca935001905060405180910390a150505050565b6000611105826119f3565b9050806001600160a01b0316836001600160a01b031614156111735760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c42565b336001600160a01b038216148061118f575061118f8133610b55565b6112015760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c42565b61120b8383612be6565b505050565b60008181526014602052604081205415806112375750600082815260156020526040902054155b806112485750611246826125d6565b155b1561125557506000919050565b6000828152601460209081526040808320546015909252822054829161127a91612c54565b915091508060001415611291575060009392505050565b600061129d8383612dfb565b90506112b8601d54600a6112b1919061411a565b8390612dfb565b915060006112d160165484612dfb90919063ffffffff16565b9695505050505050565b826112e581612b8e565b6113015760405162461bcd60e51b8152600401610c4290613f8c565b3361130b826119f3565b6001600160a01b0316146113315760405162461bcd60e51b8152600401610c4290613fba565b600260005414156113545760405162461bcd60e51b8152600401610c4290614126565b60026000908155848152601460205260409020548311156113c55760405162461bcd60e51b815260206004820152602560248201527f5661756c7420646f6573206e6f74206861766520656e6f75676820636f6c6c616044820152641d195c985b60da1b6064820152608401610c42565b6000848152601460205260408120546113de9085612e07565b600086815260156020526040902054909150156114815760008581526015602052604090205461140f908290612bb7565b6114815760405162461bcd60e51b815260206004820152603e60248201527f5769746864726177616c20776f756c6420707574207661756c742062656c6f7760448201527f206d696e696d756d20636f6c6c61746572616c2070657263656e7461676500006064820152608401610c42565b6000858152601460205260409020819055821561154257604051632e1a7d4d60e01b8152600481018590527321be370d5312f44cb42ce377bc9b8a0cef1a4c8390632e1a7d4d906024016020604051808303816000875af11580156114ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150e9190613ff1565b50604051339085156108fc029086906000818181858888f1935050505015801561153c573d6000803e3d6000fd5b50611559565b601954611559906001600160a01b03163386612e13565b60408051868152602081018690527f6c0ea3bea9dd66afa8f9d39d6eb93d833466190330813b42835efc650dca4cb9910160405180910390a150506001600055505050565b6115a83382612e76565b6115c45760405162461bcd60e51b8152600401610c429061415d565b61120b838383612f5c565b60006115da83611a6a565b821061163c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c42565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6020546001600160a01b0316331461168f5760405162461bcd60e51b8152600401610c4290613f1c565b600d55565b6020546001600160a01b031633146116be5760405162461bcd60e51b8152600401610c4290613f1c565b601055565b61120b83838360405180602001604052806000815250612689565b6000610c7582612b8e565b60006116f460095490565b82106117575760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c42565b6009828154811061176a5761176a6141ae565b90600052602060002001549050919050565b600081815260146020526040812054158061179d575061179b826125d6565b155b156117aa57506000919050565b600082815260146020908152604080832054601590925282205482916117cf91612c54565b9150915060006117ea60165483612dfb90919063ffffffff16565b9050806117fc57506000949350505050565b6118286118076123e6565b6118226103e86118226017548661310790919063ffffffff16565b90612dfb565b95945050505050565b600e54600090611842816001612bab565b600e8190558111156118565761185661400a565b6118603382613113565b604080518281523360208201527f8b6c1d05c678fa59695e26465a85918ce0fc63a88f74af53d1daef8f0a9c7804910160405180910390a1919050565b600260005414156118c05760405162461bcd60e51b8152600401610c4290614126565b60026000819055507321be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031663d0e30db0346040518263ffffffff1660e01b815260040160206040518083038185885af115801561191c573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906119419190613ff1565b5060195460405163095ea7b360e01b815230600482015271ffffffffffffffffffffffffffffffffffff60248201526001600160a01b039091169063095ea7b3906044016020604051808303816000875af11580156119a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c891906141c4565b506019546119e1906001600160a01b0316303334613252565b6119eb81346129da565b506001600055565b6000818152600360205260408120546001600160a01b031680610c755760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c42565b60006001600160a01b038216611ad55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c42565b506001600160a01b031660009081526004602052604090205490565b6020546001600160a01b03163314611b1b5760405162461bcd60e51b8152600401610c4290613f1c565b611b2481612b8e565b611b405760405162461bcd60e51b8152600401610c4290613f8c565b601255565b6020546001600160a01b03163314611b6f5760405162461bcd60e51b8152600401610c4290613f1c565b611b79600061328a565b565b601b546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611bc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be79190613ff1565b1015611c2d5760405162461bcd60e51b8152602060048201526015602482015274546f6b656e2062616c616e636520746f6f206c6f7760581b6044820152606401610c42565b600082815260156020526040902054811115611c9b5760405162461bcd60e51b815260206004820152602760248201527f5661756c742064656274206c657373207468616e20616d6f756e7420746f20706044820152666179206261636b60c81b6064820152608401610c42565b6000611cce611cb4612710611cae6123e6565b90613107565b611822611cc060135490565b601054611cae908790613107565b600084815260156020526040902054909150611cea9083612e07565b600084815260156020908152604080832093909355601490522054611d0f9082612e07565b6000848152601460205260408082209290925560125481522054611d339082612bab565b601254600090815260146020526040902055601e54611d529083612e07565b601e55601b54604051632770a7eb60e21b8152336004820152602481018490526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015611da157600080fd5b505af1158015611db5573d6000803e3d6000fd5b505060408051868152602081018690529081018490527f31f96762af4051f367185773cc2f55bfb112a6c114b3407ded1f321a9eb199ac925060600190505b60405180910390a1505050565b80611e0b81612b8e565b611e275760405162461bcd60e51b8152600401610c4290613f8c565b33611e31826119f3565b6001600160a01b031614611e575760405162461bcd60e51b8152600401610c4290613fba565b60026000541415611e7a5760405162461bcd60e51b8152600401610c4290614126565b600260009081558281526015602052604090205415611edb5760405162461bcd60e51b815260206004820152601a60248201527f5661756c7420686173206f75747374616e64696e6720646562740000000000006044820152606401610c42565b60008281526014602052604090205415611f1d57611f1d611efb836119f3565b6000848152601460205260409020546019546001600160a01b03169190612e13565b611f26826132dc565b6000828152601460209081526040808320839055601582528083209290925590518381527f4fe08624ee65b341c38ab9693d216b909d4ddee1bc8d3fe0fea14026c361b465910160405180910390a150506001600055565b6020546001600160a01b03163314611fa85760405162461bcd60e51b8152600401610c4290613f1c565b601155565b611fb681612b8e565b611fd25760405162461bcd60e51b8152600401610c4290613f8c565b6018546001600160a01b03161580611ff457506018546001600160a01b031633145b61204b5760405162461bcd60e51b815260206004820152602260248201527f6c69717569646174696f6e2069732064697361626c656420666f72207075626c604482015261696360f01b6064820152608401610c42565b6000818152601460209081526040808320546015909252822054829161207091612c54565b909250905060006120818383612dfb565b9050600d5481106120ed5760405162461bcd60e51b815260206004820152603060248201527f5661756c74206973206e6f742062656c6f77206d696e696d756d20636f6c6c6160448201526f746572616c2070657263656e7461676560801b6064820152608401610c42565b6120ff601d54600a6112b1919061411a565b9150600061211860165484612dfb90919063ffffffff16565b601b546040516370a0823160e01b815233600482015291925082916001600160a01b03909116906370a0823190602401602060405180830381865afa158015612165573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121899190613ff1565b10156121f15760405162461bcd60e51b815260206004820152603160248201527f546f6b656e2062616c616e636520746f6f206c6f7720746f20706179206f6666604482015270081bdd5d1cdd185b991a5b99c81919589d607a1b6064820152608401610c42565b601b54604051632770a7eb60e21b8152336004820152602481018390526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801561223d57600080fd5b505af1158015612251573d6000803e3d6000fd5b5050601e546122639250905082612e07565b601e5560006122718661177c565b60008781526015602052604090205490915061228d9083612e07565b6000878152601560205260408120919091556122ca6122b0612710611cae6123e6565b6118226122bc60135490565b601054611cae908890613107565b6000888152601460205260409020549091506122e69082612e07565b600088815260146020526040808220929092556012548152205461230a9082612bab565b60125460009081526014602052604080822092909255888152205461232f9083612e07565b600088815260146020908152604080832093909355338252601f905220546123579083612bab565b336000908152601f60205260409020557f4d151d3a98b83151d51917640c221f8c8e3c054422ea1b48dcbbd57e3f4210d587612392816119f3565b604080519283526001600160a01b0390911660208301523390820152606081018590526080810184905260a0810183905260c00160405180910390a150505050505050565b606060028054610c8a90613f51565b600080600c60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561243c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246091906141fb565b509195945050505050565b6020546001600160a01b031633146124955760405162461bcd60e51b8152600401610c4290613f1c565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6124c2338383613383565b5050565b6020546001600160a01b031633146124f05760405162461bcd60e51b8152600401610c4290613f1c565b601b54604080516318160ddd60e01b8152905183926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015612539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061255d9190613ff1565b11156125d15760405162461bcd60e51b815260206004820152603860248201527f7365744365696c696e673a204d757374206265206f7665722074686520616d6f60448201527f756e74206f66206f75747374616e64696e6720646562742e00000000000000006064820152608401610c42565b600f55565b60006125e182612b8e565b6125fd5760405162461bcd60e51b8152600401610c4290613f8c565b60008281526014602052604090205415806126245750600082815260156020526040902054155b1561263157506000919050565b6000828152601460209081526040808320546015909252822054829161265691612c54565b909250905060006126678383612dfb565b9050600d5481101561267e57506001949350505050565b506000949350505050565b6126933383612e76565b6126af5760405162461bcd60e51b8152600401610c429061415d565b6126bb84848484613452565b50505050565b60606126cc82612b8e565b6127305760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610c42565b600061274760408051602081019091526000815290565b905060008151116127675760405180602001604052806000815250612792565b8061277184613485565b60405160200161278292919061424b565b6040516020818303038152906040525b9392505050565b600260005414156127bc5760405162461bcd60e51b8152600401610c4290614126565b60026000908155338152601f602052604090205461281c5760405162461bcd60e51b815260206004820152601c60248201527f446f6e2774206861766520616e797468696e6720666f7220796f752e000000006044820152606401610c42565b336000818152601f60205260408120805491905560195490916119eb916001600160a01b03169083612e13565b600061285482612b8e565b6128705760405162461bcd60e51b8152600401610c4290613f8c565b60008281526014602052604090205415806128975750600082815260156020526040902054155b156128a457506000919050565b600082815260146020908152604080832054601590925282205482916128c991612c54565b90925090506128d88282612dfb565b949350505050565b6020546001600160a01b0316331461290a5760405162461bcd60e51b8152600401610c4290613f1c565b80516124c290600b906020840190613b0b565b600b805461292a90613f51565b80601f016020809104026020016040519081016040528092919081815260200182805461295690613f51565b80156129a35780601f10612978576101008083540402835291602001916129a3565b820191906000526020600020905b81548152906001019060200180831161298657829003601f168201915b505050505081565b6020546001600160a01b031633146129d55760405162461bcd60e51b8152600401610c4290613f1c565b601655565b6019546129f2906001600160a01b0316333084613252565b600082815260146020526040812054612a0b9083612bab565b600084815260146020526040902054909150811015612a2c57612a2c61400a565b60008381526014602090815260409182902083905581518581529081018490527f52c4e7127ec34e8fc95f09ce2d06b4f00acca12ccbcdfb246ef67ee6aefe068d9101611df4565b6020546001600160a01b03163314612a9e5760405162461bcd60e51b8152600401610c4290613f1c565b6001600160a01b038116612b035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c42565b612b0c8161328a565b50565b6020546001600160a01b03163314612b395760405162461bcd60e51b8152600401610c4290613f1c565b601755565b60006001600160e01b031982166380ac58cd60e01b1480612b6f57506001600160e01b03198216635b5e139f60e01b145b80610c7557506301ffc9a760e01b6001600160e01b0319831614610c75565b6000908152600360205260409020546001600160a01b0316151590565b6000612792828461427a565b6000806000612bc68585612c54565b90925090506000612bd78383612dfb565b600d5411159695505050505050565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612c1b826119f3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080612c5f6123e6565b612c6b57612c6b61400a565b601354612c7a57612c7a61400a565b6000612d99612d7c601a60009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cf99190614292565b60ff16601c60009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d739190614292565b60ff1690612e07565b612d8790600a61411a565b611cae612d926123e6565b8890613107565b905084811015612dab57612dab61400a565b6000612dc0612db960135490565b8690613107565b905084811015612dd257612dd261400a565b6000612ddf836064613107565b9050828111612df057612df061400a565b969095509350505050565b600061279282846142cb565b600061279282846142df565b6040516001600160a01b03831660248201526044810182905261120b90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613583565b6000612e8182612b8e565b612ee25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c42565b6000612eed836119f3565b9050806001600160a01b0316846001600160a01b03161480612f285750836001600160a01b0316612f1d84610d59565b6001600160a01b0316145b806128d857506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff166128d8565b826001600160a01b0316612f6f826119f3565b6001600160a01b031614612fd75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610c42565b6001600160a01b0382166130395760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c42565b613044838383613655565b61304f600082612be6565b6001600160a01b03831660009081526004602052604081208054600192906130789084906142df565b90915550506001600160a01b03821660009081526004602052604081208054600192906130a690849061427a565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061279282846142f6565b6001600160a01b0382166131695760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c42565b61317281612b8e565b156131bf5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c42565b6131cb60008383613655565b6001600160a01b03821660009081526004602052604081208054600192906131f490849061427a565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6040516001600160a01b03808516602483015283166044820152606481018290526126bb9085906323b872dd60e01b90608401612e3f565b602080546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006132e7826119f3565b90506132f581600084613655565b613300600083612be6565b6001600160a01b03811660009081526004602052604081208054600192906133299084906142df565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b031614156133e55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c42565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61345d848484612f5c565b6134698484848461370d565b6126bb5760405162461bcd60e51b8152600401610c4290614315565b6060816134a95750506040805180820190915260018152600360fc1b602082015290565b8160005b81156134d357806134bd81614367565b91506134cc9050600a836142cb565b91506134ad565b60008167ffffffffffffffff8111156134ee576134ee613d98565b6040519080825280601f01601f191660200182016040528015613518576020820181803683370190505b5090505b84156128d85761352d6001836142df565b915061353a600a86614382565b61354590603061427a565b60f81b81838151811061355a5761355a6141ae565b60200101906001600160f81b031916908160001a90535061357c600a866142cb565b945061351c565b60006135d8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661380b9092919063ffffffff16565b80519091501561120b57808060200190518101906135f691906141c4565b61120b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610c42565b6001600160a01b0383166136b0576136ab81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b6136d3565b816001600160a01b0316836001600160a01b0316146136d3576136d3838261381a565b6001600160a01b0382166136ea5761120b816138b7565b826001600160a01b0316826001600160a01b03161461120b5761120b8282613966565b60006001600160a01b0384163b1561380057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613751903390899088908890600401614396565b6020604051808303816000875af192505050801561378c575060408051601f3d908101601f19168201909252613789918101906143c9565b60015b6137e6573d8080156137ba576040519150601f19603f3d011682016040523d82523d6000602084013e6137bf565b606091505b5080516137de5760405162461bcd60e51b8152600401610c4290614315565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506128d8565b506001949350505050565b60606128d884846000856139aa565b6000600161382784611a6a565b61383191906142df565b600083815260086020526040902054909150808214613884576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b6009546000906138c9906001906142df565b6000838152600a6020526040812054600980549394509092849081106138f1576138f16141ae565b906000526020600020015490508060098381548110613912576139126141ae565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061394a5761394a6143e6565b6001900381819060005260206000200160009055905550505050565b600061397183611a6a565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b606082471015613a0b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610c42565b843b613a595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c42565b600080866001600160a01b03168587604051613a7591906143fc565b60006040518083038185875af1925050503d8060008114613ab2576040519150601f19603f3d011682016040523d82523d6000602084013e613ab7565b606091505b5091509150613ac7828286613ad2565b979650505050505050565b60608315613ae1575081612792565b825115613af15782518084602001fd5b8160405162461bcd60e51b8152600401610c429190613c48565b828054613b1790613f51565b90600052602060002090601f016020900481019282613b395760008555613b7f565b82601f10613b5257805160ff1916838001178555613b7f565b82800160010185558215613b7f579182015b82811115613b7f578251825591602001919060010190613b64565b50613b8b929150613b8f565b5090565b5b80821115613b8b5760008155600101613b90565b600060208284031215613bb657600080fd5b5035919050565b6001600160e01b031981168114612b0c57600080fd5b600060208284031215613be557600080fd5b813561279281613bbd565b60005b83811015613c0b578181015183820152602001613bf3565b838111156126bb5750506000910152565b60008151808452613c34816020860160208601613bf0565b601f01601f19169290920160200192915050565b6020815260006127926020830184613c1c565b80356001600160a01b0381168114613c7257600080fd5b919050565b600060208284031215613c8957600080fd5b61279282613c5b565b60008060408385031215613ca557600080fd5b50508035926020909101359150565b60008060408385031215613cc757600080fd5b613cd083613c5b565b946020939093013593505050565b8015158114612b0c57600080fd5b600080600060608486031215613d0157600080fd5b83359250602084013591506040840135613d1a81613cde565b809150509250925092565b600080600060608486031215613d3a57600080fd5b613d4384613c5b565b9250613d5160208501613c5b565b9150604084013590509250925092565b60008060408385031215613d7457600080fd5b613d7d83613c5b565b91506020830135613d8d81613cde565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115613dc957613dc9613d98565b604051601f8501601f19908116603f01168101908282118183101715613df157613df1613d98565b81604052809350858152868686011115613e0a57600080fd5b858560208301376000602087830101525050509392505050565b60008060008060808587031215613e3a57600080fd5b613e4385613c5b565b9350613e5160208601613c5b565b925060408501359150606085013567ffffffffffffffff811115613e7457600080fd5b8501601f81018713613e8557600080fd5b613e9487823560208401613dae565b91505092959194509250565b600060208284031215613eb257600080fd5b813567ffffffffffffffff811115613ec957600080fd5b8201601f81018413613eda57600080fd5b6128d884823560208401613dae565b60008060408385031215613efc57600080fd5b613f0583613c5b565b9150613f1360208401613c5b565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680613f6557607f821691505b60208210811415613f8657634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526014908201527315985d5b1d08191bd95cc81b9bdd08195e1a5cdd60621b604082015260600190565b60208082526019908201527f5661756c74206973206e6f74206f776e656420627920796f7500000000000000604082015260600190565b60006020828403121561400357600080fd5b5051919050565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561407157816000190482111561405757614057614020565b8085161561406457918102915b93841c939080029061403b565b509250929050565b60008261408857506001610c75565b8161409557506000610c75565b81600181146140ab57600281146140b5576140d1565b6001915050610c75565b60ff8411156140c6576140c6614020565b50506001821b610c75565b5060208310610133831016604e8410600b84101617156140f4575081810a610c75565b6140fe8383614036565b806000190482111561411257614112614020565b029392505050565b60006127928383614079565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156141d657600080fd5b815161279281613cde565b805169ffffffffffffffffffff81168114613c7257600080fd5b600080600080600060a0868803121561421357600080fd5b61421c866141e1565b945060208601519350604086015192506060860151915061423f608087016141e1565b90509295509295909350565b6000835161425d818460208801613bf0565b835190830190614271818360208801613bf0565b01949350505050565b6000821982111561428d5761428d614020565b500190565b6000602082840312156142a457600080fd5b815160ff8116811461279257600080fd5b634e487b7160e01b600052601260045260246000fd5b6000826142da576142da6142b5565b500490565b6000828210156142f1576142f1614020565b500390565b600081600019048311821515161561431057614310614020565b500290565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600060001982141561437b5761437b614020565b5060010190565b600082614391576143916142b5565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906112d190830184613c1c565b6000602082840312156143db57600080fd5b815161279281613bbd565b634e487b7160e01b600052603160045260246000fd5b6000825161440e818460208701613bf0565b919091019291505056fea264697066735822122096b62aac65f2e3411bfc3a29e5b6196c06e9318fcf0f297dbe504c815fbc361864736f6c634300080a0033000000000000000000000000f4766552d15ae4d256ad41b6cf2933482b0680dc000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000dbdffd9aac451f1f0782bbb1937a0d8889dbf94600000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c830000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000446746d3400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000446746d34000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103f35760003560e01c80638637599411610208578063cd44db1b11610118578063e0df5b6f116100ab578063eac989f81161007a578063eac989f814610b83578063eb6a887d14610b98578063ece1373214610bb8578063f2fde38b14610bd8578063ffc73da714610bf857600080fd5b8063e0df5b6f14610aee578063e1c84ea414610b0e578063e5f4dc9214610b24578063e985e9c514610b3a57600080fd5b8063d310f49b116100e7578063d310f49b14610a54578063d4a9b2c514610a81578063d8dfeb4514610aae578063df98784614610ace57600080fd5b8063cd44db1b146109fe578063cdfedd6314610a13578063cea55f5714610a29578063cf41d6f814610a3f57600080fd5b8063a5e988371161019b578063b165ff0b1161016a578063b165ff0b1461095b578063b86f6aef14610988578063b88d4fde146109a8578063c71abb32146109c8578063c87b56dd146109de57600080fd5b8063a5e98837146108fb578063a7c6a10014610910578063ab806f1514610926578063b1511cc91461093b57600080fd5b806395d89b41116101d757806395d89b411461089157806398c3f2db146108a657806398d721e0146108bb578063a22cb465146108db57600080fd5b8063863759941461081e5780638da5cb5b1461083e57806390cf0bba1461085c57806394cd4ba71461087c57600080fd5b806342842e0e11610303578063608fc37a116102965780637139c929116102655780637139c92914610793578063715018a6146107b3578063728bbbb5146107c857806385af3c16146107de57806385e290a3146107fe57600080fd5b8063608fc37a1461072a57806361d027b31461073d5780636352211e1461075357806370a082311461077357600080fd5b80634f6ccce7116102d25780634f6ccce7146106b557806356572ac0146106d5578063570b2b84146106f55780635d12928b1461071557600080fd5b806342842e0e1461063f57806342f371c61461065f5780634c19386c1461067f5780634f558e791461069557600080fd5b806311b4a8321161038657806323b872dd1161035557806323b872dd146105a95780632f745c59146105c9578063311f392a146105e957806338536275146105ff5780633db991771461061f57600080fd5b806311b4a8321461053057806318160ddd1461055e5780631c883e7b1461057357806322adad3e1461058957600080fd5b806307960532116103c257806307960532146104b0578063081812fc146104d057806308ec5927146104f0578063095ea7b31461051057600080fd5b806301e49d0a146103ff57806301ffc9a714610421578063048c661d1461045657806306fdde031461048e57600080fd5b366103fa57005b600080fd5b34801561040b57600080fd5b5061041f61041a366004613ba4565b610c18565b005b34801561042d57600080fd5b5061044161043c366004613bd3565b610c50565b60405190151581526020015b60405180910390f35b34801561046257600080fd5b50601854610476906001600160a01b031681565b6040516001600160a01b03909116815260200161044d565b34801561049a57600080fd5b506104a3610c7b565b60405161044d9190613c48565b3480156104bc57600080fd5b5061041f6104cb366004613c77565b610d0d565b3480156104dc57600080fd5b506104766104eb366004613ba4565b610d59565b3480156104fc57600080fd5b5061041f61050b366004613c92565b610de1565b34801561051c57600080fd5b5061041f61052b366004613cb4565b6110fa565b34801561053c57600080fd5b5061055061054b366004613ba4565b611210565b60405190815260200161044d565b34801561056a57600080fd5b50600954610550565b34801561057f57600080fd5b5061055060105481565b34801561059557600080fd5b5061041f6105a4366004613cec565b6112db565b3480156105b557600080fd5b5061041f6105c4366004613d25565b61159e565b3480156105d557600080fd5b506105506105e4366004613cb4565b6115cf565b3480156105f557600080fd5b5061055060175481565b34801561060b57600080fd5b5061041f61061a366004613ba4565b611665565b34801561062b57600080fd5b5061041f61063a366004613ba4565b611694565b34801561064b57600080fd5b5061041f61065a366004613d25565b6116c3565b34801561066b57600080fd5b50600c54610476906001600160a01b031681565b34801561068b57600080fd5b50610550601e5481565b3480156106a157600080fd5b506104416106b0366004613ba4565b6116de565b3480156106c157600080fd5b506105506106d0366004613ba4565b6116e9565b3480156106e157600080fd5b506105506106f0366004613ba4565b61177c565b34801561070157600080fd5b50601b54610476906001600160a01b031681565b34801561072157600080fd5b50610550611831565b61041f610738366004613ba4565b61189d565b34801561074957600080fd5b5061055060125481565b34801561075f57600080fd5b5061047661076e366004613ba4565b6119f3565b34801561077f57600080fd5b5061055061078e366004613c77565b611a6a565b34801561079f57600080fd5b5061041f6107ae366004613ba4565b611af1565b3480156107bf57600080fd5b5061041f611b45565b3480156107d457600080fd5b5061055060115481565b3480156107ea57600080fd5b5061041f6107f9366004613c92565b611b7b565b34801561080a57600080fd5b5061041f610819366004613ba4565b611e01565b34801561082a57600080fd5b5061041f610839366004613ba4565b611f7e565b34801561084a57600080fd5b506020546001600160a01b0316610476565b34801561086857600080fd5b5061041f610877366004613ba4565b611fad565b34801561088857600080fd5b50600f54610550565b34801561089d57600080fd5b506104a36123d7565b3480156108b257600080fd5b506105506123e6565b3480156108c757600080fd5b5061041f6108d6366004613c77565b61246b565b3480156108e757600080fd5b5061041f6108f6366004613d61565b6124b7565b34801561090757600080fd5b50601054610550565b34801561091c57600080fd5b50610550600e5481565b34801561093257600080fd5b50601154610550565b34801561094757600080fd5b5061041f610956366004613ba4565b6124c6565b34801561096757600080fd5b50610550610976366004613c77565b601f6020526000908152604090205481565b34801561099457600080fd5b506104416109a3366004613ba4565b6125d6565b3480156109b457600080fd5b5061041f6109c3366004613e24565b612689565b3480156109d457600080fd5b50610550601d5481565b3480156109ea57600080fd5b506104a36109f9366004613ba4565b6126c1565b348015610a0a57600080fd5b50601354610550565b348015610a1f57600080fd5b5061055060135481565b348015610a3557600080fd5b5061055060165481565b348015610a4b57600080fd5b5061041f612799565b348015610a6057600080fd5b50610550610a6f366004613ba4565b60156020526000908152604090205481565b348015610a8d57600080fd5b50610550610a9c366004613ba4565b60146020526000908152604090205481565b348015610aba57600080fd5b50601954610476906001600160a01b031681565b348015610ada57600080fd5b50610550610ae9366004613ba4565b612849565b348015610afa57600080fd5b5061041f610b09366004613ea0565b6128e0565b348015610b1a57600080fd5b50610550600f5481565b348015610b3057600080fd5b50610550600d5481565b348015610b4657600080fd5b50610441610b55366004613ee9565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610b8f57600080fd5b506104a361291d565b348015610ba457600080fd5b5061041f610bb3366004613ba4565b6129ab565b348015610bc457600080fd5b5061041f610bd3366004613c92565b6129da565b348015610be457600080fd5b5061041f610bf3366004613c77565b612a74565b348015610c0457600080fd5b5061041f610c13366004613ba4565b612b0f565b6020546001600160a01b03163314610c4b5760405162461bcd60e51b8152600401610c4290613f1c565b60405180910390fd5b601355565b60006001600160e01b0319821663780e9d6360e01b1480610c755750610c7582612b3e565b92915050565b606060018054610c8a90613f51565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb690613f51565b8015610d035780601f10610cd857610100808354040283529160200191610d03565b820191906000526020600020905b815481529060010190602001808311610ce657829003601f168201915b5050505050905090565b6020546001600160a01b03163314610d375760405162461bcd60e51b8152600401610c4290613f1c565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000610d6482612b8e565b610dc55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c42565b506000908152600560205260409020546001600160a01b031690565b81610deb81612b8e565b610e075760405162461bcd60e51b8152600401610c4290613f8c565b33610e11826119f3565b6001600160a01b031614610e375760405162461bcd60e51b8152600401610c4290613fba565b60008211610e875760405162461bcd60e51b815260206004820152601b60248201527f4d75737420626f72726f77206e6f6e2d7a65726f20616d6f756e7400000000006044820152606401610c42565b600f54610f0b83601b60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ee1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f059190613ff1565b90612bab565b1115610f715760405162461bcd60e51b815260206004820152602f60248201527f626f72726f77546f6b656e3a2043616e6e6f74206d696e74206f76657220617660448201526e30b4b630b136329039bab838363c9760891b6064820152608401610c42565b600083815260156020526040812054610f8a9084612bab565b6000858152601560205260409020549091508111610faa57610faa61400a565b600084815260146020526040902054610fc39082612bb7565b6110355760405162461bcd60e51b815260206004820152603a60248201527f426f72726f7720776f756c6420707574207661756c742062656c6f77206d696e60448201527f696d756d20636f6c6c61746572616c2070657263656e746167650000000000006064820152608401610c42565b6000848152601560205260409020819055601e546110539082612bab565b601e55601b546040516340c10f1960e01b8152336004820152602481018590526001600160a01b03909116906340c10f1990604401600060405180830381600087803b1580156110a257600080fd5b505af11580156110b6573d6000803e3d6000fd5b505060408051878152602081018790527f3e08df88d8e28f37df9bf227d3142ac506a364403445661a60891a49ed6792ca935001905060405180910390a150505050565b6000611105826119f3565b9050806001600160a01b0316836001600160a01b031614156111735760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c42565b336001600160a01b038216148061118f575061118f8133610b55565b6112015760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c42565b61120b8383612be6565b505050565b60008181526014602052604081205415806112375750600082815260156020526040902054155b806112485750611246826125d6565b155b1561125557506000919050565b6000828152601460209081526040808320546015909252822054829161127a91612c54565b915091508060001415611291575060009392505050565b600061129d8383612dfb565b90506112b8601d54600a6112b1919061411a565b8390612dfb565b915060006112d160165484612dfb90919063ffffffff16565b9695505050505050565b826112e581612b8e565b6113015760405162461bcd60e51b8152600401610c4290613f8c565b3361130b826119f3565b6001600160a01b0316146113315760405162461bcd60e51b8152600401610c4290613fba565b600260005414156113545760405162461bcd60e51b8152600401610c4290614126565b60026000908155848152601460205260409020548311156113c55760405162461bcd60e51b815260206004820152602560248201527f5661756c7420646f6573206e6f74206861766520656e6f75676820636f6c6c616044820152641d195c985b60da1b6064820152608401610c42565b6000848152601460205260408120546113de9085612e07565b600086815260156020526040902054909150156114815760008581526015602052604090205461140f908290612bb7565b6114815760405162461bcd60e51b815260206004820152603e60248201527f5769746864726177616c20776f756c6420707574207661756c742062656c6f7760448201527f206d696e696d756d20636f6c6c61746572616c2070657263656e7461676500006064820152608401610c42565b6000858152601460205260409020819055821561154257604051632e1a7d4d60e01b8152600481018590527321be370d5312f44cb42ce377bc9b8a0cef1a4c8390632e1a7d4d906024016020604051808303816000875af11580156114ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150e9190613ff1565b50604051339085156108fc029086906000818181858888f1935050505015801561153c573d6000803e3d6000fd5b50611559565b601954611559906001600160a01b03163386612e13565b60408051868152602081018690527f6c0ea3bea9dd66afa8f9d39d6eb93d833466190330813b42835efc650dca4cb9910160405180910390a150506001600055505050565b6115a83382612e76565b6115c45760405162461bcd60e51b8152600401610c429061415d565b61120b838383612f5c565b60006115da83611a6a565b821061163c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c42565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6020546001600160a01b0316331461168f5760405162461bcd60e51b8152600401610c4290613f1c565b600d55565b6020546001600160a01b031633146116be5760405162461bcd60e51b8152600401610c4290613f1c565b601055565b61120b83838360405180602001604052806000815250612689565b6000610c7582612b8e565b60006116f460095490565b82106117575760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c42565b6009828154811061176a5761176a6141ae565b90600052602060002001549050919050565b600081815260146020526040812054158061179d575061179b826125d6565b155b156117aa57506000919050565b600082815260146020908152604080832054601590925282205482916117cf91612c54565b9150915060006117ea60165483612dfb90919063ffffffff16565b9050806117fc57506000949350505050565b6118286118076123e6565b6118226103e86118226017548661310790919063ffffffff16565b90612dfb565b95945050505050565b600e54600090611842816001612bab565b600e8190558111156118565761185661400a565b6118603382613113565b604080518281523360208201527f8b6c1d05c678fa59695e26465a85918ce0fc63a88f74af53d1daef8f0a9c7804910160405180910390a1919050565b600260005414156118c05760405162461bcd60e51b8152600401610c4290614126565b60026000819055507321be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b031663d0e30db0346040518263ffffffff1660e01b815260040160206040518083038185885af115801561191c573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906119419190613ff1565b5060195460405163095ea7b360e01b815230600482015271ffffffffffffffffffffffffffffffffffff60248201526001600160a01b039091169063095ea7b3906044016020604051808303816000875af11580156119a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c891906141c4565b506019546119e1906001600160a01b0316303334613252565b6119eb81346129da565b506001600055565b6000818152600360205260408120546001600160a01b031680610c755760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c42565b60006001600160a01b038216611ad55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c42565b506001600160a01b031660009081526004602052604090205490565b6020546001600160a01b03163314611b1b5760405162461bcd60e51b8152600401610c4290613f1c565b611b2481612b8e565b611b405760405162461bcd60e51b8152600401610c4290613f8c565b601255565b6020546001600160a01b03163314611b6f5760405162461bcd60e51b8152600401610c4290613f1c565b611b79600061328a565b565b601b546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611bc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be79190613ff1565b1015611c2d5760405162461bcd60e51b8152602060048201526015602482015274546f6b656e2062616c616e636520746f6f206c6f7760581b6044820152606401610c42565b600082815260156020526040902054811115611c9b5760405162461bcd60e51b815260206004820152602760248201527f5661756c742064656274206c657373207468616e20616d6f756e7420746f20706044820152666179206261636b60c81b6064820152608401610c42565b6000611cce611cb4612710611cae6123e6565b90613107565b611822611cc060135490565b601054611cae908790613107565b600084815260156020526040902054909150611cea9083612e07565b600084815260156020908152604080832093909355601490522054611d0f9082612e07565b6000848152601460205260408082209290925560125481522054611d339082612bab565b601254600090815260146020526040902055601e54611d529083612e07565b601e55601b54604051632770a7eb60e21b8152336004820152602481018490526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015611da157600080fd5b505af1158015611db5573d6000803e3d6000fd5b505060408051868152602081018690529081018490527f31f96762af4051f367185773cc2f55bfb112a6c114b3407ded1f321a9eb199ac925060600190505b60405180910390a1505050565b80611e0b81612b8e565b611e275760405162461bcd60e51b8152600401610c4290613f8c565b33611e31826119f3565b6001600160a01b031614611e575760405162461bcd60e51b8152600401610c4290613fba565b60026000541415611e7a5760405162461bcd60e51b8152600401610c4290614126565b600260009081558281526015602052604090205415611edb5760405162461bcd60e51b815260206004820152601a60248201527f5661756c7420686173206f75747374616e64696e6720646562740000000000006044820152606401610c42565b60008281526014602052604090205415611f1d57611f1d611efb836119f3565b6000848152601460205260409020546019546001600160a01b03169190612e13565b611f26826132dc565b6000828152601460209081526040808320839055601582528083209290925590518381527f4fe08624ee65b341c38ab9693d216b909d4ddee1bc8d3fe0fea14026c361b465910160405180910390a150506001600055565b6020546001600160a01b03163314611fa85760405162461bcd60e51b8152600401610c4290613f1c565b601155565b611fb681612b8e565b611fd25760405162461bcd60e51b8152600401610c4290613f8c565b6018546001600160a01b03161580611ff457506018546001600160a01b031633145b61204b5760405162461bcd60e51b815260206004820152602260248201527f6c69717569646174696f6e2069732064697361626c656420666f72207075626c604482015261696360f01b6064820152608401610c42565b6000818152601460209081526040808320546015909252822054829161207091612c54565b909250905060006120818383612dfb565b9050600d5481106120ed5760405162461bcd60e51b815260206004820152603060248201527f5661756c74206973206e6f742062656c6f77206d696e696d756d20636f6c6c6160448201526f746572616c2070657263656e7461676560801b6064820152608401610c42565b6120ff601d54600a6112b1919061411a565b9150600061211860165484612dfb90919063ffffffff16565b601b546040516370a0823160e01b815233600482015291925082916001600160a01b03909116906370a0823190602401602060405180830381865afa158015612165573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121899190613ff1565b10156121f15760405162461bcd60e51b815260206004820152603160248201527f546f6b656e2062616c616e636520746f6f206c6f7720746f20706179206f6666604482015270081bdd5d1cdd185b991a5b99c81919589d607a1b6064820152608401610c42565b601b54604051632770a7eb60e21b8152336004820152602481018390526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801561223d57600080fd5b505af1158015612251573d6000803e3d6000fd5b5050601e546122639250905082612e07565b601e5560006122718661177c565b60008781526015602052604090205490915061228d9083612e07565b6000878152601560205260408120919091556122ca6122b0612710611cae6123e6565b6118226122bc60135490565b601054611cae908890613107565b6000888152601460205260409020549091506122e69082612e07565b600088815260146020526040808220929092556012548152205461230a9082612bab565b60125460009081526014602052604080822092909255888152205461232f9083612e07565b600088815260146020908152604080832093909355338252601f905220546123579083612bab565b336000908152601f60205260409020557f4d151d3a98b83151d51917640c221f8c8e3c054422ea1b48dcbbd57e3f4210d587612392816119f3565b604080519283526001600160a01b0390911660208301523390820152606081018590526080810184905260a0810183905260c00160405180910390a150505050505050565b606060028054610c8a90613f51565b600080600c60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561243c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246091906141fb565b509195945050505050565b6020546001600160a01b031633146124955760405162461bcd60e51b8152600401610c4290613f1c565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6124c2338383613383565b5050565b6020546001600160a01b031633146124f05760405162461bcd60e51b8152600401610c4290613f1c565b601b54604080516318160ddd60e01b8152905183926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015612539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061255d9190613ff1565b11156125d15760405162461bcd60e51b815260206004820152603860248201527f7365744365696c696e673a204d757374206265206f7665722074686520616d6f60448201527f756e74206f66206f75747374616e64696e6720646562742e00000000000000006064820152608401610c42565b600f55565b60006125e182612b8e565b6125fd5760405162461bcd60e51b8152600401610c4290613f8c565b60008281526014602052604090205415806126245750600082815260156020526040902054155b1561263157506000919050565b6000828152601460209081526040808320546015909252822054829161265691612c54565b909250905060006126678383612dfb565b9050600d5481101561267e57506001949350505050565b506000949350505050565b6126933383612e76565b6126af5760405162461bcd60e51b8152600401610c429061415d565b6126bb84848484613452565b50505050565b60606126cc82612b8e565b6127305760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610c42565b600061274760408051602081019091526000815290565b905060008151116127675760405180602001604052806000815250612792565b8061277184613485565b60405160200161278292919061424b565b6040516020818303038152906040525b9392505050565b600260005414156127bc5760405162461bcd60e51b8152600401610c4290614126565b60026000908155338152601f602052604090205461281c5760405162461bcd60e51b815260206004820152601c60248201527f446f6e2774206861766520616e797468696e6720666f7220796f752e000000006044820152606401610c42565b336000818152601f60205260408120805491905560195490916119eb916001600160a01b03169083612e13565b600061285482612b8e565b6128705760405162461bcd60e51b8152600401610c4290613f8c565b60008281526014602052604090205415806128975750600082815260156020526040902054155b156128a457506000919050565b600082815260146020908152604080832054601590925282205482916128c991612c54565b90925090506128d88282612dfb565b949350505050565b6020546001600160a01b0316331461290a5760405162461bcd60e51b8152600401610c4290613f1c565b80516124c290600b906020840190613b0b565b600b805461292a90613f51565b80601f016020809104026020016040519081016040528092919081815260200182805461295690613f51565b80156129a35780601f10612978576101008083540402835291602001916129a3565b820191906000526020600020905b81548152906001019060200180831161298657829003601f168201915b505050505081565b6020546001600160a01b031633146129d55760405162461bcd60e51b8152600401610c4290613f1c565b601655565b6019546129f2906001600160a01b0316333084613252565b600082815260146020526040812054612a0b9083612bab565b600084815260146020526040902054909150811015612a2c57612a2c61400a565b60008381526014602090815260409182902083905581518581529081018490527f52c4e7127ec34e8fc95f09ce2d06b4f00acca12ccbcdfb246ef67ee6aefe068d9101611df4565b6020546001600160a01b03163314612a9e5760405162461bcd60e51b8152600401610c4290613f1c565b6001600160a01b038116612b035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c42565b612b0c8161328a565b50565b6020546001600160a01b03163314612b395760405162461bcd60e51b8152600401610c4290613f1c565b601755565b60006001600160e01b031982166380ac58cd60e01b1480612b6f57506001600160e01b03198216635b5e139f60e01b145b80610c7557506301ffc9a760e01b6001600160e01b0319831614610c75565b6000908152600360205260409020546001600160a01b0316151590565b6000612792828461427a565b6000806000612bc68585612c54565b90925090506000612bd78383612dfb565b600d5411159695505050505050565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612c1b826119f3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080612c5f6123e6565b612c6b57612c6b61400a565b601354612c7a57612c7a61400a565b6000612d99612d7c601a60009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cf99190614292565b60ff16601c60009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d739190614292565b60ff1690612e07565b612d8790600a61411a565b611cae612d926123e6565b8890613107565b905084811015612dab57612dab61400a565b6000612dc0612db960135490565b8690613107565b905084811015612dd257612dd261400a565b6000612ddf836064613107565b9050828111612df057612df061400a565b969095509350505050565b600061279282846142cb565b600061279282846142df565b6040516001600160a01b03831660248201526044810182905261120b90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613583565b6000612e8182612b8e565b612ee25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c42565b6000612eed836119f3565b9050806001600160a01b0316846001600160a01b03161480612f285750836001600160a01b0316612f1d84610d59565b6001600160a01b0316145b806128d857506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff166128d8565b826001600160a01b0316612f6f826119f3565b6001600160a01b031614612fd75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610c42565b6001600160a01b0382166130395760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c42565b613044838383613655565b61304f600082612be6565b6001600160a01b03831660009081526004602052604081208054600192906130789084906142df565b90915550506001600160a01b03821660009081526004602052604081208054600192906130a690849061427a565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061279282846142f6565b6001600160a01b0382166131695760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c42565b61317281612b8e565b156131bf5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c42565b6131cb60008383613655565b6001600160a01b03821660009081526004602052604081208054600192906131f490849061427a565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6040516001600160a01b03808516602483015283166044820152606481018290526126bb9085906323b872dd60e01b90608401612e3f565b602080546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006132e7826119f3565b90506132f581600084613655565b613300600083612be6565b6001600160a01b03811660009081526004602052604081208054600192906133299084906142df565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b031614156133e55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c42565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61345d848484612f5c565b6134698484848461370d565b6126bb5760405162461bcd60e51b8152600401610c4290614315565b6060816134a95750506040805180820190915260018152600360fc1b602082015290565b8160005b81156134d357806134bd81614367565b91506134cc9050600a836142cb565b91506134ad565b60008167ffffffffffffffff8111156134ee576134ee613d98565b6040519080825280601f01601f191660200182016040528015613518576020820181803683370190505b5090505b84156128d85761352d6001836142df565b915061353a600a86614382565b61354590603061427a565b60f81b81838151811061355a5761355a6141ae565b60200101906001600160f81b031916908160001a90535061357c600a866142cb565b945061351c565b60006135d8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661380b9092919063ffffffff16565b80519091501561120b57808060200190518101906135f691906141c4565b61120b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610c42565b6001600160a01b0383166136b0576136ab81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b6136d3565b816001600160a01b0316836001600160a01b0316146136d3576136d3838261381a565b6001600160a01b0382166136ea5761120b816138b7565b826001600160a01b0316826001600160a01b03161461120b5761120b8282613966565b60006001600160a01b0384163b1561380057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613751903390899088908890600401614396565b6020604051808303816000875af192505050801561378c575060408051601f3d908101601f19168201909252613789918101906143c9565b60015b6137e6573d8080156137ba576040519150601f19603f3d011682016040523d82523d6000602084013e6137bf565b606091505b5080516137de5760405162461bcd60e51b8152600401610c4290614315565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506128d8565b506001949350505050565b60606128d884846000856139aa565b6000600161382784611a6a565b61383191906142df565b600083815260086020526040902054909150808214613884576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b6009546000906138c9906001906142df565b6000838152600a6020526040812054600980549394509092849081106138f1576138f16141ae565b906000526020600020015490508060098381548110613912576139126141ae565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061394a5761394a6143e6565b6001900381819060005260206000200160009055905550505050565b600061397183611a6a565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b606082471015613a0b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610c42565b843b613a595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c42565b600080866001600160a01b03168587604051613a7591906143fc565b60006040518083038185875af1925050503d8060008114613ab2576040519150601f19603f3d011682016040523d82523d6000602084013e613ab7565b606091505b5091509150613ac7828286613ad2565b979650505050505050565b60608315613ae1575081612792565b825115613af15782518084602001fd5b8160405162461bcd60e51b8152600401610c429190613c48565b828054613b1790613f51565b90600052602060002090601f016020900481019282613b395760008555613b7f565b82601f10613b5257805160ff1916838001178555613b7f565b82800160010185558215613b7f579182015b82811115613b7f578251825591602001919060010190613b64565b50613b8b929150613b8f565b5090565b5b80821115613b8b5760008155600101613b90565b600060208284031215613bb657600080fd5b5035919050565b6001600160e01b031981168114612b0c57600080fd5b600060208284031215613be557600080fd5b813561279281613bbd565b60005b83811015613c0b578181015183820152602001613bf3565b838111156126bb5750506000910152565b60008151808452613c34816020860160208601613bf0565b601f01601f19169290920160200192915050565b6020815260006127926020830184613c1c565b80356001600160a01b0381168114613c7257600080fd5b919050565b600060208284031215613c8957600080fd5b61279282613c5b565b60008060408385031215613ca557600080fd5b50508035926020909101359150565b60008060408385031215613cc757600080fd5b613cd083613c5b565b946020939093013593505050565b8015158114612b0c57600080fd5b600080600060608486031215613d0157600080fd5b83359250602084013591506040840135613d1a81613cde565b809150509250925092565b600080600060608486031215613d3a57600080fd5b613d4384613c5b565b9250613d5160208501613c5b565b9150604084013590509250925092565b60008060408385031215613d7457600080fd5b613d7d83613c5b565b91506020830135613d8d81613cde565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115613dc957613dc9613d98565b604051601f8501601f19908116603f01168101908282118183101715613df157613df1613d98565b81604052809350858152868686011115613e0a57600080fd5b858560208301376000602087830101525050509392505050565b60008060008060808587031215613e3a57600080fd5b613e4385613c5b565b9350613e5160208601613c5b565b925060408501359150606085013567ffffffffffffffff811115613e7457600080fd5b8501601f81018713613e8557600080fd5b613e9487823560208401613dae565b91505092959194509250565b600060208284031215613eb257600080fd5b813567ffffffffffffffff811115613ec957600080fd5b8201601f81018413613eda57600080fd5b6128d884823560208401613dae565b60008060408385031215613efc57600080fd5b613f0583613c5b565b9150613f1360208401613c5b565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680613f6557607f821691505b60208210811415613f8657634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526014908201527315985d5b1d08191bd95cc81b9bdd08195e1a5cdd60621b604082015260600190565b60208082526019908201527f5661756c74206973206e6f74206f776e656420627920796f7500000000000000604082015260600190565b60006020828403121561400357600080fd5b5051919050565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561407157816000190482111561405757614057614020565b8085161561406457918102915b93841c939080029061403b565b509250929050565b60008261408857506001610c75565b8161409557506000610c75565b81600181146140ab57600281146140b5576140d1565b6001915050610c75565b60ff8411156140c6576140c6614020565b50506001821b610c75565b5060208310610133831016604e8410600b84101617156140f4575081810a610c75565b6140fe8383614036565b806000190482111561411257614112614020565b029392505050565b60006127928383614079565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156141d657600080fd5b815161279281613cde565b805169ffffffffffffffffffff81168114613c7257600080fd5b600080600080600060a0868803121561421357600080fd5b61421c866141e1565b945060208601519350604086015192506060860151915061423f608087016141e1565b90509295509295909350565b6000835161425d818460208801613bf0565b835190830190614271818360208801613bf0565b01949350505050565b6000821982111561428d5761428d614020565b500190565b6000602082840312156142a457600080fd5b815160ff8116811461279257600080fd5b634e487b7160e01b600052601260045260246000fd5b6000826142da576142da6142b5565b500490565b6000828210156142f1576142f1614020565b500390565b600081600019048311821515161561431057614310614020565b500290565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600060001982141561437b5761437b614020565b5060010190565b600082614391576143916142b5565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906112d190830184613c1c565b6000602082840312156143db57600080fd5b815161279281613bbd565b634e487b7160e01b600052603160045260246000fd5b6000825161440e818460208701613bf0565b919091019291505056fea264697066735822122096b62aac65f2e3411bfc3a29e5b6196c06e9318fcf0f297dbe504c815fbc361864736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f4766552d15ae4d256ad41b6cf2933482b0680dc000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000dbdffd9aac451f1f0782bbb1937a0d8889dbf94600000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c830000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000446746d3400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000446746d34000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : ethPriceSourceAddress (address): 0xf4766552D15AE4d256Ad41B6cf2933482B0680dc
Arg [1] : minimumCollateralPercentage (uint256): 130
Arg [2] : name (string): Ftm4
Arg [3] : symbol (string): Ftm4
Arg [4] : _mai (address): 0xDbdffd9aAC451f1f0782BbB1937A0d8889DBf946
Arg [5] : _collateral (address): 0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83
Arg [6] : baseURI (string):
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 000000000000000000000000f4766552d15ae4d256ad41b6cf2933482b0680dc
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000082
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 000000000000000000000000dbdffd9aac451f1f0782bbb1937a0d8889dbf946
Arg [5] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 46746d3400000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [10] : 46746d3400000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
76357:1973:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77250:100;;;;;;;;;;-1:-1:-1;77250:100:0;;;;;:::i;:::-;;:::i;:::-;;53439:224;;;;;;;;;;-1:-1:-1;53439:224:0;;;;;:::i;:::-;;:::i;:::-;;;750:14:1;;743:22;725:41;;713:2;698:18;53439:224:0;;;;;;;;61522:28;;;;;;;;;;-1:-1:-1;61522:28:0;;;;-1:-1:-1;;;;;61522:28:0;;;;;;-1:-1:-1;;;;;941:32:1;;;923:51;;911:2;896:18;61522:28:0;777:203:1;40933:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;77090:152::-;;;;;;;;;;-1:-1:-1;77090:152:0;;;;;:::i;:::-;;:::i;42492:221::-;;;;;;;;;;-1:-1:-1;42492:221:0;;;;;:::i;:::-;;:::i;67921:712::-;;;;;;;;;;-1:-1:-1;67921:712:0;;;;;:::i;:::-;;:::i;42015:411::-;;;;;;;;;;-1:-1:-1;42015:411:0;;;;;:::i;:::-;;:::i;69670:672::-;;;;;;;;;;-1:-1:-1;69670:672:0;;;;;:::i;:::-;;:::i;:::-;;;2763:25:1;;;2751:2;2736:18;69670:672:0;2617:177:1;54079:113:0;;;;;;;;;;-1:-1:-1;54167:10:0;:17;54079:113;;61220:25;;;;;;;;;;;;;;;;67040:836;;;;;;;;;;-1:-1:-1;67040:836:0;;;;;:::i;:::-;;:::i;43242:339::-;;;;;;;;;;-1:-1:-1;43242:339:0;;;;;:::i;:::-;;:::i;53747:256::-;;;;;;;;;;-1:-1:-1;53747:256:0;;;;;:::i;:::-;;:::i;61489:24::-;;;;;;;;;;;;;;;;77681:166;;;;;;;;;;-1:-1:-1;77681:166:0;;;;;:::i;:::-;;:::i;77855:98::-;;;;;;;;;;-1:-1:-1;77855:98:0;;;;;:::i;:::-;;:::i;43652:185::-;;;;;;;;;;-1:-1:-1;43652:185:0;;;;;:::i;:::-;;:::i;60989:33::-;;;;;;;;;;-1:-1:-1;60989:33:0;;;;-1:-1:-1;;;;;60989:33:0;;;61746:28;;;;;;;;;;;;;;;;63804:103;;;;;;;;;;-1:-1:-1;63804:103:0;;;;;:::i;:::-;;:::i;54269:233::-;;;;;;;;;;-1:-1:-1;54269:233:0;;;;;:::i;:::-;;:::i;70350:541::-;;;;;;;;;;-1:-1:-1;70350:541:0;;;;;:::i;:::-;;:::i;61636:23::-;;;;;;;;;;-1:-1:-1;61636:23:0;;;;-1:-1:-1;;;;;61636:23:0;;;65480:270;;;;;;;;;;;;;:::i;66261:373::-;;;;;;:::i;:::-;;:::i;61286:23::-;;;;;;;;;;;;;;;;40627:239;;;;;;;;;;-1:-1:-1;40627:239:0;;;;;:::i;:::-;;:::i;40357:208::-;;;;;;;;;;-1:-1:-1;40357:208:0;;;;;:::i;:::-;;:::i;78067:162::-;;;;;;;;;;-1:-1:-1;78067:162:0;;;;;:::i;:::-;;:::i;75474:103::-;;;;;;;;;;;;;:::i;61252:25::-;;;;;;;;;;;;;;;;68641:753;;;;;;;;;;-1:-1:-1;68641:753:0;;;;;:::i;:::-;;:::i;65758:495::-;;;;;;;;;;-1:-1:-1;65758:495:0;;;;;:::i;:::-;;:::i;77961:98::-;;;;;;;;;;-1:-1:-1;77961:98:0;;;;;:::i;:::-;;:::i;74823:87::-;;;;;;;;;;-1:-1:-1;74896:6:0;;-1:-1:-1;;;;;74896:6:0;74823:87;;71996:1760;;;;;;;;;;-1:-1:-1;71996:1760:0;;;;;:::i;:::-;;:::i;63704:92::-;;;;;;;;;;-1:-1:-1;63777:11:0;;63704:92;;41102:104;;;;;;;;;;;;;:::i;64217:162::-;;;;;;;;;;;;;:::i;77358:102::-;;;;;;;;;;-1:-1:-1;77358:102:0;;;;;:::i;:::-;;:::i;42785:155::-;;;;;;;;;;-1:-1:-1;42785:155:0;;;;;:::i;:::-;;:::i;63915:92::-;;;;;;;;;;-1:-1:-1;63989:10:0;;63915:92;;61155:25;;;;;;;;;;;;;;;;64015:92;;;;;;;;;;-1:-1:-1;64089:10:0;;64015:92;;77468:205;;;;;;;;;;-1:-1:-1;77468:205:0;;;;;:::i;:::-;;:::i;62360:44::-;;;;;;;;;;-1:-1:-1;62360:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;71359:629;;;;;;;;;;-1:-1:-1;71359:629:0;;;;;:::i;:::-;;:::i;43908:328::-;;;;;;;;;;-1:-1:-1;43908:328:0;;;;;:::i;:::-;;:::i;61705:34::-;;;;;;;;;;;;;;;;41277:334;;;;;;;;;;-1:-1:-1;41277:334:0;;;;;:::i;:::-;;:::i;64115:94::-;;;;;;;;;;-1:-1:-1;64193:8:0;;64115:94;;61316:23;;;;;;;;;;;;;;;;61458:24;;;;;;;;;;;;;;;;69402:260;;;;;;;;;;;;;:::i;61405:44::-;;;;;;;;;;-1:-1:-1;61405:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;61348:50;;;;;;;;;;-1:-1:-1;61348:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;61559:24;;;;;;;;;;-1:-1:-1;61559:24:0;;;;-1:-1:-1;;;;;61559:24:0;;;70899:452;;;;;;;;;;-1:-1:-1;70899:452:0;;;;;:::i;:::-;;:::i;78238:89::-;;;;;;;;;;-1:-1:-1;78238:89:0;;;;;:::i;:::-;;:::i;61187:26::-;;;;;;;;;;;;;;;;61103:43;;;;;;;;;;;;;;;;43011:164;;;;;;;;;;-1:-1:-1;43011:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;43132:25:0;;;43108:4;43132:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;43011:164;59700:17;;;;;;;;;;;;;:::i;76980:102::-;;;;;;;;;;-1:-1:-1;76980:102:0;;;;;:::i;:::-;;:::i;66642:390::-;;;;;;;;;;-1:-1:-1;66642:390:0;;;;;:::i;:::-;;:::i;75732:201::-;;;;;;;;;;-1:-1:-1;75732:201:0;;;;;:::i;:::-;;:::i;76870:102::-;;;;;;;;;;-1:-1:-1;76870:102:0;;;;;:::i;:::-;;:::i;77250:100::-;74896:6;;-1:-1:-1;;;;;74896:6:0;38462:10;75043:23;75035:68;;;;-1:-1:-1;;;75035:68:0;;;;;;;:::i;:::-;;;;;;;;;77322:8:::1;:20:::0;77250:100::o;53439:224::-;53541:4;-1:-1:-1;;;;;;53565:50:0;;-1:-1:-1;;;53565:50:0;;:90;;;53619:36;53643:11;53619:23;:36::i;:::-;53558:97;53439:224;-1:-1:-1;;53439:224:0:o;40933:100::-;40987:13;41020:5;41013:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40933:100;:::o;77090:152::-;74896:6;;-1:-1:-1;;;;;74896:6:0;38462:10;75043:23;75035:68;;;;-1:-1:-1;;;75035:68:0;;;;;;;:::i;:::-;77183:14:::1;:51:::0;;-1:-1:-1;;;;;;77183:51:0::1;-1:-1:-1::0;;;;;77183:51:0;;;::::1;::::0;;;::::1;::::0;;77090:152::o;42492:221::-;42568:7;42596:16;42604:7;42596;:16::i;:::-;42588:73;;;;-1:-1:-1;;;42588:73:0;;7743:2:1;42588:73:0;;;7725:21:1;7782:2;7762:18;;;7755:30;7821:34;7801:18;;;7794:62;-1:-1:-1;;;7872:18:1;;;7865:42;7924:19;;42588:73:0;7541:408:1;42588:73:0;-1:-1:-1;42681:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;42681:24:0;;42492:221::o;67921:712::-;67999:7;63556:16;63564:7;63556;:16::i;:::-;63548:49;;;;-1:-1:-1;;;63548:49:0;;;;;;;:::i;:::-;63636:10;63616:16;63624:7;63616;:16::i;:::-;-1:-1:-1;;;;;63616:30:0;;63608:68;;;;-1:-1:-1;;;63608:68:0;;;;;;;:::i;:::-;68036:1:::1;68027:6;:10;68019:50;;;::::0;-1:-1:-1;;;68019:50:0;;8859:2:1;68019:50:0::1;::::0;::::1;8841:21:1::0;8898:2;8878:18;;;8871:30;8937:29;8917:18;;;8910:57;8984:18;;68019:50:0::1;8657:351:1::0;68019:50:0::1;68121:11;;68088:29;68110:6;68088:3;;;;;;;;;-1:-1:-1::0;;;;;68088:3:0::1;-1:-1:-1::0;;;;;68088:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:21:::0;::::1;:29::i;:::-;:44;;68080:104;;;::::0;-1:-1:-1;;;68080:104:0;;9404:2:1;68080:104:0::1;::::0;::::1;9386:21:1::0;9443:2;9423:18;;;9416:30;9482:34;9462:18;;;9455:62;-1:-1:-1;;;9533:18:1;;;9526:45;9588:19;;68080:104:0::1;9202:411:1::0;68080:104:0::1;68197:15;68215:18:::0;;;:9:::1;:18;::::0;;;;;:30:::1;::::0;68238:6;68215:22:::1;:30::i;:::-;68275:18;::::0;;;:9:::1;:18;::::0;;;;;68197:48;;-1:-1:-1;68265:28:0;::::1;68258:36;;;;:::i;:::-;68333:24;::::0;;;:15:::1;:24;::::0;;;;;68315:52:::1;::::0;68359:7;68315:17:::1;:52::i;:::-;68307:123;;;::::0;-1:-1:-1;;;68307:123:0;;9952:2:1;68307:123:0::1;::::0;::::1;9934:21:1::0;9991:2;9971:18;;;9964:30;10030:34;10010:18;;;10003:62;10101:28;10081:18;;;10074:56;10147:19;;68307:123:0::1;9750:422:1::0;68307:123:0::1;68443:18;::::0;;;:9:::1;:18;::::0;;;;:28;;;68498:13:::1;::::0;:26:::1;::::0;68464:7;68498:17:::1;:26::i;:::-;68482:13;:42:::0;68553:3:::1;::::0;:28:::1;::::0;-1:-1:-1;;;68553:28:0;;68562:10:::1;68553:28;::::0;::::1;10351:51:1::0;10418:18;;;10411:34;;;-1:-1:-1;;;;;68553:3:0;;::::1;::::0;:8:::1;::::0;10324:18:1;;68553:28:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;68597:28:0::1;::::0;;10630:25:1;;;10686:2;10671:18;;10664:34;;;68597:28:0::1;::::0;-1:-1:-1;10603:18:1;;-1:-1:-1;68597:28:0::1;;;;;;;68008:625;67921:712:::0;;;:::o;42015:411::-;42096:13;42112:23;42127:7;42112:14;:23::i;:::-;42096:39;;42160:5;-1:-1:-1;;;;;42154:11:0;:2;-1:-1:-1;;;;;42154:11:0;;;42146:57;;;;-1:-1:-1;;;42146:57:0;;10911:2:1;42146:57:0;;;10893:21:1;10950:2;10930:18;;;10923:30;10989:34;10969:18;;;10962:62;-1:-1:-1;;;11040:18:1;;;11033:31;11081:19;;42146:57:0;10709:397:1;42146:57:0;38462:10;-1:-1:-1;;;;;42238:21:0;;;;:62;;-1:-1:-1;42263:37:0;42280:5;38462:10;43011:164;:::i;42263:37::-;42216:168;;;;-1:-1:-1;;;42216:168:0;;11313:2:1;42216:168:0;;;11295:21:1;11352:2;11332:18;;;11325:30;11391:34;11371:18;;;11364:62;11462:26;11442:18;;;11435:54;11506:19;;42216:168:0;11111:420:1;42216:168:0;42397:21;42406:2;42410:7;42397:8;:21::i;:::-;42085:341;42015:411;;:::o;69670:672::-;69727:7;69752:24;;;:15;:24;;;;;;:29;;:54;;-1:-1:-1;69785:18:0;;;;:9;:18;;;;;;:21;69752:54;:84;;;;69811:25;69828:7;69811:16;:25::i;:::-;69810:26;69752:84;69749:124;;;-1:-1:-1;69860:1:0;;69670:672;-1:-1:-1;69670:672:0:o;69749:124::-;69886:31;69970:24;;;:15;:24;;;;;;;;;69996:9;:18;;;;;;69886:31;;69940:75;;:29;:75::i;:::-;69885:130;;;;70031:9;70042:1;70031:12;70028:51;;;-1:-1:-1;70066:1:0;;69670:672;-1:-1:-1;;;69670:672:0:o;70028:51::-;70099:28;70130:38;:23;70158:9;70130:27;:38::i;:::-;70099:69;;70193:40;70213:19;;70207:2;:25;;;;:::i;:::-;70193:9;;:13;:40::i;:::-;70181:52;;70246:16;70265:24;70279:9;;70265;:13;;:24;;;;:::i;:::-;70246:43;69670:672;-1:-1:-1;;;;;;69670:672:0:o;67040:836::-;67136:7;63556:16;63564:7;63556;:16::i;:::-;63548:49;;;;-1:-1:-1;;;63548:49:0;;;;;;;:::i;:::-;63636:10;63616:16;63624:7;63616;:16::i;:::-;-1:-1:-1;;;;;63616:30:0;;63608:68;;;;-1:-1:-1;;;63608:68:0;;;;;;;:::i;:::-;20981:1:::1;21579:7;;:19;;21571:63;;;;-1:-1:-1::0;;;21571:63:0::1;;;;;;;:::i;:::-;20981:1;21712:7;:18:::0;;;67177:24;;;:15:::2;:24;::::0;;;;;:34;-1:-1:-1;67177:34:0::2;67169:84;;;::::0;-1:-1:-1;;;67169:84:0;;13604:2:1;67169:84:0::2;::::0;::::2;13586:21:1::0;13643:2;13623:18;;;13616:30;13682:34;13662:18;;;13655:62;-1:-1:-1;;;13733:18:1;;;13726:35;13778:19;;67169:84:0::2;13402:401:1::0;67169:84:0::2;67266:21;67290:24:::0;;;:15:::2;:24;::::0;;;;;:36:::2;::::0;67319:6;67290:28:::2;:36::i;:::-;67342:18;::::0;;;:9:::2;:18;::::0;;;;;67266:60;;-1:-1:-1;67342:23:0;67339:182:::2;;67423:18;::::0;;;:9:::2;:18;::::0;;;;;67390:52:::2;::::0;67408:13;;67390:17:::2;:52::i;:::-;67382:127;;;::::0;-1:-1:-1;;;67382:127:0;;14010:2:1;67382:127:0::2;::::0;::::2;13992:21:1::0;14049:2;14029:18;;;14022:30;14088:34;14068:18;;;14061:62;14159:32;14139:18;;;14132:60;14209:19;;67382:127:0::2;13808:426:1::0;67382:127:0::2;67533:24;::::0;;;:15:::2;:24;::::0;;;;:40;;;67586:230;::::2;;;67611:67;::::0;-1:-1:-1;;;67611:67:0;;::::2;::::0;::::2;2763:25:1::0;;;67618:42:0::2;::::0;67611:59:::2;::::0;2736:18:1;;67611:67:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;67693:36:0::2;::::0;67701:10:::2;::::0;67693:36;::::2;;;::::0;67722:6;;67693:36:::2;::::0;;;67722:6;67701:10;67693:36;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;67586:230;;;67761:10;::::0;:43:::2;::::0;-1:-1:-1;;;;;67761:10:0::2;67785;67797:6:::0;67761:23:::2;:43::i;:::-;67833:35;::::0;;10630:25:1;;;10686:2;10671:18;;10664:34;;;67833:35:0::2;::::0;10603:18:1;67833:35:0::2;;;;;;;-1:-1:-1::0;;20937:1:0::1;21891:7;:22:::0;-1:-1:-1;;;67040:836:0:o;43242:339::-;43437:41;38462:10;43470:7;43437:18;:41::i;:::-;43429:103;;;;-1:-1:-1;;;43429:103:0;;;;;;;:::i;:::-;43545:28;43555:4;43561:2;43565:7;43545:9;:28::i;53747:256::-;53844:7;53880:23;53897:5;53880:16;:23::i;:::-;53872:5;:31;53864:87;;;;-1:-1:-1;;;53864:87:0;;14859:2:1;53864:87:0;;;14841:21:1;14898:2;14878:18;;;14871:30;14937:34;14917:18;;;14910:62;-1:-1:-1;;;14988:18:1;;;14981:41;15039:19;;53864:87:0;14657:407:1;53864:87:0;-1:-1:-1;;;;;;53969:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;53747:256::o;77681:166::-;74896:6;;-1:-1:-1;;;;;74896:6:0;38462:10;75043:23;75035:68;;;;-1:-1:-1;;;75035:68:0;;;;;;;:::i;:::-;77781:28:::1;:58:::0;77681:166::o;77855:98::-;74896:6;;-1:-1:-1;;;;;74896:6:0;38462:10;75043:23;75035:68;;;;-1:-1:-1;;;75035:68:0;;;;;;;:::i;:::-;77926:10:::1;:19:::0;77855:98::o;43652:185::-;43790:39;43807:4;43813:2;43817:7;43790:39;;;;;;;;;;;;:16;:39::i;63804:103::-;63860:4;63883:16;63891:7;63883;:16::i;54269:233::-;54344:7;54380:30;54167:10;:17;;54079:113;54380:30;54372:5;:38;54364:95;;;;-1:-1:-1;;;54364:95:0;;15271:2:1;54364:95:0;;;15253:21:1;15310:2;15290:18;;;15283:30;15349:34;15329:18;;;15322:62;-1:-1:-1;;;15400:18:1;;;15393:42;15452:19;;54364:95:0;15069:408:1;54364:95:0;54477:10;54488:5;54477:17;;;;;;;;:::i;:::-;;;;;;;;;54470:24;;54269:233;;;:::o;70350:541::-;70410:7;70435:24;;;:15;:24;;;;;;:29;;:58;;;70468:25;70485:7;70468:16;:25::i;:::-;70467:26;70435:58;70432:99;;;-1:-1:-1;70518:1:0;;70350:541;-1:-1:-1;70350:541:0:o;70432:99::-;70544:31;70628:24;;;:15;:24;;;;;;;;;70654:9;:18;;;;;;70544:31;;70598:75;;:29;:75::i;:::-;70543:130;;;;70686:16;70705:24;70719:9;;70705;:13;;:24;;;;:::i;:::-;70686:43;-1:-1:-1;70761:11:0;70758:50;;-1:-1:-1;70795:1:0;;70350:541;-1:-1:-1;;;;70350:541:0:o;70758:50::-;70825:58;70863:19;:17;:19::i;:::-;70825:33;70853:4;70825:23;70838:9;;70825:8;:12;;:23;;;;:::i;:::-;:27;;:33::i;:58::-;70818:65;70350:541;-1:-1:-1;;;;;70350:541:0:o;65480:270::-;65554:10;;65521:7;;65588:17;65554:10;65603:1;65588:14;:17::i;:::-;65575:10;:30;;;65625:16;-1:-1:-1;65625:16:0;65618:24;;;;:::i;:::-;65655:20;65661:10;65672:2;65655:5;:20::i;:::-;65693:27;;;15788:25:1;;;65709:10:0;15844:2:1;15829:18;;15822:60;65693:27:0;;15761:18:1;65693:27:0;;;;;;;65740:2;65480:270;-1:-1:-1;65480:270:0:o;66261:373::-;20981:1;21579:7;;:19;;21571:63;;;;-1:-1:-1;;;21571:63:0;;;;;;;:::i;:::-;20981:1;21712:7;:18;;;;66347:42:::1;-1:-1:-1::0;;;;;66340:58:0::1;;66406:9;66340:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;66429:10:0::1;::::0;:73:::1;::::0;-1:-1:-1;;;66429:73:0;;66456:4:::1;66429:73;::::0;::::1;10351:51:1::0;66463:38:0::1;10418:18:1::0;;;10411:34;-1:-1:-1;;;;;66429:10:0;;::::1;::::0;:18:::1;::::0;10324::1;;66429:73:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;66513:10:0::1;::::0;:65:::1;::::0;-1:-1:-1;;;;;66513:10:0::1;66549:4;66556:10;66568:9;66513:27;:65::i;:::-;66589:37;66607:7;66616:9;66589:17;:37::i;:::-;-1:-1:-1::0;20937:1:0;21891:7;:22;66261:373::o;40627:239::-;40699:7;40735:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40735:16:0;40770:19;40762:73;;;;-1:-1:-1;;;40762:73:0;;16675:2:1;40762:73:0;;;16657:21:1;16714:2;16694:18;;;16687:30;16753:34;16733:18;;;16726:62;-1:-1:-1;;;16804:18:1;;;16797:39;16853:19;;40762:73:0;16473:405:1;40357:208:0;40429:7;-1:-1:-1;;;;;40457:19:0;;40449:74;;;;-1:-1:-1;;;40449:74:0;;17085:2:1;40449:74:0;;;17067:21:1;17124:2;17104:18;;;17097:30;17163:34;17143:18;;;17136:62;-1:-1:-1;;;17214:18:1;;;17207:40;17264:19;;40449:74:0;16883:406:1;40449:74:0;-1:-1:-1;;;;;;40541:16:0;;;;;:9;:16;;;;;;;40357:208::o;78067:162::-;74896:6;;-1:-1:-1;;;;;74896:6:0;38462:10;75043:23;75035:68;;;;-1:-1:-1;;;75035:68:0;;;;;;;:::i;:::-;78147:18:::1;78155:9;78147:7;:18::i;:::-;78139:51;;;;-1:-1:-1::0;;;78139:51:0::1;;;;;;;:::i;:::-;78201:8;:20:::0;78067:162::o;75474:103::-;74896:6;;-1:-1:-1;;;;;74896:6:0;38462:10;75043:23;75035:68;;;;-1:-1:-1;;;75035:68:0;;;;;;;:::i;:::-;75539:30:::1;75566:1;75539:18;:30::i;:::-;75474:103::o:0;68641:753::-;68724:3;;:25;;-1:-1:-1;;;68724:25:0;;68738:10;68724:25;;;923:51:1;68753:6:0;;-1:-1:-1;;;;;68724:3:0;;:13;;896:18:1;;68724:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;;68716:69;;;;-1:-1:-1;;;68716:69:0;;17496:2:1;68716:69:0;;;17478:21:1;17535:2;17515:18;;;17508:30;-1:-1:-1;;;17554:18:1;;;17547:51;17615:18;;68716:69:0;17294:345:1;68716:69:0;68804:18;;;;:9;:18;;;;;;:28;-1:-1:-1;68804:28:0;68796:80;;;;-1:-1:-1;;;68796:80:0;;17846:2:1;68796:80:0;;;17828:21:1;17885:2;17865:18;;;17858:30;17924:34;17904:18;;;17897:62;-1:-1:-1;;;17975:18:1;;;17968:37;18022:19;;68796:80:0;17644:403:1;68796:80:0;68889:19;68911:87;68967:30;68991:5;68967:19;:17;:19::i;:::-;:23;;:30::i;:::-;68912:49;68939:21;64193:8;;;64115:94;68939:21;68923:10;;68912:22;;:6;;:10;:22::i;68911:87::-;69032:18;;;;:9;:18;;;;;;68889:109;;-1:-1:-1;69032:30:0;;69055:6;69032:22;:30::i;:::-;69011:18;;;;:9;:18;;;;;;;;:51;;;;69098:15;:24;;;;:41;;69127:11;69098:28;:41::i;:::-;69073:24;;;;:15;:24;;;;;;:66;;;;69192:8;;69176:25;;;;:42;;69206:11;69176:29;:42::i;:::-;69166:8;;69150:25;;;;:15;:25;;;;;:68;69247:13;;:25;;69265:6;69247:17;:25::i;:::-;69231:13;:41;69300:3;;:28;;-1:-1:-1;;;69300:28:0;;69309:10;69300:28;;;10351:51:1;10418:18;;;10411:34;;;-1:-1:-1;;;;;69300:3:0;;;;:8;;10324:18:1;;69300:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69344:42:0;;;18254:25:1;;;18310:2;18295:18;;18288:34;;;18338:18;;;18331:34;;;69344:42:0;;-1:-1:-1;18242:2:1;18227:18;;-1:-1:-1;69344:42:0;;;;;;;;68705:689;68641:753;;:::o;65758:495::-;65821:7;63556:16;63564:7;63556;:16::i;:::-;63548:49;;;;-1:-1:-1;;;63548:49:0;;;;;;;:::i;:::-;63636:10;63616:16;63624:7;63616;:16::i;:::-;-1:-1:-1;;;;;63616:30:0;;63608:68;;;;-1:-1:-1;;;63608:68:0;;;;;;;:::i;:::-;20981:1:::1;21579:7;;:19;;21571:63;;;;-1:-1:-1::0;;;21571:63:0::1;;;;;;;:::i;:::-;20981:1;21712:7;:18:::0;;;65862;;;:9:::2;:18;::::0;;;;;:23;65854:62:::2;;;::::0;-1:-1:-1;;;65854:62:0;;18578:2:1;65854:62:0::2;::::0;::::2;18560:21:1::0;18617:2;18597:18;;;18590:30;18656:28;18636:18;;;18629:56;18702:18;;65854:62:0::2;18376:350:1::0;65854:62:0::2;65932:24;::::0;;;:15:::2;:24;::::0;;;;;:27;65929:171:::2;;66021:67;66045:16;66053:7;66045;:16::i;:::-;66063:24;::::0;;;:15:::2;:24;::::0;;;;;66021:10:::2;::::0;-1:-1:-1;;;;;66021:10:0::2;::::0;:67;:23:::2;:67::i;:::-;66112:14;66118:7;66112:5;:14::i;:::-;66146:24;::::0;;;:15:::2;:24;::::0;;;;;;;66139:31;;;66188:9:::2;:18:::0;;;;;66181:25;;;;66224:21;;2763:25:1;;;66224:21:0::2;::::0;2736:18:1;66224:21:0::2;;;;;;;-1:-1:-1::0;;20937:1:0::1;21891:7;:22:::0;65758:495::o;77961:98::-;74896:6;;-1:-1:-1;;;;;74896:6:0;38462:10;75043:23;75035:68;;;;-1:-1:-1;;;75035:68:0;;;;;;;:::i;:::-;78032:10:::1;:19:::0;77961:98::o;71996:1760::-;72065:16;72073:7;72065;:16::i;:::-;72057:49;;;;-1:-1:-1;;;72057:49:0;;;;;;;:::i;:::-;72125:13;;-1:-1:-1;;;;;72125:13:0;:25;;:57;;-1:-1:-1;72169:13:0;;-1:-1:-1;;;;;72169:13:0;72154:10;:28;72125:57;72117:104;;;;-1:-1:-1;;;72117:104:0;;18933:2:1;72117:104:0;;;18915:21:1;18972:2;18952:18;;;18945:30;19011:34;18991:18;;;18984:62;-1:-1:-1;;;19062:18:1;;;19055:32;19104:19;;72117:104:0;18731:398:1;72117:104:0;72235:31;72319:24;;;:15;:24;;;;;;;;;72345:9;:18;;;;;;72235:31;;72289:75;;:29;:75::i;:::-;72234:130;;-1:-1:-1;72234:130:0;-1:-1:-1;72377:28:0;72408:38;72234:130;;72408:27;:38::i;:::-;72377:69;;72490:28;;72467:20;:51;72459:112;;;;-1:-1:-1;;;72459:112:0;;19336:2:1;72459:112:0;;;19318:21:1;19375:2;19355:18;;;19348:30;19414:34;19394:18;;;19387:62;-1:-1:-1;;;19465:18:1;;;19458:46;19521:19;;72459:112:0;19134:412:1;72459:112:0;72596:40;72616:19;;72610:2;:25;;;;:::i;72596:40::-;72584:52;;72649:16;72668:24;72682:9;;72668;:13;;:24;;;;:::i;:::-;72729:3;;:25;;-1:-1:-1;;;72729:25:0;;72743:10;72729:25;;;923:51:1;72649:43:0;;-1:-1:-1;72649:43:0;;-1:-1:-1;;;;;72729:3:0;;;;:13;;896:18:1;;72729:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;72721:99;;;;-1:-1:-1;;;72721:99:0;;19753:2:1;72721:99:0;;;19735:21:1;19792:2;19772:18;;;19765:30;19831:34;19811:18;;;19804:62;-1:-1:-1;;;19882:18:1;;;19875:47;19939:19;;72721:99:0;19551:413:1;72721:99:0;72848:3;;:30;;-1:-1:-1;;;72848:30:0;;72857:10;72848:30;;;10351:51:1;10418:18;;;10411:34;;;-1:-1:-1;;;;;72848:3:0;;;;:8;;10324:18:1;;72848:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;72905:13:0;;:27;;-1:-1:-1;72905:13:0;-1:-1:-1;72923:8:0;72905:17;:27::i;:::-;72889:13;:43;72945:20;72968:21;72981:7;72968:12;:21::i;:::-;73023:18;;;;:9;:18;;;;;;72945:44;;-1:-1:-1;73023:32:0;;73046:8;73023:22;:32::i;:::-;73002:18;;;;:9;:18;;;;;:53;;;;73124:90;73183:30;73207:5;73183:19;:17;:19::i;:30::-;73125:51;73154:21;64193:8;;;64115:94;73154:21;73138:10;;73125:24;;:8;;:12;:24::i;73124:90::-;73257:24;;;;:15;:24;;;;;;73102:112;;-1:-1:-1;73257:41:0;;73102:112;73257:28;:41::i;:::-;73232:24;;;;:15;:24;;;;;;:66;;;;73351:8;;73335:25;;;;:42;;73365:11;73335:29;:42::i;:::-;73325:8;;73309:25;;;;:15;:25;;;;;;:68;;;;73475:24;;;;;:42;;73504:12;73475:28;:42::i;:::-;73448:24;;;;:15;:24;;;;;;;;:69;;;;73611:10;73601:21;;:9;:21;;;;:39;;73627:12;73601:25;:39::i;:::-;73587:10;73577:21;;;;:9;:21;;;;;:63;73658:90;73673:7;73682:16;73673:7;73682;:16::i;:::-;73658:90;;;20256:25:1;;;-1:-1:-1;;;;;20355:15:1;;;20350:2;20335:18;;20328:43;73700:10:0;20387:18:1;;;20380:43;20454:2;20439:18;;20432:34;;;20497:3;20482:19;;20475:35;;;20308:3;20526:19;;20519:35;;;20243:3;20228:19;73658:90:0;;;;;;;72046:1710;;;;;;71996:1760;:::o;41102:104::-;41158:13;41191:7;41184:14;;;;;:::i;64217:162::-;64267:7;64288:12;64307:14;;;;;;;;;-1:-1:-1;;;;;64307:14:0;-1:-1:-1;;;;;64307:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;64286:53:0;;64217:162;-1:-1:-1;;;;;64217:162:0:o;77358:102::-;74896:6;;-1:-1:-1;;;;;74896:6:0;38462:10;75043:23;75035:68;;;;-1:-1:-1;;;75035:68:0;;;;;;;:::i;:::-;77431:13:::1;:21:::0;;-1:-1:-1;;;;;;77431:21:0::1;-1:-1:-1::0;;;;;77431:21:0;;;::::1;::::0;;;::::1;::::0;;77358:102::o;42785:155::-;42880:52;38462:10;42913:8;42923;42880:18;:52::i;:::-;42785:155;;:::o;77468:205::-;74896:6;;-1:-1:-1;;;;;74896:6:0;38462:10;75043:23;75035:68;;;;-1:-1:-1;;;75035:68:0;;;;;;;:::i;:::-;77548:3:::1;::::0;:17:::1;::::0;;-1:-1:-1;;;77548:17:0;;;;77567:6;;-1:-1:-1;;;;;77548:3:0::1;::::0;:15:::1;::::0;:17:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:3;:17:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:25;;77540:94;;;::::0;-1:-1:-1;;;77540:94:0;;21429:2:1;77540:94:0::1;::::0;::::1;21411:21:1::0;21468:2;21448:18;;;21441:30;21507:34;21487:18;;;21480:62;21578:26;21558:18;;;21551:54;21622:19;;77540:94:0::1;21227:420:1::0;77540:94:0::1;77645:11;:20:::0;77468:205::o;71359:629::-;71423:4;71448:16;71456:7;71448;:16::i;:::-;71440:49;;;;-1:-1:-1;;;71440:49:0;;;;;;;:::i;:::-;71513:24;;;;:15;:24;;;;;;:29;;:54;;-1:-1:-1;71546:18:0;;;;:9;:18;;;;;;:21;71513:54;71510:97;;;-1:-1:-1;71590:5:0;;71359:629;-1:-1:-1;71359:629:0:o;71510:97::-;71620:31;71704:24;;;:15;:24;;;;;;;;;71730:9;:18;;;;;;71620:31;;71674:75;;:29;:75::i;:::-;71619:130;;-1:-1:-1;71619:130:0;-1:-1:-1;71762:28:0;71793:38;71619:130;;71793:27;:38::i;:::-;71762:69;;71870:28;;71847:20;:51;71844:137;;;-1:-1:-1;71921:4:0;;71359:629;-1:-1:-1;;;;71359:629:0:o;71844:137::-;-1:-1:-1;71964:5:0;;71359:629;-1:-1:-1;;;;71359:629:0:o;43908:328::-;44083:41;38462:10;44116:7;44083:18;:41::i;:::-;44075:103;;;;-1:-1:-1;;;44075:103:0;;;;;;;:::i;:::-;44189:39;44203:4;44209:2;44213:7;44222:5;44189:13;:39::i;:::-;43908:328;;;;:::o;41277:334::-;41350:13;41384:16;41392:7;41384;:16::i;:::-;41376:76;;;;-1:-1:-1;;;41376:76:0;;21854:2:1;41376:76:0;;;21836:21:1;21893:2;21873:18;;;21866:30;21932:34;21912:18;;;21905:62;-1:-1:-1;;;21983:18:1;;;21976:45;22038:19;;41376:76:0;21652:411:1;41376:76:0;41465:21;41489:10;41936:9;;;;;;;;;-1:-1:-1;41936:9:0;;;41859:94;41489:10;41465:34;;41541:1;41523:7;41517:21;:25;:86;;;;;;;;;;;;;;;;;41569:7;41578:18;:7;:16;:18::i;:::-;41552:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41517:86;41510:93;41277:334;-1:-1:-1;;;41277:334:0:o;69402:260::-;20981:1;21579:7;;:19;;21571:63;;;;-1:-1:-1;;;21571:63:0;;;;;;;:::i;:::-;20981:1;21712:7;:18;;;69470:10:::1;69460:21:::0;;:9:::1;:21;::::0;;;;;69452:65:::1;;;::::0;-1:-1:-1;;;69452:65:0;;22745:2:1;69452:65:0::1;::::0;::::1;22727:21:1::0;22784:2;22764:18;;;22757:30;22823;22803:18;;;22796:58;22871:18;;69452:65:0::1;22543:352:1::0;69452:65:0::1;69555:10;69528:14;69545:21:::0;;;:9:::1;:21;::::0;;;;;;69577:23;;;69611:10:::1;::::0;69545:21;;69611:43:::1;::::0;-1:-1:-1;;;;;69611:10:0::1;::::0;69545:21;69611:23:::1;:43::i;70899:452::-:0;70971:7;70998:16;71006:7;70998;:16::i;:::-;70990:49;;;;-1:-1:-1;;;70990:49:0;;;;;;;:::i;:::-;71055:24;;;;:15;:24;;;;;;:29;;:54;;-1:-1:-1;71088:18:0;;;;:9;:18;;;;;;:21;71055:54;71052:93;;;-1:-1:-1;71132:1:0;;70899:452;-1:-1:-1;70899:452:0:o;71052:93::-;71156:31;71240:24;;;:15;:24;;;;;;;;;71266:9;:18;;;;;;71156:31;;71210:75;;:29;:75::i;:::-;71155:130;;-1:-1:-1;71155:130:0;-1:-1:-1;71305:38:0;71155:130;;71305:27;:38::i;:::-;71298:45;70899:452;-1:-1:-1;;;;70899:452:0:o;78238:89::-;74896:6;;-1:-1:-1;;;;;74896:6:0;38462:10;75043:23;75035:68;;;;-1:-1:-1;;;75035:68:0;;;;;;;:::i;:::-;78309:10;;::::1;::::0;:3:::1;::::0;:10:::1;::::0;::::1;::::0;::::1;:::i;59700:17::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;76980:102::-;74896:6;;-1:-1:-1;;;;;74896:6:0;38462:10;75043:23;75035:68;;;;-1:-1:-1;;;75035:68:0;;;;;;;:::i;:::-;77054:9:::1;:20:::0;76980:102::o;66642:390::-;66722:10;;:62;;-1:-1:-1;;;;;66722:10:0;66750;66770:4;66777:6;66722:27;:62::i;:::-;66797:21;66821:24;;;:15;:24;;;;;;:36;;66850:6;66821:28;:36::i;:::-;66894:24;;;;:15;:24;;;;;;66797:60;;-1:-1:-1;66877:41:0;;;66870:49;;;;:::i;:::-;66932:24;;;;:15;:24;;;;;;;;;:40;;;66990:34;;10630:25:1;;;10671:18;;;10664:34;;;66990::0;;10603:18:1;66990:34:0;10456:248:1;75732:201:0;74896:6;;-1:-1:-1;;;;;74896:6:0;38462:10;75043:23;75035:68;;;;-1:-1:-1;;;75035:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;75821:22:0;::::1;75813:73;;;::::0;-1:-1:-1;;;75813:73:0;;23102:2:1;75813:73:0::1;::::0;::::1;23084:21:1::0;23141:2;23121:18;;;23114:30;23180:34;23160:18;;;23153:62;-1:-1:-1;;;23231:18:1;;;23224:36;23277:19;;75813:73:0::1;22900:402:1::0;75813:73:0::1;75897:28;75916:8;75897:18;:28::i;:::-;75732:201:::0;:::o;76870:102::-;74896:6;;-1:-1:-1;;;;;74896:6:0;38462:10;75043:23;75035:68;;;;-1:-1:-1;;;75035:68:0;;;;;;;:::i;:::-;76944:9:::1;:20:::0;76870:102::o;39988:305::-;40090:4;-1:-1:-1;;;;;;40127:40:0;;-1:-1:-1;;;40127:40:0;;:105;;-1:-1:-1;;;;;;;40184:48:0;;-1:-1:-1;;;40184:48:0;40127:105;:158;;;-1:-1:-1;;;;;;;;;;5046:40:0;;;40249:36;4937:157;45746:127;45811:4;45835:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45835:16:0;:30;;;45746:127::o;15004:98::-;15062:7;15089:5;15093:1;15089;:5;:::i;65106:366::-;65190:4;65208:31;65241:17;65262:48;65292:11;65305:4;65262:29;:48::i;:::-;65207:103;;-1:-1:-1;65207:103:0;-1:-1:-1;65323:28:0;65354:38;65207:103;;65354:27;:38::i;:::-;65436:28;;-1:-1:-1;65412:52:0;;65106:366;-1:-1:-1;;;;;;65106:366:0:o;49728:174::-;49803:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;49803:29:0;-1:-1:-1;;;;;49803:29:0;;;;;;;;:24;;49857:23;49803:24;49857:14;:23::i;:::-;-1:-1:-1;;;;;49848:46:0;;;;;;;;;;;49728:174;;:::o;64387:711::-;64484:7;64493;64522:19;:17;:19::i;:::-;64515:32;;;;:::i;:::-;64193:8;;64558:34;;;;:::i;:::-;64605:23;64631:115;64677:67;64717:14;;;;;;;;;-1:-1:-1;;;;;64717:14:0;-1:-1:-1;;;;;64717:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64709:34;;64685:7;;;;;;;;;-1:-1:-1;;;;;64685:7:0;-1:-1:-1;;;;;64685:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64677:27;;;:31;:67::i;:::-;64672:73;;:2;:73;:::i;:::-;64631:36;64647:19;:17;:19::i;:::-;64631:11;;:15;:36::i;:115::-;64605:141;;64785:11;64766:15;:30;;64759:38;;;;:::i;:::-;64810:17;64830:32;64840:21;64193:8;;;64115:94;64840:21;64830:5;;:9;:32::i;:::-;64810:52;;64895:5;64882:9;:18;;64875:26;;;;:::i;:::-;64914:31;64948:24;:15;64968:3;64948:19;:24::i;:::-;64914:58;;65018:15;64992:23;:41;64985:49;;;;:::i;:::-;65055:23;65080:9;;-1:-1:-1;64387:711:0;-1:-1:-1;;;;64387:711:0:o;16141:98::-;16199:7;16226:5;16230:1;16226;:5;:::i;15385:98::-;15443:7;15470:5;15474:1;15470;:5;:::i;34407:211::-;34551:58;;-1:-1:-1;;;;;10369:32:1;;34551:58:0;;;10351:51:1;10418:18;;;10411:34;;;34524:86:0;;34544:5;;-1:-1:-1;;;34574:23:0;10324:18:1;;34551:58:0;;;;-1:-1:-1;;34551:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;34551:58:0;-1:-1:-1;;;;;;34551:58:0;;;;;;;;;;34524:19;:86::i;46040:348::-;46133:4;46158:16;46166:7;46158;:16::i;:::-;46150:73;;;;-1:-1:-1;;;46150:73:0;;24307:2:1;46150:73:0;;;24289:21:1;24346:2;24326:18;;;24319:30;24385:34;24365:18;;;24358:62;-1:-1:-1;;;24436:18:1;;;24429:42;24488:19;;46150:73:0;24105:408:1;46150:73:0;46234:13;46250:23;46265:7;46250:14;:23::i;:::-;46234:39;;46303:5;-1:-1:-1;;;;;46292:16:0;:7;-1:-1:-1;;;;;46292:16:0;;:51;;;;46336:7;-1:-1:-1;;;;;46312:31:0;:20;46324:7;46312:11;:20::i;:::-;-1:-1:-1;;;;;46312:31:0;;46292:51;:87;;;-1:-1:-1;;;;;;43132:25:0;;;43108:4;43132:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;46347:32;43011:164;49032:578;49191:4;-1:-1:-1;;;;;49164:31:0;:23;49179:7;49164:14;:23::i;:::-;-1:-1:-1;;;;;49164:31:0;;49156:85;;;;-1:-1:-1;;;49156:85:0;;24720:2:1;49156:85:0;;;24702:21:1;24759:2;24739:18;;;24732:30;24798:34;24778:18;;;24771:62;-1:-1:-1;;;24849:18:1;;;24842:39;24898:19;;49156:85:0;24518:405:1;49156:85:0;-1:-1:-1;;;;;49260:16:0;;49252:65;;;;-1:-1:-1;;;49252:65:0;;25130:2:1;49252:65:0;;;25112:21:1;25169:2;25149:18;;;25142:30;25208:34;25188:18;;;25181:62;-1:-1:-1;;;25259:18:1;;;25252:34;25303:19;;49252:65:0;24928:400:1;49252:65:0;49330:39;49351:4;49357:2;49361:7;49330:20;:39::i;:::-;49434:29;49451:1;49455:7;49434:8;:29::i;:::-;-1:-1:-1;;;;;49476:15:0;;;;;;:9;:15;;;;;:20;;49495:1;;49476:15;:20;;49495:1;;49476:20;:::i;:::-;;;;-1:-1:-1;;;;;;;49507:13:0;;;;;;:9;:13;;;;;:18;;49524:1;;49507:13;:18;;49524:1;;49507:18;:::i;:::-;;;;-1:-1:-1;;49536:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;49536:21:0;-1:-1:-1;;;;;49536:21:0;;;;;;;;;49575:27;;49536:16;;49575:27;;;;;;;49032:578;;;:::o;15742:98::-;15800:7;15827:5;15831:1;15827;:5;:::i;47724:382::-;-1:-1:-1;;;;;47804:16:0;;47796:61;;;;-1:-1:-1;;;47796:61:0;;25708:2:1;47796:61:0;;;25690:21:1;;;25727:18;;;25720:30;25786:34;25766:18;;;25759:62;25838:18;;47796:61:0;25506:356:1;47796:61:0;47877:16;47885:7;47877;:16::i;:::-;47876:17;47868:58;;;;-1:-1:-1;;;47868:58:0;;26069:2:1;47868:58:0;;;26051:21:1;26108:2;26088:18;;;26081:30;26147;26127:18;;;26120:58;26195:18;;47868:58:0;25867:352:1;47868:58:0;47939:45;47968:1;47972:2;47976:7;47939:20;:45::i;:::-;-1:-1:-1;;;;;47997:13:0;;;;;;:9;:13;;;;;:18;;48014:1;;47997:13;:18;;48014:1;;47997:18;:::i;:::-;;;;-1:-1:-1;;48026:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;48026:21:0;-1:-1:-1;;;;;48026:21:0;;;;;;;;48065:33;;48026:16;;;48065:33;;48026:16;;48065:33;47724:382;;:::o;34626:248::-;34797:68;;-1:-1:-1;;;;;26482:15:1;;;34797:68:0;;;26464:34:1;26534:15;;26514:18;;;26507:43;26566:18;;;26559:34;;;34770:96:0;;34790:5;;-1:-1:-1;;;34820:27:0;26399:18:1;;34797:68:0;26224:375:1;76093:191:0;76186:6;;;-1:-1:-1;;;;;76203:17:0;;;-1:-1:-1;;;;;;76203:17:0;;;;;;;76236:40;;76186:6;;;76203:17;76186:6;;76236:40;;76167:16;;76236:40;76156:128;76093:191;:::o;48335:360::-;48395:13;48411:23;48426:7;48411:14;:23::i;:::-;48395:39;;48447:48;48468:5;48483:1;48487:7;48447:20;:48::i;:::-;48536:29;48553:1;48557:7;48536:8;:29::i;:::-;-1:-1:-1;;;;;48578:16:0;;;;;;:9;:16;;;;;:21;;48598:1;;48578:16;:21;;48598:1;;48578:21;:::i;:::-;;;;-1:-1:-1;;48617:16:0;;;;:7;:16;;;;;;48610:23;;-1:-1:-1;;;;;;48610:23:0;;;48651:36;48625:7;;48617:16;-1:-1:-1;;;;;48651:36:0;;;;;48617:16;;48651:36;48384:311;48335:360;:::o;50044:315::-;50199:8;-1:-1:-1;;;;;50190:17:0;:5;-1:-1:-1;;;;;50190:17:0;;;50182:55;;;;-1:-1:-1;;;50182:55:0;;26806:2:1;50182:55:0;;;26788:21:1;26845:2;26825:18;;;26818:30;26884:27;26864:18;;;26857:55;26929:18;;50182:55:0;26604:349:1;50182:55:0;-1:-1:-1;;;;;50248:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;50248:46:0;;;;;;;;;;50310:41;;725::1;;;50310::0;;698:18:1;50310:41:0;;;;;;;50044:315;;;:::o;45118:::-;45275:28;45285:4;45291:2;45295:7;45275:9;:28::i;:::-;45322:48;45345:4;45351:2;45355:7;45364:5;45322:22;:48::i;:::-;45314:111;;;;-1:-1:-1;;;45314:111:0;;;;;;;:::i;365:723::-;421:13;642:10;638:53;;-1:-1:-1;;669:10:0;;;;;;;;;;;;-1:-1:-1;;;669:10:0;;;;;365:723::o;638:53::-;716:5;701:12;757:78;764:9;;757:78;;790:8;;;;:::i;:::-;;-1:-1:-1;813:10:0;;-1:-1:-1;821:2:0;813:10;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;867:17:0;;845:39;;895:154;902:10;;895:154;;929:11;939:1;929:11;;:::i;:::-;;-1:-1:-1;998:10:0;1006:2;998:5;:10;:::i;:::-;985:24;;:2;:24;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;955:56:0;;;;;;;;-1:-1:-1;1026:11:0;1035:2;1026:11;;:::i;:::-;;;895:154;;36980:716;37404:23;37430:69;37458:4;37430:69;;;;;;;;;;;;;;;;;37438:5;-1:-1:-1;;;;;37430:27:0;;;:69;;;;;:::i;:::-;37514:17;;37404:95;;-1:-1:-1;37514:21:0;37510:179;;37611:10;37600:30;;;;;;;;;;;;:::i;:::-;37592:85;;;;-1:-1:-1;;;37592:85:0;;27836:2:1;37592:85:0;;;27818:21:1;27875:2;27855:18;;;27848:30;27914:34;27894:18;;;27887:62;-1:-1:-1;;;27965:18:1;;;27958:40;28015:19;;37592:85:0;27634:406:1;55115:589:0;-1:-1:-1;;;;;55321:18:0;;55317:187;;55356:40;55388:7;56531:10;:17;;56504:24;;;;:15;:24;;;;;:44;;;56559:24;;;;;;;;;;;;56427:164;55356:40;55317:187;;;55426:2;-1:-1:-1;;;;;55418:10:0;:4;-1:-1:-1;;;;;55418:10:0;;55414:90;;55445:47;55478:4;55484:7;55445:32;:47::i;:::-;-1:-1:-1;;;;;55518:16:0;;55514:183;;55551:45;55588:7;55551:36;:45::i;55514:183::-;55624:4;-1:-1:-1;;;;;55618:10:0;:2;-1:-1:-1;;;;;55618:10:0;;55614:83;;55645:40;55673:2;55677:7;55645:27;:40::i;50924:799::-;51079:4;-1:-1:-1;;;;;51100:13:0;;23071:20;23119:8;51096:620;;51136:72;;-1:-1:-1;;;51136:72:0;;-1:-1:-1;;;;;51136:36:0;;;;;:72;;38462:10;;51187:4;;51193:7;;51202:5;;51136:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51136:72:0;;;;;;;;-1:-1:-1;;51136:72:0;;;;;;;;;;;;:::i;:::-;;;51132:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51378:13:0;;51374:272;;51421:60;;-1:-1:-1;;;51421:60:0;;;;;;;:::i;51374:272::-;51596:6;51590:13;51581:6;51577:2;51573:15;51566:38;51132:529;-1:-1:-1;;;;;;51259:51:0;-1:-1:-1;;;51259:51:0;;-1:-1:-1;51252:58:0;;51096:620;-1:-1:-1;51700:4:0;50924:799;;;;;;:::o;25554:229::-;25691:12;25723:52;25745:6;25753:4;25759:1;25762:12;25723:21;:52::i;57218:988::-;57484:22;57534:1;57509:22;57526:4;57509:16;:22::i;:::-;:26;;;;:::i;:::-;57546:18;57567:26;;;:17;:26;;;;;;57484:51;;-1:-1:-1;57700:28:0;;;57696:328;;-1:-1:-1;;;;;57767:18:0;;57745:19;57767:18;;;:12;:18;;;;;;;;:34;;;;;;;;;57818:30;;;;;;:44;;;57935:30;;:17;:30;;;;;:43;;;57696:328;-1:-1:-1;58120:26:0;;;;:17;:26;;;;;;;;58113:33;;;-1:-1:-1;;;;;58164:18:0;;;;;:12;:18;;;;;:34;;;;;;;58157:41;57218:988::o;58501:1079::-;58779:10;:17;58754:22;;58779:21;;58799:1;;58779:21;:::i;:::-;58811:18;58832:24;;;:15;:24;;;;;;59205:10;:26;;58754:46;;-1:-1:-1;58832:24:0;;58754:46;;59205:26;;;;;;:::i;:::-;;;;;;;;;59183:48;;59269:11;59244:10;59255;59244:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;59349:28;;;:15;:28;;;;;;;:41;;;59521:24;;;;;59514:31;59556:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;58572:1008;;;58501:1079;:::o;56005:221::-;56090:14;56107:20;56124:2;56107:16;:20::i;:::-;-1:-1:-1;;;;;56138:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;56183:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;56005:221:0:o;26674:510::-;26844:12;26902:5;26877:21;:30;;26869:81;;;;-1:-1:-1;;;26869:81:0;;29127:2:1;26869:81:0;;;29109:21:1;29166:2;29146:18;;;29139:30;29205:34;29185:18;;;29178:62;-1:-1:-1;;;29256:18:1;;;29249:36;29302:19;;26869:81:0;28925:402:1;26869:81:0;23071:20;;26961:60;;;;-1:-1:-1;;;26961:60:0;;29534:2:1;26961:60:0;;;29516:21:1;29573:2;29553:18;;;29546:30;29612:31;29592:18;;;29585:59;29661:18;;26961:60:0;29332:353:1;26961:60:0;27035:12;27049:23;27076:6;-1:-1:-1;;;;;27076:11:0;27095:5;27102:4;27076:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27034:73;;;;27125:51;27142:7;27151:10;27163:12;27125:16;:51::i;:::-;27118:58;26674:510;-1:-1:-1;;;;;;;26674:510:0:o;29360:712::-;29510:12;29539:7;29535:530;;;-1:-1:-1;29570:10:0;29563:17;;29535:530;29684:17;;:21;29680:374;;29882:10;29876:17;29943:15;29930:10;29926:2;29922:19;29915:44;29680:374;30025:12;30018:20;;-1:-1:-1;;;30018:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:180:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;199:131::-;-1:-1:-1;;;;;;273:32:1;;263:43;;253:71;;320:1;317;310:12;335:245;393:6;446:2;434:9;425:7;421:23;417:32;414:52;;;462:1;459;452:12;414:52;501:9;488:23;520:30;544:5;520:30;:::i;985:258::-;1057:1;1067:113;1081:6;1078:1;1075:13;1067:113;;;1157:11;;;1151:18;1138:11;;;1131:39;1103:2;1096:10;1067:113;;;1198:6;1195:1;1192:13;1189:48;;;-1:-1:-1;;1233:1:1;1215:16;;1208:27;985:258::o;1248:::-;1290:3;1328:5;1322:12;1355:6;1350:3;1343:19;1371:63;1427:6;1420:4;1415:3;1411:14;1404:4;1397:5;1393:16;1371:63;:::i;:::-;1488:2;1467:15;-1:-1:-1;;1463:29:1;1454:39;;;;1495:4;1450:50;;1248:258;-1:-1:-1;;1248:258:1:o;1511:220::-;1660:2;1649:9;1642:21;1623:4;1680:45;1721:2;1710:9;1706:18;1698:6;1680:45;:::i;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:186::-;1973:6;2026:2;2014:9;2005:7;2001:23;1997:32;1994:52;;;2042:1;2039;2032:12;1994:52;2065:29;2084:9;2065:29;:::i;2105:248::-;2173:6;2181;2234:2;2222:9;2213:7;2209:23;2205:32;2202:52;;;2250:1;2247;2240:12;2202:52;-1:-1:-1;;2273:23:1;;;2343:2;2328:18;;;2315:32;;-1:-1:-1;2105:248:1:o;2358:254::-;2426:6;2434;2487:2;2475:9;2466:7;2462:23;2458:32;2455:52;;;2503:1;2500;2493:12;2455:52;2526:29;2545:9;2526:29;:::i;:::-;2516:39;2602:2;2587:18;;;;2574:32;;-1:-1:-1;;;2358:254:1:o;2799:118::-;2885:5;2878:13;2871:21;2864:5;2861:32;2851:60;;2907:1;2904;2897:12;2922:377;2996:6;3004;3012;3065:2;3053:9;3044:7;3040:23;3036:32;3033:52;;;3081:1;3078;3071:12;3033:52;3117:9;3104:23;3094:33;;3174:2;3163:9;3159:18;3146:32;3136:42;;3228:2;3217:9;3213:18;3200:32;3241:28;3263:5;3241:28;:::i;:::-;3288:5;3278:15;;;2922:377;;;;;:::o;3304:328::-;3381:6;3389;3397;3450:2;3438:9;3429:7;3425:23;3421:32;3418:52;;;3466:1;3463;3456:12;3418:52;3489:29;3508:9;3489:29;:::i;:::-;3479:39;;3537:38;3571:2;3560:9;3556:18;3537:38;:::i;:::-;3527:48;;3622:2;3611:9;3607:18;3594:32;3584:42;;3304:328;;;;;:::o;4093:315::-;4158:6;4166;4219:2;4207:9;4198:7;4194:23;4190:32;4187:52;;;4235:1;4232;4225:12;4187:52;4258:29;4277:9;4258:29;:::i;:::-;4248:39;;4337:2;4326:9;4322:18;4309:32;4350:28;4372:5;4350:28;:::i;:::-;4397:5;4387:15;;;4093:315;;;;;:::o;4413:127::-;4474:10;4469:3;4465:20;4462:1;4455:31;4505:4;4502:1;4495:15;4529:4;4526:1;4519:15;4545:631;4609:5;4639:18;4680:2;4672:6;4669:14;4666:40;;;4686:18;;:::i;:::-;4761:2;4755:9;4729:2;4815:15;;-1:-1:-1;;4811:24:1;;;4837:2;4807:33;4803:42;4791:55;;;4861:18;;;4881:22;;;4858:46;4855:72;;;4907:18;;:::i;:::-;4947:10;4943:2;4936:22;4976:6;4967:15;;5006:6;4998;4991:22;5046:3;5037:6;5032:3;5028:16;5025:25;5022:45;;;5063:1;5060;5053:12;5022:45;5113:6;5108:3;5101:4;5093:6;5089:17;5076:44;5168:1;5161:4;5152:6;5144;5140:19;5136:30;5129:41;;;;4545:631;;;;;:::o;5181:666::-;5276:6;5284;5292;5300;5353:3;5341:9;5332:7;5328:23;5324:33;5321:53;;;5370:1;5367;5360:12;5321:53;5393:29;5412:9;5393:29;:::i;:::-;5383:39;;5441:38;5475:2;5464:9;5460:18;5441:38;:::i;:::-;5431:48;;5526:2;5515:9;5511:18;5498:32;5488:42;;5581:2;5570:9;5566:18;5553:32;5608:18;5600:6;5597:30;5594:50;;;5640:1;5637;5630:12;5594:50;5663:22;;5716:4;5708:13;;5704:27;-1:-1:-1;5694:55:1;;5745:1;5742;5735:12;5694:55;5768:73;5833:7;5828:2;5815:16;5810:2;5806;5802:11;5768:73;:::i;:::-;5758:83;;;5181:666;;;;;;;:::o;6075:450::-;6144:6;6197:2;6185:9;6176:7;6172:23;6168:32;6165:52;;;6213:1;6210;6203:12;6165:52;6253:9;6240:23;6286:18;6278:6;6275:30;6272:50;;;6318:1;6315;6308:12;6272:50;6341:22;;6394:4;6386:13;;6382:27;-1:-1:-1;6372:55:1;;6423:1;6420;6413:12;6372:55;6446:73;6511:7;6506:2;6493:16;6488:2;6484;6480:11;6446:73;:::i;6530:260::-;6598:6;6606;6659:2;6647:9;6638:7;6634:23;6630:32;6627:52;;;6675:1;6672;6665:12;6627:52;6698:29;6717:9;6698:29;:::i;:::-;6688:39;;6746:38;6780:2;6769:9;6765:18;6746:38;:::i;:::-;6736:48;;6530:260;;;;;:::o;6795:356::-;6997:2;6979:21;;;7016:18;;;7009:30;7075:34;7070:2;7055:18;;7048:62;7142:2;7127:18;;6795:356::o;7156:380::-;7235:1;7231:12;;;;7278;;;7299:61;;7353:4;7345:6;7341:17;7331:27;;7299:61;7406:2;7398:6;7395:14;7375:18;7372:38;7369:161;;;7452:10;7447:3;7443:20;7440:1;7433:31;7487:4;7484:1;7477:15;7515:4;7512:1;7505:15;7369:161;;7156:380;;;:::o;7954:344::-;8156:2;8138:21;;;8195:2;8175:18;;;8168:30;-1:-1:-1;;;8229:2:1;8214:18;;8207:50;8289:2;8274:18;;7954:344::o;8303:349::-;8505:2;8487:21;;;8544:2;8524:18;;;8517:30;8583:27;8578:2;8563:18;;8556:55;8643:2;8628:18;;8303:349::o;9013:184::-;9083:6;9136:2;9124:9;9115:7;9111:23;9107:32;9104:52;;;9152:1;9149;9142:12;9104:52;-1:-1:-1;9175:16:1;;9013:184;-1:-1:-1;9013:184:1:o;9618:127::-;9679:10;9674:3;9670:20;9667:1;9660:31;9710:4;9707:1;9700:15;9734:4;9731:1;9724:15;11536:127;11597:10;11592:3;11588:20;11585:1;11578:31;11628:4;11625:1;11618:15;11652:4;11649:1;11642:15;11668:422;11757:1;11800:5;11757:1;11814:270;11835:7;11825:8;11822:21;11814:270;;;11894:4;11890:1;11886:6;11882:17;11876:4;11873:27;11870:53;;;11903:18;;:::i;:::-;11953:7;11943:8;11939:22;11936:55;;;11973:16;;;;11936:55;12052:22;;;;12012:15;;;;11814:270;;;11818:3;11668:422;;;;;:::o;12095:806::-;12144:5;12174:8;12164:80;;-1:-1:-1;12215:1:1;12229:5;;12164:80;12263:4;12253:76;;-1:-1:-1;12300:1:1;12314:5;;12253:76;12345:4;12363:1;12358:59;;;;12431:1;12426:130;;;;12338:218;;12358:59;12388:1;12379:10;;12402:5;;;12426:130;12463:3;12453:8;12450:17;12447:43;;;12470:18;;:::i;:::-;-1:-1:-1;;12526:1:1;12512:16;;12541:5;;12338:218;;12640:2;12630:8;12627:16;12621:3;12615:4;12612:13;12608:36;12602:2;12592:8;12589:16;12584:2;12578:4;12575:12;12571:35;12568:77;12565:159;;;-1:-1:-1;12677:19:1;;;12709:5;;12565:159;12756:34;12781:8;12775:4;12756:34;:::i;:::-;12826:6;12822:1;12818:6;12814:19;12805:7;12802:32;12799:58;;;12837:18;;:::i;:::-;12875:20;;12095:806;-1:-1:-1;;;12095:806:1:o;12906:131::-;12966:5;12995:36;13022:8;13016:4;12995:36;:::i;13042:355::-;13244:2;13226:21;;;13283:2;13263:18;;;13256:30;13322:33;13317:2;13302:18;;13295:61;13388:2;13373:18;;13042:355::o;14239:413::-;14441:2;14423:21;;;14480:2;14460:18;;;14453:30;14519:34;14514:2;14499:18;;14492:62;-1:-1:-1;;;14585:2:1;14570:18;;14563:47;14642:3;14627:19;;14239:413::o;15482:127::-;15543:10;15538:3;15534:20;15531:1;15524:31;15574:4;15571:1;15564:15;15598:4;15595:1;15588:15;16223:245;16290:6;16343:2;16331:9;16322:7;16318:23;16314:32;16311:52;;;16359:1;16356;16349:12;16311:52;16391:9;16385:16;16410:28;16432:5;16410:28;:::i;20565:179::-;20643:13;;20696:22;20685:34;;20675:45;;20665:73;;20734:1;20731;20724:12;20749:473;20852:6;20860;20868;20876;20884;20937:3;20925:9;20916:7;20912:23;20908:33;20905:53;;;20954:1;20951;20944:12;20905:53;20977:39;21006:9;20977:39;:::i;:::-;20967:49;;21056:2;21045:9;21041:18;21035:25;21025:35;;21100:2;21089:9;21085:18;21079:25;21069:35;;21144:2;21133:9;21129:18;21123:25;21113:35;;21167:49;21211:3;21200:9;21196:19;21167:49;:::i;:::-;21157:59;;20749:473;;;;;;;;:::o;22068:470::-;22247:3;22285:6;22279:13;22301:53;22347:6;22342:3;22335:4;22327:6;22323:17;22301:53;:::i;:::-;22417:13;;22376:16;;;;22439:57;22417:13;22376:16;22473:4;22461:17;;22439:57;:::i;:::-;22512:20;;22068:470;-1:-1:-1;;;;22068:470:1:o;23307:128::-;23347:3;23378:1;23374:6;23371:1;23368:13;23365:39;;;23384:18;;:::i;:::-;-1:-1:-1;23420:9:1;;23307:128::o;23440:273::-;23508:6;23561:2;23549:9;23540:7;23536:23;23532:32;23529:52;;;23577:1;23574;23567:12;23529:52;23609:9;23603:16;23659:4;23652:5;23648:16;23641:5;23638:27;23628:55;;23679:1;23676;23669:12;23718:127;23779:10;23774:3;23770:20;23767:1;23760:31;23810:4;23807:1;23800:15;23834:4;23831:1;23824:15;23850:120;23890:1;23916;23906:35;;23921:18;;:::i;:::-;-1:-1:-1;23955:9:1;;23850:120::o;23975:125::-;24015:4;24043:1;24040;24037:8;24034:34;;;24048:18;;:::i;:::-;-1:-1:-1;24085:9:1;;23975:125::o;25333:168::-;25373:7;25439:1;25435;25431:6;25427:14;25424:1;25421:21;25416:1;25409:9;25402:17;25398:45;25395:71;;;25446:18;;:::i;:::-;-1:-1:-1;25486:9:1;;25333:168::o;26958:414::-;27160:2;27142:21;;;27199:2;27179:18;;;27172:30;27238:34;27233:2;27218:18;;27211:62;-1:-1:-1;;;27304:2:1;27289:18;;27282:48;27362:3;27347:19;;26958:414::o;27377:135::-;27416:3;-1:-1:-1;;27437:17:1;;27434:43;;;27457:18;;:::i;:::-;-1:-1:-1;27504:1:1;27493:13;;27377:135::o;27517:112::-;27549:1;27575;27565:35;;27580:18;;:::i;:::-;-1:-1:-1;27614:9:1;;27517:112::o;28045:489::-;-1:-1:-1;;;;;28314:15:1;;;28296:34;;28366:15;;28361:2;28346:18;;28339:43;28413:2;28398:18;;28391:34;;;28461:3;28456:2;28441:18;;28434:31;;;28239:4;;28482:46;;28508:19;;28500:6;28482:46;:::i;28539:249::-;28608:6;28661:2;28649:9;28640:7;28636:23;28632:32;28629:52;;;28677:1;28674;28667:12;28629:52;28709:9;28703:16;28728:30;28752:5;28728:30;:::i;28793:127::-;28854:10;28849:3;28845:20;28842:1;28835:31;28885:4;28882:1;28875:15;28909:4;28906:1;28899:15;29690:274;29819:3;29857:6;29851:13;29873:53;29919:6;29914:3;29907:4;29899:6;29895:17;29873:53;:::i;:::-;29942:16;;;;;29690:274;-1:-1:-1;;29690:274:1:o
Swarm Source
ipfs://96b62aac65f2e3411bfc3a29e5b6196c06e9318fcf0f297dbe504c815fbc3618
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.