ERC-721
Overview
Max Total Supply
75 ROOK
Holders
34
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 ROOKLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AllCity
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-03-15 */ // SPDX-License-Identifier: GPL-3.0 // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // 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/math/Math.sol // 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/Strings.sol // 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/utils/Context.sol // 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/Ownable.sol // 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/Address.sol // 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/IERC721Receiver.sol // 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/IERC165.sol // 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/utils/introspection/ERC165.sol // 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/IERC721.sol // 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/token/ERC721/extensions/IERC721Enumerable.sol // 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/IERC721Metadata.sol // 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: contracts/ERC721A.sol pragma solidity ^0.8.10; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 1; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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 * `maxBatchSize` refers to how much a minter can mint at a time. */ constructor( string memory name_, string memory symbol_ //uint256 maxBatchSize_ ) { //require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; // maxBatchSize = maxBatchSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex - 1; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @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 || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); // uint256 lowestTokenToCheck; // if (tokenId >= maxBatchSize) { // lowestTokenToCheck = tokenId - maxBatchSize + 1; // } for (uint256 curr = tokenId; ; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } // unreachable statement revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_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 override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); //require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > currentIndex - 1) { endIndex = currentIndex - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: contracts/AllCity.sol //Developer : WesleyETH /* |/ | | */ pragma solidity >=0.7.0 <0.9.0; contract AllCity is ERC721A, Ownable { using Strings for uint256; string public baseURI; string public baseExtension = ".json"; string public notRevealedUri; uint256 public cost = 0.06 ether; uint256 public wlcost = 0.05 ether; uint256 public maxSupply = 6000; uint256 public WlSupply = 300; uint256 public MaxperWallet = 4; // max per wallet uint256 public MaxperWalletWl = 4; // max per wallet wl uint256 public MaxperTxWl = 4; // max mint per tx for wl uint256 public maxsize = 4 ; // max mint per tx bool public paused = true; bool public revealed = false; bool public preSale = true; bool public publicSale = false; bytes32 public merkleRoot = 0x7d47dd9d8fd212164c3a9e8d23f89077455d468a3e287590d7f66b9c5ed8dcfd; // Address of reciever one address public _recieverOne = 0xf303aA8F8dD06A08007e90A2Db4B528B0c665Ff4; // Address of reciever two address public _recieverTwo = 0x0c077910e1dc0B5BEA1054CCE14143E0971f95Ce; constructor( string memory _initBaseURI, string memory _initNotRevealedUri ) ERC721A("AllCity", "ROOK") { setBaseURI(_initBaseURI); setNotRevealedURI(_initNotRevealedUri); } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } // public function mint(uint256 tokens) public payable { require(!paused, "ROOK: Oops! Contract is currently paused"); require(publicSale, "ROOK: Public sale has not started yet"); uint256 supply = totalSupply(); uint256 ownerTokenCount = balanceOf(_msgSender()); require(tokens > 0, "ROOK: need to mint at least 1 NFT"); require(tokens <= maxsize, "ROOK: max mint amount per tx exceeded"); require(supply + tokens <= maxSupply, "ROOK: We Soldout"); require(ownerTokenCount + tokens <= MaxperWallet, "ROOK: Max NFT Per Wallet exceeded"); require(msg.value >= cost * tokens, "ROOK: insufficient funds"); _splitTransfer(msg.value); _safeMint(_msgSender(), tokens); } function _splitTransfer(uint256 _amount) internal { uint256 _recieverOneAmount = (_amount / 100) * 90; uint256 _recieverTwoAmount = (_amount / 100) * 10; (bool successOne, ) = payable(_recieverOne).call{ value: _recieverOneAmount }(""); require(successOne, "ROOK: Transfer to Reciever One Failed"); (bool successTwo, ) = payable(_recieverTwo).call{ value: _recieverTwoAmount }(""); require(successTwo, "ROOK: Transfer to Reciever Two Failed"); } /// @dev presale mint for whitelisted function presalemint(uint256 tokens, bytes32[] calldata merkleProof) public payable { require(!paused, "ROOK: oops contract is paused"); require(preSale, "ROOK: Presale Hasn't started yet"); require(MerkleProof.verify(merkleProof, merkleRoot, keccak256(abi.encodePacked(msg.sender))), "ROOK: You are not Whitelisted"); uint256 supply = totalSupply(); uint256 ownerTokenCount = balanceOf(_msgSender()); require(ownerTokenCount + tokens <= MaxperWalletWl, "ROOK: Max NFT Per Wallet exceeded"); require(tokens > 0, "ROOK: need to mint at least 1 NFT"); require(tokens <= maxsize, "ROOK: max mint per Tx exceeded"); require(supply + tokens <= WlSupply, "ROOK: Whitelist MaxSupply exceeded"); require(msg.value >= wlcost * tokens, "ROOK: insufficient funds"); _safeMint(_msgSender(), tokens); } /// @dev use it for giveaway and mint for yourself function airdrop(uint256 _mintAmount, address destination) public onlyOwner { require(_mintAmount > 0, "need to mint at least 1 NFT"); uint256 supply = totalSupply(); require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded"); _safeMint(destination, _mintAmount); } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721AMetadata: URI query for nonexistent token" ); if(revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : ""; } //only owner function reveal(bool _state) public onlyOwner { revealed = _state; } function setRecieverOne(address _reciever) external onlyOwner { _recieverOne = _reciever; } function setRecieverTwo(address _reciever) external onlyOwner { _recieverTwo = _reciever; } function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner { merkleRoot = _merkleRoot; } function setMaxPerWallet(uint256 _limit) public onlyOwner { MaxperWallet = _limit; } function setWlMaxPerWallet(uint256 _limit) public onlyOwner { MaxperWalletWl = _limit; } function setmaxsize(uint256 _maxsize) public onlyOwner { maxsize = _maxsize; } function setWLMaxpertx(uint256 _maxpertx) public onlyOwner { MaxperTxWl = _maxpertx; } function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; } function setWlCost(uint256 _newWlCost) public onlyOwner { wlcost = _newWlCost; } function setMaxsupply(uint256 _newsupply) public onlyOwner { maxSupply = _newsupply; } function setwlsupply(uint256 _newsupply) public onlyOwner { WlSupply = _newsupply; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedUri = _notRevealedURI; } function pause(bool _state) public onlyOwner { paused = _state; } function togglepreSale(bool _state) external onlyOwner { preSale = _state; } function togglepublicSale(bool _state) external onlyOwner { publicSale = _state; } function withdraw() public payable onlyOwner { (bool success, ) = payable(msg.sender).call{value: address(this).balance}(""); require(success); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MaxperTxWl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxperWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxperWalletWl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WlSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_recieverOne","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_recieverTwo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"destination","type":"address"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxsize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","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":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"presalemint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newsupply","type":"uint256"}],"name":"setMaxsupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_reciever","type":"address"}],"name":"setRecieverOne","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_reciever","type":"address"}],"name":"setRecieverTwo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxpertx","type":"uint256"}],"name":"setWLMaxpertx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newWlCost","type":"uint256"}],"name":"setWlCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setWlMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxsize","type":"uint256"}],"name":"setmaxsize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newsupply","type":"uint256"}],"name":"setwlsupply","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":"bool","name":"_state","type":"bool"}],"name":"togglepreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"togglepublicSale","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wlcost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600160005560006007556040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a90805190602001906200005b929190620004cd565b5066d529ae9e860000600c5566b1a2bc2ec50000600d55611770600e5561012c600f5560046010556004601155600460125560046013556001601460006101000a81548160ff0219169083151502179055506000601460016101000a81548160ff0219169083151502179055506001601460026101000a81548160ff0219169083151502179055506000601460036101000a81548160ff0219169083151502179055507f7d47dd9d8fd212164c3a9e8d23f89077455d468a3e287590d7f66b9c5ed8dcfd60001b60155573f303aa8f8dd06a08007e90a2db4b528b0c665ff4601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550730c077910e1dc0b5bea1054cce14143e0971f95ce601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620001dc57600080fd5b506040516200658e3803806200658e83398181016040528101906200020291906200071a565b6040518060400160405280600781526020017f416c6c43697479000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f524f4f4b00000000000000000000000000000000000000000000000000000000815250816001908051906020019062000286929190620004cd565b5080600290805190602001906200029f929190620004cd565b505050620002c2620002b6620002ec60201b60201c565b620002f460201b60201c565b620002d382620003ba60201b60201c565b620002e481620003e660201b60201c565b505062000887565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003ca6200041260201b60201c565b8060099080519060200190620003e2929190620004cd565b5050565b620003f66200041260201b60201c565b80600b90805190602001906200040e929190620004cd565b5050565b62000422620002ec60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000448620004a360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004989062000800565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620004db9062000851565b90600052602060002090601f016020900481019282620004ff57600085556200054b565b82601f106200051a57805160ff19168380011785556200054b565b828001600101855582156200054b579182015b828111156200054a5782518255916020019190600101906200052d565b5b5090506200055a91906200055e565b5090565b5b80821115620005795760008160009055506001016200055f565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005e6826200059b565b810181811067ffffffffffffffff82111715620006085762000607620005ac565b5b80604052505050565b60006200061d6200057d565b90506200062b8282620005db565b919050565b600067ffffffffffffffff8211156200064e576200064d620005ac565b5b62000659826200059b565b9050602081019050919050565b60005b838110156200068657808201518184015260208101905062000669565b8381111562000696576000848401525b50505050565b6000620006b3620006ad8462000630565b62000611565b905082815260208101848484011115620006d257620006d162000596565b5b620006df84828562000666565b509392505050565b600082601f830112620006ff57620006fe62000591565b5b8151620007118482602086016200069c565b91505092915050565b6000806040838503121562000734576200073362000587565b5b600083015167ffffffffffffffff8111156200075557620007546200058c565b5b6200076385828601620006e7565b925050602083015167ffffffffffffffff8111156200078757620007866200058c565b5b6200079585828601620006e7565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620007e86020836200079f565b9150620007f582620007b0565b602082019050919050565b600060208201905081810360008301526200081b81620007d9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200086a57607f821691505b6020821081141562000881576200088062000822565b5b50919050565b615cf780620008976000396000f3fe6080604052600436106103a15760003560e01c806365d22085116101e7578063bd7a19981161010d578063da3ef23f116100a0578063f2c4ce1e1161006f578063f2c4ce1e14610d5e578063f2fde38b14610d87578063f3257cdd14610db0578063fea0e05814610dd9576103a1565b8063da3ef23f14610ca6578063e268e4d314610ccf578063e985e9c514610cf8578063f12f6d5d14610d35576103a1565b8063ca6b7ef5116100dc578063ca6b7ef514610bfc578063d5abeb0114610c25578063d7224ba014610c50578063d8ed370c14610c7b576103a1565b8063bd7a199814610b40578063bde0608a14610b6b578063c668286214610b94578063c87b56dd14610bbf576103a1565b80638472318111610185578063a0712d6811610154578063a0712d6814610aa9578063a22cb46514610ac5578063b88d4fde14610aee578063bc63f02e14610b17576103a1565b80638472318114610a015780638da5cb5b14610a2a578063940cd05b14610a5557806395d89b4114610a7e576103a1565b80636c6e927e116101c15780636c6e927e1461095957806370a0823114610984578063715018a6146109c15780637cb64759146109d8576103a1565b806365d22085146108da5780636c0360eb146109035780636c2d3c4f1461092e576103a1565b80632eb4a7ab116102cc57806344a0d68a1161026a57806355f804b31161023957806355f804b31461081e5780635a7adf7f146108475780635c975abb146108725780636352211e1461089d576103a1565b806344a0d68a14610764578063458c4f9e1461078d5780634f6ccce7146107b657806351830227146107f3576103a1565b806333bc1c5c116102a657806333bc1c5c146106c95780633ccfd60b146106f457806342842e0e146106fe578063438b630014610727576103a1565b80632eb4a7ab146106365780632f745c59146106615780633227c4221461069e576103a1565b8063095ea7b311610344578063149835a011610313578063149835a01461059057806318160ddd146105b95780631866756c146105e457806323b872dd1461060d576103a1565b8063095ea7b3146104e65780630bddb6131461050f5780630f4171631461053a57806313faede614610565576103a1565b8063036e4cb511610380578063036e4cb51461043757806306fdde0314610453578063081812fc1461047e578063081c8c44146104bb576103a1565b806277ec05146103a657806301ffc9a7146103d157806302329a291461040e575b600080fd5b3480156103b257600080fd5b506103bb610e02565b6040516103c89190613c38565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f39190613cbf565b610e08565b6040516104059190613d07565b60405180910390f35b34801561041a57600080fd5b5061043560048036038101906104309190613d4e565b610f52565b005b610451600480360381019061044c9190613e0c565b610f77565b005b34801561045f57600080fd5b50610468611279565b6040516104759190613f05565b60405180910390f35b34801561048a57600080fd5b506104a560048036038101906104a09190613f27565b61130b565b6040516104b29190613f95565b60405180910390f35b3480156104c757600080fd5b506104d0611390565b6040516104dd9190613f05565b60405180910390f35b3480156104f257600080fd5b5061050d60048036038101906105089190613fdc565b61141e565b005b34801561051b57600080fd5b50610524611537565b6040516105319190613c38565b60405180910390f35b34801561054657600080fd5b5061054f61153d565b60405161055c9190613f95565b60405180910390f35b34801561057157600080fd5b5061057a611563565b6040516105879190613c38565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190613f27565b611569565b005b3480156105c557600080fd5b506105ce61157b565b6040516105db9190613c38565b60405180910390f35b3480156105f057600080fd5b5061060b60048036038101906106069190613f27565b611591565b005b34801561061957600080fd5b50610634600480360381019061062f919061401c565b6115a3565b005b34801561064257600080fd5b5061064b6115b3565b6040516106589190614088565b60405180910390f35b34801561066d57600080fd5b5061068860048036038101906106839190613fdc565b6115b9565b6040516106959190613c38565b60405180910390f35b3480156106aa57600080fd5b506106b36117b7565b6040516106c09190613f95565b60405180910390f35b3480156106d557600080fd5b506106de6117dd565b6040516106eb9190613d07565b60405180910390f35b6106fc6117f0565b005b34801561070a57600080fd5b506107256004803603810190610720919061401c565b611871565b005b34801561073357600080fd5b5061074e600480360381019061074991906140a3565b611891565b60405161075b919061418e565b60405180910390f35b34801561077057600080fd5b5061078b60048036038101906107869190613f27565b61193f565b005b34801561079957600080fd5b506107b460048036038101906107af9190613f27565b611951565b005b3480156107c257600080fd5b506107dd60048036038101906107d89190613f27565b611963565b6040516107ea9190613c38565b60405180910390f35b3480156107ff57600080fd5b506108086119b6565b6040516108159190613d07565b60405180910390f35b34801561082a57600080fd5b50610845600480360381019061084091906142e0565b6119c9565b005b34801561085357600080fd5b5061085c6119eb565b6040516108699190613d07565b60405180910390f35b34801561087e57600080fd5b506108876119fe565b6040516108949190613d07565b60405180910390f35b3480156108a957600080fd5b506108c460048036038101906108bf9190613f27565b611a11565b6040516108d19190613f95565b60405180910390f35b3480156108e657600080fd5b5061090160048036038101906108fc91906140a3565b611a27565b005b34801561090f57600080fd5b50610918611a73565b6040516109259190613f05565b60405180910390f35b34801561093a57600080fd5b50610943611b01565b6040516109509190613c38565b60405180910390f35b34801561096557600080fd5b5061096e611b07565b60405161097b9190613c38565b60405180910390f35b34801561099057600080fd5b506109ab60048036038101906109a691906140a3565b611b0d565b6040516109b89190613c38565b60405180910390f35b3480156109cd57600080fd5b506109d6611bf6565b005b3480156109e457600080fd5b506109ff60048036038101906109fa9190614355565b611c0a565b005b348015610a0d57600080fd5b50610a286004803603810190610a2391906140a3565b611c1c565b005b348015610a3657600080fd5b50610a3f611c68565b604051610a4c9190613f95565b60405180910390f35b348015610a6157600080fd5b50610a7c6004803603810190610a779190613d4e565b611c92565b005b348015610a8a57600080fd5b50610a93611cb7565b604051610aa09190613f05565b60405180910390f35b610ac36004803603810190610abe9190613f27565b611d49565b005b348015610ad157600080fd5b50610aec6004803603810190610ae79190614382565b611f9f565b005b348015610afa57600080fd5b50610b156004803603810190610b109190614463565b612120565b005b348015610b2357600080fd5b50610b3e6004803603810190610b3991906144e6565b61217c565b005b348015610b4c57600080fd5b50610b55612232565b604051610b629190613c38565b60405180910390f35b348015610b7757600080fd5b50610b926004803603810190610b8d9190613f27565b612238565b005b348015610ba057600080fd5b50610ba961224a565b604051610bb69190613f05565b60405180910390f35b348015610bcb57600080fd5b50610be66004803603810190610be19190613f27565b6122d8565b604051610bf39190613f05565b60405180910390f35b348015610c0857600080fd5b50610c236004803603810190610c1e9190613f27565b612431565b005b348015610c3157600080fd5b50610c3a612443565b604051610c479190613c38565b60405180910390f35b348015610c5c57600080fd5b50610c65612449565b604051610c729190613c38565b60405180910390f35b348015610c8757600080fd5b50610c9061244f565b604051610c9d9190613c38565b60405180910390f35b348015610cb257600080fd5b50610ccd6004803603810190610cc891906142e0565b612455565b005b348015610cdb57600080fd5b50610cf66004803603810190610cf19190613f27565b612477565b005b348015610d0457600080fd5b50610d1f6004803603810190610d1a9190614526565b612489565b604051610d2c9190613d07565b60405180910390f35b348015610d4157600080fd5b50610d5c6004803603810190610d579190613f27565b61251d565b005b348015610d6a57600080fd5b50610d856004803603810190610d8091906142e0565b61252f565b005b348015610d9357600080fd5b50610dae6004803603810190610da991906140a3565b612551565b005b348015610dbc57600080fd5b50610dd76004803603810190610dd29190613d4e565b6125d5565b005b348015610de557600080fd5b50610e006004803603810190610dfb9190613d4e565b6125fa565b005b60115481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ed357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610f3b57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610f4b5750610f4a8261261f565b5b9050919050565b610f5a612689565b80601460006101000a81548160ff02191690831515021790555050565b601460009054906101000a900460ff1615610fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbe906145b2565b60405180910390fd5b601460029054906101000a900460ff16611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d9061461e565b60405180910390fd5b61108a828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506015543360405160200161106f9190614686565b60405160208183030381529060405280519060200120612707565b6110c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c0906146ed565b60405180910390fd5b60006110d361157b565b905060006110e76110e261271e565b611b0d565b905060115485826110f8919061473c565b1115611139576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113090614804565b60405180910390fd5b6000851161117c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117390614896565b60405180910390fd5b6013548511156111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b890614902565b60405180910390fd5b600f5485836111d0919061473c565b1115611211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120890614994565b60405180910390fd5b84600d5461121f91906149b4565b341015611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890614a5a565b60405180910390fd5b61127261126c61271e565b86612726565b5050505050565b60606001805461128890614aa9565b80601f01602080910402602001604051908101604052809291908181526020018280546112b490614aa9565b80156113015780601f106112d657610100808354040283529160200191611301565b820191906000526020600020905b8154815290600101906020018083116112e457829003601f168201915b5050505050905090565b600061131682612744565b611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c90614b4d565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b805461139d90614aa9565b80601f01602080910402602001604051908101604052809291908181526020018280546113c990614aa9565b80156114165780601f106113eb57610100808354040283529160200191611416565b820191906000526020600020905b8154815290600101906020018083116113f957829003601f168201915b505050505081565b600061142982611a11565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149190614bdf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166114b961271e565b73ffffffffffffffffffffffffffffffffffffffff1614806114e857506114e7816114e261271e565b612489565b5b611527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151e90614c71565b60405180910390fd5b611532838383612751565b505050565b600f5481565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b611571612689565b80600e8190555050565b6000600160005461158c9190614c91565b905090565b611599612689565b8060128190555050565b6115ae838383612803565b505050565b60155481565b60006115c483611b0d565b8210611605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fc90614d37565b60405180910390fd5b600061160f61157b565b905060008060005b83811015611775576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461170957806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561176157868414156117525781955050505050506117b1565b838061175d90614d57565b9450505b50808061176d90614d57565b915050611617565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a890614e12565b60405180910390fd5b92915050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601460039054906101000a900460ff1681565b6117f8612689565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161181e90614e63565b60006040518083038185875af1925050503d806000811461185b576040519150601f19603f3d011682016040523d82523d6000602084013e611860565b606091505b505090508061186e57600080fd5b50565b61188c83838360405180602001604052806000815250612120565b505050565b6060600061189e83611b0d565b905060008167ffffffffffffffff8111156118bc576118bb6141b5565b5b6040519080825280602002602001820160405280156118ea5781602001602082028036833780820191505090505b50905060005b828110156119345761190285826115b9565b82828151811061191557611914614e78565b5b602002602001018181525050808061192c90614d57565b9150506118f0565b508092505050919050565b611947612689565b80600c8190555050565b611959612689565b80600f8190555050565b600061196d61157b565b82106119ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a590614f19565b60405180910390fd5b819050919050565b601460019054906101000a900460ff1681565b6119d1612689565b80600990805190602001906119e7929190613b42565b5050565b601460029054906101000a900460ff1681565b601460009054906101000a900460ff1681565b6000611a1c82612dbc565b600001519050919050565b611a2f612689565b80601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60098054611a8090614aa9565b80601f0160208091040260200160405190810160405280929190818152602001828054611aac90614aa9565b8015611af95780601f10611ace57610100808354040283529160200191611af9565b820191906000526020600020905b815481529060010190602001808311611adc57829003601f168201915b505050505081565b600d5481565b60135481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7590614fab565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611bfe612689565b611c086000612f17565b565b611c12612689565b8060158190555050565b611c24612689565b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c9a612689565b80601460016101000a81548160ff02191690831515021790555050565b606060028054611cc690614aa9565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf290614aa9565b8015611d3f5780601f10611d1457610100808354040283529160200191611d3f565b820191906000526020600020905b815481529060010190602001808311611d2257829003601f168201915b5050505050905090565b601460009054906101000a900460ff1615611d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d909061503d565b60405180910390fd5b601460039054906101000a900460ff16611de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddf906150cf565b60405180910390fd5b6000611df261157b565b90506000611e06611e0161271e565b611b0d565b905060008311611e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4290614896565b60405180910390fd5b601354831115611e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8790615161565b60405180910390fd5b600e548383611e9f919061473c565b1115611ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed7906151cd565b60405180910390fd5b6010548382611eef919061473c565b1115611f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2790614804565b60405180910390fd5b82600c54611f3e91906149b4565b341015611f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7790614a5a565b60405180910390fd5b611f8934612fdd565b611f9a611f9461271e565b84612726565b505050565b611fa761271e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200c90615239565b60405180910390fd5b806006600061202261271e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120cf61271e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121149190613d07565b60405180910390a35050565b61212b848484612803565b612137848484846131ba565b612176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216d906152cb565b60405180910390fd5b50505050565b612184612689565b600082116121c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121be90615337565b60405180910390fd5b60006121d161157b565b9050600e5483826121e2919061473c565b1115612223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221a906153a3565b60405180910390fd5b61222d8284612726565b505050565b60105481565b612240612689565b8060118190555050565b600a805461225790614aa9565b80601f016020809104026020016040519081016040528092919081815260200182805461228390614aa9565b80156122d05780601f106122a5576101008083540402835291602001916122d0565b820191906000526020600020905b8154815290600101906020018083116122b357829003601f168201915b505050505081565b60606122e382612744565b612322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231990615435565b60405180910390fd5b60001515601460019054906101000a900460ff16151514156123d057600b805461234b90614aa9565b80601f016020809104026020016040519081016040528092919081815260200182805461237790614aa9565b80156123c45780601f10612399576101008083540402835291602001916123c4565b820191906000526020600020905b8154815290600101906020018083116123a757829003601f168201915b5050505050905061242c565b60006123da613342565b905060008151116123fa5760405180602001604052806000815250612428565b80612404846133d4565b600a60405160200161241893929190615525565b6040516020818303038152906040525b9150505b919050565b612439612689565b8060138190555050565b600e5481565b60075481565b60125481565b61245d612689565b80600a9080519060200190612473929190613b42565b5050565b61247f612689565b8060108190555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612525612689565b80600d8190555050565b612537612689565b80600b908051906020019061254d929190613b42565b5050565b612559612689565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c0906155c8565b60405180910390fd5b6125d281612f17565b50565b6125dd612689565b80601460036101000a81548160ff02191690831515021790555050565b612602612689565b80601460026101000a81548160ff02191690831515021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61269161271e565b73ffffffffffffffffffffffffffffffffffffffff166126af611c68565b73ffffffffffffffffffffffffffffffffffffffff1614612705576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fc90615634565b60405180910390fd5b565b60008261271485846134ac565b1490509392505050565b600033905090565b612740828260405180602001604052806000815250613502565b5050565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061280e82612dbc565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661283561271e565b73ffffffffffffffffffffffffffffffffffffffff161480612891575061285a61271e565b73ffffffffffffffffffffffffffffffffffffffff166128798461130b565b73ffffffffffffffffffffffffffffffffffffffff16145b806128ad57506128ac82600001516128a761271e565b612489565b5b9050806128ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e6906156c6565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295890615758565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156129d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c8906157ea565b60405180910390fd5b6129de858585600161397e565b6129ee6000848460000151612751565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612a5c9190615826565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612b00919061585a565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612c06919061473c565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612d4c57612c7c81612744565b15612d4b576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612db48686866001613984565b505050505050565b612dc4613bc8565b612dcd82612744565b612e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0390615912565b60405180910390fd5b60008290505b6000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612efe578092505050612f12565b508080612f0a90615932565b915050612e12565b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000605a606483612fee919061598b565b612ff891906149b4565b90506000600a60648461300b919061598b565b61301591906149b4565b90506000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360405161305f90614e63565b60006040518083038185875af1925050503d806000811461309c576040519150601f19603f3d011682016040523d82523d6000602084013e6130a1565b606091505b50509050806130e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130dc90615a2e565b60405180910390fd5b6000601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360405161312d90614e63565b60006040518083038185875af1925050503d806000811461316a576040519150601f19603f3d011682016040523d82523d6000602084013e61316f565b606091505b50509050806131b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131aa90615ac0565b60405180910390fd5b5050505050565b60006131db8473ffffffffffffffffffffffffffffffffffffffff1661398a565b15613335578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261320461271e565b8786866040518563ffffffff1660e01b81526004016132269493929190615b35565b6020604051808303816000875af192505050801561326257506040513d601f19601f8201168201806040525081019061325f9190615b96565b60015b6132e5573d8060008114613292576040519150601f19603f3d011682016040523d82523d6000602084013e613297565b606091505b506000815114156132dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d4906152cb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061333a565b600190505b949350505050565b60606009805461335190614aa9565b80601f016020809104026020016040519081016040528092919081815260200182805461337d90614aa9565b80156133ca5780601f1061339f576101008083540402835291602001916133ca565b820191906000526020600020905b8154815290600101906020018083116133ad57829003601f168201915b5050505050905090565b6060600060016133e3846139ad565b01905060008167ffffffffffffffff811115613402576134016141b5565b5b6040519080825280601f01601f1916602001820160405280156134345781602001600182028036833780820191505090505b509050600082602001820190505b6001156134a1578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161348b5761348a61595c565b5b049450600085141561349c576134a1565b613442565b819350505050919050565b60008082905060005b84518110156134f7576134e2828683815181106134d5576134d4614e78565b5b6020026020010151613b00565b915080806134ef90614d57565b9150506134b5565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356f90615c35565b60405180910390fd5b61358181612744565b156135c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b890615ca1565b60405180910390fd5b6135ce600085838661397e565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516136cb919061585a565b6fffffffffffffffffffffffffffffffff1681526020018583602001516136f2919061585a565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561396157818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461390160008884886131ba565b613940576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613937906152cb565b60405180910390fd5b818061394b90614d57565b925050808061395990614d57565b915050613890565b50806000819055506139766000878588613984565b505050505050565b50505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613a0b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613a0157613a0061595c565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613a48576d04ee2d6d415b85acef81000000008381613a3e57613a3d61595c565b5b0492506020810190505b662386f26fc100008310613a7757662386f26fc100008381613a6d57613a6c61595c565b5b0492506010810190505b6305f5e1008310613aa0576305f5e1008381613a9657613a9561595c565b5b0492506008810190505b6127108310613ac5576127108381613abb57613aba61595c565b5b0492506004810190505b60648310613ae85760648381613ade57613add61595c565b5b0492506002810190505b600a8310613af7576001810190505b80915050919050565b6000818310613b1857613b138284613b2b565b613b23565b613b228383613b2b565b5b905092915050565b600082600052816020526040600020905092915050565b828054613b4e90614aa9565b90600052602060002090601f016020900481019282613b705760008555613bb7565b82601f10613b8957805160ff1916838001178555613bb7565b82800160010185558215613bb7579182015b82811115613bb6578251825591602001919060010190613b9b565b5b509050613bc49190613c02565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613c1b576000816000905550600101613c03565b5090565b6000819050919050565b613c3281613c1f565b82525050565b6000602082019050613c4d6000830184613c29565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c9c81613c67565b8114613ca757600080fd5b50565b600081359050613cb981613c93565b92915050565b600060208284031215613cd557613cd4613c5d565b5b6000613ce384828501613caa565b91505092915050565b60008115159050919050565b613d0181613cec565b82525050565b6000602082019050613d1c6000830184613cf8565b92915050565b613d2b81613cec565b8114613d3657600080fd5b50565b600081359050613d4881613d22565b92915050565b600060208284031215613d6457613d63613c5d565b5b6000613d7284828501613d39565b91505092915050565b613d8481613c1f565b8114613d8f57600080fd5b50565b600081359050613da181613d7b565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613dcc57613dcb613da7565b5b8235905067ffffffffffffffff811115613de957613de8613dac565b5b602083019150836020820283011115613e0557613e04613db1565b5b9250929050565b600080600060408486031215613e2557613e24613c5d565b5b6000613e3386828701613d92565b935050602084013567ffffffffffffffff811115613e5457613e53613c62565b5b613e6086828701613db6565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ea6578082015181840152602081019050613e8b565b83811115613eb5576000848401525b50505050565b6000601f19601f8301169050919050565b6000613ed782613e6c565b613ee18185613e77565b9350613ef1818560208601613e88565b613efa81613ebb565b840191505092915050565b60006020820190508181036000830152613f1f8184613ecc565b905092915050565b600060208284031215613f3d57613f3c613c5d565b5b6000613f4b84828501613d92565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613f7f82613f54565b9050919050565b613f8f81613f74565b82525050565b6000602082019050613faa6000830184613f86565b92915050565b613fb981613f74565b8114613fc457600080fd5b50565b600081359050613fd681613fb0565b92915050565b60008060408385031215613ff357613ff2613c5d565b5b600061400185828601613fc7565b925050602061401285828601613d92565b9150509250929050565b60008060006060848603121561403557614034613c5d565b5b600061404386828701613fc7565b935050602061405486828701613fc7565b925050604061406586828701613d92565b9150509250925092565b6000819050919050565b6140828161406f565b82525050565b600060208201905061409d6000830184614079565b92915050565b6000602082840312156140b9576140b8613c5d565b5b60006140c784828501613fc7565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61410581613c1f565b82525050565b600061411783836140fc565b60208301905092915050565b6000602082019050919050565b600061413b826140d0565b61414581856140db565b9350614150836140ec565b8060005b83811015614181578151614168888261410b565b975061417383614123565b925050600181019050614154565b5085935050505092915050565b600060208201905081810360008301526141a88184614130565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6141ed82613ebb565b810181811067ffffffffffffffff8211171561420c5761420b6141b5565b5b80604052505050565b600061421f613c53565b905061422b82826141e4565b919050565b600067ffffffffffffffff82111561424b5761424a6141b5565b5b61425482613ebb565b9050602081019050919050565b82818337600083830152505050565b600061428361427e84614230565b614215565b90508281526020810184848401111561429f5761429e6141b0565b5b6142aa848285614261565b509392505050565b600082601f8301126142c7576142c6613da7565b5b81356142d7848260208601614270565b91505092915050565b6000602082840312156142f6576142f5613c5d565b5b600082013567ffffffffffffffff81111561431457614313613c62565b5b614320848285016142b2565b91505092915050565b6143328161406f565b811461433d57600080fd5b50565b60008135905061434f81614329565b92915050565b60006020828403121561436b5761436a613c5d565b5b600061437984828501614340565b91505092915050565b6000806040838503121561439957614398613c5d565b5b60006143a785828601613fc7565b92505060206143b885828601613d39565b9150509250929050565b600067ffffffffffffffff8211156143dd576143dc6141b5565b5b6143e682613ebb565b9050602081019050919050565b6000614406614401846143c2565b614215565b905082815260208101848484011115614422576144216141b0565b5b61442d848285614261565b509392505050565b600082601f83011261444a57614449613da7565b5b813561445a8482602086016143f3565b91505092915050565b6000806000806080858703121561447d5761447c613c5d565b5b600061448b87828801613fc7565b945050602061449c87828801613fc7565b93505060406144ad87828801613d92565b925050606085013567ffffffffffffffff8111156144ce576144cd613c62565b5b6144da87828801614435565b91505092959194509250565b600080604083850312156144fd576144fc613c5d565b5b600061450b85828601613d92565b925050602061451c85828601613fc7565b9150509250929050565b6000806040838503121561453d5761453c613c5d565b5b600061454b85828601613fc7565b925050602061455c85828601613fc7565b9150509250929050565b7f524f4f4b3a206f6f707320636f6e747261637420697320706175736564000000600082015250565b600061459c601d83613e77565b91506145a782614566565b602082019050919050565b600060208201905081810360008301526145cb8161458f565b9050919050565b7f524f4f4b3a2050726573616c65204861736e2774207374617274656420796574600082015250565b6000614608602083613e77565b9150614613826145d2565b602082019050919050565b60006020820190508181036000830152614637816145fb565b9050919050565b60008160601b9050919050565b60006146568261463e565b9050919050565b60006146688261464b565b9050919050565b61468061467b82613f74565b61465d565b82525050565b6000614692828461466f565b60148201915081905092915050565b7f524f4f4b3a20596f7520617265206e6f742057686974656c6973746564000000600082015250565b60006146d7601d83613e77565b91506146e2826146a1565b602082019050919050565b60006020820190508181036000830152614706816146ca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061474782613c1f565b915061475283613c1f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147875761478661470d565b5b828201905092915050565b7f524f4f4b3a204d6178204e4654205065722057616c6c6574206578636565646560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b60006147ee602183613e77565b91506147f982614792565b604082019050919050565b6000602082019050818103600083015261481d816147e1565b9050919050565b7f524f4f4b3a206e65656420746f206d696e74206174206c656173742031204e4660008201527f5400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614880602183613e77565b915061488b82614824565b604082019050919050565b600060208201905081810360008301526148af81614873565b9050919050565b7f524f4f4b3a206d6178206d696e74207065722054782065786365656465640000600082015250565b60006148ec601e83613e77565b91506148f7826148b6565b602082019050919050565b6000602082019050818103600083015261491b816148df565b9050919050565b7f524f4f4b3a2057686974656c697374204d6178537570706c792065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b600061497e602283613e77565b915061498982614922565b604082019050919050565b600060208201905081810360008301526149ad81614971565b9050919050565b60006149bf82613c1f565b91506149ca83613c1f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a0357614a0261470d565b5b828202905092915050565b7f524f4f4b3a20696e73756666696369656e742066756e64730000000000000000600082015250565b6000614a44601883613e77565b9150614a4f82614a0e565b602082019050919050565b60006020820190508181036000830152614a7381614a37565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614ac157607f821691505b60208210811415614ad557614ad4614a7a565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000614b37602d83613e77565b9150614b4282614adb565b604082019050919050565b60006020820190508181036000830152614b6681614b2a565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bc9602283613e77565b9150614bd482614b6d565b604082019050919050565b60006020820190508181036000830152614bf881614bbc565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000614c5b603983613e77565b9150614c6682614bff565b604082019050919050565b60006020820190508181036000830152614c8a81614c4e565b9050919050565b6000614c9c82613c1f565b9150614ca783613c1f565b925082821015614cba57614cb961470d565b5b828203905092915050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000614d21602283613e77565b9150614d2c82614cc5565b604082019050919050565b60006020820190508181036000830152614d5081614d14565b9050919050565b6000614d6282613c1f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d9557614d9461470d565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000614dfc602e83613e77565b9150614e0782614da0565b604082019050919050565b60006020820190508181036000830152614e2b81614def565b9050919050565b600081905092915050565b50565b6000614e4d600083614e32565b9150614e5882614e3d565b600082019050919050565b6000614e6e82614e40565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614f03602383613e77565b9150614f0e82614ea7565b604082019050919050565b60006020820190508181036000830152614f3281614ef6565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614f95602b83613e77565b9150614fa082614f39565b604082019050919050565b60006020820190508181036000830152614fc481614f88565b9050919050565b7f524f4f4b3a204f6f70732120436f6e74726163742069732063757272656e746c60008201527f7920706175736564000000000000000000000000000000000000000000000000602082015250565b6000615027602883613e77565b915061503282614fcb565b604082019050919050565b600060208201905081810360008301526150568161501a565b9050919050565b7f524f4f4b3a205075626c69632073616c6520686173206e6f742073746172746560008201527f6420796574000000000000000000000000000000000000000000000000000000602082015250565b60006150b9602583613e77565b91506150c48261505d565b604082019050919050565b600060208201905081810360008301526150e8816150ac565b9050919050565b7f524f4f4b3a206d6178206d696e7420616d6f756e74207065722074782065786360008201527f6565646564000000000000000000000000000000000000000000000000000000602082015250565b600061514b602583613e77565b9150615156826150ef565b604082019050919050565b6000602082019050818103600083015261517a8161513e565b9050919050565b7f524f4f4b3a20576520536f6c646f757400000000000000000000000000000000600082015250565b60006151b7601083613e77565b91506151c282615181565b602082019050919050565b600060208201905081810360008301526151e6816151aa565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000615223601a83613e77565b915061522e826151ed565b602082019050919050565b6000602082019050818103600083015261525281615216565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b60006152b5603383613e77565b91506152c082615259565b604082019050919050565b600060208201905081810360008301526152e4816152a8565b9050919050565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b6000615321601b83613e77565b915061532c826152eb565b602082019050919050565b6000602082019050818103600083015261535081615314565b9050919050565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b600061538d601683613e77565b915061539882615357565b602082019050919050565b600060208201905081810360008301526153bc81615380565b9050919050565b7f455243373231414d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b600061541f603083613e77565b915061542a826153c3565b604082019050919050565b6000602082019050818103600083015261544e81615412565b9050919050565b600081905092915050565b600061546b82613e6c565b6154758185615455565b9350615485818560208601613e88565b80840191505092915050565b60008190508160005260206000209050919050565b600081546154b381614aa9565b6154bd8186615455565b945060018216600081146154d857600181146154e95761551c565b60ff1983168652818601935061551c565b6154f285615491565b60005b83811015615514578154818901526001820191506020810190506154f5565b838801955050505b50505092915050565b60006155318286615460565b915061553d8285615460565b915061554982846154a6565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006155b2602683613e77565b91506155bd82615556565b604082019050919050565b600060208201905081810360008301526155e1816155a5565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061561e602083613e77565b9150615629826155e8565b602082019050919050565b6000602082019050818103600083015261564d81615611565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006156b0603283613e77565b91506156bb82615654565b604082019050919050565b600060208201905081810360008301526156df816156a3565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000615742602683613e77565b915061574d826156e6565b604082019050919050565b6000602082019050818103600083015261577181615735565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006157d4602583613e77565b91506157df82615778565b604082019050919050565b60006020820190508181036000830152615803816157c7565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b60006158318261580a565b915061583c8361580a565b92508282101561584f5761584e61470d565b5b828203905092915050565b60006158658261580a565b91506158708361580a565b9250826fffffffffffffffffffffffffffffffff038211156158955761589461470d565b5b828201905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006158fc602a83613e77565b9150615907826158a0565b604082019050919050565b6000602082019050818103600083015261592b816158ef565b9050919050565b600061593d82613c1f565b915060008214156159515761595061470d565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061599682613c1f565b91506159a183613c1f565b9250826159b1576159b061595c565b5b828204905092915050565b7f524f4f4b3a205472616e7366657220746f205265636965766572204f6e65204660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b6000615a18602583613e77565b9150615a23826159bc565b604082019050919050565b60006020820190508181036000830152615a4781615a0b565b9050919050565b7f524f4f4b3a205472616e7366657220746f2052656369657665722054776f204660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b6000615aaa602583613e77565b9150615ab582615a4e565b604082019050919050565b60006020820190508181036000830152615ad981615a9d565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615b0782615ae0565b615b118185615aeb565b9350615b21818560208601613e88565b615b2a81613ebb565b840191505092915050565b6000608082019050615b4a6000830187613f86565b615b576020830186613f86565b615b646040830185613c29565b8181036060830152615b768184615afc565b905095945050505050565b600081519050615b9081613c93565b92915050565b600060208284031215615bac57615bab613c5d565b5b6000615bba84828501615b81565b91505092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615c1f602183613e77565b9150615c2a82615bc3565b604082019050919050565b60006020820190508181036000830152615c4e81615c12565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000615c8b601d83613e77565b9150615c9682615c55565b602082019050919050565b60006020820190508181036000830152615cba81615c7e565b905091905056fea264697066735822122021fd4ef24689611e81116a24285b50cd97d4f6b4f58da6f938127b8efae38d0364736f6c634300080c00330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103a15760003560e01c806365d22085116101e7578063bd7a19981161010d578063da3ef23f116100a0578063f2c4ce1e1161006f578063f2c4ce1e14610d5e578063f2fde38b14610d87578063f3257cdd14610db0578063fea0e05814610dd9576103a1565b8063da3ef23f14610ca6578063e268e4d314610ccf578063e985e9c514610cf8578063f12f6d5d14610d35576103a1565b8063ca6b7ef5116100dc578063ca6b7ef514610bfc578063d5abeb0114610c25578063d7224ba014610c50578063d8ed370c14610c7b576103a1565b8063bd7a199814610b40578063bde0608a14610b6b578063c668286214610b94578063c87b56dd14610bbf576103a1565b80638472318111610185578063a0712d6811610154578063a0712d6814610aa9578063a22cb46514610ac5578063b88d4fde14610aee578063bc63f02e14610b17576103a1565b80638472318114610a015780638da5cb5b14610a2a578063940cd05b14610a5557806395d89b4114610a7e576103a1565b80636c6e927e116101c15780636c6e927e1461095957806370a0823114610984578063715018a6146109c15780637cb64759146109d8576103a1565b806365d22085146108da5780636c0360eb146109035780636c2d3c4f1461092e576103a1565b80632eb4a7ab116102cc57806344a0d68a1161026a57806355f804b31161023957806355f804b31461081e5780635a7adf7f146108475780635c975abb146108725780636352211e1461089d576103a1565b806344a0d68a14610764578063458c4f9e1461078d5780634f6ccce7146107b657806351830227146107f3576103a1565b806333bc1c5c116102a657806333bc1c5c146106c95780633ccfd60b146106f457806342842e0e146106fe578063438b630014610727576103a1565b80632eb4a7ab146106365780632f745c59146106615780633227c4221461069e576103a1565b8063095ea7b311610344578063149835a011610313578063149835a01461059057806318160ddd146105b95780631866756c146105e457806323b872dd1461060d576103a1565b8063095ea7b3146104e65780630bddb6131461050f5780630f4171631461053a57806313faede614610565576103a1565b8063036e4cb511610380578063036e4cb51461043757806306fdde0314610453578063081812fc1461047e578063081c8c44146104bb576103a1565b806277ec05146103a657806301ffc9a7146103d157806302329a291461040e575b600080fd5b3480156103b257600080fd5b506103bb610e02565b6040516103c89190613c38565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f39190613cbf565b610e08565b6040516104059190613d07565b60405180910390f35b34801561041a57600080fd5b5061043560048036038101906104309190613d4e565b610f52565b005b610451600480360381019061044c9190613e0c565b610f77565b005b34801561045f57600080fd5b50610468611279565b6040516104759190613f05565b60405180910390f35b34801561048a57600080fd5b506104a560048036038101906104a09190613f27565b61130b565b6040516104b29190613f95565b60405180910390f35b3480156104c757600080fd5b506104d0611390565b6040516104dd9190613f05565b60405180910390f35b3480156104f257600080fd5b5061050d60048036038101906105089190613fdc565b61141e565b005b34801561051b57600080fd5b50610524611537565b6040516105319190613c38565b60405180910390f35b34801561054657600080fd5b5061054f61153d565b60405161055c9190613f95565b60405180910390f35b34801561057157600080fd5b5061057a611563565b6040516105879190613c38565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190613f27565b611569565b005b3480156105c557600080fd5b506105ce61157b565b6040516105db9190613c38565b60405180910390f35b3480156105f057600080fd5b5061060b60048036038101906106069190613f27565b611591565b005b34801561061957600080fd5b50610634600480360381019061062f919061401c565b6115a3565b005b34801561064257600080fd5b5061064b6115b3565b6040516106589190614088565b60405180910390f35b34801561066d57600080fd5b5061068860048036038101906106839190613fdc565b6115b9565b6040516106959190613c38565b60405180910390f35b3480156106aa57600080fd5b506106b36117b7565b6040516106c09190613f95565b60405180910390f35b3480156106d557600080fd5b506106de6117dd565b6040516106eb9190613d07565b60405180910390f35b6106fc6117f0565b005b34801561070a57600080fd5b506107256004803603810190610720919061401c565b611871565b005b34801561073357600080fd5b5061074e600480360381019061074991906140a3565b611891565b60405161075b919061418e565b60405180910390f35b34801561077057600080fd5b5061078b60048036038101906107869190613f27565b61193f565b005b34801561079957600080fd5b506107b460048036038101906107af9190613f27565b611951565b005b3480156107c257600080fd5b506107dd60048036038101906107d89190613f27565b611963565b6040516107ea9190613c38565b60405180910390f35b3480156107ff57600080fd5b506108086119b6565b6040516108159190613d07565b60405180910390f35b34801561082a57600080fd5b50610845600480360381019061084091906142e0565b6119c9565b005b34801561085357600080fd5b5061085c6119eb565b6040516108699190613d07565b60405180910390f35b34801561087e57600080fd5b506108876119fe565b6040516108949190613d07565b60405180910390f35b3480156108a957600080fd5b506108c460048036038101906108bf9190613f27565b611a11565b6040516108d19190613f95565b60405180910390f35b3480156108e657600080fd5b5061090160048036038101906108fc91906140a3565b611a27565b005b34801561090f57600080fd5b50610918611a73565b6040516109259190613f05565b60405180910390f35b34801561093a57600080fd5b50610943611b01565b6040516109509190613c38565b60405180910390f35b34801561096557600080fd5b5061096e611b07565b60405161097b9190613c38565b60405180910390f35b34801561099057600080fd5b506109ab60048036038101906109a691906140a3565b611b0d565b6040516109b89190613c38565b60405180910390f35b3480156109cd57600080fd5b506109d6611bf6565b005b3480156109e457600080fd5b506109ff60048036038101906109fa9190614355565b611c0a565b005b348015610a0d57600080fd5b50610a286004803603810190610a2391906140a3565b611c1c565b005b348015610a3657600080fd5b50610a3f611c68565b604051610a4c9190613f95565b60405180910390f35b348015610a6157600080fd5b50610a7c6004803603810190610a779190613d4e565b611c92565b005b348015610a8a57600080fd5b50610a93611cb7565b604051610aa09190613f05565b60405180910390f35b610ac36004803603810190610abe9190613f27565b611d49565b005b348015610ad157600080fd5b50610aec6004803603810190610ae79190614382565b611f9f565b005b348015610afa57600080fd5b50610b156004803603810190610b109190614463565b612120565b005b348015610b2357600080fd5b50610b3e6004803603810190610b3991906144e6565b61217c565b005b348015610b4c57600080fd5b50610b55612232565b604051610b629190613c38565b60405180910390f35b348015610b7757600080fd5b50610b926004803603810190610b8d9190613f27565b612238565b005b348015610ba057600080fd5b50610ba961224a565b604051610bb69190613f05565b60405180910390f35b348015610bcb57600080fd5b50610be66004803603810190610be19190613f27565b6122d8565b604051610bf39190613f05565b60405180910390f35b348015610c0857600080fd5b50610c236004803603810190610c1e9190613f27565b612431565b005b348015610c3157600080fd5b50610c3a612443565b604051610c479190613c38565b60405180910390f35b348015610c5c57600080fd5b50610c65612449565b604051610c729190613c38565b60405180910390f35b348015610c8757600080fd5b50610c9061244f565b604051610c9d9190613c38565b60405180910390f35b348015610cb257600080fd5b50610ccd6004803603810190610cc891906142e0565b612455565b005b348015610cdb57600080fd5b50610cf66004803603810190610cf19190613f27565b612477565b005b348015610d0457600080fd5b50610d1f6004803603810190610d1a9190614526565b612489565b604051610d2c9190613d07565b60405180910390f35b348015610d4157600080fd5b50610d5c6004803603810190610d579190613f27565b61251d565b005b348015610d6a57600080fd5b50610d856004803603810190610d8091906142e0565b61252f565b005b348015610d9357600080fd5b50610dae6004803603810190610da991906140a3565b612551565b005b348015610dbc57600080fd5b50610dd76004803603810190610dd29190613d4e565b6125d5565b005b348015610de557600080fd5b50610e006004803603810190610dfb9190613d4e565b6125fa565b005b60115481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ed357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610f3b57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610f4b5750610f4a8261261f565b5b9050919050565b610f5a612689565b80601460006101000a81548160ff02191690831515021790555050565b601460009054906101000a900460ff1615610fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbe906145b2565b60405180910390fd5b601460029054906101000a900460ff16611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d9061461e565b60405180910390fd5b61108a828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506015543360405160200161106f9190614686565b60405160208183030381529060405280519060200120612707565b6110c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c0906146ed565b60405180910390fd5b60006110d361157b565b905060006110e76110e261271e565b611b0d565b905060115485826110f8919061473c565b1115611139576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113090614804565b60405180910390fd5b6000851161117c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117390614896565b60405180910390fd5b6013548511156111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b890614902565b60405180910390fd5b600f5485836111d0919061473c565b1115611211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120890614994565b60405180910390fd5b84600d5461121f91906149b4565b341015611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890614a5a565b60405180910390fd5b61127261126c61271e565b86612726565b5050505050565b60606001805461128890614aa9565b80601f01602080910402602001604051908101604052809291908181526020018280546112b490614aa9565b80156113015780601f106112d657610100808354040283529160200191611301565b820191906000526020600020905b8154815290600101906020018083116112e457829003601f168201915b5050505050905090565b600061131682612744565b611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c90614b4d565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b805461139d90614aa9565b80601f01602080910402602001604051908101604052809291908181526020018280546113c990614aa9565b80156114165780601f106113eb57610100808354040283529160200191611416565b820191906000526020600020905b8154815290600101906020018083116113f957829003601f168201915b505050505081565b600061142982611a11565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149190614bdf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166114b961271e565b73ffffffffffffffffffffffffffffffffffffffff1614806114e857506114e7816114e261271e565b612489565b5b611527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151e90614c71565b60405180910390fd5b611532838383612751565b505050565b600f5481565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b611571612689565b80600e8190555050565b6000600160005461158c9190614c91565b905090565b611599612689565b8060128190555050565b6115ae838383612803565b505050565b60155481565b60006115c483611b0d565b8210611605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fc90614d37565b60405180910390fd5b600061160f61157b565b905060008060005b83811015611775576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461170957806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561176157868414156117525781955050505050506117b1565b838061175d90614d57565b9450505b50808061176d90614d57565b915050611617565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a890614e12565b60405180910390fd5b92915050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601460039054906101000a900460ff1681565b6117f8612689565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161181e90614e63565b60006040518083038185875af1925050503d806000811461185b576040519150601f19603f3d011682016040523d82523d6000602084013e611860565b606091505b505090508061186e57600080fd5b50565b61188c83838360405180602001604052806000815250612120565b505050565b6060600061189e83611b0d565b905060008167ffffffffffffffff8111156118bc576118bb6141b5565b5b6040519080825280602002602001820160405280156118ea5781602001602082028036833780820191505090505b50905060005b828110156119345761190285826115b9565b82828151811061191557611914614e78565b5b602002602001018181525050808061192c90614d57565b9150506118f0565b508092505050919050565b611947612689565b80600c8190555050565b611959612689565b80600f8190555050565b600061196d61157b565b82106119ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a590614f19565b60405180910390fd5b819050919050565b601460019054906101000a900460ff1681565b6119d1612689565b80600990805190602001906119e7929190613b42565b5050565b601460029054906101000a900460ff1681565b601460009054906101000a900460ff1681565b6000611a1c82612dbc565b600001519050919050565b611a2f612689565b80601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60098054611a8090614aa9565b80601f0160208091040260200160405190810160405280929190818152602001828054611aac90614aa9565b8015611af95780601f10611ace57610100808354040283529160200191611af9565b820191906000526020600020905b815481529060010190602001808311611adc57829003601f168201915b505050505081565b600d5481565b60135481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7590614fab565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611bfe612689565b611c086000612f17565b565b611c12612689565b8060158190555050565b611c24612689565b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c9a612689565b80601460016101000a81548160ff02191690831515021790555050565b606060028054611cc690614aa9565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf290614aa9565b8015611d3f5780601f10611d1457610100808354040283529160200191611d3f565b820191906000526020600020905b815481529060010190602001808311611d2257829003601f168201915b5050505050905090565b601460009054906101000a900460ff1615611d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d909061503d565b60405180910390fd5b601460039054906101000a900460ff16611de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddf906150cf565b60405180910390fd5b6000611df261157b565b90506000611e06611e0161271e565b611b0d565b905060008311611e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4290614896565b60405180910390fd5b601354831115611e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8790615161565b60405180910390fd5b600e548383611e9f919061473c565b1115611ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed7906151cd565b60405180910390fd5b6010548382611eef919061473c565b1115611f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2790614804565b60405180910390fd5b82600c54611f3e91906149b4565b341015611f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7790614a5a565b60405180910390fd5b611f8934612fdd565b611f9a611f9461271e565b84612726565b505050565b611fa761271e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200c90615239565b60405180910390fd5b806006600061202261271e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120cf61271e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121149190613d07565b60405180910390a35050565b61212b848484612803565b612137848484846131ba565b612176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216d906152cb565b60405180910390fd5b50505050565b612184612689565b600082116121c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121be90615337565b60405180910390fd5b60006121d161157b565b9050600e5483826121e2919061473c565b1115612223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221a906153a3565b60405180910390fd5b61222d8284612726565b505050565b60105481565b612240612689565b8060118190555050565b600a805461225790614aa9565b80601f016020809104026020016040519081016040528092919081815260200182805461228390614aa9565b80156122d05780601f106122a5576101008083540402835291602001916122d0565b820191906000526020600020905b8154815290600101906020018083116122b357829003601f168201915b505050505081565b60606122e382612744565b612322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231990615435565b60405180910390fd5b60001515601460019054906101000a900460ff16151514156123d057600b805461234b90614aa9565b80601f016020809104026020016040519081016040528092919081815260200182805461237790614aa9565b80156123c45780601f10612399576101008083540402835291602001916123c4565b820191906000526020600020905b8154815290600101906020018083116123a757829003601f168201915b5050505050905061242c565b60006123da613342565b905060008151116123fa5760405180602001604052806000815250612428565b80612404846133d4565b600a60405160200161241893929190615525565b6040516020818303038152906040525b9150505b919050565b612439612689565b8060138190555050565b600e5481565b60075481565b60125481565b61245d612689565b80600a9080519060200190612473929190613b42565b5050565b61247f612689565b8060108190555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612525612689565b80600d8190555050565b612537612689565b80600b908051906020019061254d929190613b42565b5050565b612559612689565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c0906155c8565b60405180910390fd5b6125d281612f17565b50565b6125dd612689565b80601460036101000a81548160ff02191690831515021790555050565b612602612689565b80601460026101000a81548160ff02191690831515021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61269161271e565b73ffffffffffffffffffffffffffffffffffffffff166126af611c68565b73ffffffffffffffffffffffffffffffffffffffff1614612705576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fc90615634565b60405180910390fd5b565b60008261271485846134ac565b1490509392505050565b600033905090565b612740828260405180602001604052806000815250613502565b5050565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061280e82612dbc565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661283561271e565b73ffffffffffffffffffffffffffffffffffffffff161480612891575061285a61271e565b73ffffffffffffffffffffffffffffffffffffffff166128798461130b565b73ffffffffffffffffffffffffffffffffffffffff16145b806128ad57506128ac82600001516128a761271e565b612489565b5b9050806128ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e6906156c6565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295890615758565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156129d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c8906157ea565b60405180910390fd5b6129de858585600161397e565b6129ee6000848460000151612751565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612a5c9190615826565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612b00919061585a565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612c06919061473c565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612d4c57612c7c81612744565b15612d4b576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612db48686866001613984565b505050505050565b612dc4613bc8565b612dcd82612744565b612e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0390615912565b60405180910390fd5b60008290505b6000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612efe578092505050612f12565b508080612f0a90615932565b915050612e12565b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000605a606483612fee919061598b565b612ff891906149b4565b90506000600a60648461300b919061598b565b61301591906149b4565b90506000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360405161305f90614e63565b60006040518083038185875af1925050503d806000811461309c576040519150601f19603f3d011682016040523d82523d6000602084013e6130a1565b606091505b50509050806130e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130dc90615a2e565b60405180910390fd5b6000601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360405161312d90614e63565b60006040518083038185875af1925050503d806000811461316a576040519150601f19603f3d011682016040523d82523d6000602084013e61316f565b606091505b50509050806131b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131aa90615ac0565b60405180910390fd5b5050505050565b60006131db8473ffffffffffffffffffffffffffffffffffffffff1661398a565b15613335578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261320461271e565b8786866040518563ffffffff1660e01b81526004016132269493929190615b35565b6020604051808303816000875af192505050801561326257506040513d601f19601f8201168201806040525081019061325f9190615b96565b60015b6132e5573d8060008114613292576040519150601f19603f3d011682016040523d82523d6000602084013e613297565b606091505b506000815114156132dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d4906152cb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061333a565b600190505b949350505050565b60606009805461335190614aa9565b80601f016020809104026020016040519081016040528092919081815260200182805461337d90614aa9565b80156133ca5780601f1061339f576101008083540402835291602001916133ca565b820191906000526020600020905b8154815290600101906020018083116133ad57829003601f168201915b5050505050905090565b6060600060016133e3846139ad565b01905060008167ffffffffffffffff811115613402576134016141b5565b5b6040519080825280601f01601f1916602001820160405280156134345781602001600182028036833780820191505090505b509050600082602001820190505b6001156134a1578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161348b5761348a61595c565b5b049450600085141561349c576134a1565b613442565b819350505050919050565b60008082905060005b84518110156134f7576134e2828683815181106134d5576134d4614e78565b5b6020026020010151613b00565b915080806134ef90614d57565b9150506134b5565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356f90615c35565b60405180910390fd5b61358181612744565b156135c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b890615ca1565b60405180910390fd5b6135ce600085838661397e565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516136cb919061585a565b6fffffffffffffffffffffffffffffffff1681526020018583602001516136f2919061585a565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561396157818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461390160008884886131ba565b613940576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613937906152cb565b60405180910390fd5b818061394b90614d57565b925050808061395990614d57565b915050613890565b50806000819055506139766000878588613984565b505050505050565b50505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613a0b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613a0157613a0061595c565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613a48576d04ee2d6d415b85acef81000000008381613a3e57613a3d61595c565b5b0492506020810190505b662386f26fc100008310613a7757662386f26fc100008381613a6d57613a6c61595c565b5b0492506010810190505b6305f5e1008310613aa0576305f5e1008381613a9657613a9561595c565b5b0492506008810190505b6127108310613ac5576127108381613abb57613aba61595c565b5b0492506004810190505b60648310613ae85760648381613ade57613add61595c565b5b0492506002810190505b600a8310613af7576001810190505b80915050919050565b6000818310613b1857613b138284613b2b565b613b23565b613b228383613b2b565b5b905092915050565b600082600052816020526040600020905092915050565b828054613b4e90614aa9565b90600052602060002090601f016020900481019282613b705760008555613bb7565b82601f10613b8957805160ff1916838001178555613bb7565b82800160010185558215613bb7579182015b82811115613bb6578251825591602001919060010190613b9b565b5b509050613bc49190613c02565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613c1b576000816000905550600101613c03565b5090565b6000819050919050565b613c3281613c1f565b82525050565b6000602082019050613c4d6000830184613c29565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c9c81613c67565b8114613ca757600080fd5b50565b600081359050613cb981613c93565b92915050565b600060208284031215613cd557613cd4613c5d565b5b6000613ce384828501613caa565b91505092915050565b60008115159050919050565b613d0181613cec565b82525050565b6000602082019050613d1c6000830184613cf8565b92915050565b613d2b81613cec565b8114613d3657600080fd5b50565b600081359050613d4881613d22565b92915050565b600060208284031215613d6457613d63613c5d565b5b6000613d7284828501613d39565b91505092915050565b613d8481613c1f565b8114613d8f57600080fd5b50565b600081359050613da181613d7b565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613dcc57613dcb613da7565b5b8235905067ffffffffffffffff811115613de957613de8613dac565b5b602083019150836020820283011115613e0557613e04613db1565b5b9250929050565b600080600060408486031215613e2557613e24613c5d565b5b6000613e3386828701613d92565b935050602084013567ffffffffffffffff811115613e5457613e53613c62565b5b613e6086828701613db6565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ea6578082015181840152602081019050613e8b565b83811115613eb5576000848401525b50505050565b6000601f19601f8301169050919050565b6000613ed782613e6c565b613ee18185613e77565b9350613ef1818560208601613e88565b613efa81613ebb565b840191505092915050565b60006020820190508181036000830152613f1f8184613ecc565b905092915050565b600060208284031215613f3d57613f3c613c5d565b5b6000613f4b84828501613d92565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613f7f82613f54565b9050919050565b613f8f81613f74565b82525050565b6000602082019050613faa6000830184613f86565b92915050565b613fb981613f74565b8114613fc457600080fd5b50565b600081359050613fd681613fb0565b92915050565b60008060408385031215613ff357613ff2613c5d565b5b600061400185828601613fc7565b925050602061401285828601613d92565b9150509250929050565b60008060006060848603121561403557614034613c5d565b5b600061404386828701613fc7565b935050602061405486828701613fc7565b925050604061406586828701613d92565b9150509250925092565b6000819050919050565b6140828161406f565b82525050565b600060208201905061409d6000830184614079565b92915050565b6000602082840312156140b9576140b8613c5d565b5b60006140c784828501613fc7565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61410581613c1f565b82525050565b600061411783836140fc565b60208301905092915050565b6000602082019050919050565b600061413b826140d0565b61414581856140db565b9350614150836140ec565b8060005b83811015614181578151614168888261410b565b975061417383614123565b925050600181019050614154565b5085935050505092915050565b600060208201905081810360008301526141a88184614130565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6141ed82613ebb565b810181811067ffffffffffffffff8211171561420c5761420b6141b5565b5b80604052505050565b600061421f613c53565b905061422b82826141e4565b919050565b600067ffffffffffffffff82111561424b5761424a6141b5565b5b61425482613ebb565b9050602081019050919050565b82818337600083830152505050565b600061428361427e84614230565b614215565b90508281526020810184848401111561429f5761429e6141b0565b5b6142aa848285614261565b509392505050565b600082601f8301126142c7576142c6613da7565b5b81356142d7848260208601614270565b91505092915050565b6000602082840312156142f6576142f5613c5d565b5b600082013567ffffffffffffffff81111561431457614313613c62565b5b614320848285016142b2565b91505092915050565b6143328161406f565b811461433d57600080fd5b50565b60008135905061434f81614329565b92915050565b60006020828403121561436b5761436a613c5d565b5b600061437984828501614340565b91505092915050565b6000806040838503121561439957614398613c5d565b5b60006143a785828601613fc7565b92505060206143b885828601613d39565b9150509250929050565b600067ffffffffffffffff8211156143dd576143dc6141b5565b5b6143e682613ebb565b9050602081019050919050565b6000614406614401846143c2565b614215565b905082815260208101848484011115614422576144216141b0565b5b61442d848285614261565b509392505050565b600082601f83011261444a57614449613da7565b5b813561445a8482602086016143f3565b91505092915050565b6000806000806080858703121561447d5761447c613c5d565b5b600061448b87828801613fc7565b945050602061449c87828801613fc7565b93505060406144ad87828801613d92565b925050606085013567ffffffffffffffff8111156144ce576144cd613c62565b5b6144da87828801614435565b91505092959194509250565b600080604083850312156144fd576144fc613c5d565b5b600061450b85828601613d92565b925050602061451c85828601613fc7565b9150509250929050565b6000806040838503121561453d5761453c613c5d565b5b600061454b85828601613fc7565b925050602061455c85828601613fc7565b9150509250929050565b7f524f4f4b3a206f6f707320636f6e747261637420697320706175736564000000600082015250565b600061459c601d83613e77565b91506145a782614566565b602082019050919050565b600060208201905081810360008301526145cb8161458f565b9050919050565b7f524f4f4b3a2050726573616c65204861736e2774207374617274656420796574600082015250565b6000614608602083613e77565b9150614613826145d2565b602082019050919050565b60006020820190508181036000830152614637816145fb565b9050919050565b60008160601b9050919050565b60006146568261463e565b9050919050565b60006146688261464b565b9050919050565b61468061467b82613f74565b61465d565b82525050565b6000614692828461466f565b60148201915081905092915050565b7f524f4f4b3a20596f7520617265206e6f742057686974656c6973746564000000600082015250565b60006146d7601d83613e77565b91506146e2826146a1565b602082019050919050565b60006020820190508181036000830152614706816146ca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061474782613c1f565b915061475283613c1f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147875761478661470d565b5b828201905092915050565b7f524f4f4b3a204d6178204e4654205065722057616c6c6574206578636565646560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b60006147ee602183613e77565b91506147f982614792565b604082019050919050565b6000602082019050818103600083015261481d816147e1565b9050919050565b7f524f4f4b3a206e65656420746f206d696e74206174206c656173742031204e4660008201527f5400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614880602183613e77565b915061488b82614824565b604082019050919050565b600060208201905081810360008301526148af81614873565b9050919050565b7f524f4f4b3a206d6178206d696e74207065722054782065786365656465640000600082015250565b60006148ec601e83613e77565b91506148f7826148b6565b602082019050919050565b6000602082019050818103600083015261491b816148df565b9050919050565b7f524f4f4b3a2057686974656c697374204d6178537570706c792065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b600061497e602283613e77565b915061498982614922565b604082019050919050565b600060208201905081810360008301526149ad81614971565b9050919050565b60006149bf82613c1f565b91506149ca83613c1f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a0357614a0261470d565b5b828202905092915050565b7f524f4f4b3a20696e73756666696369656e742066756e64730000000000000000600082015250565b6000614a44601883613e77565b9150614a4f82614a0e565b602082019050919050565b60006020820190508181036000830152614a7381614a37565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614ac157607f821691505b60208210811415614ad557614ad4614a7a565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000614b37602d83613e77565b9150614b4282614adb565b604082019050919050565b60006020820190508181036000830152614b6681614b2a565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bc9602283613e77565b9150614bd482614b6d565b604082019050919050565b60006020820190508181036000830152614bf881614bbc565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000614c5b603983613e77565b9150614c6682614bff565b604082019050919050565b60006020820190508181036000830152614c8a81614c4e565b9050919050565b6000614c9c82613c1f565b9150614ca783613c1f565b925082821015614cba57614cb961470d565b5b828203905092915050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000614d21602283613e77565b9150614d2c82614cc5565b604082019050919050565b60006020820190508181036000830152614d5081614d14565b9050919050565b6000614d6282613c1f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d9557614d9461470d565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000614dfc602e83613e77565b9150614e0782614da0565b604082019050919050565b60006020820190508181036000830152614e2b81614def565b9050919050565b600081905092915050565b50565b6000614e4d600083614e32565b9150614e5882614e3d565b600082019050919050565b6000614e6e82614e40565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614f03602383613e77565b9150614f0e82614ea7565b604082019050919050565b60006020820190508181036000830152614f3281614ef6565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614f95602b83613e77565b9150614fa082614f39565b604082019050919050565b60006020820190508181036000830152614fc481614f88565b9050919050565b7f524f4f4b3a204f6f70732120436f6e74726163742069732063757272656e746c60008201527f7920706175736564000000000000000000000000000000000000000000000000602082015250565b6000615027602883613e77565b915061503282614fcb565b604082019050919050565b600060208201905081810360008301526150568161501a565b9050919050565b7f524f4f4b3a205075626c69632073616c6520686173206e6f742073746172746560008201527f6420796574000000000000000000000000000000000000000000000000000000602082015250565b60006150b9602583613e77565b91506150c48261505d565b604082019050919050565b600060208201905081810360008301526150e8816150ac565b9050919050565b7f524f4f4b3a206d6178206d696e7420616d6f756e74207065722074782065786360008201527f6565646564000000000000000000000000000000000000000000000000000000602082015250565b600061514b602583613e77565b9150615156826150ef565b604082019050919050565b6000602082019050818103600083015261517a8161513e565b9050919050565b7f524f4f4b3a20576520536f6c646f757400000000000000000000000000000000600082015250565b60006151b7601083613e77565b91506151c282615181565b602082019050919050565b600060208201905081810360008301526151e6816151aa565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000615223601a83613e77565b915061522e826151ed565b602082019050919050565b6000602082019050818103600083015261525281615216565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b60006152b5603383613e77565b91506152c082615259565b604082019050919050565b600060208201905081810360008301526152e4816152a8565b9050919050565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b6000615321601b83613e77565b915061532c826152eb565b602082019050919050565b6000602082019050818103600083015261535081615314565b9050919050565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b600061538d601683613e77565b915061539882615357565b602082019050919050565b600060208201905081810360008301526153bc81615380565b9050919050565b7f455243373231414d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b600061541f603083613e77565b915061542a826153c3565b604082019050919050565b6000602082019050818103600083015261544e81615412565b9050919050565b600081905092915050565b600061546b82613e6c565b6154758185615455565b9350615485818560208601613e88565b80840191505092915050565b60008190508160005260206000209050919050565b600081546154b381614aa9565b6154bd8186615455565b945060018216600081146154d857600181146154e95761551c565b60ff1983168652818601935061551c565b6154f285615491565b60005b83811015615514578154818901526001820191506020810190506154f5565b838801955050505b50505092915050565b60006155318286615460565b915061553d8285615460565b915061554982846154a6565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006155b2602683613e77565b91506155bd82615556565b604082019050919050565b600060208201905081810360008301526155e1816155a5565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061561e602083613e77565b9150615629826155e8565b602082019050919050565b6000602082019050818103600083015261564d81615611565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006156b0603283613e77565b91506156bb82615654565b604082019050919050565b600060208201905081810360008301526156df816156a3565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000615742602683613e77565b915061574d826156e6565b604082019050919050565b6000602082019050818103600083015261577181615735565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006157d4602583613e77565b91506157df82615778565b604082019050919050565b60006020820190508181036000830152615803816157c7565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b60006158318261580a565b915061583c8361580a565b92508282101561584f5761584e61470d565b5b828203905092915050565b60006158658261580a565b91506158708361580a565b9250826fffffffffffffffffffffffffffffffff038211156158955761589461470d565b5b828201905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006158fc602a83613e77565b9150615907826158a0565b604082019050919050565b6000602082019050818103600083015261592b816158ef565b9050919050565b600061593d82613c1f565b915060008214156159515761595061470d565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061599682613c1f565b91506159a183613c1f565b9250826159b1576159b061595c565b5b828204905092915050565b7f524f4f4b3a205472616e7366657220746f205265636965766572204f6e65204660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b6000615a18602583613e77565b9150615a23826159bc565b604082019050919050565b60006020820190508181036000830152615a4781615a0b565b9050919050565b7f524f4f4b3a205472616e7366657220746f2052656369657665722054776f204660008201527f61696c6564000000000000000000000000000000000000000000000000000000602082015250565b6000615aaa602583613e77565b9150615ab582615a4e565b604082019050919050565b60006020820190508181036000830152615ad981615a9d565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615b0782615ae0565b615b118185615aeb565b9350615b21818560208601613e88565b615b2a81613ebb565b840191505092915050565b6000608082019050615b4a6000830187613f86565b615b576020830186613f86565b615b646040830185613c29565b8181036060830152615b768184615afc565b905095945050505050565b600081519050615b9081613c93565b92915050565b600060208284031215615bac57615bab613c5d565b5b6000615bba84828501615b81565b91505092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615c1f602183613e77565b9150615c2a82615bc3565b604082019050919050565b60006020820190508181036000830152615c4e81615c12565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000615c8b601d83613e77565b9150615c9682615c55565b602082019050919050565b60006020820190508181036000830152615cba81615c7e565b905091905056fea264697066735822122021fd4ef24689611e81116a24285b50cd97d4f6b4f58da6f938127b8efae38d0364736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _initBaseURI (string):
Arg [1] : _initNotRevealedUri (string):
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
70609:6780:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70985:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58179:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76942:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73267:858;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59916:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61441:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70752:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61004:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70897:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71528:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70785:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76382:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56739:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76096:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62291:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71284:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57371:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71417:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71249:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77228:158;;;:::i;:::-;;62496:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74516:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76198:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76484:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56906:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71185:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76582:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71218:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71155:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59739:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75581:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70683:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70822:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71104:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58605:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34614:103;;;;;;;;;;;;;:::i;:::-;;75688:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75474:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33966:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75390:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60071:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71948:722;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61709:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62716:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74194:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70931:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75900:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70710:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74870:498;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76002:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70861:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67049:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71044:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76686:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75800:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62046:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76286:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76816:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34872:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77121:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77023:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70985:33;;;;:::o;58179:370::-;58306:4;58351:25;58336:40;;;:11;:40;;;;:99;;;;58402:33;58387:48;;;:11;:48;;;;58336:99;:160;;;;58461:35;58446:50;;;:11;:50;;;;58336:160;:207;;;;58507:36;58531:11;58507:23;:36::i;:::-;58336:207;58322:221;;58179:370;;;:::o;76942:73::-;33852:13;:11;:13::i;:::-;77003:6:::1;76994;;:15;;;;;;;;;;;;;;;;;;76942:73:::0;:::o;73267:858::-;73368:6;;;;;;;;;;;73367:7;73359:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;73423:7;;;;;;;;;;;73415:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;73482:84;73501:11;;73482:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73514:10;;73553;73536:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;73526:39;;;;;;73482:18;:84::i;:::-;73474:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;73607:14;73624:13;:11;:13::i;:::-;73607:30;;73644:23;73670;73680:12;:10;:12::i;:::-;73670:9;:23::i;:::-;73644:49;;73736:14;;73726:6;73708:15;:24;;;;:::i;:::-;:42;;73700:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;73812:1;73803:6;:10;73795:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;73876:7;;73866:6;:17;;73858:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;73952:8;;73942:6;73933;:15;;;;:::i;:::-;:27;;73925:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;74036:6;74027;;:15;;;;:::i;:::-;74014:9;:28;;74006:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;74082:31;74092:12;:10;:12::i;:::-;74106:6;74082:9;:31::i;:::-;73352:773;;73267:858;;;:::o;59916:94::-;59970:13;59999:5;59992:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59916:94;:::o;61441:204::-;61509:7;61533:16;61541:7;61533;:16::i;:::-;61525:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;61615:15;:24;61631:7;61615:24;;;;;;;;;;;;;;;;;;;;;61608:31;;61441:204;;;:::o;70752:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61004:379::-;61073:13;61089:24;61105:7;61089:15;:24::i;:::-;61073:40;;61134:5;61128:11;;:2;:11;;;;61120:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;61219:5;61203:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;61228:37;61245:5;61252:12;:10;:12::i;:::-;61228:16;:37::i;:::-;61203:62;61187:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;61349:28;61358:2;61362:7;61371:5;61349:8;:28::i;:::-;61066:317;61004:379;;:::o;70897:29::-;;;;:::o;71528:72::-;;;;;;;;;;;;;:::o;70785:32::-;;;;:::o;76382:94::-;33852:13;:11;:13::i;:::-;76460:10:::1;76448:9;:22;;;;76382:94:::0;:::o;56739:98::-;56792:7;56830:1;56815:12;;:16;;;;:::i;:::-;56808:23;;56739:98;:::o;76096:94::-;33852:13;:11;:13::i;:::-;76175:9:::1;76162:10;:22;;;;76096:94:::0;:::o;62291:142::-;62399:28;62409:4;62415:2;62419:7;62399:9;:28::i;:::-;62291:142;;;:::o;71284:94::-;;;;:::o;57371:744::-;57480:7;57515:16;57525:5;57515:9;:16::i;:::-;57507:5;:24;57499:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;57577:22;57602:13;:11;:13::i;:::-;57577:38;;57622:19;57652:25;57702:9;57697:350;57721:14;57717:1;:18;57697:350;;;57751:31;57785:11;:14;57797:1;57785:14;;;;;;;;;;;57751:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57838:1;57812:28;;:9;:14;;;:28;;;57808:89;;57873:9;:14;;;57853:34;;57808:89;57930:5;57909:26;;:17;:26;;;57905:135;;;57967:5;57952:11;:20;57948:59;;;57994:1;57987:8;;;;;;;;;57948:59;58017:13;;;;;:::i;:::-;;;;57905:135;57742:305;57737:3;;;;;:::i;:::-;;;;57697:350;;;;58053:56;;;;;;;;;;:::i;:::-;;;;;;;;57371:744;;;;;:::o;71417:72::-;;;;;;;;;;;;;:::o;71249:30::-;;;;;;;;;;;;;:::o;77228:158::-;33852:13;:11;:13::i;:::-;77281:12:::1;77307:10;77299:24;;77331:21;77299:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77280:77;;;77372:7;77364:16;;;::::0;::::1;;77273:113;77228:158::o:0;62496:157::-;62608:39;62625:4;62631:2;62635:7;62608:39;;;;;;;;;;;;:16;:39::i;:::-;62496:157;;;:::o;74516:348::-;74591:16;74619:23;74645:17;74655:6;74645:9;:17::i;:::-;74619:43;;74669:25;74711:15;74697:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74669:58;;74739:9;74734:103;74754:15;74750:1;:19;74734:103;;;74799:30;74819:6;74827:1;74799:19;:30::i;:::-;74785:8;74794:1;74785:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;74771:3;;;;;:::i;:::-;;;;74734:103;;;;74850:8;74843:15;;;;74516:348;;;:::o;76198:80::-;33852:13;:11;:13::i;:::-;76264:8:::1;76257:4;:15;;;;76198:80:::0;:::o;76484:92::-;33852:13;:11;:13::i;:::-;76560:10:::1;76549:8;:21;;;;76484:92:::0;:::o;56906:177::-;56973:7;57005:13;:11;:13::i;:::-;56997:5;:21;56989:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;57072:5;57065:12;;56906:177;;;:::o;71185:28::-;;;;;;;;;;;;;:::o;76582:98::-;33852:13;:11;:13::i;:::-;76663:11:::1;76653:7;:21;;;;;;;;;;;;:::i;:::-;;76582:98:::0;:::o;71218:26::-;;;;;;;;;;;;;:::o;71155:25::-;;;;;;;;;;;;;:::o;59739:118::-;59803:7;59826:20;59838:7;59826:11;:20::i;:::-;:25;;;59819:32;;59739:118;;;:::o;75581:103::-;33852:13;:11;:13::i;:::-;75669:9:::1;75654:12;;:24;;;;;;;;;;;;;;;;;;75581:103:::0;:::o;70683:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;70822:34::-;;;;:::o;71104:26::-;;;;:::o;58605:211::-;58669:7;58710:1;58693:19;;:5;:19;;;;58685:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;58782:12;:19;58795:5;58782:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;58774:36;;58767:43;;58605:211;;;:::o;34614:103::-;33852:13;:11;:13::i;:::-;34679:30:::1;34706:1;34679:18;:30::i;:::-;34614:103::o:0;75688:104::-;33852:13;:11;:13::i;:::-;75775:11:::1;75762:10;:24;;;;75688:104:::0;:::o;75474:103::-;33852:13;:11;:13::i;:::-;75562:9:::1;75547:12;;:24;;;;;;;;;;;;;;;;;;75474:103:::0;:::o;33966:87::-;34012:7;34039:6;;;;;;;;;;;34032:13;;33966:87;:::o;75390:78::-;33852:13;:11;:13::i;:::-;75456:6:::1;75445:8;;:17;;;;;;;;;;;;;;;;;;75390:78:::0;:::o;60071:98::-;60127:13;60156:7;60149:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60071:98;:::o;71948:722::-;72009:6;;;;;;;;;;;72008:7;72000:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;72075:10;;;;;;;;;;;72067:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;72134:14;72151:13;:11;:13::i;:::-;72134:30;;72171:23;72197;72207:12;:10;:12::i;:::-;72197:9;:23::i;:::-;72171:49;;72244:1;72235:6;:10;72227:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;72308:7;;72298:6;:17;;72290:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;72391:9;;72381:6;72372;:15;;;;:::i;:::-;:28;;72364:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;72464:12;;72454:6;72436:15;:24;;;;:::i;:::-;:40;;72428:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;72549:6;72542:4;;:13;;;;:::i;:::-;72529:9;:26;;72521:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;72593:25;72608:9;72593:14;:25::i;:::-;72627:31;72637:12;:10;:12::i;:::-;72651:6;72627:9;:31::i;:::-;71993:677;;71948:722;:::o;61709:274::-;61812:12;:10;:12::i;:::-;61800:24;;:8;:24;;;;61792:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;61909:8;61864:18;:32;61883:12;:10;:12::i;:::-;61864:32;;;;;;;;;;;;;;;:42;61897:8;61864:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;61958:8;61929:48;;61944:12;:10;:12::i;:::-;61929:48;;;61968:8;61929:48;;;;;;:::i;:::-;;;;;;;;61709:274;;:::o;62716:311::-;62853:28;62863:4;62869:2;62873:7;62853:9;:28::i;:::-;62904:48;62927:4;62933:2;62937:7;62946:5;62904:22;:48::i;:::-;62888:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;62716:311;;;;:::o;74194:308::-;33852:13;:11;:13::i;:::-;74299:1:::1;74285:11;:15;74277:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;74339:14;74356:13;:11;:13::i;:::-;74339:30;;74408:9;;74393:11;74384:6;:20;;;;:::i;:::-;:33;;74376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74455:35;74465:11;74478;74455:9;:35::i;:::-;74270:232;74194:308:::0;;:::o;70931:31::-;;;;:::o;75900:96::-;33852:13;:11;:13::i;:::-;75984:6:::1;75967:14;:23;;;;75900:96:::0;:::o;70710:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;74870:498::-;74968:13;75009:16;75017:7;75009;:16::i;:::-;74993:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;75119:5;75107:17;;:8;;;;;;;;;;;:17;;;75104:62;;;75144:14;75137:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75104:62;75174:28;75205:10;:8;:10::i;:::-;75174:41;;75260:1;75235:14;75229:28;:32;:133;;;;;;;;;;;;;;;;;75297:14;75313:18;:7;:16;:18::i;:::-;75333:13;75280:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75229:133;75222:140;;;74870:498;;;;:::o;76002:86::-;33852:13;:11;:13::i;:::-;76074:8:::1;76064:7;:18;;;;76002:86:::0;:::o;70861:31::-;;;;:::o;67049:43::-;;;;:::o;71044:29::-;;;;:::o;76686:122::-;33852:13;:11;:13::i;:::-;76785:17:::1;76769:13;:33;;;;;;;;;;;;:::i;:::-;;76686:122:::0;:::o;75800:92::-;33852:13;:11;:13::i;:::-;75880:6:::1;75865:12;:21;;;;75800:92:::0;:::o;62046:186::-;62168:4;62191:18;:25;62210:5;62191:25;;;;;;;;;;;;;;;:35;62217:8;62191:35;;;;;;;;;;;;;;;;;;;;;;;;;62184:42;;62046:186;;;;:::o;76286:88::-;33852:13;:11;:13::i;:::-;76358:10:::1;76349:6;:19;;;;76286:88:::0;:::o;76816:120::-;33852:13;:11;:13::i;:::-;76915:15:::1;76898:14;:32;;;;;;;;;;;;:::i;:::-;;76816:120:::0;:::o;34872:201::-;33852:13;:11;:13::i;:::-;34981:1:::1;34961:22;;:8;:22;;;;34953:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35037:28;35056:8;35037:18;:28::i;:::-;34872:201:::0;:::o;77121:96::-;33852:13;:11;:13::i;:::-;77203:6:::1;77190:10;;:19;;;;;;;;;;;;;;;;;;77121:96:::0;:::o;77023:90::-;33852:13;:11;:13::i;:::-;77099:6:::1;77089:7;;:16;;;;;;;;;;;;;;;;;;77023:90:::0;:::o;47695:157::-;47780:4;47819:25;47804:40;;;:11;:40;;;;47797:47;;47695:157;;;:::o;34131:132::-;34206:12;:10;:12::i;:::-;34195:23;;:7;:5;:7::i;:::-;:23;;;34187:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34131:132::o;1259:190::-;1384:4;1437;1408:25;1421:5;1428:4;1408:12;:25::i;:::-;:33;1401:40;;1259:190;;;;;:::o;32517:98::-;32570:7;32597:10;32590:17;;32517:98;:::o;63377:::-;63442:27;63452:2;63456:8;63442:27;;;;;;;;;;;;:9;:27::i;:::-;63377:98;;:::o;63266:105::-;63323:4;63353:12;;63343:7;:22;63336:29;;63266:105;;;:::o;66871:172::-;66995:2;66968:15;:24;66984:7;66968:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;67029:7;67025:2;67009:28;;67018:5;67009:28;;;;;;;;;;;;66871:172;;;:::o;65236:1529::-;65333:35;65371:20;65383:7;65371:11;:20::i;:::-;65333:58;;65400:22;65442:13;:18;;;65426:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;65495:12;:10;:12::i;:::-;65471:36;;:20;65483:7;65471:11;:20::i;:::-;:36;;;65426:81;:142;;;;65518:50;65535:13;:18;;;65555:12;:10;:12::i;:::-;65518:16;:50::i;:::-;65426:142;65400:169;;65594:17;65578:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;65726:4;65704:26;;:13;:18;;;:26;;;65688:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;65815:1;65801:16;;:2;:16;;;;65793:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;65868:43;65890:4;65896:2;65900:7;65909:1;65868:21;:43::i;:::-;65968:49;65985:1;65989:7;65998:13;:18;;;65968:8;:49::i;:::-;66056:1;66026:12;:18;66039:4;66026:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;66092:1;66064:12;:16;66077:2;66064:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;66123:43;;;;;;;;66138:2;66123:43;;;;;;66149:15;66123:43;;;;;66100:11;:20;66112:7;66100:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66394:19;66426:1;66416:7;:11;;;;:::i;:::-;66394:33;;66479:1;66438:43;;:11;:24;66450:11;66438:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;66434:236;;;66496:20;66504:11;66496:7;:20::i;:::-;66492:171;;;66556:97;;;;;;;;66583:13;:18;;;66556:97;;;;;;66614:13;:28;;;66556:97;;;;;66529:11;:24;66541:11;66529:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66492:171;66434:236;66702:7;66698:2;66683:27;;66692:4;66683:27;;;;;;;;;;;;66717:42;66738:4;66744:2;66748:7;66757:1;66717:20;:42::i;:::-;65326:1439;;;65236:1529;;;:::o;59068:617::-;59144:21;;:::i;:::-;59185:16;59193:7;59185;:16::i;:::-;59177:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;59407:12;59422:7;59407:22;;59402:186;59450:31;59484:11;:17;59496:4;59484:17;;;;;;;;;;;59450:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59540:1;59514:28;;:9;:14;;;:28;;;59510:71;;59562:9;59555:16;;;;;;59510:71;59441:147;59433:6;;;;;:::i;:::-;;;;59402:186;;59068:617;;;;:::o;35233:191::-;35307:16;35326:6;;;;;;;;;;;35307:25;;35352:8;35343:6;;:17;;;;;;;;;;;;;;;;;;35407:8;35376:40;;35397:8;35376:40;;;;;;;;;;;;35296:128;35233:191;:::o;72674:548::-;72735:26;72782:2;72775:3;72765:7;:13;;;;:::i;:::-;72764:20;;;;:::i;:::-;72735:49;;72795:26;72842:2;72835:3;72825:7;:13;;;;:::i;:::-;72824:20;;;;:::i;:::-;72795:49;;72856:15;72885:12;;;;;;;;;;;72877:26;;72925:18;72877:81;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72855:103;;;72977:10;72969:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;73041:15;73070:12;;;;;;;;;;;73062:26;;73110:18;73062:81;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73040:103;;;73162:10;73154:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;72724:498;;;;72674:548;:::o;68582:690::-;68719:4;68736:15;:2;:13;;;:15::i;:::-;68732:535;;;68791:2;68775:36;;;68812:12;:10;:12::i;:::-;68826:4;68832:7;68841:5;68775:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;68762:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69023:1;69006:6;:13;:18;69002:215;;;69039:61;;;;;;;;;;:::i;:::-;;;;;;;;69002:215;69185:6;69179:13;69170:6;69166:2;69162:15;69155:38;68762:464;68907:45;;;68897:55;;;:6;:55;;;;68890:62;;;;;68732:535;69255:4;69248:11;;68582:690;;;;;;;:::o;71827:102::-;71887:13;71916:7;71909:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71827:102;:::o;29944:716::-;30000:13;30051:14;30088:1;30068:17;30079:5;30068:10;:17::i;:::-;:21;30051:38;;30104:20;30138:6;30127:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30104:41;;30160:11;30289:6;30285:2;30281:15;30273:6;30269:28;30262:35;;30326:288;30333:4;30326:288;;;30358:5;;;;;;;;30500:8;30495:2;30488:5;30484:14;30479:30;30474:3;30466:44;30556:2;30547:11;;;;;;:::i;:::-;;;;;30590:1;30581:5;:10;30577:21;;;30593:5;;30577:21;30326:288;;;30635:6;30628:13;;;;;29944:716;;;:::o;2126:296::-;2209:7;2229:20;2252:4;2229:27;;2272:9;2267:118;2291:5;:12;2287:1;:16;2267:118;;;2340:33;2350:12;2364:5;2370:1;2364:8;;;;;;;;:::i;:::-;;;;;;;;2340:9;:33::i;:::-;2325:48;;2305:3;;;;;:::i;:::-;;;;2267:118;;;;2402:12;2395:19;;;2126:296;;;;:::o;63730:1274::-;63835:20;63858:12;;63835:35;;63899:1;63885:16;;:2;:16;;;;63877:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;64076:21;64084:12;64076:7;:21::i;:::-;64075:22;64067:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;64220:61;64250:1;64254:2;64258:12;64272:8;64220:21;:61::i;:::-;64290:30;64323:12;:16;64336:2;64323:16;;;;;;;;;;;;;;;64290:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64365:119;;;;;;;;64415:8;64385:11;:19;;;:39;;;;:::i;:::-;64365:119;;;;;;64468:8;64433:11;:24;;;:44;;;;:::i;:::-;64365:119;;;;;64346:12;:16;64359:2;64346:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64519:43;;;;;;;;64534:2;64519:43;;;;;;64545:15;64519:43;;;;;64491:11;:25;64503:12;64491:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64571:20;64594:12;64571:35;;64620:9;64615:281;64639:8;64635:1;:12;64615:281;;;64693:12;64689:2;64668:38;;64685:1;64668:38;;;;;;;;;;;;64733:59;64764:1;64768:2;64772:12;64786:5;64733:22;:59::i;:::-;64715:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;64874:14;;;;;:::i;:::-;;;;64649:3;;;;;:::i;:::-;;;;64615:281;;;;64919:12;64904;:27;;;;64938:60;64967:1;64971:2;64975:12;64989:8;64938:20;:60::i;:::-;63828:1176;;;63730:1274;;;:::o;69734:141::-;;;;;:::o;70261:140::-;;;;;:::o;36664:326::-;36724:4;36981:1;36959:7;:19;;;:23;36952:30;;36664:326;;;:::o;26810:922::-;26863:7;26883:14;26900:1;26883:18;;26950:6;26941:5;:15;26937:102;;26986:6;26977:15;;;;;;:::i;:::-;;;;;27021:2;27011:12;;;;26937:102;27066:6;27057:5;:15;27053:102;;27102:6;27093:15;;;;;;:::i;:::-;;;;;27137:2;27127:12;;;;27053:102;27182:6;27173:5;:15;27169:102;;27218:6;27209:15;;;;;;:::i;:::-;;;;;27253:2;27243:12;;;;27169:102;27298:5;27289;:14;27285:99;;27333:5;27324:14;;;;;;:::i;:::-;;;;;27367:1;27357:11;;;;27285:99;27411:5;27402;:14;27398:99;;27446:5;27437:14;;;;;;:::i;:::-;;;;;27480:1;27470:11;;;;27398:99;27524:5;27515;:14;27511:99;;27559:5;27550:14;;;;;;:::i;:::-;;;;;27593:1;27583:11;;;;27511:99;27637:5;27628;:14;27624:66;;27673:1;27663:11;;;;27624:66;27718:6;27711:13;;;26810:922;;;:::o;9166:149::-;9229:7;9260:1;9256;:5;:51;;9287:20;9302:1;9305;9287:14;:20::i;:::-;9256:51;;;9264:20;9279:1;9282;9264:14;:20::i;:::-;9256:51;9249:58;;9166:149;;;;:::o;9323:268::-;9391:13;9498:1;9492:4;9485:15;9527:1;9521:4;9514:15;9568:4;9562;9552:21;9543:30;;9323:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:116::-;2023:21;2038:5;2023:21;:::i;:::-;2016:5;2013:32;2003:60;;2059:1;2056;2049:12;2003:60;1953:116;:::o;2075:133::-;2118:5;2156:6;2143:20;2134:29;;2172:30;2196:5;2172:30;:::i;:::-;2075:133;;;;:::o;2214:323::-;2270:6;2319:2;2307:9;2298:7;2294:23;2290:32;2287:119;;;2325:79;;:::i;:::-;2287:119;2445:1;2470:50;2512:7;2503:6;2492:9;2488:22;2470:50;:::i;:::-;2460:60;;2416:114;2214:323;;;;:::o;2543:122::-;2616:24;2634:5;2616:24;:::i;:::-;2609:5;2606:35;2596:63;;2655:1;2652;2645:12;2596:63;2543:122;:::o;2671:139::-;2717:5;2755:6;2742:20;2733:29;;2771:33;2798:5;2771:33;:::i;:::-;2671:139;;;;:::o;2816:117::-;2925:1;2922;2915:12;2939:117;3048:1;3045;3038:12;3062:117;3171:1;3168;3161:12;3202:568;3275:8;3285:6;3335:3;3328:4;3320:6;3316:17;3312:27;3302:122;;3343:79;;:::i;:::-;3302:122;3456:6;3443:20;3433:30;;3486:18;3478:6;3475:30;3472:117;;;3508:79;;:::i;:::-;3472:117;3622:4;3614:6;3610:17;3598:29;;3676:3;3668:4;3660:6;3656:17;3646:8;3642:32;3639:41;3636:128;;;3683:79;;:::i;:::-;3636:128;3202:568;;;;;:::o;3776:704::-;3871:6;3879;3887;3936:2;3924:9;3915:7;3911:23;3907:32;3904:119;;;3942:79;;:::i;:::-;3904:119;4062:1;4087:53;4132:7;4123:6;4112:9;4108:22;4087:53;:::i;:::-;4077:63;;4033:117;4217:2;4206:9;4202:18;4189:32;4248:18;4240:6;4237:30;4234:117;;;4270:79;;:::i;:::-;4234:117;4383:80;4455:7;4446:6;4435:9;4431:22;4383:80;:::i;:::-;4365:98;;;;4160:313;3776:704;;;;;:::o;4486:99::-;4538:6;4572:5;4566:12;4556:22;;4486:99;;;:::o;4591:169::-;4675:11;4709:6;4704:3;4697:19;4749:4;4744:3;4740:14;4725:29;;4591:169;;;;:::o;4766:307::-;4834:1;4844:113;4858:6;4855:1;4852:13;4844:113;;;4943:1;4938:3;4934:11;4928:18;4924:1;4919:3;4915:11;4908:39;4880:2;4877:1;4873:10;4868:15;;4844:113;;;4975:6;4972:1;4969:13;4966:101;;;5055:1;5046:6;5041:3;5037:16;5030:27;4966:101;4815:258;4766:307;;;:::o;5079:102::-;5120:6;5171:2;5167:7;5162:2;5155:5;5151:14;5147:28;5137:38;;5079:102;;;:::o;5187:364::-;5275:3;5303:39;5336:5;5303:39;:::i;:::-;5358:71;5422:6;5417:3;5358:71;:::i;:::-;5351:78;;5438:52;5483:6;5478:3;5471:4;5464:5;5460:16;5438:52;:::i;:::-;5515:29;5537:6;5515:29;:::i;:::-;5510:3;5506:39;5499:46;;5279:272;5187:364;;;;:::o;5557:313::-;5670:4;5708:2;5697:9;5693:18;5685:26;;5757:9;5751:4;5747:20;5743:1;5732:9;5728:17;5721:47;5785:78;5858:4;5849:6;5785:78;:::i;:::-;5777:86;;5557:313;;;;:::o;5876:329::-;5935:6;5984:2;5972:9;5963:7;5959:23;5955:32;5952:119;;;5990:79;;:::i;:::-;5952:119;6110:1;6135:53;6180:7;6171:6;6160:9;6156:22;6135:53;:::i;:::-;6125:63;;6081:117;5876:329;;;;:::o;6211:126::-;6248:7;6288:42;6281:5;6277:54;6266:65;;6211:126;;;:::o;6343:96::-;6380:7;6409:24;6427:5;6409:24;:::i;:::-;6398:35;;6343:96;;;:::o;6445:118::-;6532:24;6550:5;6532:24;:::i;:::-;6527:3;6520:37;6445:118;;:::o;6569:222::-;6662:4;6700:2;6689:9;6685:18;6677:26;;6713:71;6781:1;6770:9;6766:17;6757:6;6713:71;:::i;:::-;6569:222;;;;:::o;6797:122::-;6870:24;6888:5;6870:24;:::i;:::-;6863:5;6860:35;6850:63;;6909:1;6906;6899:12;6850:63;6797:122;:::o;6925:139::-;6971:5;7009:6;6996:20;6987:29;;7025:33;7052:5;7025:33;:::i;:::-;6925:139;;;;:::o;7070:474::-;7138:6;7146;7195:2;7183:9;7174:7;7170:23;7166:32;7163:119;;;7201:79;;:::i;:::-;7163:119;7321:1;7346:53;7391:7;7382:6;7371:9;7367:22;7346:53;:::i;:::-;7336:63;;7292:117;7448:2;7474:53;7519:7;7510:6;7499:9;7495:22;7474:53;:::i;:::-;7464:63;;7419:118;7070:474;;;;;:::o;7550:619::-;7627:6;7635;7643;7692:2;7680:9;7671:7;7667:23;7663:32;7660:119;;;7698:79;;:::i;:::-;7660:119;7818:1;7843:53;7888:7;7879:6;7868:9;7864:22;7843:53;:::i;:::-;7833:63;;7789:117;7945:2;7971:53;8016:7;8007:6;7996:9;7992:22;7971:53;:::i;:::-;7961:63;;7916:118;8073:2;8099:53;8144:7;8135:6;8124:9;8120:22;8099:53;:::i;:::-;8089:63;;8044:118;7550:619;;;;;:::o;8175:77::-;8212:7;8241:5;8230:16;;8175:77;;;:::o;8258:118::-;8345:24;8363:5;8345:24;:::i;:::-;8340:3;8333:37;8258:118;;:::o;8382:222::-;8475:4;8513:2;8502:9;8498:18;8490:26;;8526:71;8594:1;8583:9;8579:17;8570:6;8526:71;:::i;:::-;8382:222;;;;:::o;8610:329::-;8669:6;8718:2;8706:9;8697:7;8693:23;8689:32;8686:119;;;8724:79;;:::i;:::-;8686:119;8844:1;8869:53;8914:7;8905:6;8894:9;8890:22;8869:53;:::i;:::-;8859:63;;8815:117;8610:329;;;;:::o;8945:114::-;9012:6;9046:5;9040:12;9030:22;;8945:114;;;:::o;9065:184::-;9164:11;9198:6;9193:3;9186:19;9238:4;9233:3;9229:14;9214:29;;9065:184;;;;:::o;9255:132::-;9322:4;9345:3;9337:11;;9375:4;9370:3;9366:14;9358:22;;9255:132;;;:::o;9393:108::-;9470:24;9488:5;9470:24;:::i;:::-;9465:3;9458:37;9393:108;;:::o;9507:179::-;9576:10;9597:46;9639:3;9631:6;9597:46;:::i;:::-;9675:4;9670:3;9666:14;9652:28;;9507:179;;;;:::o;9692:113::-;9762:4;9794;9789:3;9785:14;9777:22;;9692:113;;;:::o;9841:732::-;9960:3;9989:54;10037:5;9989:54;:::i;:::-;10059:86;10138:6;10133:3;10059:86;:::i;:::-;10052:93;;10169:56;10219:5;10169:56;:::i;:::-;10248:7;10279:1;10264:284;10289:6;10286:1;10283:13;10264:284;;;10365:6;10359:13;10392:63;10451:3;10436:13;10392:63;:::i;:::-;10385:70;;10478:60;10531:6;10478:60;:::i;:::-;10468:70;;10324:224;10311:1;10308;10304:9;10299:14;;10264:284;;;10268:14;10564:3;10557:10;;9965:608;;;9841:732;;;;:::o;10579:373::-;10722:4;10760:2;10749:9;10745:18;10737:26;;10809:9;10803:4;10799:20;10795:1;10784:9;10780:17;10773:47;10837:108;10940:4;10931:6;10837:108;:::i;:::-;10829:116;;10579:373;;;;:::o;10958:117::-;11067:1;11064;11057:12;11081:180;11129:77;11126:1;11119:88;11226:4;11223:1;11216:15;11250:4;11247:1;11240:15;11267:281;11350:27;11372:4;11350:27;:::i;:::-;11342:6;11338:40;11480:6;11468:10;11465:22;11444:18;11432:10;11429:34;11426:62;11423:88;;;11491:18;;:::i;:::-;11423:88;11531:10;11527:2;11520:22;11310:238;11267:281;;:::o;11554:129::-;11588:6;11615:20;;:::i;:::-;11605:30;;11644:33;11672:4;11664:6;11644:33;:::i;:::-;11554:129;;;:::o;11689:308::-;11751:4;11841:18;11833:6;11830:30;11827:56;;;11863:18;;:::i;:::-;11827:56;11901:29;11923:6;11901:29;:::i;:::-;11893:37;;11985:4;11979;11975:15;11967:23;;11689:308;;;:::o;12003:154::-;12087:6;12082:3;12077;12064:30;12149:1;12140:6;12135:3;12131:16;12124:27;12003:154;;;:::o;12163:412::-;12241:5;12266:66;12282:49;12324:6;12282:49;:::i;:::-;12266:66;:::i;:::-;12257:75;;12355:6;12348:5;12341:21;12393:4;12386:5;12382:16;12431:3;12422:6;12417:3;12413:16;12410:25;12407:112;;;12438:79;;:::i;:::-;12407:112;12528:41;12562:6;12557:3;12552;12528:41;:::i;:::-;12247:328;12163:412;;;;;:::o;12595:340::-;12651:5;12700:3;12693:4;12685:6;12681:17;12677:27;12667:122;;12708:79;;:::i;:::-;12667:122;12825:6;12812:20;12850:79;12925:3;12917:6;12910:4;12902:6;12898:17;12850:79;:::i;:::-;12841:88;;12657:278;12595:340;;;;:::o;12941:509::-;13010:6;13059:2;13047:9;13038:7;13034:23;13030:32;13027:119;;;13065:79;;:::i;:::-;13027:119;13213:1;13202:9;13198:17;13185:31;13243:18;13235:6;13232:30;13229:117;;;13265:79;;:::i;:::-;13229:117;13370:63;13425:7;13416:6;13405:9;13401:22;13370:63;:::i;:::-;13360:73;;13156:287;12941:509;;;;:::o;13456:122::-;13529:24;13547:5;13529:24;:::i;:::-;13522:5;13519:35;13509:63;;13568:1;13565;13558:12;13509:63;13456:122;:::o;13584:139::-;13630:5;13668:6;13655:20;13646:29;;13684:33;13711:5;13684:33;:::i;:::-;13584:139;;;;:::o;13729:329::-;13788:6;13837:2;13825:9;13816:7;13812:23;13808:32;13805:119;;;13843:79;;:::i;:::-;13805:119;13963:1;13988:53;14033:7;14024:6;14013:9;14009:22;13988:53;:::i;:::-;13978:63;;13934:117;13729:329;;;;:::o;14064:468::-;14129:6;14137;14186:2;14174:9;14165:7;14161:23;14157:32;14154:119;;;14192:79;;:::i;:::-;14154:119;14312:1;14337:53;14382:7;14373:6;14362:9;14358:22;14337:53;:::i;:::-;14327:63;;14283:117;14439:2;14465:50;14507:7;14498:6;14487:9;14483:22;14465:50;:::i;:::-;14455:60;;14410:115;14064:468;;;;;:::o;14538:307::-;14599:4;14689:18;14681:6;14678:30;14675:56;;;14711:18;;:::i;:::-;14675:56;14749:29;14771:6;14749:29;:::i;:::-;14741:37;;14833:4;14827;14823:15;14815:23;;14538:307;;;:::o;14851:410::-;14928:5;14953:65;14969:48;15010:6;14969:48;:::i;:::-;14953:65;:::i;:::-;14944:74;;15041:6;15034:5;15027:21;15079:4;15072:5;15068:16;15117:3;15108:6;15103:3;15099:16;15096:25;15093:112;;;15124:79;;:::i;:::-;15093:112;15214:41;15248:6;15243:3;15238;15214:41;:::i;:::-;14934:327;14851:410;;;;;:::o;15280:338::-;15335:5;15384:3;15377:4;15369:6;15365:17;15361:27;15351:122;;15392:79;;:::i;:::-;15351:122;15509:6;15496:20;15534:78;15608:3;15600:6;15593:4;15585:6;15581:17;15534:78;:::i;:::-;15525:87;;15341:277;15280:338;;;;:::o;15624:943::-;15719:6;15727;15735;15743;15792:3;15780:9;15771:7;15767:23;15763:33;15760:120;;;15799:79;;:::i;:::-;15760:120;15919:1;15944:53;15989:7;15980:6;15969:9;15965:22;15944:53;:::i;:::-;15934:63;;15890:117;16046:2;16072:53;16117:7;16108:6;16097:9;16093:22;16072:53;:::i;:::-;16062:63;;16017:118;16174:2;16200:53;16245:7;16236:6;16225:9;16221:22;16200:53;:::i;:::-;16190:63;;16145:118;16330:2;16319:9;16315:18;16302:32;16361:18;16353:6;16350:30;16347:117;;;16383:79;;:::i;:::-;16347:117;16488:62;16542:7;16533:6;16522:9;16518:22;16488:62;:::i;:::-;16478:72;;16273:287;15624:943;;;;;;;:::o;16573:474::-;16641:6;16649;16698:2;16686:9;16677:7;16673:23;16669:32;16666:119;;;16704:79;;:::i;:::-;16666:119;16824:1;16849:53;16894:7;16885:6;16874:9;16870:22;16849:53;:::i;:::-;16839:63;;16795:117;16951:2;16977:53;17022:7;17013:6;17002:9;16998:22;16977:53;:::i;:::-;16967:63;;16922:118;16573:474;;;;;:::o;17053:::-;17121:6;17129;17178:2;17166:9;17157:7;17153:23;17149:32;17146:119;;;17184:79;;:::i;:::-;17146:119;17304:1;17329:53;17374:7;17365:6;17354:9;17350:22;17329:53;:::i;:::-;17319:63;;17275:117;17431:2;17457:53;17502:7;17493:6;17482:9;17478:22;17457:53;:::i;:::-;17447:63;;17402:118;17053:474;;;;;:::o;17533:179::-;17673:31;17669:1;17661:6;17657:14;17650:55;17533:179;:::o;17718:366::-;17860:3;17881:67;17945:2;17940:3;17881:67;:::i;:::-;17874:74;;17957:93;18046:3;17957:93;:::i;:::-;18075:2;18070:3;18066:12;18059:19;;17718:366;;;:::o;18090:419::-;18256:4;18294:2;18283:9;18279:18;18271:26;;18343:9;18337:4;18333:20;18329:1;18318:9;18314:17;18307:47;18371:131;18497:4;18371:131;:::i;:::-;18363:139;;18090:419;;;:::o;18515:182::-;18655:34;18651:1;18643:6;18639:14;18632:58;18515:182;:::o;18703:366::-;18845:3;18866:67;18930:2;18925:3;18866:67;:::i;:::-;18859:74;;18942:93;19031:3;18942:93;:::i;:::-;19060:2;19055:3;19051:12;19044:19;;18703:366;;;:::o;19075:419::-;19241:4;19279:2;19268:9;19264:18;19256:26;;19328:9;19322:4;19318:20;19314:1;19303:9;19299:17;19292:47;19356:131;19482:4;19356:131;:::i;:::-;19348:139;;19075:419;;;:::o;19500:94::-;19533:8;19581:5;19577:2;19573:14;19552:35;;19500:94;;;:::o;19600:::-;19639:7;19668:20;19682:5;19668:20;:::i;:::-;19657:31;;19600:94;;;:::o;19700:100::-;19739:7;19768:26;19788:5;19768:26;:::i;:::-;19757:37;;19700:100;;;:::o;19806:157::-;19911:45;19931:24;19949:5;19931:24;:::i;:::-;19911:45;:::i;:::-;19906:3;19899:58;19806:157;;:::o;19969:256::-;20081:3;20096:75;20167:3;20158:6;20096:75;:::i;:::-;20196:2;20191:3;20187:12;20180:19;;20216:3;20209:10;;19969:256;;;;:::o;20231:179::-;20371:31;20367:1;20359:6;20355:14;20348:55;20231:179;:::o;20416:366::-;20558:3;20579:67;20643:2;20638:3;20579:67;:::i;:::-;20572:74;;20655:93;20744:3;20655:93;:::i;:::-;20773:2;20768:3;20764:12;20757:19;;20416:366;;;:::o;20788:419::-;20954:4;20992:2;20981:9;20977:18;20969:26;;21041:9;21035:4;21031:20;21027:1;21016:9;21012:17;21005:47;21069:131;21195:4;21069:131;:::i;:::-;21061:139;;20788:419;;;:::o;21213:180::-;21261:77;21258:1;21251:88;21358:4;21355:1;21348:15;21382:4;21379:1;21372:15;21399:305;21439:3;21458:20;21476:1;21458:20;:::i;:::-;21453:25;;21492:20;21510:1;21492:20;:::i;:::-;21487:25;;21646:1;21578:66;21574:74;21571:1;21568:81;21565:107;;;21652:18;;:::i;:::-;21565:107;21696:1;21693;21689:9;21682:16;;21399:305;;;;:::o;21710:220::-;21850:34;21846:1;21838:6;21834:14;21827:58;21919:3;21914:2;21906:6;21902:15;21895:28;21710:220;:::o;21936:366::-;22078:3;22099:67;22163:2;22158:3;22099:67;:::i;:::-;22092:74;;22175:93;22264:3;22175:93;:::i;:::-;22293:2;22288:3;22284:12;22277:19;;21936:366;;;:::o;22308:419::-;22474:4;22512:2;22501:9;22497:18;22489:26;;22561:9;22555:4;22551:20;22547:1;22536:9;22532:17;22525:47;22589:131;22715:4;22589:131;:::i;:::-;22581:139;;22308:419;;;:::o;22733:220::-;22873:34;22869:1;22861:6;22857:14;22850:58;22942:3;22937:2;22929:6;22925:15;22918:28;22733:220;:::o;22959:366::-;23101:3;23122:67;23186:2;23181:3;23122:67;:::i;:::-;23115:74;;23198:93;23287:3;23198:93;:::i;:::-;23316:2;23311:3;23307:12;23300:19;;22959:366;;;:::o;23331:419::-;23497:4;23535:2;23524:9;23520:18;23512:26;;23584:9;23578:4;23574:20;23570:1;23559:9;23555:17;23548:47;23612:131;23738:4;23612:131;:::i;:::-;23604:139;;23331:419;;;:::o;23756:180::-;23896:32;23892:1;23884:6;23880:14;23873:56;23756:180;:::o;23942:366::-;24084:3;24105:67;24169:2;24164:3;24105:67;:::i;:::-;24098:74;;24181:93;24270:3;24181:93;:::i;:::-;24299:2;24294:3;24290:12;24283:19;;23942:366;;;:::o;24314:419::-;24480:4;24518:2;24507:9;24503:18;24495:26;;24567:9;24561:4;24557:20;24553:1;24542:9;24538:17;24531:47;24595:131;24721:4;24595:131;:::i;:::-;24587:139;;24314:419;;;:::o;24739:221::-;24879:34;24875:1;24867:6;24863:14;24856:58;24948:4;24943:2;24935:6;24931:15;24924:29;24739:221;:::o;24966:366::-;25108:3;25129:67;25193:2;25188:3;25129:67;:::i;:::-;25122:74;;25205:93;25294:3;25205:93;:::i;:::-;25323:2;25318:3;25314:12;25307:19;;24966:366;;;:::o;25338:419::-;25504:4;25542:2;25531:9;25527:18;25519:26;;25591:9;25585:4;25581:20;25577:1;25566:9;25562:17;25555:47;25619:131;25745:4;25619:131;:::i;:::-;25611:139;;25338:419;;;:::o;25763:348::-;25803:7;25826:20;25844:1;25826:20;:::i;:::-;25821:25;;25860:20;25878:1;25860:20;:::i;:::-;25855:25;;26048:1;25980:66;25976:74;25973:1;25970:81;25965:1;25958:9;25951:17;25947:105;25944:131;;;26055:18;;:::i;:::-;25944:131;26103:1;26100;26096:9;26085:20;;25763:348;;;;:::o;26117:174::-;26257:26;26253:1;26245:6;26241:14;26234:50;26117:174;:::o;26297:366::-;26439:3;26460:67;26524:2;26519:3;26460:67;:::i;:::-;26453:74;;26536:93;26625:3;26536:93;:::i;:::-;26654:2;26649:3;26645:12;26638:19;;26297:366;;;:::o;26669:419::-;26835:4;26873:2;26862:9;26858:18;26850:26;;26922:9;26916:4;26912:20;26908:1;26897:9;26893:17;26886:47;26950:131;27076:4;26950:131;:::i;:::-;26942:139;;26669:419;;;:::o;27094:180::-;27142:77;27139:1;27132:88;27239:4;27236:1;27229:15;27263:4;27260:1;27253:15;27280:320;27324:6;27361:1;27355:4;27351:12;27341:22;;27408:1;27402:4;27398:12;27429:18;27419:81;;27485:4;27477:6;27473:17;27463:27;;27419:81;27547:2;27539:6;27536:14;27516:18;27513:38;27510:84;;;27566:18;;:::i;:::-;27510:84;27331:269;27280:320;;;:::o;27606:232::-;27746:34;27742:1;27734:6;27730:14;27723:58;27815:15;27810:2;27802:6;27798:15;27791:40;27606:232;:::o;27844:366::-;27986:3;28007:67;28071:2;28066:3;28007:67;:::i;:::-;28000:74;;28083:93;28172:3;28083:93;:::i;:::-;28201:2;28196:3;28192:12;28185:19;;27844:366;;;:::o;28216:419::-;28382:4;28420:2;28409:9;28405:18;28397:26;;28469:9;28463:4;28459:20;28455:1;28444:9;28440:17;28433:47;28497:131;28623:4;28497:131;:::i;:::-;28489:139;;28216:419;;;:::o;28641:221::-;28781:34;28777:1;28769:6;28765:14;28758:58;28850:4;28845:2;28837:6;28833:15;28826:29;28641:221;:::o;28868:366::-;29010:3;29031:67;29095:2;29090:3;29031:67;:::i;:::-;29024:74;;29107:93;29196:3;29107:93;:::i;:::-;29225:2;29220:3;29216:12;29209:19;;28868:366;;;:::o;29240:419::-;29406:4;29444:2;29433:9;29429:18;29421:26;;29493:9;29487:4;29483:20;29479:1;29468:9;29464:17;29457:47;29521:131;29647:4;29521:131;:::i;:::-;29513:139;;29240:419;;;:::o;29665:244::-;29805:34;29801:1;29793:6;29789:14;29782:58;29874:27;29869:2;29861:6;29857:15;29850:52;29665:244;:::o;29915:366::-;30057:3;30078:67;30142:2;30137:3;30078:67;:::i;:::-;30071:74;;30154:93;30243:3;30154:93;:::i;:::-;30272:2;30267:3;30263:12;30256:19;;29915:366;;;:::o;30287:419::-;30453:4;30491:2;30480:9;30476:18;30468:26;;30540:9;30534:4;30530:20;30526:1;30515:9;30511:17;30504:47;30568:131;30694:4;30568:131;:::i;:::-;30560:139;;30287:419;;;:::o;30712:191::-;30752:4;30772:20;30790:1;30772:20;:::i;:::-;30767:25;;30806:20;30824:1;30806:20;:::i;:::-;30801:25;;30845:1;30842;30839:8;30836:34;;;30850:18;;:::i;:::-;30836:34;30895:1;30892;30888:9;30880:17;;30712:191;;;;:::o;30909:221::-;31049:34;31045:1;31037:6;31033:14;31026:58;31118:4;31113:2;31105:6;31101:15;31094:29;30909:221;:::o;31136:366::-;31278:3;31299:67;31363:2;31358:3;31299:67;:::i;:::-;31292:74;;31375:93;31464:3;31375:93;:::i;:::-;31493:2;31488:3;31484:12;31477:19;;31136:366;;;:::o;31508:419::-;31674:4;31712:2;31701:9;31697:18;31689:26;;31761:9;31755:4;31751:20;31747:1;31736:9;31732:17;31725:47;31789:131;31915:4;31789:131;:::i;:::-;31781:139;;31508:419;;;:::o;31933:233::-;31972:3;31995:24;32013:5;31995:24;:::i;:::-;31986:33;;32041:66;32034:5;32031:77;32028:103;;;32111:18;;:::i;:::-;32028:103;32158:1;32151:5;32147:13;32140:20;;31933:233;;;:::o;32172:::-;32312:34;32308:1;32300:6;32296:14;32289:58;32381:16;32376:2;32368:6;32364:15;32357:41;32172:233;:::o;32411:366::-;32553:3;32574:67;32638:2;32633:3;32574:67;:::i;:::-;32567:74;;32650:93;32739:3;32650:93;:::i;:::-;32768:2;32763:3;32759:12;32752:19;;32411:366;;;:::o;32783:419::-;32949:4;32987:2;32976:9;32972:18;32964:26;;33036:9;33030:4;33026:20;33022:1;33011:9;33007:17;33000:47;33064:131;33190:4;33064:131;:::i;:::-;33056:139;;32783:419;;;:::o;33208:147::-;33309:11;33346:3;33331:18;;33208:147;;;;:::o;33361:114::-;;:::o;33481:398::-;33640:3;33661:83;33742:1;33737:3;33661:83;:::i;:::-;33654:90;;33753:93;33842:3;33753:93;:::i;:::-;33871:1;33866:3;33862:11;33855:18;;33481:398;;;:::o;33885:379::-;34069:3;34091:147;34234:3;34091:147;:::i;:::-;34084:154;;34255:3;34248:10;;33885:379;;;:::o;34270:180::-;34318:77;34315:1;34308:88;34415:4;34412:1;34405:15;34439:4;34436:1;34429:15;34456:222;34596:34;34592:1;34584:6;34580:14;34573:58;34665:5;34660:2;34652:6;34648:15;34641:30;34456:222;:::o;34684:366::-;34826:3;34847:67;34911:2;34906:3;34847:67;:::i;:::-;34840:74;;34923:93;35012:3;34923:93;:::i;:::-;35041:2;35036:3;35032:12;35025:19;;34684:366;;;:::o;35056:419::-;35222:4;35260:2;35249:9;35245:18;35237:26;;35309:9;35303:4;35299:20;35295:1;35284:9;35280:17;35273:47;35337:131;35463:4;35337:131;:::i;:::-;35329:139;;35056:419;;;:::o;35481:230::-;35621:34;35617:1;35609:6;35605:14;35598:58;35690:13;35685:2;35677:6;35673:15;35666:38;35481:230;:::o;35717:366::-;35859:3;35880:67;35944:2;35939:3;35880:67;:::i;:::-;35873:74;;35956:93;36045:3;35956:93;:::i;:::-;36074:2;36069:3;36065:12;36058:19;;35717:366;;;:::o;36089:419::-;36255:4;36293:2;36282:9;36278:18;36270:26;;36342:9;36336:4;36332:20;36328:1;36317:9;36313:17;36306:47;36370:131;36496:4;36370:131;:::i;:::-;36362:139;;36089:419;;;:::o;36514:227::-;36654:34;36650:1;36642:6;36638:14;36631:58;36723:10;36718:2;36710:6;36706:15;36699:35;36514:227;:::o;36747:366::-;36889:3;36910:67;36974:2;36969:3;36910:67;:::i;:::-;36903:74;;36986:93;37075:3;36986:93;:::i;:::-;37104:2;37099:3;37095:12;37088:19;;36747:366;;;:::o;37119:419::-;37285:4;37323:2;37312:9;37308:18;37300:26;;37372:9;37366:4;37362:20;37358:1;37347:9;37343:17;37336:47;37400:131;37526:4;37400:131;:::i;:::-;37392:139;;37119:419;;;:::o;37544:224::-;37684:34;37680:1;37672:6;37668:14;37661:58;37753:7;37748:2;37740:6;37736:15;37729:32;37544:224;:::o;37774:366::-;37916:3;37937:67;38001:2;37996:3;37937:67;:::i;:::-;37930:74;;38013:93;38102:3;38013:93;:::i;:::-;38131:2;38126:3;38122:12;38115:19;;37774:366;;;:::o;38146:419::-;38312:4;38350:2;38339:9;38335:18;38327:26;;38399:9;38393:4;38389:20;38385:1;38374:9;38370:17;38363:47;38427:131;38553:4;38427:131;:::i;:::-;38419:139;;38146:419;;;:::o;38571:224::-;38711:34;38707:1;38699:6;38695:14;38688:58;38780:7;38775:2;38767:6;38763:15;38756:32;38571:224;:::o;38801:366::-;38943:3;38964:67;39028:2;39023:3;38964:67;:::i;:::-;38957:74;;39040:93;39129:3;39040:93;:::i;:::-;39158:2;39153:3;39149:12;39142:19;;38801:366;;;:::o;39173:419::-;39339:4;39377:2;39366:9;39362:18;39354:26;;39426:9;39420:4;39416:20;39412:1;39401:9;39397:17;39390:47;39454:131;39580:4;39454:131;:::i;:::-;39446:139;;39173:419;;;:::o;39598:166::-;39738:18;39734:1;39726:6;39722:14;39715:42;39598:166;:::o;39770:366::-;39912:3;39933:67;39997:2;39992:3;39933:67;:::i;:::-;39926:74;;40009:93;40098:3;40009:93;:::i;:::-;40127:2;40122:3;40118:12;40111:19;;39770:366;;;:::o;40142:419::-;40308:4;40346:2;40335:9;40331:18;40323:26;;40395:9;40389:4;40385:20;40381:1;40370:9;40366:17;40359:47;40423:131;40549:4;40423:131;:::i;:::-;40415:139;;40142:419;;;:::o;40567:176::-;40707:28;40703:1;40695:6;40691:14;40684:52;40567:176;:::o;40749:366::-;40891:3;40912:67;40976:2;40971:3;40912:67;:::i;:::-;40905:74;;40988:93;41077:3;40988:93;:::i;:::-;41106:2;41101:3;41097:12;41090:19;;40749:366;;;:::o;41121:419::-;41287:4;41325:2;41314:9;41310:18;41302:26;;41374:9;41368:4;41364:20;41360:1;41349:9;41345:17;41338:47;41402:131;41528:4;41402:131;:::i;:::-;41394:139;;41121:419;;;:::o;41546:238::-;41686:34;41682:1;41674:6;41670:14;41663:58;41755:21;41750:2;41742:6;41738:15;41731:46;41546:238;:::o;41790:366::-;41932:3;41953:67;42017:2;42012:3;41953:67;:::i;:::-;41946:74;;42029:93;42118:3;42029:93;:::i;:::-;42147:2;42142:3;42138:12;42131:19;;41790:366;;;:::o;42162:419::-;42328:4;42366:2;42355:9;42351:18;42343:26;;42415:9;42409:4;42405:20;42401:1;42390:9;42386:17;42379:47;42443:131;42569:4;42443:131;:::i;:::-;42435:139;;42162:419;;;:::o;42587:177::-;42727:29;42723:1;42715:6;42711:14;42704:53;42587:177;:::o;42770:366::-;42912:3;42933:67;42997:2;42992:3;42933:67;:::i;:::-;42926:74;;43009:93;43098:3;43009:93;:::i;:::-;43127:2;43122:3;43118:12;43111:19;;42770:366;;;:::o;43142:419::-;43308:4;43346:2;43335:9;43331:18;43323:26;;43395:9;43389:4;43385:20;43381:1;43370:9;43366:17;43359:47;43423:131;43549:4;43423:131;:::i;:::-;43415:139;;43142:419;;;:::o;43567:172::-;43707:24;43703:1;43695:6;43691:14;43684:48;43567:172;:::o;43745:366::-;43887:3;43908:67;43972:2;43967:3;43908:67;:::i;:::-;43901:74;;43984:93;44073:3;43984:93;:::i;:::-;44102:2;44097:3;44093:12;44086:19;;43745:366;;;:::o;44117:419::-;44283:4;44321:2;44310:9;44306:18;44298:26;;44370:9;44364:4;44360:20;44356:1;44345:9;44341:17;44334:47;44398:131;44524:4;44398:131;:::i;:::-;44390:139;;44117:419;;;:::o;44542:235::-;44682:34;44678:1;44670:6;44666:14;44659:58;44751:18;44746:2;44738:6;44734:15;44727:43;44542:235;:::o;44783:366::-;44925:3;44946:67;45010:2;45005:3;44946:67;:::i;:::-;44939:74;;45022:93;45111:3;45022:93;:::i;:::-;45140:2;45135:3;45131:12;45124:19;;44783:366;;;:::o;45155:419::-;45321:4;45359:2;45348:9;45344:18;45336:26;;45408:9;45402:4;45398:20;45394:1;45383:9;45379:17;45372:47;45436:131;45562:4;45436:131;:::i;:::-;45428:139;;45155:419;;;:::o;45580:148::-;45682:11;45719:3;45704:18;;45580:148;;;;:::o;45734:377::-;45840:3;45868:39;45901:5;45868:39;:::i;:::-;45923:89;46005:6;46000:3;45923:89;:::i;:::-;45916:96;;46021:52;46066:6;46061:3;46054:4;46047:5;46043:16;46021:52;:::i;:::-;46098:6;46093:3;46089:16;46082:23;;45844:267;45734:377;;;;:::o;46117:141::-;46166:4;46189:3;46181:11;;46212:3;46209:1;46202:14;46246:4;46243:1;46233:18;46225:26;;46117:141;;;:::o;46288:845::-;46391:3;46428:5;46422:12;46457:36;46483:9;46457:36;:::i;:::-;46509:89;46591:6;46586:3;46509:89;:::i;:::-;46502:96;;46629:1;46618:9;46614:17;46645:1;46640:137;;;;46791:1;46786:341;;;;46607:520;;46640:137;46724:4;46720:9;46709;46705:25;46700:3;46693:38;46760:6;46755:3;46751:16;46744:23;;46640:137;;46786:341;46853:38;46885:5;46853:38;:::i;:::-;46913:1;46927:154;46941:6;46938:1;46935:13;46927:154;;;47015:7;47009:14;47005:1;47000:3;46996:11;46989:35;47065:1;47056:7;47052:15;47041:26;;46963:4;46960:1;46956:12;46951:17;;46927:154;;;47110:6;47105:3;47101:16;47094:23;;46793:334;;46607:520;;46395:738;;46288:845;;;;:::o;47139:589::-;47364:3;47386:95;47477:3;47468:6;47386:95;:::i;:::-;47379:102;;47498:95;47589:3;47580:6;47498:95;:::i;:::-;47491:102;;47610:92;47698:3;47689:6;47610:92;:::i;:::-;47603:99;;47719:3;47712:10;;47139:589;;;;;;:::o;47734:225::-;47874:34;47870:1;47862:6;47858:14;47851:58;47943:8;47938:2;47930:6;47926:15;47919:33;47734:225;:::o;47965:366::-;48107:3;48128:67;48192:2;48187:3;48128:67;:::i;:::-;48121:74;;48204:93;48293:3;48204:93;:::i;:::-;48322:2;48317:3;48313:12;48306:19;;47965:366;;;:::o;48337:419::-;48503:4;48541:2;48530:9;48526:18;48518:26;;48590:9;48584:4;48580:20;48576:1;48565:9;48561:17;48554:47;48618:131;48744:4;48618:131;:::i;:::-;48610:139;;48337:419;;;:::o;48762:182::-;48902:34;48898:1;48890:6;48886:14;48879:58;48762:182;:::o;48950:366::-;49092:3;49113:67;49177:2;49172:3;49113:67;:::i;:::-;49106:74;;49189:93;49278:3;49189:93;:::i;:::-;49307:2;49302:3;49298:12;49291:19;;48950:366;;;:::o;49322:419::-;49488:4;49526:2;49515:9;49511:18;49503:26;;49575:9;49569:4;49565:20;49561:1;49550:9;49546:17;49539:47;49603:131;49729:4;49603:131;:::i;:::-;49595:139;;49322:419;;;:::o;49747:237::-;49887:34;49883:1;49875:6;49871:14;49864:58;49956:20;49951:2;49943:6;49939:15;49932:45;49747:237;:::o;49990:366::-;50132:3;50153:67;50217:2;50212:3;50153:67;:::i;:::-;50146:74;;50229:93;50318:3;50229:93;:::i;:::-;50347:2;50342:3;50338:12;50331:19;;49990:366;;;:::o;50362:419::-;50528:4;50566:2;50555:9;50551:18;50543:26;;50615:9;50609:4;50605:20;50601:1;50590:9;50586:17;50579:47;50643:131;50769:4;50643:131;:::i;:::-;50635:139;;50362:419;;;:::o;50787:225::-;50927:34;50923:1;50915:6;50911:14;50904:58;50996:8;50991:2;50983:6;50979:15;50972:33;50787:225;:::o;51018:366::-;51160:3;51181:67;51245:2;51240:3;51181:67;:::i;:::-;51174:74;;51257:93;51346:3;51257:93;:::i;:::-;51375:2;51370:3;51366:12;51359:19;;51018:366;;;:::o;51390:419::-;51556:4;51594:2;51583:9;51579:18;51571:26;;51643:9;51637:4;51633:20;51629:1;51618:9;51614:17;51607:47;51671:131;51797:4;51671:131;:::i;:::-;51663:139;;51390:419;;;:::o;51815:224::-;51955:34;51951:1;51943:6;51939:14;51932:58;52024:7;52019:2;52011:6;52007:15;52000:32;51815:224;:::o;52045:366::-;52187:3;52208:67;52272:2;52267:3;52208:67;:::i;:::-;52201:74;;52284:93;52373:3;52284:93;:::i;:::-;52402:2;52397:3;52393:12;52386:19;;52045:366;;;:::o;52417:419::-;52583:4;52621:2;52610:9;52606:18;52598:26;;52670:9;52664:4;52660:20;52656:1;52645:9;52641:17;52634:47;52698:131;52824:4;52698:131;:::i;:::-;52690:139;;52417:419;;;:::o;52842:118::-;52879:7;52919:34;52912:5;52908:46;52897:57;;52842:118;;;:::o;52966:191::-;53006:4;53026:20;53044:1;53026:20;:::i;:::-;53021:25;;53060:20;53078:1;53060:20;:::i;:::-;53055:25;;53099:1;53096;53093:8;53090:34;;;53104:18;;:::i;:::-;53090:34;53149:1;53146;53142:9;53134:17;;52966:191;;;;:::o;53163:273::-;53203:3;53222:20;53240:1;53222:20;:::i;:::-;53217:25;;53256:20;53274:1;53256:20;:::i;:::-;53251:25;;53378:1;53342:34;53338:42;53335:1;53332:49;53329:75;;;53384:18;;:::i;:::-;53329:75;53428:1;53425;53421:9;53414:16;;53163:273;;;;:::o;53442:229::-;53582:34;53578:1;53570:6;53566:14;53559:58;53651:12;53646:2;53638:6;53634:15;53627:37;53442:229;:::o;53677:366::-;53819:3;53840:67;53904:2;53899:3;53840:67;:::i;:::-;53833:74;;53916:93;54005:3;53916:93;:::i;:::-;54034:2;54029:3;54025:12;54018:19;;53677:366;;;:::o;54049:419::-;54215:4;54253:2;54242:9;54238:18;54230:26;;54302:9;54296:4;54292:20;54288:1;54277:9;54273:17;54266:47;54330:131;54456:4;54330:131;:::i;:::-;54322:139;;54049:419;;;:::o;54474:171::-;54513:3;54536:24;54554:5;54536:24;:::i;:::-;54527:33;;54582:4;54575:5;54572:15;54569:41;;;54590:18;;:::i;:::-;54569:41;54637:1;54630:5;54626:13;54619:20;;54474:171;;;:::o;55688:180::-;55736:77;55733:1;55726:88;55833:4;55830:1;55823:15;55857:4;55854:1;55847:15;55874:185;55914:1;55931:20;55949:1;55931:20;:::i;:::-;55926:25;;55965:20;55983:1;55965:20;:::i;:::-;55960:25;;56004:1;55994:35;;56009:18;;:::i;:::-;55994:35;56051:1;56048;56044:9;56039:14;;55874:185;;;;:::o;56065:224::-;56205:34;56201:1;56193:6;56189:14;56182:58;56274:7;56269:2;56261:6;56257:15;56250:32;56065:224;:::o;56295:366::-;56437:3;56458:67;56522:2;56517:3;56458:67;:::i;:::-;56451:74;;56534:93;56623:3;56534:93;:::i;:::-;56652:2;56647:3;56643:12;56636:19;;56295:366;;;:::o;56667:419::-;56833:4;56871:2;56860:9;56856:18;56848:26;;56920:9;56914:4;56910:20;56906:1;56895:9;56891:17;56884:47;56948:131;57074:4;56948:131;:::i;:::-;56940:139;;56667:419;;;:::o;57092:224::-;57232:34;57228:1;57220:6;57216:14;57209:58;57301:7;57296:2;57288:6;57284:15;57277:32;57092:224;:::o;57322:366::-;57464:3;57485:67;57549:2;57544:3;57485:67;:::i;:::-;57478:74;;57561:93;57650:3;57561:93;:::i;:::-;57679:2;57674:3;57670:12;57663:19;;57322:366;;;:::o;57694:419::-;57860:4;57898:2;57887:9;57883:18;57875:26;;57947:9;57941:4;57937:20;57933:1;57922:9;57918:17;57911:47;57975:131;58101:4;57975:131;:::i;:::-;57967:139;;57694:419;;;:::o;58119:98::-;58170:6;58204:5;58198:12;58188:22;;58119:98;;;:::o;58223:168::-;58306:11;58340:6;58335:3;58328:19;58380:4;58375:3;58371:14;58356:29;;58223:168;;;;:::o;58397:360::-;58483:3;58511:38;58543:5;58511:38;:::i;:::-;58565:70;58628:6;58623:3;58565:70;:::i;:::-;58558:77;;58644:52;58689:6;58684:3;58677:4;58670:5;58666:16;58644:52;:::i;:::-;58721:29;58743:6;58721:29;:::i;:::-;58716:3;58712:39;58705:46;;58487:270;58397:360;;;;:::o;58763:640::-;58958:4;58996:3;58985:9;58981:19;58973:27;;59010:71;59078:1;59067:9;59063:17;59054:6;59010:71;:::i;:::-;59091:72;59159:2;59148:9;59144:18;59135:6;59091:72;:::i;:::-;59173;59241:2;59230:9;59226:18;59217:6;59173:72;:::i;:::-;59292:9;59286:4;59282:20;59277:2;59266:9;59262:18;59255:48;59320:76;59391:4;59382:6;59320:76;:::i;:::-;59312:84;;58763:640;;;;;;;:::o;59409:141::-;59465:5;59496:6;59490:13;59481:22;;59512:32;59538:5;59512:32;:::i;:::-;59409:141;;;;:::o;59556:349::-;59625:6;59674:2;59662:9;59653:7;59649:23;59645:32;59642:119;;;59680:79;;:::i;:::-;59642:119;59800:1;59825:63;59880:7;59871:6;59860:9;59856:22;59825:63;:::i;:::-;59815:73;;59771:127;59556:349;;;;:::o;59911:220::-;60051:34;60047:1;60039:6;60035:14;60028:58;60120:3;60115:2;60107:6;60103:15;60096:28;59911:220;:::o;60137:366::-;60279:3;60300:67;60364:2;60359:3;60300:67;:::i;:::-;60293:74;;60376:93;60465:3;60376:93;:::i;:::-;60494:2;60489:3;60485:12;60478:19;;60137:366;;;:::o;60509:419::-;60675:4;60713:2;60702:9;60698:18;60690:26;;60762:9;60756:4;60752:20;60748:1;60737:9;60733:17;60726:47;60790:131;60916:4;60790:131;:::i;:::-;60782:139;;60509:419;;;:::o;60934:179::-;61074:31;61070:1;61062:6;61058:14;61051:55;60934:179;:::o;61119:366::-;61261:3;61282:67;61346:2;61341:3;61282:67;:::i;:::-;61275:74;;61358:93;61447:3;61358:93;:::i;:::-;61476:2;61471:3;61467:12;61460:19;;61119:366;;;:::o;61491:419::-;61657:4;61695:2;61684:9;61680:18;61672:26;;61744:9;61738:4;61734:20;61730:1;61719:9;61715:17;61708:47;61772:131;61898:4;61772:131;:::i;:::-;61764:139;;61491:419;;;:::o
Swarm Source
ipfs://21fd4ef24689611e81116a24285b50cd97d4f6b4f58da6f938127b8efae38d03
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.