More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 215 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint | 14288010 | 248 days ago | IN | 15 CRO | 1.14339575 | ||||
Set Approval For... | 13283953 | 314 days ago | IN | 0 CRO | 0.23602185 | ||||
Set Approval For... | 13073425 | 328 days ago | IN | 0 CRO | 0.23602185 | ||||
Set Approval For... | 11551387 | 427 days ago | IN | 0 CRO | 0.21513445 | ||||
Set Approval For... | 11408925 | 436 days ago | IN | 0 CRO | 0.21542777 | ||||
Set Approval For... | 11275941 | 444 days ago | IN | 0 CRO | 0.21570434 | ||||
Mint | 10631166 | 486 days ago | IN | 15 CRO | 4.21566641 | ||||
Mint | 10073409 | 523 days ago | IN | 10 CRO | 0.99043816 | ||||
Mint | 9895028 | 534 days ago | IN | 3 CRO | 1.23992843 | ||||
Set Approval For... | 9894926 | 534 days ago | IN | 0 CRO | 0.21861135 | ||||
Mint | 9861795 | 537 days ago | IN | 10 CRO | 1.05939415 | ||||
Set Approval For... | 9753532 | 544 days ago | IN | 0 CRO | 0.21891228 | ||||
Set Approval For... | 9689361 | 548 days ago | IN | 0 CRO | 0.21904931 | ||||
Mint | 9537034 | 558 days ago | IN | 3 CRO | 1.25733963 | ||||
Set Approval For... | 9517516 | 559 days ago | IN | 0 CRO | 0.21941525 | ||||
Mint | 9482254 | 561 days ago | IN | 10 CRO | 3.17622822 | ||||
Set Approval For... | 9459343 | 563 days ago | IN | 0 CRO | 0.21953944 | ||||
Set Approval For... | 9445316 | 564 days ago | IN | 0 CRO | 0.21956936 | ||||
Safe Transfer Fr... | 9440032 | 564 days ago | IN | 0 CRO | 0.16066492 | ||||
Mint | 9414146 | 566 days ago | IN | 24 CRO | 6.98294726 | ||||
Set Approval For... | 9349491 | 570 days ago | IN | 0 CRO | 0.21977346 | ||||
Set Approval For... | 9348467 | 570 days ago | IN | 0 CRO | 0.21977565 | ||||
Set Approval For... | 9045727 | 590 days ago | IN | 0 CRO | 0.22042089 | ||||
Set Approval For... | 9029127 | 591 days ago | IN | 0 CRO | 0.2204561 | ||||
Set Approval For... | 9000837 | 593 days ago | IN | 0 CRO | 0.22051657 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
14288010 | 248 days ago | 14.25 CRO | ||||
14288010 | 248 days ago | 0.75 CRO | ||||
10631166 | 486 days ago | 15 CRO | ||||
10073409 | 523 days ago | 9.5 CRO | ||||
10073409 | 523 days ago | 0.5 CRO | ||||
9895028 | 534 days ago | 3 CRO | ||||
9861795 | 537 days ago | 9.5 CRO | ||||
9861795 | 537 days ago | 0.5 CRO | ||||
9537034 | 558 days ago | 3 CRO | ||||
9482254 | 561 days ago | 9.5 CRO | ||||
9482254 | 561 days ago | 0.5 CRO | ||||
9414146 | 566 days ago | 22.8 CRO | ||||
9414146 | 566 days ago | 1.2 CRO | ||||
8587973 | 620 days ago | 30 CRO | ||||
8584935 | 620 days ago | 47.5 CRO | ||||
8584935 | 620 days ago | 2.5 CRO | ||||
8486759 | 626 days ago | 7.6 CRO | ||||
8486759 | 626 days ago | 0.4 CRO | ||||
8484299 | 627 days ago | 14.25 CRO | ||||
8484299 | 627 days ago | 0.75 CRO | ||||
8482907 | 627 days ago | 14.25 CRO | ||||
8482907 | 627 days ago | 0.75 CRO | ||||
8391324 | 633 days ago | 15.2 CRO | ||||
8391324 | 633 days ago | 0.8 CRO | ||||
8384364 | 633 days ago | 1.9 CRO |
Loading...
Loading
Contract Name:
Launchpad
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2023-03-22 */ /** *Submitted for verification at testnet.cronoscan.com on 2023-03-14 */ // Sources flattened with hardhat v2.12.2 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT // // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File @openzeppelin/contracts/utils/math/[email protected] // // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File @openzeppelin/contracts/utils/[email protected] // // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File @openzeppelin/contracts/token/ERC20/[email protected] // // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File @openzeppelin/contracts/utils/[email protected] // // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // // OpenZeppelin Contracts (last updated v4.7.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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // // OpenZeppelin Contracts v4.4.1 (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/token/ERC721/[email protected] // // OpenZeppelin Contracts (last updated v4.8.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`. * * 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; /** * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // File @openzeppelin/contracts/utils/[email protected] // // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File @openzeppelin/contracts/token/ERC721/[email protected] // // OpenZeppelin Contracts (last updated v4.6.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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/utils/introspection/[email protected] // // OpenZeppelin Contracts v4.4.1 (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/extensions/[email protected] // // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/token/ERC721/[email protected] // // OpenZeppelin Contracts (last updated v4.8.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: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); 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) { _requireMinted(tokenId); 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 overridden 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 token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); 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: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @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 _ownerOf(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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @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 from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // // OpenZeppelin Contracts (last updated v4.5.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); /** * @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/[email protected] // // OpenZeppelin Contracts (last updated v4.8.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 See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; 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 @openzeppelin/contracts/utils/math/[email protected] // // OpenZeppelin Contracts (last updated v4.6.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 subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol) pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } // File @openzeppelin/contracts/interfaces/[email protected] // // OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC1271 standard signature validation method for * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271]. * * _Available since v4.1._ */ interface IERC1271 { /** * @dev Should return whether the signature provided is valid for the provided data * @param hash Hash of the data to be signed * @param signature Signature byte array associated with _data */ function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue); } // File @openzeppelin/contracts/utils/cryptography/[email protected] // // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/SignatureChecker.sol) pragma solidity ^0.8.0; /** * @dev Signature verification helper that can be used instead of `ECDSA.recover` to seamlessly support both ECDSA * signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets like * Argent and Gnosis Safe. * * _Available since v4.1._ */ library SignatureChecker { /** * @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the * signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECDSA.recover`. * * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus * change through time. It could return true at block N and false at block N+1 (or the opposite). */ function isValidSignatureNow( address signer, bytes32 hash, bytes memory signature ) internal view returns (bool) { (address recovered, ECDSA.RecoverError error) = ECDSA.tryRecover(hash, signature); if (error == ECDSA.RecoverError.NoError && recovered == signer) { return true; } (bool success, bytes memory result) = signer.staticcall( abi.encodeWithSelector(IERC1271.isValidSignature.selector, hash, signature) ); return (success && result.length == 32 && abi.decode(result, (bytes32)) == bytes32(IERC1271.isValidSignature.selector)); } } // File contracts/launchpad/Launchpad.sol pragma solidity ^0.8.9; // // TODO: Add current supply to mint validate signature contract Launchpad is ERC721Enumerable, Ownable, EIP712 { enum TokenType { NATIVE, ERC20, ERC721 } using Counters for Counters.Counter; Counters.Counter private _tokenIds; string public baseURI; uint256 public limit; uint256 public userLimit; mapping(address => uint256) public minted; address _signer; // payees detail address[] public payees; uint256[] public payeePercents; // 2500 = 25%, total 100% // corgi fee address public corgiPayee; uint256 public corgiNativePercent = 500; // 5% uint256 public corgiERC20Percent = 1000; // 10% uint256 public corgiERC721Fee = 3 ether; constructor( string memory _name, string memory _symbol, string memory _baseURI, uint256 _limit, uint256 _userLimit, address[] memory _payees, uint256[] memory _payeePercents, address signer_, address _corgiPayee ) ERC721(_name, _symbol) EIP712("Launchpad", "1.0.0") payable { baseURI = _baseURI; _signer = signer_; corgiPayee = _corgiPayee; setLimit(_limit, _userLimit); setPayees(_payees, _payeePercents); payable(corgiPayee).transfer(msg.value); } // ======================== SETTING ===================================== function setBaseURI(string memory _baseURI) public onlyOwner { baseURI = _baseURI; } function setLimit(uint256 _limit, uint256 _userLimit) public onlyOwner { limit = _limit; userLimit = _userLimit; } function setPayees( address[] memory _payees, uint256[] memory _payeePercents ) public onlyOwner { uint256 totalPercent = 0; for (uint256 i = 0; i < _payeePercents.length; i++) { totalPercent += _payeePercents[i]; } require(totalPercent == 10000, "r0"); payees = _payees; payeePercents = _payeePercents; } // ======================== GETTERS ===================================== function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) { require(_exists(tokenId), "nonexistent token"); return string( abi.encodePacked(baseURI, Strings.toString(tokenId), ".json") ); } // ======================== MINT ===================================== function _mint( address _from, address _to, uint256 _amount ) internal { require(_tokenIds.current() + _amount <= limit, "r1"); require(minted[_from] + _amount <= userLimit, "r2"); for (uint256 i = 0; i < _amount; i++) { _tokenIds.increment(); _safeMint(_to, _tokenIds.current()); } minted[_from] += _amount; } // WARN: ERC721 must be first function mint( address _to, uint256 _quantity, TokenType[] memory _types, address[] calldata _tokens, uint256[] calldata _tokenAmounts, uint16[] memory _nftIdsPay, bytes calldata _signature ) public payable { require( SignatureChecker.isValidSignatureNow( _signer, _hash(msg.sender, _quantity, _tokens, _tokenAmounts), _signature ), "r3" ); _payment( msg.sender, _types[0], _tokens[0], _tokenAmounts[0], _nftIdsPay, 0, _quantity ); if (_tokens.length > 1) { _payment( msg.sender, _types[1], _tokens[1], _tokenAmounts[1], _nftIdsPay, _tokenAmounts[0], _quantity ); } _mint(msg.sender, _to, _quantity); } function _payment( address _from, TokenType _type, address _token, uint256 _amount, uint16[] memory _nftIds, uint256 _index, uint256 _quantity ) internal { if (_type == TokenType.NATIVE) { _payNative(_amount); } else if (_type == TokenType.ERC20) { _payERC20(_token, _from, _amount); } else if (_type == TokenType.ERC721) { (bool success, ) = corgiPayee.call{ value: _quantity * corgiERC721Fee }(""); require(success, "r7"); _payERC721(_token, _from, _amount, _nftIds, _index); } else { revert("Invalid token type"); } } function _payNative(uint256 _amount) internal { uint256 corgiFee = (_amount * corgiNativePercent) / 10000; uint256 payeeAmount = _amount - corgiFee; // pay corgi, use call to prevent revert (bool success, ) = corgiPayee.call{value: corgiFee}(""); require(success, "r5"); // pay payees for (uint256 i = 0; i < payees.length; i++) { uint256 payeeFee = (payeeAmount * payeePercents[i]) / 10000; (success, ) = payees[i].call{value: payeeFee}(""); require(success, "r6"); } } function _payERC20( address _token, address _from, uint256 _amount ) internal { uint256 corgiFee = (_amount * corgiERC20Percent) / 10000; uint256 payeeAmount = _amount - corgiFee; // pay corgi IERC20(_token).transferFrom(_from, corgiPayee, corgiFee); // pay payees for (uint256 i = 0; i < payees.length; i++) { uint256 payeeFee = (payeeAmount * payeePercents[i]) / 10000; IERC20(_token).transferFrom(_from, payees[i], payeeFee); } } function _payERC721( address _token, address _from, uint256 _amount, uint16[] memory _nftIds, uint256 _index ) internal { for (uint256 i = _index; i < _index + _amount; i++) { IERC721(_token).transferFrom(_from, payees[0], _nftIds[i]); } } // ======================== SUPPORT ===================================== function _hash( address _from, uint256 _quantity, address[] calldata _tokens, uint256[] calldata _tokenAmounts ) private view returns (bytes32) { return _hashTypedDataV4( keccak256( abi.encode( keccak256( "MintParams(address from,uint256 quantity,address[] tokens,uint256[] tokenAmounts,uint256 value)" ), _from, _quantity, keccak256(abi.encodePacked(_tokens)), keccak256(abi.encodePacked(_tokenAmounts)), msg.value ) ) ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"uint256","name":"_limit","type":"uint256"},{"internalType":"uint256","name":"_userLimit","type":"uint256"},{"internalType":"address[]","name":"_payees","type":"address[]"},{"internalType":"uint256[]","name":"_payeePercents","type":"uint256[]"},{"internalType":"address","name":"signer_","type":"address"},{"internalType":"address","name":"_corgiPayee","type":"address"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"corgiERC20Percent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"corgiERC721Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"corgiNativePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"corgiPayee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"limit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"enum Launchpad.TokenType[]","name":"_types","type":"uint8[]"},{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_tokenAmounts","type":"uint256[]"},{"internalType":"uint16[]","name":"_nftIdsPay","type":"uint16[]"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","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":"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":"","type":"uint256"}],"name":"payeePercents","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payees","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"},{"internalType":"uint256","name":"_userLimit","type":"uint256"}],"name":"setLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_payees","type":"address[]"},{"internalType":"uint256[]","name":"_payeePercents","type":"uint256[]"}],"name":"setPayees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"userLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101406040526101f46014556103e86015556729a2241af62c00006016556040516200704438038062007044833981810160405281019062000042919062000a84565b6040518060400160405280600981526020017f4c61756e636870616400000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f312e302e300000000000000000000000000000000000000000000000000000008152508a8a8160009081620000c1919062000e3f565b508060019081620000d3919062000e3f565b505050620000f6620000ea620002d960201b60201c565b620002e160201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506200015f818484620003a760201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050806101208181525050505050505086600c9081620001b9919062000e3f565b5081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200024e8686620003e360201b60201c565b6200026084846200040560201b60201c565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015620002c9573d6000803e3d6000fd5b505050505050505050506200119b565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008383834630604051602001620003c495949392919062000f63565b6040516020818303038152906040528051906020012090509392505050565b620003f3620004e560201b60201c565b81600d8190555080600e819055505050565b62000415620004e560201b60201c565b6000805b8251811015620004665782818151811062000439576200043862000fc0565b5b6020026020010151826200044e91906200101e565b915080806200045d9062001059565b91505062000419565b506127108114620004ae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004a59062001107565b60405180910390fd5b8260119080519060200190620004c6929190620005a0565b508160129080519060200190620004df9291906200062f565b50505050565b620004f5620002d960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200051b6200057660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000574576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200056b9062001179565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280548282559060005260206000209081019282156200061c579160200282015b828111156200061b5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620005c1565b5b5090506200062b919062000681565b5090565b8280548282559060005260206000209081019282156200066e579160200282015b828111156200066d57825182559160200191906001019062000650565b5b5090506200067d919062000681565b5090565b5b808211156200069c57600081600090555060010162000682565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200070982620006be565b810181811067ffffffffffffffff821117156200072b576200072a620006cf565b5b80604052505050565b600062000740620006a0565b90506200074e8282620006fe565b919050565b600067ffffffffffffffff821115620007715762000770620006cf565b5b6200077c82620006be565b9050602081019050919050565b60005b83811015620007a95780820151818401526020810190506200078c565b60008484015250505050565b6000620007cc620007c68462000753565b62000734565b905082815260208101848484011115620007eb57620007ea620006b9565b5b620007f884828562000789565b509392505050565b600082601f830112620008185762000817620006b4565b5b81516200082a848260208601620007b5565b91505092915050565b6000819050919050565b620008488162000833565b81146200085457600080fd5b50565b60008151905062000868816200083d565b92915050565b600067ffffffffffffffff8211156200088c576200088b620006cf565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008cf82620008a2565b9050919050565b620008e181620008c2565b8114620008ed57600080fd5b50565b6000815190506200090181620008d6565b92915050565b60006200091e62000918846200086e565b62000734565b905080838252602082019050602084028301858111156200094457620009436200089d565b5b835b818110156200097157806200095c8882620008f0565b84526020840193505060208101905062000946565b5050509392505050565b600082601f830112620009935762000992620006b4565b5b8151620009a584826020860162000907565b91505092915050565b600067ffffffffffffffff821115620009cc57620009cb620006cf565b5b602082029050602081019050919050565b6000620009f4620009ee84620009ae565b62000734565b9050808382526020820190506020840283018581111562000a1a5762000a196200089d565b5b835b8181101562000a47578062000a32888262000857565b84526020840193505060208101905062000a1c565b5050509392505050565b600082601f83011262000a695762000a68620006b4565b5b815162000a7b848260208601620009dd565b91505092915050565b60008060008060008060008060006101208a8c03121562000aaa5762000aa9620006aa565b5b60008a015167ffffffffffffffff81111562000acb5762000aca620006af565b5b62000ad98c828d0162000800565b99505060208a015167ffffffffffffffff81111562000afd5762000afc620006af565b5b62000b0b8c828d0162000800565b98505060408a015167ffffffffffffffff81111562000b2f5762000b2e620006af565b5b62000b3d8c828d0162000800565b975050606062000b508c828d0162000857565b965050608062000b638c828d0162000857565b95505060a08a015167ffffffffffffffff81111562000b875762000b86620006af565b5b62000b958c828d016200097b565b94505060c08a015167ffffffffffffffff81111562000bb95762000bb8620006af565b5b62000bc78c828d0162000a51565b93505060e062000bda8c828d01620008f0565b92505061010062000bee8c828d01620008f0565b9150509295985092959850929598565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c5157607f821691505b60208210810362000c675762000c6662000c09565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000cd17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c92565b62000cdd868362000c92565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000d2062000d1a62000d148462000833565b62000cf5565b62000833565b9050919050565b6000819050919050565b62000d3c8362000cff565b62000d5462000d4b8262000d27565b84845462000c9f565b825550505050565b600090565b62000d6b62000d5c565b62000d7881848462000d31565b505050565b5b8181101562000da05762000d9460008262000d61565b60018101905062000d7e565b5050565b601f82111562000def5762000db98162000c6d565b62000dc48462000c82565b8101602085101562000dd4578190505b62000dec62000de38562000c82565b83018262000d7d565b50505b505050565b600082821c905092915050565b600062000e146000198460080262000df4565b1980831691505092915050565b600062000e2f838362000e01565b9150826002028217905092915050565b62000e4a8262000bfe565b67ffffffffffffffff81111562000e665762000e65620006cf565b5b62000e72825462000c38565b62000e7f82828562000da4565b600060209050601f83116001811462000eb7576000841562000ea2578287015190505b62000eae858262000e21565b86555062000f1e565b601f19841662000ec78662000c6d565b60005b8281101562000ef15784890151825560018201915060208501945060208101905062000eca565b8683101562000f11578489015162000f0d601f89168262000e01565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b62000f3b8162000f26565b82525050565b62000f4c8162000833565b82525050565b62000f5d81620008c2565b82525050565b600060a08201905062000f7a600083018862000f30565b62000f89602083018762000f30565b62000f98604083018662000f30565b62000fa7606083018562000f41565b62000fb6608083018462000f52565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200102b8262000833565b9150620010388362000833565b925082820190508082111562001053576200105262000fef565b5b92915050565b6000620010668262000833565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200109b576200109a62000fef565b5b600182019050919050565b600082825260208201905092915050565b7f7230000000000000000000000000000000000000000000000000000000000000600082015250565b6000620010ef600283620010a6565b9150620010fc82620010b7565b602082019050919050565b600060208201905081810360008301526200112281620010e0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062001161602083620010a6565b91506200116e8262001129565b602082019050919050565b60006020820190508181036000830152620011948162001152565b9050919050565b60805160a05160c05160e0516101005161012051615e59620011eb6000396000613366015260006133a801526000613387015260006132bc015260006133120152600061333b0152615e596000f3fe6080604052600436106101ee5760003560e01c80636352211e1161010d578063a4d66daf116100a0578063c87b56dd1161006f578063c87b56dd14610704578063cda3353d14610741578063e985e9c51461076c578063f2fde38b146107a9578063f4e7e13e146107d2576101ee565b8063a4d66daf1461066b578063af822c2d14610696578063b88d4fde146106b2578063bcc7445f146106db576101ee565b80638296b880116100dc5780638296b880146105c15780638da5cb5b146105ec57806395d89b4114610617578063a22cb46514610642576101ee565b80636352211e146105055780636c0360eb1461054257806370a082311461056d578063715018a6146105aa576101ee565b80632a555cc7116101855780634a7c01ec116101545780634a7c01ec146104375780634f6ccce71461046257806355f804b31461049f57806363037b0c146104c8576101ee565b80632a555cc71461037b5780632f745c59146103a657806342842e0e146103e357806343cc72781461040c576101ee565b806318160ddd116101c157806318160ddd146102c15780631e7269c5146102ec578063207add911461032957806323b872dd14610352576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a6004803603810190610215919061391c565b61080f565b6040516102279190613964565b60405180910390f35b34801561023c57600080fd5b50610245610889565b6040516102529190613a0f565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190613a67565b61091b565b60405161028f9190613ad5565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190613b1c565b610961565b005b3480156102cd57600080fd5b506102d6610a78565b6040516102e39190613b6b565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e9190613b86565b610a85565b6040516103209190613b6b565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b9190613bb3565b610a9d565b005b34801561035e57600080fd5b5061037960048036038101906103749190613bf3565b610ab7565b005b34801561038757600080fd5b50610390610b17565b60405161039d9190613b6b565b60405180910390f35b3480156103b257600080fd5b506103cd60048036038101906103c89190613b1c565b610b1d565b6040516103da9190613b6b565b60405180910390f35b3480156103ef57600080fd5b5061040a60048036038101906104059190613bf3565b610bc2565b005b34801561041857600080fd5b50610421610be2565b60405161042e9190613ad5565b60405180910390f35b34801561044357600080fd5b5061044c610c08565b6040516104599190613b6b565b60405180910390f35b34801561046e57600080fd5b5061048960048036038101906104849190613a67565b610c0e565b6040516104969190613b6b565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c19190613d7b565b610c7f565b005b3480156104d457600080fd5b506104ef60048036038101906104ea9190613a67565b610c9a565b6040516104fc9190613ad5565b60405180910390f35b34801561051157600080fd5b5061052c60048036038101906105279190613a67565b610cd9565b6040516105399190613ad5565b60405180910390f35b34801561054e57600080fd5b50610557610d5f565b6040516105649190613a0f565b60405180910390f35b34801561057957600080fd5b50610594600480360381019061058f9190613b86565b610ded565b6040516105a19190613b6b565b60405180910390f35b3480156105b657600080fd5b506105bf610ea4565b005b3480156105cd57600080fd5b506105d6610eb8565b6040516105e39190613b6b565b60405180910390f35b3480156105f857600080fd5b50610601610ebe565b60405161060e9190613ad5565b60405180910390f35b34801561062357600080fd5b5061062c610ee8565b6040516106399190613a0f565b60405180910390f35b34801561064e57600080fd5b5061066960048036038101906106649190613df0565b610f7a565b005b34801561067757600080fd5b50610680610f90565b60405161068d9190613b6b565b60405180910390f35b6106b060048036038101906106ab9190614121565b610f96565b005b3480156106be57600080fd5b506106d960048036038101906106d491906142fd565b61116a565b005b3480156106e757600080fd5b5061070260048036038101906106fd9190614506565b6111cc565b005b34801561071057600080fd5b5061072b60048036038101906107269190613a67565b611294565b6040516107389190613a0f565b60405180910390f35b34801561074d57600080fd5b50610756611310565b6040516107639190613b6b565b60405180910390f35b34801561077857600080fd5b50610793600480360381019061078e919061457e565b611316565b6040516107a09190613964565b60405180910390f35b3480156107b557600080fd5b506107d060048036038101906107cb9190613b86565b6113aa565b005b3480156107de57600080fd5b506107f960048036038101906107f49190613a67565b61142d565b6040516108069190613b6b565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610882575061088182611451565b5b9050919050565b606060008054610898906145ed565b80601f01602080910402602001604051908101604052809291908181526020018280546108c4906145ed565b80156109115780601f106108e657610100808354040283529160200191610911565b820191906000526020600020905b8154815290600101906020018083116108f457829003601f168201915b5050505050905090565b600061092682611533565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061096c82610cd9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d390614690565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109fb61157e565b73ffffffffffffffffffffffffffffffffffffffff161480610a2a5750610a2981610a2461157e565b611316565b5b610a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6090614722565b60405180910390fd5b610a738383611586565b505050565b6000600880549050905090565b600f6020528060005260406000206000915090505481565b610aa561163f565b81600d8190555080600e819055505050565b610ac8610ac261157e565b826116bd565b610b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afe906147b4565b60405180910390fd5b610b12838383611752565b505050565b60155481565b6000610b2883610ded565b8210610b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6090614846565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bdd8383836040518060200160405280600081525061116a565b505050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b6000610c18610a78565b8210610c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c50906148d8565b60405180910390fd5b60088281548110610c6d57610c6c6148f8565b5b90600052602060002001549050919050565b610c8761163f565b80600c9081610c969190614ad3565b5050565b60118181548110610caa57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080610ce583611a4b565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4d90614bf1565b60405180910390fd5b80915050919050565b600c8054610d6c906145ed565b80601f0160208091040260200160405190810160405280929190818152602001828054610d98906145ed565b8015610de55780601f10610dba57610100808354040283529160200191610de5565b820191906000526020600020905b815481529060010190602001808311610dc857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5490614c83565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610eac61163f565b610eb66000611a88565b565b60145481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ef7906145ed565b80601f0160208091040260200160405190810160405280929190818152602001828054610f23906145ed565b8015610f705780601f10610f4557610100808354040283529160200191610f70565b820191906000526020600020905b815481529060010190602001808311610f5357829003601f168201915b5050505050905090565b610f8c610f8561157e565b8383611b4e565b5050565b600d5481565b611014601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610fca338c8b8b8b8b611cba565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611d71565b611053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104a90614cef565b60405180910390fd5b6110c0338960008151811061106b5761106a6148f8565b5b602002602001015189896000818110611087576110866148f8565b5b905060200201602081019061109c9190613b86565b888860008181106110b0576110af6148f8565b5b905060200201358760008f611f37565b60018787905011156111535761115233896001815181106110e4576110e36148f8565b5b602002602001015189896001818110611100576110ff6148f8565b5b90506020020160208101906111159190613b86565b88886001818110611129576111286148f8565b5b90506020020135878a8a6000818110611145576111446148f8565b5b905060200201358f611f37565b5b61115e338b8b61210c565b50505050505050505050565b61117b61117561157e565b836116bd565b6111ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b1906147b4565b60405180910390fd5b6111c68484848461228b565b50505050565b6111d461163f565b6000805b825181101561121c578281815181106111f4576111f36148f8565b5b6020026020010151826112079190614d3e565b9150808061121490614d72565b9150506111d8565b506127108114611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890614e06565b60405180910390fd5b82601190805190602001906112779291906137bc565b50816012908051906020019061128e929190613846565b50505050565b606061129f826122e7565b6112de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d590614e72565b60405180910390fd5b600c6112e983612328565b6040516020016112fa929190614f9d565b6040516020818303038152906040529050919050565b60165481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113b261163f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611421576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114189061503e565b60405180910390fd5b61142a81611a88565b50565b6012818154811061143d57600080fd5b906000526020600020016000915090505481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061151c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061152c575061152b826123f6565b5b9050919050565b61153c816122e7565b61157b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157290614bf1565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166115f983610cd9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61164761157e565b73ffffffffffffffffffffffffffffffffffffffff16611665610ebe565b73ffffffffffffffffffffffffffffffffffffffff16146116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b2906150aa565b60405180910390fd5b565b6000806116c983610cd9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061170b575061170a8185611316565b5b8061174957508373ffffffffffffffffffffffffffffffffffffffff166117318461091b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661177282610cd9565b73ffffffffffffffffffffffffffffffffffffffff16146117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf9061513c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182e906151ce565b60405180910390fd5b6118448383836001612460565b8273ffffffffffffffffffffffffffffffffffffffff1661186482610cd9565b73ffffffffffffffffffffffffffffffffffffffff16146118ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b19061513c565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a4683838360016125be565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb39061523a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cad9190613964565b60405180910390a3505050565b6000611d657f9ae2a55fde6a9674250342c0e5a8a89b164fe9b8f8ea2819853c37c0e5c1a11288888888604051602001611cf5929190615317565b604051602081830303815290604052805190602001208787604051602001611d1e9291906153a5565b6040516020818303038152906040528051906020012034604051602001611d4a969594939291906153d7565b604051602081830303815290604052805190602001206125c4565b90509695505050505050565b6000806000611d8085856125de565b9150915060006004811115611d9857611d97615438565b5b816004811115611dab57611daa615438565b5b148015611de357508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15611df357600192505050611f30565b6000808773ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b8888604051602401611e289291906154bc565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611e929190615528565b600060405180830381855afa9150503d8060008114611ecd576040519150601f19603f3d011682016040523d82523d6000602084013e611ed2565b606091505b5091509150818015611ee5575060208151145b8015611f295750631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681806020019051810190611f27919061556b565b145b9450505050505b9392505050565b60006002811115611f4b57611f4a615438565b5b866002811115611f5e57611f5d615438565b5b03611f7157611f6c8461262f565b612103565b60016002811115611f8557611f84615438565b5b866002811115611f9857611f97615438565b5b03611fad57611fa885888661287c565b612102565b600280811115611fc057611fbf615438565b5b866002811115611fd357611fd2615438565b5b036120c6576000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16601654836120219190615598565b60405161202d90615600565b60006040518083038185875af1925050503d806000811461206a576040519150601f19603f3d011682016040523d82523d6000602084013e61206f565b606091505b50509050806120b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120aa90615661565b60405180910390fd5b6120c08689878787612a74565b50612101565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f8906156cd565b60405180910390fd5b5b5b50505050505050565b600d548161211a600b612b70565b6121249190614d3e565b1115612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c90615739565b60405180910390fd5b600e5481600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121b39190614d3e565b11156121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb906157a5565b60405180910390fd5b60005b8181101561222f57612209600b612b7e565b61221c83612217600b612b70565b612b94565b808061222790614d72565b9150506121f7565b5080600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461227f9190614d3e565b92505081905550505050565b612296848484611752565b6122a284848484612bb2565b6122e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d890615837565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661230983611a4b565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606000600161233784612d39565b01905060008167ffffffffffffffff81111561235657612355613c50565b5b6040519080825280601f01601f1916602001820160405280156123885781602001600182028036833780820191505090505b509050600082602001820190505b6001156123eb578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816123df576123de615857565b5b04945060008503612396575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61246c84848484612e8c565b60018111156124b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a7906158f8565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036124f7576124f281612fb2565b612536565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612535576125348582612ffb565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036125785761257381613168565b6125b7565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146125b6576125b58482613239565b5b5b5050505050565b50505050565b60006125d76125d16132b8565b836133d2565b9050919050565b600080604183510361261f5760008060006020860151925060408601519150606086015160001a905061261387828585613405565b94509450505050612628565b60006002915091505b9250929050565b6000612710601454836126429190615598565b61264c9190615918565b90506000818361265c9190615949565b90506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516126a690615600565b60006040518083038185875af1925050503d80600081146126e3576040519150601f19603f3d011682016040523d82523d6000602084013e6126e8565b606091505b505090508061272c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612723906159c9565b60405180910390fd5b60005b60118054905081101561287557600061271060128381548110612755576127546148f8565b5b90600052602060002001548561276b9190615598565b6127759190615918565b90506011828154811061278b5761278a6148f8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16816040516127d990615600565b60006040518083038185875af1925050503d8060008114612816576040519150601f19603f3d011682016040523d82523d6000602084013e61281b565b606091505b50508093505082612861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285890615a35565b60405180910390fd5b50808061286d90614d72565b91505061272f565b5050505050565b60006127106015548361288f9190615598565b6128999190615918565b9050600081836128a99190615949565b90508473ffffffffffffffffffffffffffffffffffffffff166323b872dd85601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518463ffffffff1660e01b815260040161290a93929190615a55565b6020604051808303816000875af1158015612929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294d9190615aa1565b5060005b601180549050811015612a6c57600061271060128381548110612977576129766148f8565b5b90600052602060002001548461298d9190615598565b6129979190615918565b90508673ffffffffffffffffffffffffffffffffffffffff166323b872dd87601185815481106129ca576129c96148f8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401612a1493929190615a55565b6020604051808303816000875af1158015612a33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a579190615aa1565b50508080612a6490614d72565b915050612951565b505050505050565b60008190505b8382612a869190614d3e565b811015612b68578573ffffffffffffffffffffffffffffffffffffffff166323b872dd866011600081548110612abf57612abe6148f8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868581518110612afd57612afc6148f8565b5b60200260200101516040518463ffffffff1660e01b8152600401612b2393929190615aff565b600060405180830381600087803b158015612b3d57600080fd5b505af1158015612b51573d6000803e3d6000fd5b505050508080612b6090614d72565b915050612a7a565b505050505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b612bae8282604051806020016040528060008152506134e7565b5050565b6000612bd38473ffffffffffffffffffffffffffffffffffffffff16613542565b15612d2c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bfc61157e565b8786866040518563ffffffff1660e01b8152600401612c1e9493929190615b36565b6020604051808303816000875af1925050508015612c5a57506040513d601f19601f82011682018060405250810190612c579190615b97565b60015b612cdc573d8060008114612c8a576040519150601f19603f3d011682016040523d82523d6000602084013e612c8f565b606091505b506000815103612cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ccb90615837565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d31565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612d97577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612d8d57612d8c615857565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612dd4576d04ee2d6d415b85acef81000000008381612dca57612dc9615857565b5b0492506020810190505b662386f26fc100008310612e0357662386f26fc100008381612df957612df8615857565b5b0492506010810190505b6305f5e1008310612e2c576305f5e1008381612e2257612e21615857565b5b0492506008810190505b6127108310612e51576127108381612e4757612e46615857565b5b0492506004810190505b60648310612e745760648381612e6a57612e69615857565b5b0492506002810190505b600a8310612e83576001810190505b80915050919050565b6001811115612fac57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612f205780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f189190615949565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612fab5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fa39190614d3e565b925050819055505b5b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161300884610ded565b6130129190615949565b90506000600760008481526020019081526020016000205490508181146130f7576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061317c9190615949565b90506000600960008481526020019081526020016000205490506000600883815481106131ac576131ab6148f8565b5b9060005260206000200154905080600883815481106131ce576131cd6148f8565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061321d5761321c615bc4565b5b6001900381819060005260206000200160009055905550505050565b600061324483610ded565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561333457507f000000000000000000000000000000000000000000000000000000000000000046145b15613361577f000000000000000000000000000000000000000000000000000000000000000090506133cf565b6133cc7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613565565b90505b90565b600082826040516020016133e7929190615c60565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156134405760006003915091506134de565b6000600187878787604051600081526020016040526040516134659493929190615cb3565b6020604051602081039080840390855afa158015613487573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036134d5576000600192509250506134de565b80600092509250505b94509492505050565b6134f1838361359f565b6134fe6000848484612bb2565b61353d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353490615837565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008383834630604051602001613580959493929190615cf8565b6040516020818303038152906040528051906020012090509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361360e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360590615d97565b60405180910390fd5b613617816122e7565b15613657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161364e90615e03565b60405180910390fd5b613665600083836001612460565b61366e816122e7565b156136ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136a590615e03565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137b86000838360016125be565b5050565b828054828255906000526020600020908101928215613835579160200282015b828111156138345782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906137dc565b5b5090506138429190613893565b5090565b828054828255906000526020600020908101928215613882579160200282015b82811115613881578251825591602001919060010190613866565b5b50905061388f9190613893565b5090565b5b808211156138ac576000816000905550600101613894565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138f9816138c4565b811461390457600080fd5b50565b600081359050613916816138f0565b92915050565b600060208284031215613932576139316138ba565b5b600061394084828501613907565b91505092915050565b60008115159050919050565b61395e81613949565b82525050565b60006020820190506139796000830184613955565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156139b957808201518184015260208101905061399e565b60008484015250505050565b6000601f19601f8301169050919050565b60006139e18261397f565b6139eb818561398a565b93506139fb81856020860161399b565b613a04816139c5565b840191505092915050565b60006020820190508181036000830152613a2981846139d6565b905092915050565b6000819050919050565b613a4481613a31565b8114613a4f57600080fd5b50565b600081359050613a6181613a3b565b92915050565b600060208284031215613a7d57613a7c6138ba565b5b6000613a8b84828501613a52565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613abf82613a94565b9050919050565b613acf81613ab4565b82525050565b6000602082019050613aea6000830184613ac6565b92915050565b613af981613ab4565b8114613b0457600080fd5b50565b600081359050613b1681613af0565b92915050565b60008060408385031215613b3357613b326138ba565b5b6000613b4185828601613b07565b9250506020613b5285828601613a52565b9150509250929050565b613b6581613a31565b82525050565b6000602082019050613b806000830184613b5c565b92915050565b600060208284031215613b9c57613b9b6138ba565b5b6000613baa84828501613b07565b91505092915050565b60008060408385031215613bca57613bc96138ba565b5b6000613bd885828601613a52565b9250506020613be985828601613a52565b9150509250929050565b600080600060608486031215613c0c57613c0b6138ba565b5b6000613c1a86828701613b07565b9350506020613c2b86828701613b07565b9250506040613c3c86828701613a52565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c88826139c5565b810181811067ffffffffffffffff82111715613ca757613ca6613c50565b5b80604052505050565b6000613cba6138b0565b9050613cc68282613c7f565b919050565b600067ffffffffffffffff821115613ce657613ce5613c50565b5b613cef826139c5565b9050602081019050919050565b82818337600083830152505050565b6000613d1e613d1984613ccb565b613cb0565b905082815260208101848484011115613d3a57613d39613c4b565b5b613d45848285613cfc565b509392505050565b600082601f830112613d6257613d61613c46565b5b8135613d72848260208601613d0b565b91505092915050565b600060208284031215613d9157613d906138ba565b5b600082013567ffffffffffffffff811115613daf57613dae6138bf565b5b613dbb84828501613d4d565b91505092915050565b613dcd81613949565b8114613dd857600080fd5b50565b600081359050613dea81613dc4565b92915050565b60008060408385031215613e0757613e066138ba565b5b6000613e1585828601613b07565b9250506020613e2685828601613ddb565b9150509250929050565b600067ffffffffffffffff821115613e4b57613e4a613c50565b5b602082029050602081019050919050565b600080fd5b60038110613e6e57600080fd5b50565b600081359050613e8081613e61565b92915050565b6000613e99613e9484613e30565b613cb0565b90508083825260208201905060208402830185811115613ebc57613ebb613e5c565b5b835b81811015613ee55780613ed18882613e71565b845260208401935050602081019050613ebe565b5050509392505050565b600082601f830112613f0457613f03613c46565b5b8135613f14848260208601613e86565b91505092915050565b600080fd5b60008083601f840112613f3857613f37613c46565b5b8235905067ffffffffffffffff811115613f5557613f54613f1d565b5b602083019150836020820283011115613f7157613f70613e5c565b5b9250929050565b60008083601f840112613f8e57613f8d613c46565b5b8235905067ffffffffffffffff811115613fab57613faa613f1d565b5b602083019150836020820283011115613fc757613fc6613e5c565b5b9250929050565b600067ffffffffffffffff821115613fe957613fe8613c50565b5b602082029050602081019050919050565b600061ffff82169050919050565b61401181613ffa565b811461401c57600080fd5b50565b60008135905061402e81614008565b92915050565b600061404761404284613fce565b613cb0565b9050808382526020820190506020840283018581111561406a57614069613e5c565b5b835b81811015614093578061407f888261401f565b84526020840193505060208101905061406c565b5050509392505050565b600082601f8301126140b2576140b1613c46565b5b81356140c2848260208601614034565b91505092915050565b60008083601f8401126140e1576140e0613c46565b5b8235905067ffffffffffffffff8111156140fe576140fd613f1d565b5b60208301915083600182028301111561411a57614119613e5c565b5b9250929050565b60008060008060008060008060008060e08b8d031215614144576141436138ba565b5b60006141528d828e01613b07565b9a505060206141638d828e01613a52565b99505060408b013567ffffffffffffffff811115614184576141836138bf565b5b6141908d828e01613eef565b98505060608b013567ffffffffffffffff8111156141b1576141b06138bf565b5b6141bd8d828e01613f22565b975097505060808b013567ffffffffffffffff8111156141e0576141df6138bf565b5b6141ec8d828e01613f78565b955095505060a08b013567ffffffffffffffff81111561420f5761420e6138bf565b5b61421b8d828e0161409d565b93505060c08b013567ffffffffffffffff81111561423c5761423b6138bf565b5b6142488d828e016140cb565b92509250509295989b9194979a5092959850565b600067ffffffffffffffff82111561427757614276613c50565b5b614280826139c5565b9050602081019050919050565b60006142a061429b8461425c565b613cb0565b9050828152602081018484840111156142bc576142bb613c4b565b5b6142c7848285613cfc565b509392505050565b600082601f8301126142e4576142e3613c46565b5b81356142f484826020860161428d565b91505092915050565b60008060008060808587031215614317576143166138ba565b5b600061432587828801613b07565b945050602061433687828801613b07565b935050604061434787828801613a52565b925050606085013567ffffffffffffffff811115614368576143676138bf565b5b614374878288016142cf565b91505092959194509250565b600067ffffffffffffffff82111561439b5761439a613c50565b5b602082029050602081019050919050565b60006143bf6143ba84614380565b613cb0565b905080838252602082019050602084028301858111156143e2576143e1613e5c565b5b835b8181101561440b57806143f78882613b07565b8452602084019350506020810190506143e4565b5050509392505050565b600082601f83011261442a57614429613c46565b5b813561443a8482602086016143ac565b91505092915050565b600067ffffffffffffffff82111561445e5761445d613c50565b5b602082029050602081019050919050565b600061448261447d84614443565b613cb0565b905080838252602082019050602084028301858111156144a5576144a4613e5c565b5b835b818110156144ce57806144ba8882613a52565b8452602084019350506020810190506144a7565b5050509392505050565b600082601f8301126144ed576144ec613c46565b5b81356144fd84826020860161446f565b91505092915050565b6000806040838503121561451d5761451c6138ba565b5b600083013567ffffffffffffffff81111561453b5761453a6138bf565b5b61454785828601614415565b925050602083013567ffffffffffffffff811115614568576145676138bf565b5b614574858286016144d8565b9150509250929050565b60008060408385031215614595576145946138ba565b5b60006145a385828601613b07565b92505060206145b485828601613b07565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061460557607f821691505b602082108103614618576146176145be565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061467a60218361398a565b91506146858261461e565b604082019050919050565b600060208201905081810360008301526146a98161466d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061470c603d8361398a565b9150614717826146b0565b604082019050919050565b6000602082019050818103600083015261473b816146ff565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b600061479e602d8361398a565b91506147a982614742565b604082019050919050565b600060208201905081810360008301526147cd81614791565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614830602b8361398a565b915061483b826147d4565b604082019050919050565b6000602082019050818103600083015261485f81614823565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006148c2602c8361398a565b91506148cd82614866565b604082019050919050565b600060208201905081810360008301526148f1816148b5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026149897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261494c565b614993868361494c565b95508019841693508086168417925050509392505050565b6000819050919050565b60006149d06149cb6149c684613a31565b6149ab565b613a31565b9050919050565b6000819050919050565b6149ea836149b5565b6149fe6149f6826149d7565b848454614959565b825550505050565b600090565b614a13614a06565b614a1e8184846149e1565b505050565b5b81811015614a4257614a37600082614a0b565b600181019050614a24565b5050565b601f821115614a8757614a5881614927565b614a618461493c565b81016020851015614a70578190505b614a84614a7c8561493c565b830182614a23565b50505b505050565b600082821c905092915050565b6000614aaa60001984600802614a8c565b1980831691505092915050565b6000614ac38383614a99565b9150826002028217905092915050565b614adc8261397f565b67ffffffffffffffff811115614af557614af4613c50565b5b614aff82546145ed565b614b0a828285614a46565b600060209050601f831160018114614b3d5760008415614b2b578287015190505b614b358582614ab7565b865550614b9d565b601f198416614b4b86614927565b60005b82811015614b7357848901518255600182019150602085019450602081019050614b4e565b86831015614b905784890151614b8c601f891682614a99565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614bdb60188361398a565b9150614be682614ba5565b602082019050919050565b60006020820190508181036000830152614c0a81614bce565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614c6d60298361398a565b9150614c7882614c11565b604082019050919050565b60006020820190508181036000830152614c9c81614c60565b9050919050565b7f7233000000000000000000000000000000000000000000000000000000000000600082015250565b6000614cd960028361398a565b9150614ce482614ca3565b602082019050919050565b60006020820190508181036000830152614d0881614ccc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614d4982613a31565b9150614d5483613a31565b9250828201905080821115614d6c57614d6b614d0f565b5b92915050565b6000614d7d82613a31565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614daf57614dae614d0f565b5b600182019050919050565b7f7230000000000000000000000000000000000000000000000000000000000000600082015250565b6000614df060028361398a565b9150614dfb82614dba565b602082019050919050565b60006020820190508181036000830152614e1f81614de3565b9050919050565b7f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b6000614e5c60118361398a565b9150614e6782614e26565b602082019050919050565b60006020820190508181036000830152614e8b81614e4f565b9050919050565b600081905092915050565b60008154614eaa816145ed565b614eb48186614e92565b94506001821660008114614ecf5760018114614ee457614f17565b60ff1983168652811515820286019350614f17565b614eed85614927565b60005b83811015614f0f57815481890152600182019150602081019050614ef0565b838801955050505b50505092915050565b6000614f2b8261397f565b614f358185614e92565b9350614f4581856020860161399b565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614f87600583614e92565b9150614f9282614f51565b600582019050919050565b6000614fa98285614e9d565b9150614fb58284614f20565b9150614fc082614f7a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061502860268361398a565b915061503382614fcc565b604082019050919050565b600060208201905081810360008301526150578161501b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061509460208361398a565b915061509f8261505e565b602082019050919050565b600060208201905081810360008301526150c381615087565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061512660258361398a565b9150615131826150ca565b604082019050919050565b6000602082019050818103600083015261515581615119565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006151b860248361398a565b91506151c38261515c565b604082019050919050565b600060208201905081810360008301526151e7816151ab565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061522460198361398a565b915061522f826151ee565b602082019050919050565b6000602082019050818103600083015261525381615217565b9050919050565b600081905092915050565b6000819050919050565b61527881613ab4565b82525050565b600061528a838361526f565b60208301905092915050565b60006152a56020840184613b07565b905092915050565b6000602082019050919050565b60006152c6838561525a565b93506152d182615265565b8060005b8581101561530a576152e78284615296565b6152f1888261527e565b97506152fc836152ad565b9250506001810190506152d5565b5085925050509392505050565b60006153248284866152ba565b91508190509392505050565b600081905092915050565b600080fd5b82818337505050565b60006153558385615330565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156153885761538761533b565b5b602083029250615399838584615340565b82840190509392505050565b60006153b2828486615349565b91508190509392505050565b6000819050919050565b6153d1816153be565b82525050565b600060c0820190506153ec60008301896153c8565b6153f96020830188613ac6565b6154066040830187613b5c565b61541360608301866153c8565b61542060808301856153c8565b61542d60a0830184613b5c565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061548e82615467565b6154988185615472565b93506154a881856020860161399b565b6154b1816139c5565b840191505092915050565b60006040820190506154d160008301856153c8565b81810360208301526154e38184615483565b90509392505050565b600081905092915050565b600061550282615467565b61550c81856154ec565b935061551c81856020860161399b565b80840191505092915050565b600061553482846154f7565b915081905092915050565b615548816153be565b811461555357600080fd5b50565b6000815190506155658161553f565b92915050565b600060208284031215615581576155806138ba565b5b600061558f84828501615556565b91505092915050565b60006155a382613a31565b91506155ae83613a31565b92508282026155bc81613a31565b915082820484148315176155d3576155d2614d0f565b5b5092915050565b50565b60006155ea6000836154ec565b91506155f5826155da565b600082019050919050565b600061560b826155dd565b9150819050919050565b7f7237000000000000000000000000000000000000000000000000000000000000600082015250565b600061564b60028361398a565b915061565682615615565b602082019050919050565b6000602082019050818103600083015261567a8161563e565b9050919050565b7f496e76616c696420746f6b656e20747970650000000000000000000000000000600082015250565b60006156b760128361398a565b91506156c282615681565b602082019050919050565b600060208201905081810360008301526156e6816156aa565b9050919050565b7f7231000000000000000000000000000000000000000000000000000000000000600082015250565b600061572360028361398a565b915061572e826156ed565b602082019050919050565b6000602082019050818103600083015261575281615716565b9050919050565b7f7232000000000000000000000000000000000000000000000000000000000000600082015250565b600061578f60028361398a565b915061579a82615759565b602082019050919050565b600060208201905081810360008301526157be81615782565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061582160328361398a565b915061582c826157c5565b604082019050919050565b6000602082019050818103600083015261585081615814565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006158e260358361398a565b91506158ed82615886565b604082019050919050565b60006020820190508181036000830152615911816158d5565b9050919050565b600061592382613a31565b915061592e83613a31565b92508261593e5761593d615857565b5b828204905092915050565b600061595482613a31565b915061595f83613a31565b925082820390508181111561597757615976614d0f565b5b92915050565b7f7235000000000000000000000000000000000000000000000000000000000000600082015250565b60006159b360028361398a565b91506159be8261597d565b602082019050919050565b600060208201905081810360008301526159e2816159a6565b9050919050565b7f7236000000000000000000000000000000000000000000000000000000000000600082015250565b6000615a1f60028361398a565b9150615a2a826159e9565b602082019050919050565b60006020820190508181036000830152615a4e81615a12565b9050919050565b6000606082019050615a6a6000830186613ac6565b615a776020830185613ac6565b615a846040830184613b5c565b949350505050565b600081519050615a9b81613dc4565b92915050565b600060208284031215615ab757615ab66138ba565b5b6000615ac584828501615a8c565b91505092915050565b6000615ae9615ae4615adf84613ffa565b6149ab565b613a31565b9050919050565b615af981615ace565b82525050565b6000606082019050615b146000830186613ac6565b615b216020830185613ac6565b615b2e6040830184615af0565b949350505050565b6000608082019050615b4b6000830187613ac6565b615b586020830186613ac6565b615b656040830185613b5c565b8181036060830152615b778184615483565b905095945050505050565b600081519050615b91816138f0565b92915050565b600060208284031215615bad57615bac6138ba565b5b6000615bbb84828501615b82565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000615c29600283614e92565b9150615c3482615bf3565b600282019050919050565b6000819050919050565b615c5a615c55826153be565b615c3f565b82525050565b6000615c6b82615c1c565b9150615c778285615c49565b602082019150615c878284615c49565b6020820191508190509392505050565b600060ff82169050919050565b615cad81615c97565b82525050565b6000608082019050615cc860008301876153c8565b615cd56020830186615ca4565b615ce260408301856153c8565b615cef60608301846153c8565b95945050505050565b600060a082019050615d0d60008301886153c8565b615d1a60208301876153c8565b615d2760408301866153c8565b615d346060830185613b5c565b615d416080830184613ac6565b9695505050505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615d8160208361398a565b9150615d8c82615d4b565b602082019050919050565b60006020820190508181036000830152615db081615d74565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615ded601c8361398a565b9150615df882615db7565b602082019050919050565b60006020820190508181036000830152615e1c81615de0565b905091905056fea26469706673582212200a22257f8438c57912d2c1d104935bfceb213b1b30f43699051530a4d8a524fe64736f6c634300081100330000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000281000000000000000000000000000000000000000000000000000000000000028100000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000260000000000000000000000000a3cc55b34dceab3c3ee85bfbe94b140f645177cd0000000000000000000000006b7fbb0a0ec0099eed6549ec54d3f79463711dfe000000000000000000000000000000000000000000000000000000000000001954726f6c6c20546f776e202d2042727573687374726f6b657a0000000000000000000000000000000000000000000000000000000000000000000000000000075374726f6b657a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006068747470733a2f2f636f72676973747564696f2e667261312e6469676974616c6f6365616e7370616365732e636f6d2f6c5f31326236343765312d386366392d346136652d613135632d3639333665303736383731372f6d657461646174612f000000000000000000000000000000000000000000000000000000000000000100000000000000000000000043f2de85222a6c1fad109d0831a12f720951412400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000002710
Deployed Bytecode
0x6080604052600436106101ee5760003560e01c80636352211e1161010d578063a4d66daf116100a0578063c87b56dd1161006f578063c87b56dd14610704578063cda3353d14610741578063e985e9c51461076c578063f2fde38b146107a9578063f4e7e13e146107d2576101ee565b8063a4d66daf1461066b578063af822c2d14610696578063b88d4fde146106b2578063bcc7445f146106db576101ee565b80638296b880116100dc5780638296b880146105c15780638da5cb5b146105ec57806395d89b4114610617578063a22cb46514610642576101ee565b80636352211e146105055780636c0360eb1461054257806370a082311461056d578063715018a6146105aa576101ee565b80632a555cc7116101855780634a7c01ec116101545780634a7c01ec146104375780634f6ccce71461046257806355f804b31461049f57806363037b0c146104c8576101ee565b80632a555cc71461037b5780632f745c59146103a657806342842e0e146103e357806343cc72781461040c576101ee565b806318160ddd116101c157806318160ddd146102c15780631e7269c5146102ec578063207add911461032957806323b872dd14610352576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a6004803603810190610215919061391c565b61080f565b6040516102279190613964565b60405180910390f35b34801561023c57600080fd5b50610245610889565b6040516102529190613a0f565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190613a67565b61091b565b60405161028f9190613ad5565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190613b1c565b610961565b005b3480156102cd57600080fd5b506102d6610a78565b6040516102e39190613b6b565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e9190613b86565b610a85565b6040516103209190613b6b565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b9190613bb3565b610a9d565b005b34801561035e57600080fd5b5061037960048036038101906103749190613bf3565b610ab7565b005b34801561038757600080fd5b50610390610b17565b60405161039d9190613b6b565b60405180910390f35b3480156103b257600080fd5b506103cd60048036038101906103c89190613b1c565b610b1d565b6040516103da9190613b6b565b60405180910390f35b3480156103ef57600080fd5b5061040a60048036038101906104059190613bf3565b610bc2565b005b34801561041857600080fd5b50610421610be2565b60405161042e9190613ad5565b60405180910390f35b34801561044357600080fd5b5061044c610c08565b6040516104599190613b6b565b60405180910390f35b34801561046e57600080fd5b5061048960048036038101906104849190613a67565b610c0e565b6040516104969190613b6b565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c19190613d7b565b610c7f565b005b3480156104d457600080fd5b506104ef60048036038101906104ea9190613a67565b610c9a565b6040516104fc9190613ad5565b60405180910390f35b34801561051157600080fd5b5061052c60048036038101906105279190613a67565b610cd9565b6040516105399190613ad5565b60405180910390f35b34801561054e57600080fd5b50610557610d5f565b6040516105649190613a0f565b60405180910390f35b34801561057957600080fd5b50610594600480360381019061058f9190613b86565b610ded565b6040516105a19190613b6b565b60405180910390f35b3480156105b657600080fd5b506105bf610ea4565b005b3480156105cd57600080fd5b506105d6610eb8565b6040516105e39190613b6b565b60405180910390f35b3480156105f857600080fd5b50610601610ebe565b60405161060e9190613ad5565b60405180910390f35b34801561062357600080fd5b5061062c610ee8565b6040516106399190613a0f565b60405180910390f35b34801561064e57600080fd5b5061066960048036038101906106649190613df0565b610f7a565b005b34801561067757600080fd5b50610680610f90565b60405161068d9190613b6b565b60405180910390f35b6106b060048036038101906106ab9190614121565b610f96565b005b3480156106be57600080fd5b506106d960048036038101906106d491906142fd565b61116a565b005b3480156106e757600080fd5b5061070260048036038101906106fd9190614506565b6111cc565b005b34801561071057600080fd5b5061072b60048036038101906107269190613a67565b611294565b6040516107389190613a0f565b60405180910390f35b34801561074d57600080fd5b50610756611310565b6040516107639190613b6b565b60405180910390f35b34801561077857600080fd5b50610793600480360381019061078e919061457e565b611316565b6040516107a09190613964565b60405180910390f35b3480156107b557600080fd5b506107d060048036038101906107cb9190613b86565b6113aa565b005b3480156107de57600080fd5b506107f960048036038101906107f49190613a67565b61142d565b6040516108069190613b6b565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610882575061088182611451565b5b9050919050565b606060008054610898906145ed565b80601f01602080910402602001604051908101604052809291908181526020018280546108c4906145ed565b80156109115780601f106108e657610100808354040283529160200191610911565b820191906000526020600020905b8154815290600101906020018083116108f457829003601f168201915b5050505050905090565b600061092682611533565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061096c82610cd9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d390614690565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109fb61157e565b73ffffffffffffffffffffffffffffffffffffffff161480610a2a5750610a2981610a2461157e565b611316565b5b610a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6090614722565b60405180910390fd5b610a738383611586565b505050565b6000600880549050905090565b600f6020528060005260406000206000915090505481565b610aa561163f565b81600d8190555080600e819055505050565b610ac8610ac261157e565b826116bd565b610b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afe906147b4565b60405180910390fd5b610b12838383611752565b505050565b60155481565b6000610b2883610ded565b8210610b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6090614846565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bdd8383836040518060200160405280600081525061116a565b505050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b6000610c18610a78565b8210610c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c50906148d8565b60405180910390fd5b60088281548110610c6d57610c6c6148f8565b5b90600052602060002001549050919050565b610c8761163f565b80600c9081610c969190614ad3565b5050565b60118181548110610caa57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080610ce583611a4b565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4d90614bf1565b60405180910390fd5b80915050919050565b600c8054610d6c906145ed565b80601f0160208091040260200160405190810160405280929190818152602001828054610d98906145ed565b8015610de55780601f10610dba57610100808354040283529160200191610de5565b820191906000526020600020905b815481529060010190602001808311610dc857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5490614c83565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610eac61163f565b610eb66000611a88565b565b60145481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ef7906145ed565b80601f0160208091040260200160405190810160405280929190818152602001828054610f23906145ed565b8015610f705780601f10610f4557610100808354040283529160200191610f70565b820191906000526020600020905b815481529060010190602001808311610f5357829003601f168201915b5050505050905090565b610f8c610f8561157e565b8383611b4e565b5050565b600d5481565b611014601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610fca338c8b8b8b8b611cba565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611d71565b611053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104a90614cef565b60405180910390fd5b6110c0338960008151811061106b5761106a6148f8565b5b602002602001015189896000818110611087576110866148f8565b5b905060200201602081019061109c9190613b86565b888860008181106110b0576110af6148f8565b5b905060200201358760008f611f37565b60018787905011156111535761115233896001815181106110e4576110e36148f8565b5b602002602001015189896001818110611100576110ff6148f8565b5b90506020020160208101906111159190613b86565b88886001818110611129576111286148f8565b5b90506020020135878a8a6000818110611145576111446148f8565b5b905060200201358f611f37565b5b61115e338b8b61210c565b50505050505050505050565b61117b61117561157e565b836116bd565b6111ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b1906147b4565b60405180910390fd5b6111c68484848461228b565b50505050565b6111d461163f565b6000805b825181101561121c578281815181106111f4576111f36148f8565b5b6020026020010151826112079190614d3e565b9150808061121490614d72565b9150506111d8565b506127108114611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890614e06565b60405180910390fd5b82601190805190602001906112779291906137bc565b50816012908051906020019061128e929190613846565b50505050565b606061129f826122e7565b6112de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d590614e72565b60405180910390fd5b600c6112e983612328565b6040516020016112fa929190614f9d565b6040516020818303038152906040529050919050565b60165481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113b261163f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611421576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114189061503e565b60405180910390fd5b61142a81611a88565b50565b6012818154811061143d57600080fd5b906000526020600020016000915090505481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061151c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061152c575061152b826123f6565b5b9050919050565b61153c816122e7565b61157b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157290614bf1565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166115f983610cd9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61164761157e565b73ffffffffffffffffffffffffffffffffffffffff16611665610ebe565b73ffffffffffffffffffffffffffffffffffffffff16146116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b2906150aa565b60405180910390fd5b565b6000806116c983610cd9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061170b575061170a8185611316565b5b8061174957508373ffffffffffffffffffffffffffffffffffffffff166117318461091b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661177282610cd9565b73ffffffffffffffffffffffffffffffffffffffff16146117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf9061513c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182e906151ce565b60405180910390fd5b6118448383836001612460565b8273ffffffffffffffffffffffffffffffffffffffff1661186482610cd9565b73ffffffffffffffffffffffffffffffffffffffff16146118ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b19061513c565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a4683838360016125be565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb39061523a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cad9190613964565b60405180910390a3505050565b6000611d657f9ae2a55fde6a9674250342c0e5a8a89b164fe9b8f8ea2819853c37c0e5c1a11288888888604051602001611cf5929190615317565b604051602081830303815290604052805190602001208787604051602001611d1e9291906153a5565b6040516020818303038152906040528051906020012034604051602001611d4a969594939291906153d7565b604051602081830303815290604052805190602001206125c4565b90509695505050505050565b6000806000611d8085856125de565b9150915060006004811115611d9857611d97615438565b5b816004811115611dab57611daa615438565b5b148015611de357508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15611df357600192505050611f30565b6000808773ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b8888604051602401611e289291906154bc565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611e929190615528565b600060405180830381855afa9150503d8060008114611ecd576040519150601f19603f3d011682016040523d82523d6000602084013e611ed2565b606091505b5091509150818015611ee5575060208151145b8015611f295750631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681806020019051810190611f27919061556b565b145b9450505050505b9392505050565b60006002811115611f4b57611f4a615438565b5b866002811115611f5e57611f5d615438565b5b03611f7157611f6c8461262f565b612103565b60016002811115611f8557611f84615438565b5b866002811115611f9857611f97615438565b5b03611fad57611fa885888661287c565b612102565b600280811115611fc057611fbf615438565b5b866002811115611fd357611fd2615438565b5b036120c6576000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16601654836120219190615598565b60405161202d90615600565b60006040518083038185875af1925050503d806000811461206a576040519150601f19603f3d011682016040523d82523d6000602084013e61206f565b606091505b50509050806120b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120aa90615661565b60405180910390fd5b6120c08689878787612a74565b50612101565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f8906156cd565b60405180910390fd5b5b5b50505050505050565b600d548161211a600b612b70565b6121249190614d3e565b1115612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c90615739565b60405180910390fd5b600e5481600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121b39190614d3e565b11156121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb906157a5565b60405180910390fd5b60005b8181101561222f57612209600b612b7e565b61221c83612217600b612b70565b612b94565b808061222790614d72565b9150506121f7565b5080600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461227f9190614d3e565b92505081905550505050565b612296848484611752565b6122a284848484612bb2565b6122e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d890615837565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661230983611a4b565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606000600161233784612d39565b01905060008167ffffffffffffffff81111561235657612355613c50565b5b6040519080825280601f01601f1916602001820160405280156123885781602001600182028036833780820191505090505b509050600082602001820190505b6001156123eb578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816123df576123de615857565b5b04945060008503612396575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61246c84848484612e8c565b60018111156124b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a7906158f8565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036124f7576124f281612fb2565b612536565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612535576125348582612ffb565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036125785761257381613168565b6125b7565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146125b6576125b58482613239565b5b5b5050505050565b50505050565b60006125d76125d16132b8565b836133d2565b9050919050565b600080604183510361261f5760008060006020860151925060408601519150606086015160001a905061261387828585613405565b94509450505050612628565b60006002915091505b9250929050565b6000612710601454836126429190615598565b61264c9190615918565b90506000818361265c9190615949565b90506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516126a690615600565b60006040518083038185875af1925050503d80600081146126e3576040519150601f19603f3d011682016040523d82523d6000602084013e6126e8565b606091505b505090508061272c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612723906159c9565b60405180910390fd5b60005b60118054905081101561287557600061271060128381548110612755576127546148f8565b5b90600052602060002001548561276b9190615598565b6127759190615918565b90506011828154811061278b5761278a6148f8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16816040516127d990615600565b60006040518083038185875af1925050503d8060008114612816576040519150601f19603f3d011682016040523d82523d6000602084013e61281b565b606091505b50508093505082612861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285890615a35565b60405180910390fd5b50808061286d90614d72565b91505061272f565b5050505050565b60006127106015548361288f9190615598565b6128999190615918565b9050600081836128a99190615949565b90508473ffffffffffffffffffffffffffffffffffffffff166323b872dd85601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518463ffffffff1660e01b815260040161290a93929190615a55565b6020604051808303816000875af1158015612929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294d9190615aa1565b5060005b601180549050811015612a6c57600061271060128381548110612977576129766148f8565b5b90600052602060002001548461298d9190615598565b6129979190615918565b90508673ffffffffffffffffffffffffffffffffffffffff166323b872dd87601185815481106129ca576129c96148f8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401612a1493929190615a55565b6020604051808303816000875af1158015612a33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a579190615aa1565b50508080612a6490614d72565b915050612951565b505050505050565b60008190505b8382612a869190614d3e565b811015612b68578573ffffffffffffffffffffffffffffffffffffffff166323b872dd866011600081548110612abf57612abe6148f8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868581518110612afd57612afc6148f8565b5b60200260200101516040518463ffffffff1660e01b8152600401612b2393929190615aff565b600060405180830381600087803b158015612b3d57600080fd5b505af1158015612b51573d6000803e3d6000fd5b505050508080612b6090614d72565b915050612a7a565b505050505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b612bae8282604051806020016040528060008152506134e7565b5050565b6000612bd38473ffffffffffffffffffffffffffffffffffffffff16613542565b15612d2c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bfc61157e565b8786866040518563ffffffff1660e01b8152600401612c1e9493929190615b36565b6020604051808303816000875af1925050508015612c5a57506040513d601f19601f82011682018060405250810190612c579190615b97565b60015b612cdc573d8060008114612c8a576040519150601f19603f3d011682016040523d82523d6000602084013e612c8f565b606091505b506000815103612cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ccb90615837565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d31565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612d97577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612d8d57612d8c615857565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612dd4576d04ee2d6d415b85acef81000000008381612dca57612dc9615857565b5b0492506020810190505b662386f26fc100008310612e0357662386f26fc100008381612df957612df8615857565b5b0492506010810190505b6305f5e1008310612e2c576305f5e1008381612e2257612e21615857565b5b0492506008810190505b6127108310612e51576127108381612e4757612e46615857565b5b0492506004810190505b60648310612e745760648381612e6a57612e69615857565b5b0492506002810190505b600a8310612e83576001810190505b80915050919050565b6001811115612fac57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612f205780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f189190615949565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612fab5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fa39190614d3e565b925050819055505b5b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161300884610ded565b6130129190615949565b90506000600760008481526020019081526020016000205490508181146130f7576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061317c9190615949565b90506000600960008481526020019081526020016000205490506000600883815481106131ac576131ab6148f8565b5b9060005260206000200154905080600883815481106131ce576131cd6148f8565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061321d5761321c615bc4565b5b6001900381819060005260206000200160009055905550505050565b600061324483610ded565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f000000000000000000000000aaceb7831d12365872da6e1332e87e2b9f0f710573ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561333457507f000000000000000000000000000000000000000000000000000000000000001946145b15613361577f2f752f472d6b8cdd2b32b1bc01fdb7a2bc52aeddafa74b99b5dbc2cdaa89146e90506133cf565b6133cc7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f392961903cf69c37e2f3ff817043cf175b66be5bbfff4d21d91c2493324063257f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c613565565b90505b90565b600082826040516020016133e7929190615c60565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156134405760006003915091506134de565b6000600187878787604051600081526020016040526040516134659493929190615cb3565b6020604051602081039080840390855afa158015613487573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036134d5576000600192509250506134de565b80600092509250505b94509492505050565b6134f1838361359f565b6134fe6000848484612bb2565b61353d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353490615837565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008383834630604051602001613580959493929190615cf8565b6040516020818303038152906040528051906020012090509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361360e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360590615d97565b60405180910390fd5b613617816122e7565b15613657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161364e90615e03565b60405180910390fd5b613665600083836001612460565b61366e816122e7565b156136ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136a590615e03565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137b86000838360016125be565b5050565b828054828255906000526020600020908101928215613835579160200282015b828111156138345782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906137dc565b5b5090506138429190613893565b5090565b828054828255906000526020600020908101928215613882579160200282015b82811115613881578251825591602001919060010190613866565b5b50905061388f9190613893565b5090565b5b808211156138ac576000816000905550600101613894565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138f9816138c4565b811461390457600080fd5b50565b600081359050613916816138f0565b92915050565b600060208284031215613932576139316138ba565b5b600061394084828501613907565b91505092915050565b60008115159050919050565b61395e81613949565b82525050565b60006020820190506139796000830184613955565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156139b957808201518184015260208101905061399e565b60008484015250505050565b6000601f19601f8301169050919050565b60006139e18261397f565b6139eb818561398a565b93506139fb81856020860161399b565b613a04816139c5565b840191505092915050565b60006020820190508181036000830152613a2981846139d6565b905092915050565b6000819050919050565b613a4481613a31565b8114613a4f57600080fd5b50565b600081359050613a6181613a3b565b92915050565b600060208284031215613a7d57613a7c6138ba565b5b6000613a8b84828501613a52565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613abf82613a94565b9050919050565b613acf81613ab4565b82525050565b6000602082019050613aea6000830184613ac6565b92915050565b613af981613ab4565b8114613b0457600080fd5b50565b600081359050613b1681613af0565b92915050565b60008060408385031215613b3357613b326138ba565b5b6000613b4185828601613b07565b9250506020613b5285828601613a52565b9150509250929050565b613b6581613a31565b82525050565b6000602082019050613b806000830184613b5c565b92915050565b600060208284031215613b9c57613b9b6138ba565b5b6000613baa84828501613b07565b91505092915050565b60008060408385031215613bca57613bc96138ba565b5b6000613bd885828601613a52565b9250506020613be985828601613a52565b9150509250929050565b600080600060608486031215613c0c57613c0b6138ba565b5b6000613c1a86828701613b07565b9350506020613c2b86828701613b07565b9250506040613c3c86828701613a52565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c88826139c5565b810181811067ffffffffffffffff82111715613ca757613ca6613c50565b5b80604052505050565b6000613cba6138b0565b9050613cc68282613c7f565b919050565b600067ffffffffffffffff821115613ce657613ce5613c50565b5b613cef826139c5565b9050602081019050919050565b82818337600083830152505050565b6000613d1e613d1984613ccb565b613cb0565b905082815260208101848484011115613d3a57613d39613c4b565b5b613d45848285613cfc565b509392505050565b600082601f830112613d6257613d61613c46565b5b8135613d72848260208601613d0b565b91505092915050565b600060208284031215613d9157613d906138ba565b5b600082013567ffffffffffffffff811115613daf57613dae6138bf565b5b613dbb84828501613d4d565b91505092915050565b613dcd81613949565b8114613dd857600080fd5b50565b600081359050613dea81613dc4565b92915050565b60008060408385031215613e0757613e066138ba565b5b6000613e1585828601613b07565b9250506020613e2685828601613ddb565b9150509250929050565b600067ffffffffffffffff821115613e4b57613e4a613c50565b5b602082029050602081019050919050565b600080fd5b60038110613e6e57600080fd5b50565b600081359050613e8081613e61565b92915050565b6000613e99613e9484613e30565b613cb0565b90508083825260208201905060208402830185811115613ebc57613ebb613e5c565b5b835b81811015613ee55780613ed18882613e71565b845260208401935050602081019050613ebe565b5050509392505050565b600082601f830112613f0457613f03613c46565b5b8135613f14848260208601613e86565b91505092915050565b600080fd5b60008083601f840112613f3857613f37613c46565b5b8235905067ffffffffffffffff811115613f5557613f54613f1d565b5b602083019150836020820283011115613f7157613f70613e5c565b5b9250929050565b60008083601f840112613f8e57613f8d613c46565b5b8235905067ffffffffffffffff811115613fab57613faa613f1d565b5b602083019150836020820283011115613fc757613fc6613e5c565b5b9250929050565b600067ffffffffffffffff821115613fe957613fe8613c50565b5b602082029050602081019050919050565b600061ffff82169050919050565b61401181613ffa565b811461401c57600080fd5b50565b60008135905061402e81614008565b92915050565b600061404761404284613fce565b613cb0565b9050808382526020820190506020840283018581111561406a57614069613e5c565b5b835b81811015614093578061407f888261401f565b84526020840193505060208101905061406c565b5050509392505050565b600082601f8301126140b2576140b1613c46565b5b81356140c2848260208601614034565b91505092915050565b60008083601f8401126140e1576140e0613c46565b5b8235905067ffffffffffffffff8111156140fe576140fd613f1d565b5b60208301915083600182028301111561411a57614119613e5c565b5b9250929050565b60008060008060008060008060008060e08b8d031215614144576141436138ba565b5b60006141528d828e01613b07565b9a505060206141638d828e01613a52565b99505060408b013567ffffffffffffffff811115614184576141836138bf565b5b6141908d828e01613eef565b98505060608b013567ffffffffffffffff8111156141b1576141b06138bf565b5b6141bd8d828e01613f22565b975097505060808b013567ffffffffffffffff8111156141e0576141df6138bf565b5b6141ec8d828e01613f78565b955095505060a08b013567ffffffffffffffff81111561420f5761420e6138bf565b5b61421b8d828e0161409d565b93505060c08b013567ffffffffffffffff81111561423c5761423b6138bf565b5b6142488d828e016140cb565b92509250509295989b9194979a5092959850565b600067ffffffffffffffff82111561427757614276613c50565b5b614280826139c5565b9050602081019050919050565b60006142a061429b8461425c565b613cb0565b9050828152602081018484840111156142bc576142bb613c4b565b5b6142c7848285613cfc565b509392505050565b600082601f8301126142e4576142e3613c46565b5b81356142f484826020860161428d565b91505092915050565b60008060008060808587031215614317576143166138ba565b5b600061432587828801613b07565b945050602061433687828801613b07565b935050604061434787828801613a52565b925050606085013567ffffffffffffffff811115614368576143676138bf565b5b614374878288016142cf565b91505092959194509250565b600067ffffffffffffffff82111561439b5761439a613c50565b5b602082029050602081019050919050565b60006143bf6143ba84614380565b613cb0565b905080838252602082019050602084028301858111156143e2576143e1613e5c565b5b835b8181101561440b57806143f78882613b07565b8452602084019350506020810190506143e4565b5050509392505050565b600082601f83011261442a57614429613c46565b5b813561443a8482602086016143ac565b91505092915050565b600067ffffffffffffffff82111561445e5761445d613c50565b5b602082029050602081019050919050565b600061448261447d84614443565b613cb0565b905080838252602082019050602084028301858111156144a5576144a4613e5c565b5b835b818110156144ce57806144ba8882613a52565b8452602084019350506020810190506144a7565b5050509392505050565b600082601f8301126144ed576144ec613c46565b5b81356144fd84826020860161446f565b91505092915050565b6000806040838503121561451d5761451c6138ba565b5b600083013567ffffffffffffffff81111561453b5761453a6138bf565b5b61454785828601614415565b925050602083013567ffffffffffffffff811115614568576145676138bf565b5b614574858286016144d8565b9150509250929050565b60008060408385031215614595576145946138ba565b5b60006145a385828601613b07565b92505060206145b485828601613b07565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061460557607f821691505b602082108103614618576146176145be565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061467a60218361398a565b91506146858261461e565b604082019050919050565b600060208201905081810360008301526146a98161466d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061470c603d8361398a565b9150614717826146b0565b604082019050919050565b6000602082019050818103600083015261473b816146ff565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b600061479e602d8361398a565b91506147a982614742565b604082019050919050565b600060208201905081810360008301526147cd81614791565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614830602b8361398a565b915061483b826147d4565b604082019050919050565b6000602082019050818103600083015261485f81614823565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006148c2602c8361398a565b91506148cd82614866565b604082019050919050565b600060208201905081810360008301526148f1816148b5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026149897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261494c565b614993868361494c565b95508019841693508086168417925050509392505050565b6000819050919050565b60006149d06149cb6149c684613a31565b6149ab565b613a31565b9050919050565b6000819050919050565b6149ea836149b5565b6149fe6149f6826149d7565b848454614959565b825550505050565b600090565b614a13614a06565b614a1e8184846149e1565b505050565b5b81811015614a4257614a37600082614a0b565b600181019050614a24565b5050565b601f821115614a8757614a5881614927565b614a618461493c565b81016020851015614a70578190505b614a84614a7c8561493c565b830182614a23565b50505b505050565b600082821c905092915050565b6000614aaa60001984600802614a8c565b1980831691505092915050565b6000614ac38383614a99565b9150826002028217905092915050565b614adc8261397f565b67ffffffffffffffff811115614af557614af4613c50565b5b614aff82546145ed565b614b0a828285614a46565b600060209050601f831160018114614b3d5760008415614b2b578287015190505b614b358582614ab7565b865550614b9d565b601f198416614b4b86614927565b60005b82811015614b7357848901518255600182019150602085019450602081019050614b4e565b86831015614b905784890151614b8c601f891682614a99565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614bdb60188361398a565b9150614be682614ba5565b602082019050919050565b60006020820190508181036000830152614c0a81614bce565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614c6d60298361398a565b9150614c7882614c11565b604082019050919050565b60006020820190508181036000830152614c9c81614c60565b9050919050565b7f7233000000000000000000000000000000000000000000000000000000000000600082015250565b6000614cd960028361398a565b9150614ce482614ca3565b602082019050919050565b60006020820190508181036000830152614d0881614ccc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614d4982613a31565b9150614d5483613a31565b9250828201905080821115614d6c57614d6b614d0f565b5b92915050565b6000614d7d82613a31565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614daf57614dae614d0f565b5b600182019050919050565b7f7230000000000000000000000000000000000000000000000000000000000000600082015250565b6000614df060028361398a565b9150614dfb82614dba565b602082019050919050565b60006020820190508181036000830152614e1f81614de3565b9050919050565b7f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b6000614e5c60118361398a565b9150614e6782614e26565b602082019050919050565b60006020820190508181036000830152614e8b81614e4f565b9050919050565b600081905092915050565b60008154614eaa816145ed565b614eb48186614e92565b94506001821660008114614ecf5760018114614ee457614f17565b60ff1983168652811515820286019350614f17565b614eed85614927565b60005b83811015614f0f57815481890152600182019150602081019050614ef0565b838801955050505b50505092915050565b6000614f2b8261397f565b614f358185614e92565b9350614f4581856020860161399b565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614f87600583614e92565b9150614f9282614f51565b600582019050919050565b6000614fa98285614e9d565b9150614fb58284614f20565b9150614fc082614f7a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061502860268361398a565b915061503382614fcc565b604082019050919050565b600060208201905081810360008301526150578161501b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061509460208361398a565b915061509f8261505e565b602082019050919050565b600060208201905081810360008301526150c381615087565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061512660258361398a565b9150615131826150ca565b604082019050919050565b6000602082019050818103600083015261515581615119565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006151b860248361398a565b91506151c38261515c565b604082019050919050565b600060208201905081810360008301526151e7816151ab565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061522460198361398a565b915061522f826151ee565b602082019050919050565b6000602082019050818103600083015261525381615217565b9050919050565b600081905092915050565b6000819050919050565b61527881613ab4565b82525050565b600061528a838361526f565b60208301905092915050565b60006152a56020840184613b07565b905092915050565b6000602082019050919050565b60006152c6838561525a565b93506152d182615265565b8060005b8581101561530a576152e78284615296565b6152f1888261527e565b97506152fc836152ad565b9250506001810190506152d5565b5085925050509392505050565b60006153248284866152ba565b91508190509392505050565b600081905092915050565b600080fd5b82818337505050565b60006153558385615330565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156153885761538761533b565b5b602083029250615399838584615340565b82840190509392505050565b60006153b2828486615349565b91508190509392505050565b6000819050919050565b6153d1816153be565b82525050565b600060c0820190506153ec60008301896153c8565b6153f96020830188613ac6565b6154066040830187613b5c565b61541360608301866153c8565b61542060808301856153c8565b61542d60a0830184613b5c565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061548e82615467565b6154988185615472565b93506154a881856020860161399b565b6154b1816139c5565b840191505092915050565b60006040820190506154d160008301856153c8565b81810360208301526154e38184615483565b90509392505050565b600081905092915050565b600061550282615467565b61550c81856154ec565b935061551c81856020860161399b565b80840191505092915050565b600061553482846154f7565b915081905092915050565b615548816153be565b811461555357600080fd5b50565b6000815190506155658161553f565b92915050565b600060208284031215615581576155806138ba565b5b600061558f84828501615556565b91505092915050565b60006155a382613a31565b91506155ae83613a31565b92508282026155bc81613a31565b915082820484148315176155d3576155d2614d0f565b5b5092915050565b50565b60006155ea6000836154ec565b91506155f5826155da565b600082019050919050565b600061560b826155dd565b9150819050919050565b7f7237000000000000000000000000000000000000000000000000000000000000600082015250565b600061564b60028361398a565b915061565682615615565b602082019050919050565b6000602082019050818103600083015261567a8161563e565b9050919050565b7f496e76616c696420746f6b656e20747970650000000000000000000000000000600082015250565b60006156b760128361398a565b91506156c282615681565b602082019050919050565b600060208201905081810360008301526156e6816156aa565b9050919050565b7f7231000000000000000000000000000000000000000000000000000000000000600082015250565b600061572360028361398a565b915061572e826156ed565b602082019050919050565b6000602082019050818103600083015261575281615716565b9050919050565b7f7232000000000000000000000000000000000000000000000000000000000000600082015250565b600061578f60028361398a565b915061579a82615759565b602082019050919050565b600060208201905081810360008301526157be81615782565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061582160328361398a565b915061582c826157c5565b604082019050919050565b6000602082019050818103600083015261585081615814565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006158e260358361398a565b91506158ed82615886565b604082019050919050565b60006020820190508181036000830152615911816158d5565b9050919050565b600061592382613a31565b915061592e83613a31565b92508261593e5761593d615857565b5b828204905092915050565b600061595482613a31565b915061595f83613a31565b925082820390508181111561597757615976614d0f565b5b92915050565b7f7235000000000000000000000000000000000000000000000000000000000000600082015250565b60006159b360028361398a565b91506159be8261597d565b602082019050919050565b600060208201905081810360008301526159e2816159a6565b9050919050565b7f7236000000000000000000000000000000000000000000000000000000000000600082015250565b6000615a1f60028361398a565b9150615a2a826159e9565b602082019050919050565b60006020820190508181036000830152615a4e81615a12565b9050919050565b6000606082019050615a6a6000830186613ac6565b615a776020830185613ac6565b615a846040830184613b5c565b949350505050565b600081519050615a9b81613dc4565b92915050565b600060208284031215615ab757615ab66138ba565b5b6000615ac584828501615a8c565b91505092915050565b6000615ae9615ae4615adf84613ffa565b6149ab565b613a31565b9050919050565b615af981615ace565b82525050565b6000606082019050615b146000830186613ac6565b615b216020830185613ac6565b615b2e6040830184615af0565b949350505050565b6000608082019050615b4b6000830187613ac6565b615b586020830186613ac6565b615b656040830185613b5c565b8181036060830152615b778184615483565b905095945050505050565b600081519050615b91816138f0565b92915050565b600060208284031215615bad57615bac6138ba565b5b6000615bbb84828501615b82565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000615c29600283614e92565b9150615c3482615bf3565b600282019050919050565b6000819050919050565b615c5a615c55826153be565b615c3f565b82525050565b6000615c6b82615c1c565b9150615c778285615c49565b602082019150615c878284615c49565b6020820191508190509392505050565b600060ff82169050919050565b615cad81615c97565b82525050565b6000608082019050615cc860008301876153c8565b615cd56020830186615ca4565b615ce260408301856153c8565b615cef60608301846153c8565b95945050505050565b600060a082019050615d0d60008301886153c8565b615d1a60208301876153c8565b615d2760408301866153c8565b615d346060830185613b5c565b615d416080830184613ac6565b9695505050505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615d8160208361398a565b9150615d8c82615d4b565b602082019050919050565b60006020820190508181036000830152615db081615d74565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615ded601c8361398a565b9150615df882615db7565b602082019050919050565b60006020820190508181036000830152615e1c81615de0565b905091905056fea26469706673582212200a22257f8438c57912d2c1d104935bfceb213b1b30f43699051530a4d8a524fe64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000281000000000000000000000000000000000000000000000000000000000000028100000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000260000000000000000000000000a3cc55b34dceab3c3ee85bfbe94b140f645177cd0000000000000000000000006b7fbb0a0ec0099eed6549ec54d3f79463711dfe000000000000000000000000000000000000000000000000000000000000001954726f6c6c20546f776e202d2042727573687374726f6b657a0000000000000000000000000000000000000000000000000000000000000000000000000000075374726f6b657a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006068747470733a2f2f636f72676973747564696f2e667261312e6469676974616c6f6365616e7370616365732e636f6d2f6c5f31326236343765312d386366392d346136652d613135632d3639333665303736383731372f6d657461646174612f000000000000000000000000000000000000000000000000000000000000000100000000000000000000000043f2de85222a6c1fad109d0831a12f720951412400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000002710
-----Decoded View---------------
Arg [0] : _name (string): Troll Town - Brushstrokez
Arg [1] : _symbol (string): Strokez
Arg [2] : _baseURI (string): https://corgistudio.fra1.digitaloceanspaces.com/l_12b647e1-8cf9-4a6e-a15c-6936e0768717/metadata/
Arg [3] : _limit (uint256): 641
Arg [4] : _userLimit (uint256): 641
Arg [5] : _payees (address[]): 0x43f2De85222A6C1fad109D0831A12f7209514124
Arg [6] : _payeePercents (uint256[]): 10000
Arg [7] : signer_ (address): 0xa3Cc55B34DcEAb3C3EE85bFBe94b140f645177cD
Arg [8] : _corgiPayee (address): 0x6B7FBb0A0EC0099eED6549eC54d3f79463711DFe
-----Encoded View---------------
21 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000281
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000281
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000260
Arg [7] : 000000000000000000000000a3cc55b34dceab3c3ee85bfbe94b140f645177cd
Arg [8] : 0000000000000000000000006b7fbb0a0ec0099eed6549ec54d3f79463711dfe
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [10] : 54726f6c6c20546f776e202d2042727573687374726f6b657a00000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [12] : 5374726f6b657a00000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [14] : 68747470733a2f2f636f72676973747564696f2e667261312e6469676974616c
Arg [15] : 6f6365616e7370616365732e636f6d2f6c5f31326236343765312d386366392d
Arg [16] : 346136652d613135632d3639333665303736383731372f6d657461646174612f
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [18] : 00000000000000000000000043f2de85222a6c1fad109d0831a12f7209514124
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [20] : 0000000000000000000000000000000000000000000000000000000000002710
Deployed Bytecode Sourcemap
90160:7205:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61159:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44123:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45635:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45153:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61799:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90476:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91660:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46335:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90769:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61467:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46741:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90685:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90443:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61989:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91554:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90572:23;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43833:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90388:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43564:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22557:103;;;;;;;;;;;;;:::i;:::-;;90717:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21909:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44292:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45878:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90416:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93165:1070;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46997:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91805:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92292:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90822:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46104:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22815:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90602:30;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61159:224;61261:4;61300:35;61285:50;;;:11;:50;;;;:90;;;;61339:36;61363:11;61339:23;:36::i;:::-;61285:90;61278:97;;61159:224;;;:::o;44123:100::-;44177:13;44210:5;44203:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44123:100;:::o;45635:171::-;45711:7;45731:23;45746:7;45731:14;:23::i;:::-;45774:15;:24;45790:7;45774:24;;;;;;;;;;;;;;;;;;;;;45767:31;;45635:171;;;:::o;45153:416::-;45234:13;45250:23;45265:7;45250:14;:23::i;:::-;45234:39;;45298:5;45292:11;;:2;:11;;;45284:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;45392:5;45376:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;45401:37;45418:5;45425:12;:10;:12::i;:::-;45401:16;:37::i;:::-;45376:62;45354:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;45540:21;45549:2;45553:7;45540:8;:21::i;:::-;45223:346;45153:416;;:::o;61799:113::-;61860:7;61887:10;:17;;;;61880:24;;61799:113;:::o;90476:41::-;;;;;;;;;;;;;;;;;:::o;91660:137::-;21795:13;:11;:13::i;:::-;91750:6:::1;91742:5;:14;;;;91779:10;91767:9;:22;;;;91660:137:::0;;:::o;46335:335::-;46530:41;46549:12;:10;:12::i;:::-;46563:7;46530:18;:41::i;:::-;46522:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;46634:28;46644:4;46650:2;46654:7;46634:9;:28::i;:::-;46335:335;;;:::o;90769:39::-;;;;:::o;61467:256::-;61564:7;61600:23;61617:5;61600:16;:23::i;:::-;61592:5;:31;61584:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;61689:12;:19;61702:5;61689:19;;;;;;;;;;;;;;;:26;61709:5;61689:26;;;;;;;;;;;;61682:33;;61467:256;;;;:::o;46741:185::-;46879:39;46896:4;46902:2;46906:7;46879:39;;;;;;;;;;;;:16;:39::i;:::-;46741:185;;;:::o;90685:25::-;;;;;;;;;;;;;:::o;90443:24::-;;;;:::o;61989:233::-;62064:7;62100:30;:28;:30::i;:::-;62092:5;:38;62084:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;62197:10;62208:5;62197:17;;;;;;;;:::i;:::-;;;;;;;;;;62190:24;;61989:233;;;:::o;91554:98::-;21795:13;:11;:13::i;:::-;91636:8:::1;91626:7;:18;;;;;;:::i;:::-;;91554:98:::0;:::o;90572:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43833:223::-;43905:7;43925:13;43941:17;43950:7;43941:8;:17::i;:::-;43925:33;;43994:1;43977:19;;:5;:19;;;43969:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;44043:5;44036:12;;;43833:223;;;:::o;90388:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43564:207::-;43636:7;43681:1;43664:19;;:5;:19;;;43656:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43747:9;:16;43757:5;43747:16;;;;;;;;;;;;;;;;43740:23;;43564:207;;;:::o;22557:103::-;21795:13;:11;:13::i;:::-;22622:30:::1;22649:1;22622:18;:30::i;:::-;22557:103::o:0;90717:39::-;;;;:::o;21909:87::-;21955:7;21982:6;;;;;;;;;;;21975:13;;21909:87;:::o;44292:104::-;44348:13;44381:7;44374:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44292:104;:::o;45878:155::-;45973:52;45992:12;:10;:12::i;:::-;46006:8;46016;45973:18;:52::i;:::-;45878:155;;:::o;90416:20::-;;;;:::o;93165:1070::-;93473:177;93528:7;;;;;;;;;;;93554:52;93560:10;93572:9;93583:7;;93592:13;;93554:5;:52::i;:::-;93625:10;;93473:177;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:36;:177::i;:::-;93451:229;;;;;;;;;;;;:::i;:::-;;;;;;;;;93693:189;93716:10;93741:6;93748:1;93741:9;;;;;;;;:::i;:::-;;;;;;;;93765:7;;93773:1;93765:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;93790:13;;93804:1;93790:16;;;;;;;:::i;:::-;;;;;;;;93821:10;93846:1;93862:9;93693:8;:189::i;:::-;93916:1;93899:7;;:14;;:18;93895:287;;;93934:236;93961:10;93990:6;93997:1;93990:9;;;;;;;;:::i;:::-;;;;;;;;94018:7;;94026:1;94018:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;94047:13;;94061:1;94047:16;;;;;;;:::i;:::-;;;;;;;;94082:10;94111:13;;94125:1;94111:16;;;;;;;:::i;:::-;;;;;;;;94146:9;93934:8;:236::i;:::-;93895:287;94194:33;94200:10;94212:3;94217:9;94194:5;:33::i;:::-;93165:1070;;;;;;;;;;:::o;46997:322::-;47171:41;47190:12;:10;:12::i;:::-;47204:7;47171:18;:41::i;:::-;47163:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;47273:38;47287:4;47293:2;47297:7;47306:4;47273:13;:38::i;:::-;46997:322;;;;:::o;91805:400::-;21795:13;:11;:13::i;:::-;91936:20:::1;91976:9:::0;91971:112:::1;91995:14;:21;91991:1;:25;91971:112;;;92054:14;92069:1;92054:17;;;;;;;;:::i;:::-;;;;;;;;92038:33;;;;;:::i;:::-;;;92018:3;;;;;:::i;:::-;;;;91971:112;;;;92117:5;92101:12;:21;92093:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;92149:7;92140:6;:16;;;;;;;;;;;;:::i;:::-;;92183:14;92167:13;:30;;;;;;;;;;;;:::i;:::-;;91925:280;91805:400:::0;;:::o;92292:326::-;92401:13;92440:16;92448:7;92440;:16::i;:::-;92432:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;92551:7;92560:25;92577:7;92560:16;:25::i;:::-;92534:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;92489:121;;92292:326;;;:::o;90822:39::-;;;;:::o;46104:164::-;46201:4;46225:18;:25;46244:5;46225:25;;;;;;;;;;;;;;;:35;46251:8;46225:35;;;;;;;;;;;;;;;;;;;;;;;;;46218:42;;46104:164;;;;:::o;22815:201::-;21795:13;:11;:13::i;:::-;22924:1:::1;22904:22;;:8;:22;;::::0;22896:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22980:28;22999:8;22980:18;:28::i;:::-;22815:201:::0;:::o;90602:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43195:305::-;43297:4;43349:25;43334:40;;;:11;:40;;;;:105;;;;43406:33;43391:48;;;:11;:48;;;;43334:105;:158;;;;43456:36;43480:11;43456:23;:36::i;:::-;43334:158;43314:178;;43195:305;;;:::o;55454:135::-;55536:16;55544:7;55536;:16::i;:::-;55528:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;55454:135;:::o;20451:98::-;20504:7;20531:10;20524:17;;20451:98;:::o;54733:174::-;54835:2;54808:15;:24;54824:7;54808:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;54891:7;54887:2;54853:46;;54862:23;54877:7;54862:14;:23::i;:::-;54853:46;;;;;;;;;;;;54733:174;;:::o;22074:132::-;22149:12;:10;:12::i;:::-;22138:23;;:7;:5;:7::i;:::-;:23;;;22130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22074:132::o;49352:264::-;49445:4;49462:13;49478:23;49493:7;49478:14;:23::i;:::-;49462:39;;49531:5;49520:16;;:7;:16;;;:52;;;;49540:32;49557:5;49564:7;49540:16;:32::i;:::-;49520:52;:87;;;;49600:7;49576:31;;:20;49588:7;49576:11;:20::i;:::-;:31;;;49520:87;49512:96;;;49352:264;;;;:::o;53351:1263::-;53510:4;53483:31;;:23;53498:7;53483:14;:23::i;:::-;:31;;;53475:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;53589:1;53575:16;;:2;:16;;;53567:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53645:42;53666:4;53672:2;53676:7;53685:1;53645:20;:42::i;:::-;53817:4;53790:31;;:23;53805:7;53790:14;:23::i;:::-;:31;;;53782:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;53935:15;:24;53951:7;53935:24;;;;;;;;;;;;53928:31;;;;;;;;;;;54430:1;54411:9;:15;54421:4;54411:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;54463:1;54446:9;:13;54456:2;54446:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;54505:2;54486:7;:16;54494:7;54486:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;54544:7;54540:2;54525:27;;54534:4;54525:27;;;;;;;;;;;;54565:41;54585:4;54591:2;54595:7;54604:1;54565:19;:41::i;:::-;53351:1263;;;:::o;48627:117::-;48693:7;48720;:16;48728:7;48720:16;;;;;;;;;;;;;;;;;;;;;48713:23;;48627:117;;;:::o;23176:191::-;23250:16;23269:6;;;;;;;;;;;23250:25;;23295:8;23286:6;;:17;;;;;;;;;;;;;;;;;;23350:8;23319:40;;23340:8;23319:40;;;;;;;;;;;;23239:128;23176:191;:::o;55050:315::-;55205:8;55196:17;;:5;:17;;;55188:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;55292:8;55254:18;:25;55273:5;55254:25;;;;;;;;;;;;;;;:35;55280:8;55254:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;55338:8;55316:41;;55331:5;55316:41;;;55348:8;55316:41;;;;;;:::i;:::-;;;;;;;;55050:315;;;:::o;96577:785::-;96753:7;96793:561;96897:164;97088:5;97120:9;97183:7;;97166:25;;;;;;;;;:::i;:::-;;;;;;;;;;;;;97156:36;;;;;;97246:13;;97229:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;97219:42;;;;;;97288:9;96860:460;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;96828:511;;;;;;96793:16;:561::i;:::-;96773:581;;96577:785;;;;;;;;:::o;89317:683::-;89457:4;89475:17;89494:24;89522:33;89539:4;89545:9;89522:16;:33::i;:::-;89474:81;;;;89579:26;89570:35;;;;;;;;:::i;:::-;;:5;:35;;;;;;;;:::i;:::-;;;:58;;;;;89622:6;89609:19;;:9;:19;;;89570:58;89566:102;;;89652:4;89645:11;;;;;;89566:102;89681:12;89695:19;89718:6;:17;;89773:34;;;89809:4;89815:9;89750:75;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89718:118;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89680:156;;;;89855:7;:43;;;;;89896:2;89879:6;:13;:19;89855:43;:136;;;;;89956:34;;;89948:43;;;89926:6;89915:29;;;;;;;;;;;;:::i;:::-;:76;89855:136;89847:145;;;;;;89317:683;;;;;;:::o;94243:746::-;94489:16;94480:25;;;;;;;;:::i;:::-;;:5;:25;;;;;;;;:::i;:::-;;;94476:506;;94522:19;94533:7;94522:10;:19::i;:::-;94476:506;;;94572:15;94563:24;;;;;;;;:::i;:::-;;:5;:24;;;;;;;;:::i;:::-;;;94559:423;;94604:33;94614:6;94622:5;94629:7;94604:9;:33::i;:::-;94559:423;;;94668:16;94659:25;;;;;;;;:::i;:::-;;:5;:25;;;;;;;;:::i;:::-;;;94655:327;;94702:12;94720:10;;;;;;;;;;;:15;;94773:14;;94761:9;:26;;;;:::i;:::-;94720:86;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94701:105;;;94829:7;94821:22;;;;;;;;;;;;:::i;:::-;;;;;;;;;94858:51;94869:6;94877:5;94884:7;94893;94902:6;94858:10;:51::i;:::-;94686:235;94655:327;;;94942:28;;;;;;;;;;:::i;:::-;;;;;;;;94655:327;94559:423;94476:506;94243:746;;;;;;;:::o;92702:420::-;92857:5;;92846:7;92824:19;:9;:17;:19::i;:::-;:29;;;;:::i;:::-;:38;;92816:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;92915:9;;92904:7;92888:6;:13;92895:5;92888:13;;;;;;;;;;;;;;;;:23;;;;:::i;:::-;:36;;92880:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;92949:9;92944:136;92968:7;92964:1;:11;92944:136;;;92997:21;:9;:19;:21::i;:::-;93033:35;93043:3;93048:19;:9;:17;:19::i;:::-;93033:9;:35::i;:::-;92977:3;;;;;:::i;:::-;;;;92944:136;;;;93107:7;93090:6;:13;93097:5;93090:13;;;;;;;;;;;;;;;;:24;;;;;;;:::i;:::-;;;;;;;;92702:420;;;:::o;48200:313::-;48356:28;48366:4;48372:2;48376:7;48356:9;:28::i;:::-;48403:47;48426:4;48432:2;48436:7;48445:4;48403:22;:47::i;:::-;48395:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;48200:313;;;;:::o;49057:128::-;49122:4;49175:1;49146:31;;:17;49155:7;49146:8;:17::i;:::-;:31;;;;49139:38;;49057:128;;;:::o;14977:716::-;15033:13;15084:14;15121:1;15101:17;15112:5;15101:10;:17::i;:::-;:21;15084:38;;15137:20;15171:6;15160:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15137:41;;15193:11;15322:6;15318:2;15314:15;15306:6;15302:28;15295:35;;15359:288;15366:4;15359:288;;;15391:5;;;;;;;;15533:8;15528:2;15521:5;15517:14;15512:30;15507:3;15499:44;15589:2;15580:11;;;;;;:::i;:::-;;;;;15623:1;15614:5;:10;15359:288;15610:21;15359:288;15668:6;15661:13;;;;;14977:716;;;:::o;40793:157::-;40878:4;40917:25;40902:40;;;:11;:40;;;;40895:47;;40793:157;;;:::o;62296:915::-;62473:61;62500:4;62506:2;62510:12;62524:9;62473:26;:61::i;:::-;62563:1;62551:9;:13;62547:222;;;62694:63;;;;;;;;;;:::i;:::-;;;;;;;;62547:222;62781:15;62799:12;62781:30;;62844:1;62828:18;;:4;:18;;;62824:187;;62863:40;62895:7;62863:31;:40::i;:::-;62824:187;;;62933:2;62925:10;;:4;:10;;;62921:90;;62952:47;62985:4;62991:7;62952:32;:47::i;:::-;62921:90;62824:187;63039:1;63025:16;;:2;:16;;;63021:183;;63058:45;63095:7;63058:36;:45::i;:::-;63021:183;;;63131:4;63125:10;;:2;:10;;;63121:83;;63152:40;63180:2;63184:7;63152:27;:40::i;:::-;63121:83;63021:183;62462:749;62296:915;;;;:::o;58870:158::-;;;;;:::o;87385:167::-;87462:7;87489:55;87511:20;:18;:20::i;:::-;87533:10;87489:21;:55::i;:::-;87482:62;;87385:167;;;:::o;76362:747::-;76443:7;76452:12;76501:2;76481:9;:16;:22;76477:625;;76520:9;76544;76568:7;76825:4;76814:9;76810:20;76804:27;76799:32;;76875:4;76864:9;76860:20;76854:27;76849:32;;76933:4;76922:9;76918:20;76912:27;76909:1;76904:36;76899:41;;76976:25;76987:4;76993:1;76996;76999;76976:10;:25::i;:::-;76969:32;;;;;;;;;76477:625;77050:1;77054:35;77034:56;;;;76362:747;;;;;;:::o;94997:590::-;95054:16;95106:5;95084:18;;95074:7;:28;;;;:::i;:::-;95073:38;;;;:::i;:::-;95054:57;;95122:19;95154:8;95144:7;:18;;;;:::i;:::-;95122:40;;95226:12;95244:10;;;;;;;;;;;:15;;95267:8;95244:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95225:55;;;95299:7;95291:22;;;;;;;;;;;;:::i;:::-;;;;;;;;;95354:9;95349:231;95373:6;:13;;;;95369:1;:17;95349:231;;;95408:16;95462:5;95442:13;95456:1;95442:16;;;;;;;;:::i;:::-;;;;;;;;;;95428:11;:30;;;;:::i;:::-;95427:40;;;;:::i;:::-;95408:59;;95496:6;95503:1;95496:9;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:14;;95518:8;95496:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95482:49;;;;;95554:7;95546:22;;;;;;;;;;;;:::i;:::-;;;;;;;;;95393:187;95388:3;;;;;:::i;:::-;;;;95349:231;;;;95043:544;;;94997:590;:::o;95595:562::-;95716:16;95767:5;95746:17;;95736:7;:27;;;;:::i;:::-;95735:37;;;;:::i;:::-;95716:56;;95783:19;95815:8;95805:7;:18;;;;:::i;:::-;95783:40;;95865:6;95858:27;;;95886:5;95893:10;;;;;;;;;;;95905:8;95858:56;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;95955:9;95950:200;95974:6;:13;;;;95970:1;:17;95950:200;;;96009:16;96063:5;96043:13;96057:1;96043:16;;;;;;;;:::i;:::-;;;;;;;;;;96029:11;:30;;;;:::i;:::-;96028:40;;;;:::i;:::-;96009:59;;96090:6;96083:27;;;96111:5;96118:6;96125:1;96118:9;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;96129:8;96083:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;95994:156;95989:3;;;;;:::i;:::-;;;;95950:200;;;;95705:452;;95595:562;;;:::o;96165:325::-;96351:9;96363:6;96351:18;;96346:137;96384:7;96375:6;:16;;;;:::i;:::-;96371:1;:20;96346:137;;;96421:6;96413:28;;;96442:5;96449:6;96456:1;96449:9;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;96460:7;96468:1;96460:10;;;;;;;;:::i;:::-;;;;;;;;96413:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96393:3;;;;;:::i;:::-;;;;96346:137;;;;96165:325;;;;;:::o;1059:114::-;1124:7;1151;:14;;;1144:21;;1059:114;;;:::o;1181:127::-;1288:1;1270:7;:14;;;:19;;;;;;;;;;;1181:127;:::o;49958:110::-;50034:26;50044:2;50048:7;50034:26;;;;;;;;;;;;:9;:26::i;:::-;49958:110;;:::o;56153:853::-;56307:4;56328:15;:2;:13;;;:15::i;:::-;56324:675;;;56380:2;56364:36;;;56401:12;:10;:12::i;:::-;56415:4;56421:7;56430:4;56364:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;56360:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56622:1;56605:6;:13;:18;56601:328;;56648:60;;;;;;;;;;:::i;:::-;;;;;;;;56601:328;56879:6;56873:13;56864:6;56860:2;56856:15;56849:38;56360:584;56496:41;;;56486:51;;;:6;:51;;;;56479:58;;;;;56324:675;56983:4;56976:11;;56153:853;;;;;;;:::o;11834:922::-;11887:7;11907:14;11924:1;11907:18;;11974:6;11965:5;:15;11961:102;;12010:6;12001:15;;;;;;:::i;:::-;;;;;12045:2;12035:12;;;;11961:102;12090:6;12081:5;:15;12077:102;;12126:6;12117:15;;;;;;:::i;:::-;;;;;12161:2;12151:12;;;;12077:102;12206:6;12197:5;:15;12193:102;;12242:6;12233:15;;;;;;:::i;:::-;;;;;12277:2;12267:12;;;;12193:102;12322:5;12313;:14;12309:99;;12357:5;12348:14;;;;;;:::i;:::-;;;;;12391:1;12381:11;;;;12309:99;12435:5;12426;:14;12422:99;;12470:5;12461:14;;;;;;:::i;:::-;;;;;12504:1;12494:11;;;;12422:99;12548:5;12539;:14;12535:99;;12583:5;12574:14;;;;;;:::i;:::-;;;;;12617:1;12607:11;;;;12535:99;12661:5;12652;:14;12648:66;;12697:1;12687:11;;;;12648:66;12742:6;12735:13;;;11834:922;;;:::o;57738:410::-;57928:1;57916:9;:13;57912:229;;;57966:1;57950:18;;:4;:18;;;57946:87;;58008:9;57989;:15;57999:4;57989:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;57946:87;58065:1;58051:16;;:2;:16;;;58047:83;;58105:9;58088;:13;58098:2;58088:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;58047:83;57912:229;57738:410;;;;:::o;63934:164::-;64038:10;:17;;;;64011:15;:24;64027:7;64011:24;;;;;;;;;;;:44;;;;64066:10;64082:7;64066:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63934:164;:::o;64725:988::-;64991:22;65041:1;65016:22;65033:4;65016:16;:22::i;:::-;:26;;;;:::i;:::-;64991:51;;65053:18;65074:17;:26;65092:7;65074:26;;;;;;;;;;;;65053:47;;65221:14;65207:10;:28;65203:328;;65252:19;65274:12;:18;65287:4;65274:18;;;;;;;;;;;;;;;:34;65293:14;65274:34;;;;;;;;;;;;65252:56;;65358:11;65325:12;:18;65338:4;65325:18;;;;;;;;;;;;;;;:30;65344:10;65325:30;;;;;;;;;;;:44;;;;65475:10;65442:17;:30;65460:11;65442:30;;;;;;;;;;;:43;;;;65237:294;65203:328;65627:17;:26;65645:7;65627:26;;;;;;;;;;;65620:33;;;65671:12;:18;65684:4;65671:18;;;;;;;;;;;;;;;:34;65690:14;65671:34;;;;;;;;;;;65664:41;;;64806:907;;64725:988;;:::o;66008:1079::-;66261:22;66306:1;66286:10;:17;;;;:21;;;;:::i;:::-;66261:46;;66318:18;66339:15;:24;66355:7;66339:24;;;;;;;;;;;;66318:45;;66690:19;66712:10;66723:14;66712:26;;;;;;;;:::i;:::-;;;;;;;;;;66690:48;;66776:11;66751:10;66762;66751:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;66887:10;66856:15;:28;66872:11;66856:28;;;;;;;;;;;:41;;;;67028:15;:24;67044:7;67028:24;;;;;;;;;;;67021:31;;;67063:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;66079:1008;;;66008:1079;:::o;63512:221::-;63597:14;63614:20;63631:2;63614:16;:20::i;:::-;63597:37;;63672:7;63645:12;:16;63658:2;63645:16;;;;;;;;;;;;;;;:24;63662:6;63645:24;;;;;;;;;;;:34;;;;63719:6;63690:17;:26;63708:7;63690:26;;;;;;;;;;;:35;;;;63586:147;63512:221;;:::o;86158:314::-;86211:7;86252:12;86235:29;;86243:4;86235:29;;;:66;;;;;86285:16;86268:13;:33;86235:66;86231:234;;;86325:24;86318:31;;;;86231:234;86389:64;86411:10;86423:12;86437:15;86389:21;:64::i;:::-;86382:71;;86158:314;;:::o;82713:196::-;82806:7;82872:15;82889:10;82843:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;82833:68;;;;;;82826:75;;82713:196;;;;:::o;79363:1520::-;79494:7;79503:12;80428:66;80423:1;80415:10;;:79;80411:163;;;80527:1;80531:30;80511:51;;;;;;80411:163;80671:14;80688:24;80698:4;80704:1;80707;80710;80688:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80671:41;;80745:1;80727:20;;:6;:20;;;80723:103;;80780:1;80784:29;80764:50;;;;;;;80723:103;80846:6;80854:20;80838:37;;;;;79363:1520;;;;;;;;:::o;50295:319::-;50424:18;50430:2;50434:7;50424:5;:18::i;:::-;50475:53;50506:1;50510:2;50514:7;50523:4;50475:22;:53::i;:::-;50453:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;50295:319;;;:::o;30659:326::-;30719:4;30976:1;30954:7;:19;;;:23;30947:30;;30659:326;;;:::o;86480:263::-;86624:7;86672:8;86682;86692:11;86705:13;86728:4;86661:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;86651:84;;;;;;86644:91;;86480:263;;;;;:::o;50950:942::-;51044:1;51030:16;;:2;:16;;;51022:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;51103:16;51111:7;51103;:16::i;:::-;51102:17;51094:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51165:48;51194:1;51198:2;51202:7;51211:1;51165:20;:48::i;:::-;51312:16;51320:7;51312;:16::i;:::-;51311:17;51303:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51727:1;51710:9;:13;51720:2;51710:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;51771:2;51752:7;:16;51760:7;51752:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;51816:7;51812:2;51791:33;;51808:1;51791:33;;;;;;;;;;;;51837:47;51865:1;51869:2;51873:7;51882:1;51837:19;:47::i;:::-;50950:942;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:329::-;5301:6;5350:2;5338:9;5329:7;5325:23;5321:32;5318:119;;;5356:79;;:::i;:::-;5318:119;5476:1;5501:53;5546:7;5537:6;5526:9;5522:22;5501:53;:::i;:::-;5491:63;;5447:117;5242:329;;;;:::o;5577:474::-;5645:6;5653;5702:2;5690:9;5681:7;5677:23;5673:32;5670:119;;;5708:79;;:::i;:::-;5670:119;5828:1;5853:53;5898:7;5889:6;5878:9;5874:22;5853:53;:::i;:::-;5843:63;;5799:117;5955:2;5981:53;6026:7;6017:6;6006:9;6002:22;5981:53;:::i;:::-;5971:63;;5926:118;5577:474;;;;;:::o;6057:619::-;6134:6;6142;6150;6199:2;6187:9;6178:7;6174:23;6170:32;6167:119;;;6205:79;;:::i;:::-;6167:119;6325:1;6350:53;6395:7;6386:6;6375:9;6371:22;6350:53;:::i;:::-;6340:63;;6296:117;6452:2;6478:53;6523:7;6514:6;6503:9;6499:22;6478:53;:::i;:::-;6468:63;;6423:118;6580:2;6606:53;6651:7;6642:6;6631:9;6627:22;6606:53;:::i;:::-;6596:63;;6551:118;6057:619;;;;;:::o;6682:117::-;6791:1;6788;6781:12;6805:117;6914:1;6911;6904:12;6928:180;6976:77;6973:1;6966:88;7073:4;7070:1;7063:15;7097:4;7094:1;7087:15;7114:281;7197:27;7219:4;7197:27;:::i;:::-;7189:6;7185:40;7327:6;7315:10;7312:22;7291:18;7279:10;7276:34;7273:62;7270:88;;;7338:18;;:::i;:::-;7270:88;7378:10;7374:2;7367:22;7157:238;7114:281;;:::o;7401:129::-;7435:6;7462:20;;:::i;:::-;7452:30;;7491:33;7519:4;7511:6;7491:33;:::i;:::-;7401:129;;;:::o;7536:308::-;7598:4;7688:18;7680:6;7677:30;7674:56;;;7710:18;;:::i;:::-;7674:56;7748:29;7770:6;7748:29;:::i;:::-;7740:37;;7832:4;7826;7822:15;7814:23;;7536:308;;;:::o;7850:146::-;7947:6;7942:3;7937;7924:30;7988:1;7979:6;7974:3;7970:16;7963:27;7850:146;;;:::o;8002:425::-;8080:5;8105:66;8121:49;8163:6;8121:49;:::i;:::-;8105:66;:::i;:::-;8096:75;;8194:6;8187:5;8180:21;8232:4;8225:5;8221:16;8270:3;8261:6;8256:3;8252:16;8249:25;8246:112;;;8277:79;;:::i;:::-;8246:112;8367:54;8414:6;8409:3;8404;8367:54;:::i;:::-;8086:341;8002:425;;;;;:::o;8447:340::-;8503:5;8552:3;8545:4;8537:6;8533:17;8529:27;8519:122;;8560:79;;:::i;:::-;8519:122;8677:6;8664:20;8702:79;8777:3;8769:6;8762:4;8754:6;8750:17;8702:79;:::i;:::-;8693:88;;8509:278;8447:340;;;;:::o;8793:509::-;8862:6;8911:2;8899:9;8890:7;8886:23;8882:32;8879:119;;;8917:79;;:::i;:::-;8879:119;9065:1;9054:9;9050:17;9037:31;9095:18;9087:6;9084:30;9081:117;;;9117:79;;:::i;:::-;9081:117;9222:63;9277:7;9268:6;9257:9;9253:22;9222:63;:::i;:::-;9212:73;;9008:287;8793:509;;;;:::o;9308:116::-;9378:21;9393:5;9378:21;:::i;:::-;9371:5;9368:32;9358:60;;9414:1;9411;9404:12;9358:60;9308:116;:::o;9430:133::-;9473:5;9511:6;9498:20;9489:29;;9527:30;9551:5;9527:30;:::i;:::-;9430:133;;;;:::o;9569:468::-;9634:6;9642;9691:2;9679:9;9670:7;9666:23;9662:32;9659:119;;;9697:79;;:::i;:::-;9659:119;9817:1;9842:53;9887:7;9878:6;9867:9;9863:22;9842:53;:::i;:::-;9832:63;;9788:117;9944:2;9970:50;10012:7;10003:6;9992:9;9988:22;9970:50;:::i;:::-;9960:60;;9915:115;9569:468;;;;;:::o;10043:325::-;10134:4;10224:18;10216:6;10213:30;10210:56;;;10246:18;;:::i;:::-;10210:56;10296:4;10288:6;10284:17;10276:25;;10356:4;10350;10346:15;10338:23;;10043:325;;;:::o;10374:117::-;10483:1;10480;10473:12;10497:113;10584:1;10577:5;10574:12;10564:40;;10600:1;10597;10590:12;10564:40;10497:113;:::o;10616:167::-;10676:5;10714:6;10701:20;10692:29;;10730:47;10771:5;10730:47;:::i;:::-;10616:167;;;;:::o;10823:752::-;10933:5;10958:95;10974:78;11045:6;10974:78;:::i;:::-;10958:95;:::i;:::-;10949:104;;11073:5;11102:6;11095:5;11088:21;11136:4;11129:5;11125:16;11118:23;;11189:4;11181:6;11177:17;11169:6;11165:30;11218:3;11210:6;11207:15;11204:122;;;11237:79;;:::i;:::-;11204:122;11352:6;11335:234;11369:6;11364:3;11361:15;11335:234;;;11444:3;11473:51;11520:3;11508:10;11473:51;:::i;:::-;11468:3;11461:64;11554:4;11549:3;11545:14;11538:21;;11411:158;11395:4;11390:3;11386:14;11379:21;;11335:234;;;11339:21;10939:636;;10823:752;;;;;:::o;11615:398::-;11700:5;11749:3;11742:4;11734:6;11730:17;11726:27;11716:122;;11757:79;;:::i;:::-;11716:122;11874:6;11861:20;11899:108;12003:3;11995:6;11988:4;11980:6;11976:17;11899:108;:::i;:::-;11890:117;;11706:307;11615:398;;;;:::o;12019:117::-;12128:1;12125;12118:12;12159:568;12232:8;12242:6;12292:3;12285:4;12277:6;12273:17;12269:27;12259:122;;12300:79;;:::i;:::-;12259:122;12413:6;12400:20;12390:30;;12443:18;12435:6;12432:30;12429:117;;;12465:79;;:::i;:::-;12429:117;12579:4;12571:6;12567:17;12555:29;;12633:3;12625:4;12617:6;12613:17;12603:8;12599:32;12596:41;12593:128;;;12640:79;;:::i;:::-;12593:128;12159:568;;;;;:::o;12750:::-;12823:8;12833:6;12883:3;12876:4;12868:6;12864:17;12860:27;12850:122;;12891:79;;:::i;:::-;12850:122;13004:6;12991:20;12981:30;;13034:18;13026:6;13023:30;13020:117;;;13056:79;;:::i;:::-;13020:117;13170:4;13162:6;13158:17;13146:29;;13224:3;13216:4;13208:6;13204:17;13194:8;13190:32;13187:41;13184:128;;;13231:79;;:::i;:::-;13184:128;12750:568;;;;;:::o;13324:310::-;13400:4;13490:18;13482:6;13479:30;13476:56;;;13512:18;;:::i;:::-;13476:56;13562:4;13554:6;13550:17;13542:25;;13622:4;13616;13612:15;13604:23;;13324:310;;;:::o;13640:89::-;13676:7;13716:6;13709:5;13705:18;13694:29;;13640:89;;;:::o;13735:120::-;13807:23;13824:5;13807:23;:::i;:::-;13800:5;13797:34;13787:62;;13845:1;13842;13835:12;13787:62;13735:120;:::o;13861:137::-;13906:5;13944:6;13931:20;13922:29;;13960:32;13986:5;13960:32;:::i;:::-;13861:137;;;;:::o;14020:707::-;14115:5;14140:80;14156:63;14212:6;14156:63;:::i;:::-;14140:80;:::i;:::-;14131:89;;14240:5;14269:6;14262:5;14255:21;14303:4;14296:5;14292:16;14285:23;;14356:4;14348:6;14344:17;14336:6;14332:30;14385:3;14377:6;14374:15;14371:122;;;14404:79;;:::i;:::-;14371:122;14519:6;14502:219;14536:6;14531:3;14528:15;14502:219;;;14611:3;14640:36;14672:3;14660:10;14640:36;:::i;:::-;14635:3;14628:49;14706:4;14701:3;14697:14;14690:21;;14578:143;14562:4;14557:3;14553:14;14546:21;;14502:219;;;14506:21;14121:606;;14020:707;;;;;:::o;14749:368::-;14819:5;14868:3;14861:4;14853:6;14849:17;14845:27;14835:122;;14876:79;;:::i;:::-;14835:122;14993:6;14980:20;15018:93;15107:3;15099:6;15092:4;15084:6;15080:17;15018:93;:::i;:::-;15009:102;;14825:292;14749:368;;;;:::o;15136:552::-;15193:8;15203:6;15253:3;15246:4;15238:6;15234:17;15230:27;15220:122;;15261:79;;:::i;:::-;15220:122;15374:6;15361:20;15351:30;;15404:18;15396:6;15393:30;15390:117;;;15426:79;;:::i;:::-;15390:117;15540:4;15532:6;15528:17;15516:29;;15594:3;15586:4;15578:6;15574:17;15564:8;15560:32;15557:41;15554:128;;;15601:79;;:::i;:::-;15554:128;15136:552;;;;;:::o;15694:2307::-;15935:6;15943;15951;15959;15967;15975;15983;15991;15999;16007;16056:3;16044:9;16035:7;16031:23;16027:33;16024:120;;;16063:79;;:::i;:::-;16024:120;16183:1;16208:53;16253:7;16244:6;16233:9;16229:22;16208:53;:::i;:::-;16198:63;;16154:117;16310:2;16336:53;16381:7;16372:6;16361:9;16357:22;16336:53;:::i;:::-;16326:63;;16281:118;16466:2;16455:9;16451:18;16438:32;16497:18;16489:6;16486:30;16483:117;;;16519:79;;:::i;:::-;16483:117;16624:92;16708:7;16699:6;16688:9;16684:22;16624:92;:::i;:::-;16614:102;;16409:317;16793:2;16782:9;16778:18;16765:32;16824:18;16816:6;16813:30;16810:117;;;16846:79;;:::i;:::-;16810:117;16959:80;17031:7;17022:6;17011:9;17007:22;16959:80;:::i;:::-;16941:98;;;;16736:313;17116:3;17105:9;17101:19;17088:33;17148:18;17140:6;17137:30;17134:117;;;17170:79;;:::i;:::-;17134:117;17283:80;17355:7;17346:6;17335:9;17331:22;17283:80;:::i;:::-;17265:98;;;;17059:314;17440:3;17429:9;17425:19;17412:33;17472:18;17464:6;17461:30;17458:117;;;17494:79;;:::i;:::-;17458:117;17599:77;17668:7;17659:6;17648:9;17644:22;17599:77;:::i;:::-;17589:87;;17383:303;17753:3;17742:9;17738:19;17725:33;17785:18;17777:6;17774:30;17771:117;;;17807:79;;:::i;:::-;17771:117;17920:64;17976:7;17967:6;17956:9;17952:22;17920:64;:::i;:::-;17902:82;;;;17696:298;15694:2307;;;;;;;;;;;;;:::o;18007:307::-;18068:4;18158:18;18150:6;18147:30;18144:56;;;18180:18;;:::i;:::-;18144:56;18218:29;18240:6;18218:29;:::i;:::-;18210:37;;18302:4;18296;18292:15;18284:23;;18007:307;;;:::o;18320:423::-;18397:5;18422:65;18438:48;18479:6;18438:48;:::i;:::-;18422:65;:::i;:::-;18413:74;;18510:6;18503:5;18496:21;18548:4;18541:5;18537:16;18586:3;18577:6;18572:3;18568:16;18565:25;18562:112;;;18593:79;;:::i;:::-;18562:112;18683:54;18730:6;18725:3;18720;18683:54;:::i;:::-;18403:340;18320:423;;;;;:::o;18762:338::-;18817:5;18866:3;18859:4;18851:6;18847:17;18843:27;18833:122;;18874:79;;:::i;:::-;18833:122;18991:6;18978:20;19016:78;19090:3;19082:6;19075:4;19067:6;19063:17;19016:78;:::i;:::-;19007:87;;18823:277;18762:338;;;;:::o;19106:943::-;19201:6;19209;19217;19225;19274:3;19262:9;19253:7;19249:23;19245:33;19242:120;;;19281:79;;:::i;:::-;19242:120;19401:1;19426:53;19471:7;19462:6;19451:9;19447:22;19426:53;:::i;:::-;19416:63;;19372:117;19528:2;19554:53;19599:7;19590:6;19579:9;19575:22;19554:53;:::i;:::-;19544:63;;19499:118;19656:2;19682:53;19727:7;19718:6;19707:9;19703:22;19682:53;:::i;:::-;19672:63;;19627:118;19812:2;19801:9;19797:18;19784:32;19843:18;19835:6;19832:30;19829:117;;;19865:79;;:::i;:::-;19829:117;19970:62;20024:7;20015:6;20004:9;20000:22;19970:62;:::i;:::-;19960:72;;19755:287;19106:943;;;;;;;:::o;20055:311::-;20132:4;20222:18;20214:6;20211:30;20208:56;;;20244:18;;:::i;:::-;20208:56;20294:4;20286:6;20282:17;20274:25;;20354:4;20348;20344:15;20336:23;;20055:311;;;:::o;20389:710::-;20485:5;20510:81;20526:64;20583:6;20526:64;:::i;:::-;20510:81;:::i;:::-;20501:90;;20611:5;20640:6;20633:5;20626:21;20674:4;20667:5;20663:16;20656:23;;20727:4;20719:6;20715:17;20707:6;20703:30;20756:3;20748:6;20745:15;20742:122;;;20775:79;;:::i;:::-;20742:122;20890:6;20873:220;20907:6;20902:3;20899:15;20873:220;;;20982:3;21011:37;21044:3;21032:10;21011:37;:::i;:::-;21006:3;20999:50;21078:4;21073:3;21069:14;21062:21;;20949:144;20933:4;20928:3;20924:14;20917:21;;20873:220;;;20877:21;20491:608;;20389:710;;;;;:::o;21122:370::-;21193:5;21242:3;21235:4;21227:6;21223:17;21219:27;21209:122;;21250:79;;:::i;:::-;21209:122;21367:6;21354:20;21392:94;21482:3;21474:6;21467:4;21459:6;21455:17;21392:94;:::i;:::-;21383:103;;21199:293;21122:370;;;;:::o;21498:311::-;21575:4;21665:18;21657:6;21654:30;21651:56;;;21687:18;;:::i;:::-;21651:56;21737:4;21729:6;21725:17;21717:25;;21797:4;21791;21787:15;21779:23;;21498:311;;;:::o;21832:710::-;21928:5;21953:81;21969:64;22026:6;21969:64;:::i;:::-;21953:81;:::i;:::-;21944:90;;22054:5;22083:6;22076:5;22069:21;22117:4;22110:5;22106:16;22099:23;;22170:4;22162:6;22158:17;22150:6;22146:30;22199:3;22191:6;22188:15;22185:122;;;22218:79;;:::i;:::-;22185:122;22333:6;22316:220;22350:6;22345:3;22342:15;22316:220;;;22425:3;22454:37;22487:3;22475:10;22454:37;:::i;:::-;22449:3;22442:50;22521:4;22516:3;22512:14;22505:21;;22392:144;22376:4;22371:3;22367:14;22360:21;;22316:220;;;22320:21;21934:608;;21832:710;;;;;:::o;22565:370::-;22636:5;22685:3;22678:4;22670:6;22666:17;22662:27;22652:122;;22693:79;;:::i;:::-;22652:122;22810:6;22797:20;22835:94;22925:3;22917:6;22910:4;22902:6;22898:17;22835:94;:::i;:::-;22826:103;;22642:293;22565:370;;;;:::o;22941:894::-;23059:6;23067;23116:2;23104:9;23095:7;23091:23;23087:32;23084:119;;;23122:79;;:::i;:::-;23084:119;23270:1;23259:9;23255:17;23242:31;23300:18;23292:6;23289:30;23286:117;;;23322:79;;:::i;:::-;23286:117;23427:78;23497:7;23488:6;23477:9;23473:22;23427:78;:::i;:::-;23417:88;;23213:302;23582:2;23571:9;23567:18;23554:32;23613:18;23605:6;23602:30;23599:117;;;23635:79;;:::i;:::-;23599:117;23740:78;23810:7;23801:6;23790:9;23786:22;23740:78;:::i;:::-;23730:88;;23525:303;22941:894;;;;;:::o;23841:474::-;23909:6;23917;23966:2;23954:9;23945:7;23941:23;23937:32;23934:119;;;23972:79;;:::i;:::-;23934:119;24092:1;24117:53;24162:7;24153:6;24142:9;24138:22;24117:53;:::i;:::-;24107:63;;24063:117;24219:2;24245:53;24290:7;24281:6;24270:9;24266:22;24245:53;:::i;:::-;24235:63;;24190:118;23841:474;;;;;:::o;24321:180::-;24369:77;24366:1;24359:88;24466:4;24463:1;24456:15;24490:4;24487:1;24480:15;24507:320;24551:6;24588:1;24582:4;24578:12;24568:22;;24635:1;24629:4;24625:12;24656:18;24646:81;;24712:4;24704:6;24700:17;24690:27;;24646:81;24774:2;24766:6;24763:14;24743:18;24740:38;24737:84;;24793:18;;:::i;:::-;24737:84;24558:269;24507:320;;;:::o;24833:220::-;24973:34;24969:1;24961:6;24957:14;24950:58;25042:3;25037:2;25029:6;25025:15;25018:28;24833:220;:::o;25059:366::-;25201:3;25222:67;25286:2;25281:3;25222:67;:::i;:::-;25215:74;;25298:93;25387:3;25298:93;:::i;:::-;25416:2;25411:3;25407:12;25400:19;;25059:366;;;:::o;25431:419::-;25597:4;25635:2;25624:9;25620:18;25612:26;;25684:9;25678:4;25674:20;25670:1;25659:9;25655:17;25648:47;25712:131;25838:4;25712:131;:::i;:::-;25704:139;;25431:419;;;:::o;25856:248::-;25996:34;25992:1;25984:6;25980:14;25973:58;26065:31;26060:2;26052:6;26048:15;26041:56;25856:248;:::o;26110:366::-;26252:3;26273:67;26337:2;26332:3;26273:67;:::i;:::-;26266:74;;26349:93;26438:3;26349:93;:::i;:::-;26467:2;26462:3;26458:12;26451:19;;26110:366;;;:::o;26482:419::-;26648:4;26686:2;26675:9;26671:18;26663:26;;26735:9;26729:4;26725:20;26721:1;26710:9;26706:17;26699:47;26763:131;26889:4;26763:131;:::i;:::-;26755:139;;26482:419;;;:::o;26907:232::-;27047:34;27043:1;27035:6;27031:14;27024:58;27116:15;27111:2;27103:6;27099:15;27092:40;26907:232;:::o;27145:366::-;27287:3;27308:67;27372:2;27367:3;27308:67;:::i;:::-;27301:74;;27384:93;27473:3;27384:93;:::i;:::-;27502:2;27497:3;27493:12;27486:19;;27145:366;;;:::o;27517:419::-;27683:4;27721:2;27710:9;27706:18;27698:26;;27770:9;27764:4;27760:20;27756:1;27745:9;27741:17;27734:47;27798:131;27924:4;27798:131;:::i;:::-;27790:139;;27517:419;;;:::o;27942:230::-;28082:34;28078:1;28070:6;28066:14;28059:58;28151:13;28146:2;28138:6;28134:15;28127:38;27942:230;:::o;28178:366::-;28320:3;28341:67;28405:2;28400:3;28341:67;:::i;:::-;28334:74;;28417:93;28506:3;28417:93;:::i;:::-;28535:2;28530:3;28526:12;28519:19;;28178:366;;;:::o;28550:419::-;28716:4;28754:2;28743:9;28739:18;28731:26;;28803:9;28797:4;28793:20;28789:1;28778:9;28774:17;28767:47;28831:131;28957:4;28831:131;:::i;:::-;28823:139;;28550:419;;;:::o;28975:231::-;29115:34;29111:1;29103:6;29099:14;29092:58;29184:14;29179:2;29171:6;29167:15;29160:39;28975:231;:::o;29212:366::-;29354:3;29375:67;29439:2;29434:3;29375:67;:::i;:::-;29368:74;;29451:93;29540:3;29451:93;:::i;:::-;29569:2;29564:3;29560:12;29553:19;;29212:366;;;:::o;29584:419::-;29750:4;29788:2;29777:9;29773:18;29765:26;;29837:9;29831:4;29827:20;29823:1;29812:9;29808:17;29801:47;29865:131;29991:4;29865:131;:::i;:::-;29857:139;;29584:419;;;:::o;30009:180::-;30057:77;30054:1;30047:88;30154:4;30151:1;30144:15;30178:4;30175:1;30168:15;30195:141;30244:4;30267:3;30259:11;;30290:3;30287:1;30280:14;30324:4;30321:1;30311:18;30303:26;;30195:141;;;:::o;30342:93::-;30379:6;30426:2;30421;30414:5;30410:14;30406:23;30396:33;;30342:93;;;:::o;30441:107::-;30485:8;30535:5;30529:4;30525:16;30504:37;;30441:107;;;;:::o;30554:393::-;30623:6;30673:1;30661:10;30657:18;30696:97;30726:66;30715:9;30696:97;:::i;:::-;30814:39;30844:8;30833:9;30814:39;:::i;:::-;30802:51;;30886:4;30882:9;30875:5;30871:21;30862:30;;30935:4;30925:8;30921:19;30914:5;30911:30;30901:40;;30630:317;;30554:393;;;;;:::o;30953:60::-;30981:3;31002:5;30995:12;;30953:60;;;:::o;31019:142::-;31069:9;31102:53;31120:34;31129:24;31147:5;31129:24;:::i;:::-;31120:34;:::i;:::-;31102:53;:::i;:::-;31089:66;;31019:142;;;:::o;31167:75::-;31210:3;31231:5;31224:12;;31167:75;;;:::o;31248:269::-;31358:39;31389:7;31358:39;:::i;:::-;31419:91;31468:41;31492:16;31468:41;:::i;:::-;31460:6;31453:4;31447:11;31419:91;:::i;:::-;31413:4;31406:105;31324:193;31248:269;;;:::o;31523:73::-;31568:3;31523:73;:::o;31602:189::-;31679:32;;:::i;:::-;31720:65;31778:6;31770;31764:4;31720:65;:::i;:::-;31655:136;31602:189;;:::o;31797:186::-;31857:120;31874:3;31867:5;31864:14;31857:120;;;31928:39;31965:1;31958:5;31928:39;:::i;:::-;31901:1;31894:5;31890:13;31881:22;;31857:120;;;31797:186;;:::o;31989:543::-;32090:2;32085:3;32082:11;32079:446;;;32124:38;32156:5;32124:38;:::i;:::-;32208:29;32226:10;32208:29;:::i;:::-;32198:8;32194:44;32391:2;32379:10;32376:18;32373:49;;;32412:8;32397:23;;32373:49;32435:80;32491:22;32509:3;32491:22;:::i;:::-;32481:8;32477:37;32464:11;32435:80;:::i;:::-;32094:431;;32079:446;31989:543;;;:::o;32538:117::-;32592:8;32642:5;32636:4;32632:16;32611:37;;32538:117;;;;:::o;32661:169::-;32705:6;32738:51;32786:1;32782:6;32774:5;32771:1;32767:13;32738:51;:::i;:::-;32734:56;32819:4;32813;32809:15;32799:25;;32712:118;32661:169;;;;:::o;32835:295::-;32911:4;33057:29;33082:3;33076:4;33057:29;:::i;:::-;33049:37;;33119:3;33116:1;33112:11;33106:4;33103:21;33095:29;;32835:295;;;;:::o;33135:1395::-;33252:37;33285:3;33252:37;:::i;:::-;33354:18;33346:6;33343:30;33340:56;;;33376:18;;:::i;:::-;33340:56;33420:38;33452:4;33446:11;33420:38;:::i;:::-;33505:67;33565:6;33557;33551:4;33505:67;:::i;:::-;33599:1;33623:4;33610:17;;33655:2;33647:6;33644:14;33672:1;33667:618;;;;34329:1;34346:6;34343:77;;;34395:9;34390:3;34386:19;34380:26;34371:35;;34343:77;34446:67;34506:6;34499:5;34446:67;:::i;:::-;34440:4;34433:81;34302:222;33637:887;;33667:618;33719:4;33715:9;33707:6;33703:22;33753:37;33785:4;33753:37;:::i;:::-;33812:1;33826:208;33840:7;33837:1;33834:14;33826:208;;;33919:9;33914:3;33910:19;33904:26;33896:6;33889:42;33970:1;33962:6;33958:14;33948:24;;34017:2;34006:9;34002:18;33989:31;;33863:4;33860:1;33856:12;33851:17;;33826:208;;;34062:6;34053:7;34050:19;34047:179;;;34120:9;34115:3;34111:19;34105:26;34163:48;34205:4;34197:6;34193:17;34182:9;34163:48;:::i;:::-;34155:6;34148:64;34070:156;34047:179;34272:1;34268;34260:6;34256:14;34252:22;34246:4;34239:36;33674:611;;;33637:887;;33227:1303;;;33135:1395;;:::o;34536:174::-;34676:26;34672:1;34664:6;34660:14;34653:50;34536:174;:::o;34716:366::-;34858:3;34879:67;34943:2;34938:3;34879:67;:::i;:::-;34872:74;;34955:93;35044:3;34955:93;:::i;:::-;35073:2;35068:3;35064:12;35057:19;;34716:366;;;:::o;35088:419::-;35254:4;35292:2;35281:9;35277:18;35269:26;;35341:9;35335:4;35331:20;35327:1;35316:9;35312:17;35305:47;35369:131;35495:4;35369:131;:::i;:::-;35361:139;;35088:419;;;:::o;35513:228::-;35653:34;35649:1;35641:6;35637:14;35630:58;35722:11;35717:2;35709:6;35705:15;35698:36;35513:228;:::o;35747:366::-;35889:3;35910:67;35974:2;35969:3;35910:67;:::i;:::-;35903:74;;35986:93;36075:3;35986:93;:::i;:::-;36104:2;36099:3;36095:12;36088:19;;35747:366;;;:::o;36119:419::-;36285:4;36323:2;36312:9;36308:18;36300:26;;36372:9;36366:4;36362:20;36358:1;36347:9;36343:17;36336:47;36400:131;36526:4;36400:131;:::i;:::-;36392:139;;36119:419;;;:::o;36544:152::-;36684:4;36680:1;36672:6;36668:14;36661:28;36544:152;:::o;36702:365::-;36844:3;36865:66;36929:1;36924:3;36865:66;:::i;:::-;36858:73;;36940:93;37029:3;36940:93;:::i;:::-;37058:2;37053:3;37049:12;37042:19;;36702:365;;;:::o;37073:419::-;37239:4;37277:2;37266:9;37262:18;37254:26;;37326:9;37320:4;37316:20;37312:1;37301:9;37297:17;37290:47;37354:131;37480:4;37354:131;:::i;:::-;37346:139;;37073:419;;;:::o;37498:180::-;37546:77;37543:1;37536:88;37643:4;37640:1;37633:15;37667:4;37664:1;37657:15;37684:191;37724:3;37743:20;37761:1;37743:20;:::i;:::-;37738:25;;37777:20;37795:1;37777:20;:::i;:::-;37772:25;;37820:1;37817;37813:9;37806:16;;37841:3;37838:1;37835:10;37832:36;;;37848:18;;:::i;:::-;37832:36;37684:191;;;;:::o;37881:233::-;37920:3;37943:24;37961:5;37943:24;:::i;:::-;37934:33;;37989:66;37982:5;37979:77;37976:103;;38059:18;;:::i;:::-;37976:103;38106:1;38099:5;38095:13;38088:20;;37881:233;;;:::o;38120:152::-;38260:4;38256:1;38248:6;38244:14;38237:28;38120:152;:::o;38278:365::-;38420:3;38441:66;38505:1;38500:3;38441:66;:::i;:::-;38434:73;;38516:93;38605:3;38516:93;:::i;:::-;38634:2;38629:3;38625:12;38618:19;;38278:365;;;:::o;38649:419::-;38815:4;38853:2;38842:9;38838:18;38830:26;;38902:9;38896:4;38892:20;38888:1;38877:9;38873:17;38866:47;38930:131;39056:4;38930:131;:::i;:::-;38922:139;;38649:419;;;:::o;39074:167::-;39214:19;39210:1;39202:6;39198:14;39191:43;39074:167;:::o;39247:366::-;39389:3;39410:67;39474:2;39469:3;39410:67;:::i;:::-;39403:74;;39486:93;39575:3;39486:93;:::i;:::-;39604:2;39599:3;39595:12;39588:19;;39247:366;;;:::o;39619:419::-;39785:4;39823:2;39812:9;39808:18;39800:26;;39872:9;39866:4;39862:20;39858:1;39847:9;39843:17;39836:47;39900:131;40026:4;39900:131;:::i;:::-;39892:139;;39619:419;;;:::o;40044:148::-;40146:11;40183:3;40168:18;;40044:148;;;;:::o;40222:874::-;40325:3;40362:5;40356:12;40391:36;40417:9;40391:36;:::i;:::-;40443:89;40525:6;40520:3;40443:89;:::i;:::-;40436:96;;40563:1;40552:9;40548:17;40579:1;40574:166;;;;40754:1;40749:341;;;;40541:549;;40574:166;40658:4;40654:9;40643;40639:25;40634:3;40627:38;40720:6;40713:14;40706:22;40698:6;40694:35;40689:3;40685:45;40678:52;;40574:166;;40749:341;40816:38;40848:5;40816:38;:::i;:::-;40876:1;40890:154;40904:6;40901:1;40898:13;40890:154;;;40978:7;40972:14;40968:1;40963:3;40959:11;40952:35;41028:1;41019:7;41015:15;41004:26;;40926:4;40923:1;40919:12;40914:17;;40890:154;;;41073:6;41068:3;41064:16;41057:23;;40756:334;;40541:549;;40329:767;;40222:874;;;;:::o;41102:390::-;41208:3;41236:39;41269:5;41236:39;:::i;:::-;41291:89;41373:6;41368:3;41291:89;:::i;:::-;41284:96;;41389:65;41447:6;41442:3;41435:4;41428:5;41424:16;41389:65;:::i;:::-;41479:6;41474:3;41470:16;41463:23;;41212:280;41102:390;;;;:::o;41498:155::-;41638:7;41634:1;41626:6;41622:14;41615:31;41498:155;:::o;41659:400::-;41819:3;41840:84;41922:1;41917:3;41840:84;:::i;:::-;41833:91;;41933:93;42022:3;41933:93;:::i;:::-;42051:1;42046:3;42042:11;42035:18;;41659:400;;;:::o;42065:695::-;42343:3;42365:92;42453:3;42444:6;42365:92;:::i;:::-;42358:99;;42474:95;42565:3;42556:6;42474:95;:::i;:::-;42467:102;;42586:148;42730:3;42586:148;:::i;:::-;42579:155;;42751:3;42744:10;;42065:695;;;;;:::o;42766:225::-;42906:34;42902:1;42894:6;42890:14;42883:58;42975:8;42970:2;42962:6;42958:15;42951:33;42766:225;:::o;42997:366::-;43139:3;43160:67;43224:2;43219:3;43160:67;:::i;:::-;43153:74;;43236:93;43325:3;43236:93;:::i;:::-;43354:2;43349:3;43345:12;43338:19;;42997:366;;;:::o;43369:419::-;43535:4;43573:2;43562:9;43558:18;43550:26;;43622:9;43616:4;43612:20;43608:1;43597:9;43593:17;43586:47;43650:131;43776:4;43650:131;:::i;:::-;43642:139;;43369:419;;;:::o;43794:182::-;43934:34;43930:1;43922:6;43918:14;43911:58;43794:182;:::o;43982:366::-;44124:3;44145:67;44209:2;44204:3;44145:67;:::i;:::-;44138:74;;44221:93;44310:3;44221:93;:::i;:::-;44339:2;44334:3;44330:12;44323:19;;43982:366;;;:::o;44354:419::-;44520:4;44558:2;44547:9;44543:18;44535:26;;44607:9;44601:4;44597:20;44593:1;44582:9;44578:17;44571:47;44635:131;44761:4;44635:131;:::i;:::-;44627:139;;44354:419;;;:::o;44779:224::-;44919:34;44915:1;44907:6;44903:14;44896:58;44988:7;44983:2;44975:6;44971:15;44964:32;44779:224;:::o;45009:366::-;45151:3;45172:67;45236:2;45231:3;45172:67;:::i;:::-;45165:74;;45248:93;45337:3;45248:93;:::i;:::-;45366:2;45361:3;45357:12;45350:19;;45009:366;;;:::o;45381:419::-;45547:4;45585:2;45574:9;45570:18;45562:26;;45634:9;45628:4;45624:20;45620:1;45609:9;45605:17;45598:47;45662:131;45788:4;45662:131;:::i;:::-;45654:139;;45381:419;;;:::o;45806:223::-;45946:34;45942:1;45934:6;45930:14;45923:58;46015:6;46010:2;46002:6;45998:15;45991:31;45806:223;:::o;46035:366::-;46177:3;46198:67;46262:2;46257:3;46198:67;:::i;:::-;46191:74;;46274:93;46363:3;46274:93;:::i;:::-;46392:2;46387:3;46383:12;46376:19;;46035:366;;;:::o;46407:419::-;46573:4;46611:2;46600:9;46596:18;46588:26;;46660:9;46654:4;46650:20;46646:1;46635:9;46631:17;46624:47;46688:131;46814:4;46688:131;:::i;:::-;46680:139;;46407:419;;;:::o;46832:175::-;46972:27;46968:1;46960:6;46956:14;46949:51;46832:175;:::o;47013:366::-;47155:3;47176:67;47240:2;47235:3;47176:67;:::i;:::-;47169:74;;47252:93;47341:3;47252:93;:::i;:::-;47370:2;47365:3;47361:12;47354:19;;47013:366;;;:::o;47385:419::-;47551:4;47589:2;47578:9;47574:18;47566:26;;47638:9;47632:4;47628:20;47624:1;47613:9;47609:17;47602:47;47666:131;47792:4;47666:131;:::i;:::-;47658:139;;47385:419;;;:::o;47810:163::-;47927:11;47964:3;47949:18;;47810:163;;;;:::o;47979:102::-;48048:4;48071:3;48063:11;;47979:102;;;:::o;48087:116::-;48172:24;48190:5;48172:24;:::i;:::-;48167:3;48160:37;48087:116;;:::o;48209:195::-;48286:10;48307:54;48357:3;48349:6;48307:54;:::i;:::-;48393:4;48388:3;48384:14;48370:28;;48209:195;;;;:::o;48410:122::-;48462:5;48487:39;48522:2;48517:3;48513:12;48508:3;48487:39;:::i;:::-;48478:48;;48410:122;;;;:::o;48538:115::-;48610:4;48642;48637:3;48633:14;48625:22;;48538:115;;;:::o;48689:743::-;48836:3;48859:104;48956:6;48951:3;48859:104;:::i;:::-;48852:111;;48987:58;49039:5;48987:58;:::i;:::-;49068:7;49099:1;49084:323;49109:6;49106:1;49103:13;49084:323;;;49179:42;49214:6;49205:7;49179:42;:::i;:::-;49241:71;49308:3;49293:13;49241:71;:::i;:::-;49234:78;;49335:62;49390:6;49335:62;:::i;:::-;49325:72;;49144:263;49131:1;49128;49124:9;49119:14;;49084:323;;;49088:14;49423:3;49416:10;;48841:591;;48689:743;;;;;:::o;49438:355::-;49610:3;49632:135;49763:3;49754:6;49746;49632:135;:::i;:::-;49625:142;;49784:3;49777:10;;49438:355;;;;;:::o;49799:163::-;49916:11;49953:3;49938:18;;49799:163;;;;:::o;49968:117::-;50077:1;50074;50067:12;50091:98;50175:6;50170:3;50165;50152:30;50091:98;;;:::o;50225:573::-;50371:3;50392:104;50489:6;50484:3;50392:104;:::i;:::-;50385:111;;50520:66;50512:6;50509:78;50506:165;;;50590:79;;:::i;:::-;50506:165;50702:4;50694:6;50690:17;50680:27;;50717:43;50753:6;50748:3;50741:5;50717:43;:::i;:::-;50785:6;50780:3;50776:16;50769:23;;50225:573;;;;;:::o;50804:355::-;50976:3;50998:135;51129:3;51120:6;51112;50998:135;:::i;:::-;50991:142;;51150:3;51143:10;;50804:355;;;;;:::o;51165:77::-;51202:7;51231:5;51220:16;;51165:77;;;:::o;51248:118::-;51335:24;51353:5;51335:24;:::i;:::-;51330:3;51323:37;51248:118;;:::o;51372:775::-;51605:4;51643:3;51632:9;51628:19;51620:27;;51657:71;51725:1;51714:9;51710:17;51701:6;51657:71;:::i;:::-;51738:72;51806:2;51795:9;51791:18;51782:6;51738:72;:::i;:::-;51820;51888:2;51877:9;51873:18;51864:6;51820:72;:::i;:::-;51902;51970:2;51959:9;51955:18;51946:6;51902:72;:::i;:::-;51984:73;52052:3;52041:9;52037:19;52028:6;51984:73;:::i;:::-;52067;52135:3;52124:9;52120:19;52111:6;52067:73;:::i;:::-;51372:775;;;;;;;;;:::o;52153:180::-;52201:77;52198:1;52191:88;52298:4;52295:1;52288:15;52322:4;52319:1;52312:15;52339:98;52390:6;52424:5;52418:12;52408:22;;52339:98;;;:::o;52443:168::-;52526:11;52560:6;52555:3;52548:19;52600:4;52595:3;52591:14;52576:29;;52443:168;;;;:::o;52617:373::-;52703:3;52731:38;52763:5;52731:38;:::i;:::-;52785:70;52848:6;52843:3;52785:70;:::i;:::-;52778:77;;52864:65;52922:6;52917:3;52910:4;52903:5;52899:16;52864:65;:::i;:::-;52954:29;52976:6;52954:29;:::i;:::-;52949:3;52945:39;52938:46;;52707:283;52617:373;;;;:::o;52996:419::-;53135:4;53173:2;53162:9;53158:18;53150:26;;53186:71;53254:1;53243:9;53239:17;53230:6;53186:71;:::i;:::-;53304:9;53298:4;53294:20;53289:2;53278:9;53274:18;53267:48;53332:76;53403:4;53394:6;53332:76;:::i;:::-;53324:84;;52996:419;;;;;:::o;53421:147::-;53522:11;53559:3;53544:18;;53421:147;;;;:::o;53574:386::-;53678:3;53706:38;53738:5;53706:38;:::i;:::-;53760:88;53841:6;53836:3;53760:88;:::i;:::-;53753:95;;53857:65;53915:6;53910:3;53903:4;53896:5;53892:16;53857:65;:::i;:::-;53947:6;53942:3;53938:16;53931:23;;53682:278;53574:386;;;;:::o;53966:271::-;54096:3;54118:93;54207:3;54198:6;54118:93;:::i;:::-;54111:100;;54228:3;54221:10;;53966:271;;;;:::o;54243:122::-;54316:24;54334:5;54316:24;:::i;:::-;54309:5;54306:35;54296:63;;54355:1;54352;54345:12;54296:63;54243:122;:::o;54371:143::-;54428:5;54459:6;54453:13;54444:22;;54475:33;54502:5;54475:33;:::i;:::-;54371:143;;;;:::o;54520:351::-;54590:6;54639:2;54627:9;54618:7;54614:23;54610:32;54607:119;;;54645:79;;:::i;:::-;54607:119;54765:1;54790:64;54846:7;54837:6;54826:9;54822:22;54790:64;:::i;:::-;54780:74;;54736:128;54520:351;;;;:::o;54877:410::-;54917:7;54940:20;54958:1;54940:20;:::i;:::-;54935:25;;54974:20;54992:1;54974:20;:::i;:::-;54969:25;;55029:1;55026;55022:9;55051:30;55069:11;55051:30;:::i;:::-;55040:41;;55230:1;55221:7;55217:15;55214:1;55211:22;55191:1;55184:9;55164:83;55141:139;;55260:18;;:::i;:::-;55141:139;54925:362;54877:410;;;;:::o;55293:114::-;;:::o;55413:398::-;55572:3;55593:83;55674:1;55669:3;55593:83;:::i;:::-;55586:90;;55685:93;55774:3;55685:93;:::i;:::-;55803:1;55798:3;55794:11;55787:18;;55413:398;;;:::o;55817:379::-;56001:3;56023:147;56166:3;56023:147;:::i;:::-;56016:154;;56187:3;56180:10;;55817:379;;;:::o;56202:152::-;56342:4;56338:1;56330:6;56326:14;56319:28;56202:152;:::o;56360:365::-;56502:3;56523:66;56587:1;56582:3;56523:66;:::i;:::-;56516:73;;56598:93;56687:3;56598:93;:::i;:::-;56716:2;56711:3;56707:12;56700:19;;56360:365;;;:::o;56731:419::-;56897:4;56935:2;56924:9;56920:18;56912:26;;56984:9;56978:4;56974:20;56970:1;56959:9;56955:17;56948:47;57012:131;57138:4;57012:131;:::i;:::-;57004:139;;56731:419;;;:::o;57156:168::-;57296:20;57292:1;57284:6;57280:14;57273:44;57156:168;:::o;57330:366::-;57472:3;57493:67;57557:2;57552:3;57493:67;:::i;:::-;57486:74;;57569:93;57658:3;57569:93;:::i;:::-;57687:2;57682:3;57678:12;57671:19;;57330:366;;;:::o;57702:419::-;57868:4;57906:2;57895:9;57891:18;57883:26;;57955:9;57949:4;57945:20;57941:1;57930:9;57926:17;57919:47;57983:131;58109:4;57983:131;:::i;:::-;57975:139;;57702:419;;;:::o;58127:152::-;58267:4;58263:1;58255:6;58251:14;58244:28;58127:152;:::o;58285:365::-;58427:3;58448:66;58512:1;58507:3;58448:66;:::i;:::-;58441:73;;58523:93;58612:3;58523:93;:::i;:::-;58641:2;58636:3;58632:12;58625:19;;58285:365;;;:::o;58656:419::-;58822:4;58860:2;58849:9;58845:18;58837:26;;58909:9;58903:4;58899:20;58895:1;58884:9;58880:17;58873:47;58937:131;59063:4;58937:131;:::i;:::-;58929:139;;58656:419;;;:::o;59081:152::-;59221:4;59217:1;59209:6;59205:14;59198:28;59081:152;:::o;59239:365::-;59381:3;59402:66;59466:1;59461:3;59402:66;:::i;:::-;59395:73;;59477:93;59566:3;59477:93;:::i;:::-;59595:2;59590:3;59586:12;59579:19;;59239:365;;;:::o;59610:419::-;59776:4;59814:2;59803:9;59799:18;59791:26;;59863:9;59857:4;59853:20;59849:1;59838:9;59834:17;59827:47;59891:131;60017:4;59891:131;:::i;:::-;59883:139;;59610:419;;;:::o;60035:237::-;60175:34;60171:1;60163:6;60159:14;60152:58;60244:20;60239:2;60231:6;60227:15;60220:45;60035:237;:::o;60278:366::-;60420:3;60441:67;60505:2;60500:3;60441:67;:::i;:::-;60434:74;;60517:93;60606:3;60517:93;:::i;:::-;60635:2;60630:3;60626:12;60619:19;;60278:366;;;:::o;60650:419::-;60816:4;60854:2;60843:9;60839:18;60831:26;;60903:9;60897:4;60893:20;60889:1;60878:9;60874:17;60867:47;60931:131;61057:4;60931:131;:::i;:::-;60923:139;;60650:419;;;:::o;61075:180::-;61123:77;61120:1;61113:88;61220:4;61217:1;61210:15;61244:4;61241:1;61234:15;61261:240;61401:34;61397:1;61389:6;61385:14;61378:58;61470:23;61465:2;61457:6;61453:15;61446:48;61261:240;:::o;61507:366::-;61649:3;61670:67;61734:2;61729:3;61670:67;:::i;:::-;61663:74;;61746:93;61835:3;61746:93;:::i;:::-;61864:2;61859:3;61855:12;61848:19;;61507:366;;;:::o;61879:419::-;62045:4;62083:2;62072:9;62068:18;62060:26;;62132:9;62126:4;62122:20;62118:1;62107:9;62103:17;62096:47;62160:131;62286:4;62160:131;:::i;:::-;62152:139;;61879:419;;;:::o;62304:185::-;62344:1;62361:20;62379:1;62361:20;:::i;:::-;62356:25;;62395:20;62413:1;62395:20;:::i;:::-;62390:25;;62434:1;62424:35;;62439:18;;:::i;:::-;62424:35;62481:1;62478;62474:9;62469:14;;62304:185;;;;:::o;62495:194::-;62535:4;62555:20;62573:1;62555:20;:::i;:::-;62550:25;;62589:20;62607:1;62589:20;:::i;:::-;62584:25;;62633:1;62630;62626:9;62618:17;;62657:1;62651:4;62648:11;62645:37;;;62662:18;;:::i;:::-;62645:37;62495:194;;;;:::o;62695:152::-;62835:4;62831:1;62823:6;62819:14;62812:28;62695:152;:::o;62853:365::-;62995:3;63016:66;63080:1;63075:3;63016:66;:::i;:::-;63009:73;;63091:93;63180:3;63091:93;:::i;:::-;63209:2;63204:3;63200:12;63193:19;;62853:365;;;:::o;63224:419::-;63390:4;63428:2;63417:9;63413:18;63405:26;;63477:9;63471:4;63467:20;63463:1;63452:9;63448:17;63441:47;63505:131;63631:4;63505:131;:::i;:::-;63497:139;;63224:419;;;:::o;63649:152::-;63789:4;63785:1;63777:6;63773:14;63766:28;63649:152;:::o;63807:365::-;63949:3;63970:66;64034:1;64029:3;63970:66;:::i;:::-;63963:73;;64045:93;64134:3;64045:93;:::i;:::-;64163:2;64158:3;64154:12;64147:19;;63807:365;;;:::o;64178:419::-;64344:4;64382:2;64371:9;64367:18;64359:26;;64431:9;64425:4;64421:20;64417:1;64406:9;64402:17;64395:47;64459:131;64585:4;64459:131;:::i;:::-;64451:139;;64178:419;;;:::o;64603:442::-;64752:4;64790:2;64779:9;64775:18;64767:26;;64803:71;64871:1;64860:9;64856:17;64847:6;64803:71;:::i;:::-;64884:72;64952:2;64941:9;64937:18;64928:6;64884:72;:::i;:::-;64966;65034:2;65023:9;65019:18;65010:6;64966:72;:::i;:::-;64603:442;;;;;;:::o;65051:137::-;65105:5;65136:6;65130:13;65121:22;;65152:30;65176:5;65152:30;:::i;:::-;65051:137;;;;:::o;65194:345::-;65261:6;65310:2;65298:9;65289:7;65285:23;65281:32;65278:119;;;65316:79;;:::i;:::-;65278:119;65436:1;65461:61;65514:7;65505:6;65494:9;65490:22;65461:61;:::i;:::-;65451:71;;65407:125;65194:345;;;;:::o;65545:140::-;65594:9;65627:52;65645:33;65654:23;65671:5;65654:23;:::i;:::-;65645:33;:::i;:::-;65627:52;:::i;:::-;65614:65;;65545:140;;;:::o;65691:129::-;65777:36;65807:5;65777:36;:::i;:::-;65772:3;65765:49;65691:129;;:::o;65826:440::-;65974:4;66012:2;66001:9;65997:18;65989:26;;66025:71;66093:1;66082:9;66078:17;66069:6;66025:71;:::i;:::-;66106:72;66174:2;66163:9;66159:18;66150:6;66106:72;:::i;:::-;66188:71;66255:2;66244:9;66240:18;66231:6;66188:71;:::i;:::-;65826:440;;;;;;:::o;66272:640::-;66467:4;66505:3;66494:9;66490:19;66482:27;;66519:71;66587:1;66576:9;66572:17;66563:6;66519:71;:::i;:::-;66600:72;66668:2;66657:9;66653:18;66644:6;66600:72;:::i;:::-;66682;66750:2;66739:9;66735:18;66726:6;66682:72;:::i;:::-;66801:9;66795:4;66791:20;66786:2;66775:9;66771:18;66764:48;66829:76;66900:4;66891:6;66829:76;:::i;:::-;66821:84;;66272:640;;;;;;;:::o;66918:141::-;66974:5;67005:6;66999:13;66990:22;;67021:32;67047:5;67021:32;:::i;:::-;66918:141;;;;:::o;67065:349::-;67134:6;67183:2;67171:9;67162:7;67158:23;67154:32;67151:119;;;67189:79;;:::i;:::-;67151:119;67309:1;67334:63;67389:7;67380:6;67369:9;67365:22;67334:63;:::i;:::-;67324:73;;67280:127;67065:349;;;;:::o;67420:180::-;67468:77;67465:1;67458:88;67565:4;67562:1;67555:15;67589:4;67586:1;67579:15;67606:214;67746:66;67742:1;67734:6;67730:14;67723:90;67606:214;:::o;67826:400::-;67986:3;68007:84;68089:1;68084:3;68007:84;:::i;:::-;68000:91;;68100:93;68189:3;68100:93;:::i;:::-;68218:1;68213:3;68209:11;68202:18;;67826:400;;;:::o;68232:79::-;68271:7;68300:5;68289:16;;68232:79;;;:::o;68317:157::-;68422:45;68442:24;68460:5;68442:24;:::i;:::-;68422:45;:::i;:::-;68417:3;68410:58;68317:157;;:::o;68480:663::-;68721:3;68743:148;68887:3;68743:148;:::i;:::-;68736:155;;68901:75;68972:3;68963:6;68901:75;:::i;:::-;69001:2;68996:3;68992:12;68985:19;;69014:75;69085:3;69076:6;69014:75;:::i;:::-;69114:2;69109:3;69105:12;69098:19;;69134:3;69127:10;;68480:663;;;;;:::o;69149:86::-;69184:7;69224:4;69217:5;69213:16;69202:27;;69149:86;;;:::o;69241:112::-;69324:22;69340:5;69324:22;:::i;:::-;69319:3;69312:35;69241:112;;:::o;69359:545::-;69532:4;69570:3;69559:9;69555:19;69547:27;;69584:71;69652:1;69641:9;69637:17;69628:6;69584:71;:::i;:::-;69665:68;69729:2;69718:9;69714:18;69705:6;69665:68;:::i;:::-;69743:72;69811:2;69800:9;69796:18;69787:6;69743:72;:::i;:::-;69825;69893:2;69882:9;69878:18;69869:6;69825:72;:::i;:::-;69359:545;;;;;;;:::o;69910:664::-;70115:4;70153:3;70142:9;70138:19;70130:27;;70167:71;70235:1;70224:9;70220:17;70211:6;70167:71;:::i;:::-;70248:72;70316:2;70305:9;70301:18;70292:6;70248:72;:::i;:::-;70330;70398:2;70387:9;70383:18;70374:6;70330:72;:::i;:::-;70412;70480:2;70469:9;70465:18;70456:6;70412:72;:::i;:::-;70494:73;70562:3;70551:9;70547:19;70538:6;70494:73;:::i;:::-;69910:664;;;;;;;;:::o;70580:182::-;70720:34;70716:1;70708:6;70704:14;70697:58;70580:182;:::o;70768:366::-;70910:3;70931:67;70995:2;70990:3;70931:67;:::i;:::-;70924:74;;71007:93;71096:3;71007:93;:::i;:::-;71125:2;71120:3;71116:12;71109:19;;70768:366;;;:::o;71140:419::-;71306:4;71344:2;71333:9;71329:18;71321:26;;71393:9;71387:4;71383:20;71379:1;71368:9;71364:17;71357:47;71421:131;71547:4;71421:131;:::i;:::-;71413:139;;71140:419;;;:::o;71565:178::-;71705:30;71701:1;71693:6;71689:14;71682:54;71565:178;:::o;71749:366::-;71891:3;71912:67;71976:2;71971:3;71912:67;:::i;:::-;71905:74;;71988:93;72077:3;71988:93;:::i;:::-;72106:2;72101:3;72097:12;72090:19;;71749:366;;;:::o;72121:419::-;72287:4;72325:2;72314:9;72310:18;72302:26;;72374:9;72368:4;72364:20;72360:1;72349:9;72345:17;72338:47;72402:131;72528:4;72402:131;:::i;:::-;72394:139;;72121:419;;;:::o
Swarm Source
ipfs://0a22257f8438c57912d2c1d104935bfceb213b1b30f43699051530a4d8a524fe
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.