Polygon Sponsored slots available. Book your slot here!
Overview
POL Balance
0 POL
POL Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 17 from a total of 17 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Balance | 39838112 | 644 days ago | IN | 0 POL | 0.00630976 | ||||
Change Pause Sta... | 39838092 | 644 days ago | IN | 0 POL | 0.00925906 | ||||
Distribution | 39777044 | 646 days ago | IN | 0 POL | 0.06337236 | ||||
Distribution | 38014144 | 691 days ago | IN | 0 POL | 0.02761982 | ||||
Distribution | 37947936 | 693 days ago | IN | 0 POL | 0.02197871 | ||||
Transfer Ownersh... | 37863049 | 695 days ago | IN | 0 POL | 0.00377967 | ||||
Distribution | 37863015 | 695 days ago | IN | 0 POL | 0.04792721 | ||||
Transfer | 37862994 | 695 days ago | IN | 500 POL | 0.00196858 | ||||
Transfer | 37862804 | 695 days ago | IN | 100 POL | 0.00109097 | ||||
Update Division ... | 37858983 | 695 days ago | IN | 0 POL | 0.0124819 | ||||
Update Division ... | 37858965 | 695 days ago | IN | 0 POL | 0.00171561 | ||||
Update Division ... | 37858959 | 695 days ago | IN | 0 POL | 0.00294602 | ||||
Update Division ... | 37858940 | 695 days ago | IN | 0 POL | 0.00408872 | ||||
Update Division ... | 37858934 | 695 days ago | IN | 0 POL | 0.00408872 | ||||
Update Division ... | 37858922 | 695 days ago | IN | 0 POL | 0.00995247 | ||||
Update Division ... | 37858917 | 695 days ago | IN | 0 POL | 0.01777081 | ||||
Update Division ... | 37858911 | 695 days ago | IN | 0 POL | 0.03340748 |
Loading...
Loading
Contract Name:
PrizeDistribution
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2023-01-09 */ /** *Submitted for verification at polygonscan.com on 2022-12-15 */ /** === World Cup Qatar 2022 Prediction NFT Distribution === **/ // SPDX-License-Identifier: MIT // 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/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/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/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.7.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 functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // 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/ERC1155/IERC1155Receiver.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/extensions/ERC1155Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC1155} that allows token holders to destroy both their * own tokens and those that they have been approved to use. * * _Available since v3.1._ */ abstract contract ERC1155Burnable is ERC1155 { function burn( address account, uint256 id, uint256 value ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not token owner or approved" ); _burn(account, id, value); } function burnBatch( address account, uint256[] memory ids, uint256[] memory values ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not token owner or approved" ); _burnBatch(account, ids, values); } } // File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol) pragma solidity ^0.8.0; /** * @dev Extension of ERC1155 that adds tracking of total supply per id. * * Useful for scenarios where Fungible and Non-fungible tokens have to be * clearly identified. Note: While a totalSupply of 1 might mean the * corresponding is an NFT, there is no guarantees that no other token with the * same id are not going to be minted. */ abstract contract ERC1155Supply is ERC1155 { mapping(uint256 => uint256) private _totalSupply; /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155Supply.totalSupply(id) > 0; } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 supply = _totalSupply[id]; require(supply >= amount, "ERC1155: burn amount exceeds totalSupply"); unchecked { _totalSupply[id] = supply - amount; } } } } } // File: Distribution.sol /** === World Cup Qatar 2022 Prediction NFT Distribution === **/ pragma solidity ^0.8.4; contract PrizeDistribution is ERC1155, Ownable, ERC1155Burnable { ERC1155Burnable predictionContract; IERC1155 predictionToken; ERC1155Supply tokenSupply; string public constant name = "World Cup Qatar 2022 Prediction NFT Distribution"; string public constant symbol = "WCQPND"; address public PredictionContractAddress = 0xFA73C01E9DF6BeBCBA5487dCA4c22B870688Fa20; // Prediction Minting Contract address public teamAddress = 0x34F684DF34b072C6B69d501399650d0984D9B65A; // Team Wallet Address uint256 public startTimestamp = 1671451200;// distribution start timestamp. - 19.12.2022, 12:00PM UTC mapping(uint256 => uint256) public DivisionLevel;//[0,1,2,3,4,5,6] mapping(uint256 => uint256) public DivisionTeams;//[1,1,1,1,4,8,16] //Distribution Division Levels uint256 public firstPlace = 5000; // 50% uint256 public secondPlace = 1750; // 17.5% uint256 public thirdPlace = 1000; // 10% uint256 public fourthPlace = 500; // 5% uint256 public quarterFinal = 400; // 4% uint256 public roundOf16 = 250; // 2.5% uint256 public groupStage = 100; // 1% uint256 public teamShare = 1000; // 10% uint[] public Division = [firstPlace, secondPlace, thirdPlace, fourthPlace, quarterFinal, roundOf16, groupStage, teamShare]; //NFT Balance of wallet mapping(address => uint256[]) public ids; mapping(address => uint256[]) public amounts; address TeamWallet; // wallet address of development team uint256 public totalPrizePool; // total MATIC amounts for prize uint256 public remainingPool; // remaining balance of pool bool public paused; modifier onlyPaused { require(paused, "You can use this function when distribution is paused!"); _; } constructor( uint256 _totalPool ) payable ERC1155("") { totalPrizePool = _totalPool; remainingPool = _totalPool; predictionContract = ERC1155Burnable(PredictionContractAddress); predictionToken = IERC1155(PredictionContractAddress); tokenSupply = ERC1155Supply(PredictionContractAddress); } function setPredictionContract(address _newPredictionContract) external onlyOwner { PredictionContractAddress = _newPredictionContract; predictionContract = ERC1155Burnable(_newPredictionContract); predictionToken = IERC1155(_newPredictionContract); tokenSupply = ERC1155Supply(_newPredictionContract); } function distribution() external { require(!paused, "distribution is not started"); require(block.timestamp > startTimestamp, "distribution not started yet"); require(msg.sender != address(0), "Cannot be zero address"); address user = msg.sender; address burnAddress = 0x0000000000000000000000000000000000000001; require(msg.sender != burnAddress, "Cannot be burn address"); uint256 prizeAmount; for (uint256 i = 0; i < 32; i++) { uint256 totalSupplyById = tokenSupply.totalSupply(i); if (totalSupplyById > 0) { uint256 balancePerId = predictionToken.balanceOf(user, i); if (balancePerId > 0) { ids[user].push(i); amounts[user].push(balancePerId); if (DivisionTeams[DivisionLevel[i]] > 0) { uint256 prizePerNFT = (totalPrizePool * Division[DivisionLevel[i]])/ (totalSupplyById * DivisionTeams[DivisionLevel[i]]); prizeAmount += prizePerNFT * balancePerId; } } } } predictionToken.safeBatchTransferFrom(msg.sender, burnAddress, ids[user], amounts[user], ""); divisionOfBenefit(user, prizeAmount); } function divisionOfBenefit(address user, uint256 amount) private { require(amount > 0, "amount must bigger than zero"); uint256 value = amount / 10000; require(address(this).balance > value, "remaining prize pool must bigger than claimable amount"); remainingPool -= value; (bool success,) = user.call{value : value}(""); require(success, "TransferHelper: MATIC_TRANSFER_FAILED"); } function changePauseStatus() external onlyOwner { paused = !paused; } function updateDivision(uint256 _PlaceId, uint256 _NewPercent) external onlyOwner { Division[_PlaceId] = _NewPercent * 100;// 10% as 10*100 = 1000 } function updateDivisionLevel(uint256[] memory tokenIds, uint256 placeId) external onlyOwner { require(tokenIds.length > 0, "please enter at least one Id"); for (uint256 i = 0; i < tokenIds.length; i++) { DivisionLevel[tokenIds[i]] = placeId; } } function updateDivisionTeams(uint256[] memory divisionLevels, uint256[] memory teams) external onlyOwner { require(divisionLevels.length > 0, "please enter at least one level"); for (uint256 i = 0; i < divisionLevels.length; i++) { DivisionTeams[divisionLevels[i]] = teams[i]; } } function updateTeamAddress(address _newAddress) external onlyOwner { teamAddress = _newAddress; } function setTotalPrizePool(uint256 _newPrizePool) external onlyOwner { totalPrizePool = _newPrizePool; } function withdrawTeamDivision() public onlyOwner { uint256 amount = totalPrizePool * Division[7] / 10000; (bool success,) = teamAddress.call{value : amount}(""); require(success, "Transfer failed!"); } function withdrawBalance() public onlyPaused onlyOwner { (bool success,) = owner().call{value : address(this).balance}(""); require(success, "Transfer failed!"); } fallback() external payable {} receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_totalPool","type":"uint256"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Division","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"DivisionLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"DivisionTeams","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PredictionContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"amounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changePauseStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"firstPlace","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fourthPlace","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"groupStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ids","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quarterFinal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainingPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"roundOf16","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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"secondPlace","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPredictionContract","type":"address"}],"name":"setPredictionContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrizePool","type":"uint256"}],"name":"setTotalPrizePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"thirdPlace","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPrizePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_PlaceId","type":"uint256"},{"internalType":"uint256","name":"_NewPercent","type":"uint256"}],"name":"updateDivision","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"placeId","type":"uint256"}],"name":"updateDivisionLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"divisionLevels","type":"uint256[]"},{"internalType":"uint256[]","name":"teams","type":"uint256[]"}],"name":"updateDivisionTeams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"updateTeamAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawTeamDivision","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405273fa73c01e9df6bebcba5487dca4c22b870688fa20600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507334f684df34b072c6b69d501399650d0984d9b65a600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506363a05240600955611388600c556106d6600d556103e8600e556101f4600f5561019060105560fa60115560646012556103e8601355604051806101000160405280600c548152602001600d548152602001600e548152602001600f548152602001601054815260200160115481526020016012548152602001601354815250601490600862000140929190620003d0565b5060405162005682380380620056828339818101604052810190620001669190620004e9565b604051806020016040528060008152506200018781620002e660201b60201c565b50620001a86200019c6200030260201b60201c565b6200030a60201b60201c565b8060188190555080601981905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620005a9565b8060029080519060200190620002fe92919062000422565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280548282559060005260206000209081019282156200040f579160200282015b828111156200040e578251825591602001919060010190620003f1565b5b5090506200041e9190620004b3565b5090565b828054620004309062000525565b90600052602060002090601f016020900481019282620004545760008555620004a0565b82601f106200046f57805160ff1916838001178555620004a0565b82800160010185558215620004a0579182015b828111156200049f57825182559160200191906001019062000482565b5b509050620004af9190620004b3565b5090565b5b80821115620004ce576000816000905550600101620004b4565b5090565b600081519050620004e3816200058f565b92915050565b6000602082840312156200050257620005016200058a565b5b60006200051284828501620004d2565b91505092915050565b6000819050919050565b600060028204905060018216806200053e57607f821691505b602082108114156200055557620005546200055b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6200059a816200051b565b8114620005a657600080fd5b50565b6150c980620005b96000396000f3fe60806040526004361061026a5760003560e01c80638b15b80a11610144578063c6bbcaa5116100b6578063e6fd48bc1161007a578063e6fd48bc14610901578063e985e9c51461092c578063ea6ef2fe14610969578063f242432a14610994578063f2fde38b146109bd578063f5298aca146109e657610271565b8063c6bbcaa51461081c578063cdba3f8c14610845578063d6c210421461085c578063ded0bafb14610887578063dfbf8b16146108c457610271565b8063a22cb46511610108578063a22cb46514610732578063a8dd85421461075b578063b14d37c014610786578063b744721f146107b1578063c4549408146107dc578063c4c413c1146107f357610271565b80638b15b80a146106495780638c749102146106745780638da5cb5b1461069f57806395d89b41146106ca5780639f20bc92146106f557610271565b80633c93bc2b116101dd57806365ac656d116101a157806365ac656d1461053b5780636b20c454146105785780636d1860e3146105a15780636fccb22b146105de578063715018a6146106095780637bbeeb801461062057610271565b80633c93bc2b1461047c5780634e1273f4146104a55780635c975abb146104e25780635ee58efc1461050d5780635fd8c7101461052457610271565b80631c75f0851161022f5780631c75f0851461037e5780632297a1ba146103a957806326aa1842146103d45780632eb2c2d6146103fd57806336d2e7bf14610426578063398ab9a71461045157610271565b8062fdd58e1461027357806301ffc9a7146102b057806306fdde03146102ed5780630e89341c1461031857806314eb76ac1461035557610271565b3661027157005b005b34801561027f57600080fd5b5061029a600480360381019061029591906136c1565b610a0f565b6040516102a791906143c2565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d291906138a0565b610ad8565b6040516102e49190614085565b60405180910390f35b3480156102f957600080fd5b50610302610bba565b60405161030f91906140a0565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a91906138fa565b610bd6565b60405161034c91906140a0565b60405180910390f35b34801561036157600080fd5b5061037c60048036038101906103779190613423565b610c6a565b005b34801561038a57600080fd5b50610393610cb6565b6040516103a09190613ec0565b60405180910390f35b3480156103b557600080fd5b506103be610cdc565b6040516103cb91906143c2565b60405180910390f35b3480156103e057600080fd5b506103fb60048036038101906103f69190613954565b610ce2565b005b34801561040957600080fd5b50610424600480360381019061041f9190613490565b610d1d565b005b34801561043257600080fd5b5061043b610dbe565b60405161044891906143c2565b60405180910390f35b34801561045d57600080fd5b50610466610dc4565b60405161047391906143c2565b60405180910390f35b34801561048857600080fd5b506104a3600480360381019061049e9190613844565b610dca565b005b3480156104b157600080fd5b506104cc60048036038101906104c79190613754565b610e6c565b6040516104d9919061402c565b60405180910390f35b3480156104ee57600080fd5b506104f7610f85565b6040516105049190614085565b60405180910390f35b34801561051957600080fd5b50610522610f98565b005b34801561053057600080fd5b50610539611563565b005b34801561054757600080fd5b50610562600480360381019061055d91906138fa565b611670565b60405161056f91906143c2565b60405180910390f35b34801561058457600080fd5b5061059f600480360381019061059a91906135f6565b611688565b005b3480156105ad57600080fd5b506105c860048036038101906105c391906138fa565b611725565b6040516105d591906143c2565b60405180910390f35b3480156105ea57600080fd5b506105f361173d565b60405161060091906143c2565b60405180910390f35b34801561061557600080fd5b5061061e611743565b005b34801561062c57600080fd5b50610647600480360381019061064291906138fa565b611757565b005b34801561065557600080fd5b5061065e611769565b60405161066b91906143c2565b60405180910390f35b34801561068057600080fd5b5061068961176f565b6040516106969190613ec0565b60405180910390f35b3480156106ab57600080fd5b506106b4611795565b6040516106c19190613ec0565b60405180910390f35b3480156106d657600080fd5b506106df6117bf565b6040516106ec91906140a0565b60405180910390f35b34801561070157600080fd5b5061071c600480360381019061071791906136c1565b6117f8565b60405161072991906143c2565b60405180910390f35b34801561073e57600080fd5b5061075960048036038101906107549190613681565b611829565b005b34801561076757600080fd5b5061077061183f565b60405161077d91906143c2565b60405180910390f35b34801561079257600080fd5b5061079b611845565b6040516107a891906143c2565b60405180910390f35b3480156107bd57600080fd5b506107c661184b565b6040516107d391906143c2565b60405180910390f35b3480156107e857600080fd5b506107f1611851565b005b3480156107ff57600080fd5b5061081a600480360381019061081591906137cc565b611885565b005b34801561082857600080fd5b50610843600480360381019061083e9190613423565b611941565b005b34801561085157600080fd5b5061085a611a50565b005b34801561086857600080fd5b50610871611b68565b60405161087e91906143c2565b60405180910390f35b34801561089357600080fd5b506108ae60048036038101906108a991906138fa565b611b6e565b6040516108bb91906143c2565b60405180910390f35b3480156108d057600080fd5b506108eb60048036038101906108e691906136c1565b611b92565b6040516108f891906143c2565b60405180910390f35b34801561090d57600080fd5b50610916611bc3565b60405161092391906143c2565b60405180910390f35b34801561093857600080fd5b50610953600480360381019061094e9190613450565b611bc9565b6040516109609190614085565b60405180910390f35b34801561097557600080fd5b5061097e611c5d565b60405161098b91906143c2565b60405180910390f35b3480156109a057600080fd5b506109bb60048036038101906109b6919061355f565b611c63565b005b3480156109c957600080fd5b506109e460048036038101906109df9190613423565b611d04565b005b3480156109f257600080fd5b50610a0d6004803603810190610a089190613701565b611d88565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7790614162565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ba357507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bb35750610bb282611e25565b5b9050919050565b6040518060600160405280603081526020016150646030913981565b606060028054610be590614732565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1190614732565b8015610c5e5780601f10610c3357610100808354040283529160200191610c5e565b820191906000526020600020905b815481529060010190602001808311610c4157829003601f168201915b50505050509050919050565b610c72611e8f565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b610cea611e8f565b606481610cf791906145e4565b60148381548110610d0b57610d0a614885565b5b90600052602060002001819055505050565b610d25611f0d565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610d6b5750610d6a85610d65611f0d565b611bc9565b5b610daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da1906141a2565b60405180910390fd5b610db78585858585611f15565b5050505050565b600f5481565b60185481565b610dd2611e8f565b6000825111610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d906140e2565b60405180910390fd5b60005b8251811015610e675781600a6000858481518110610e3a57610e39614885565b5b60200260200101518152602001908152602001600020819055508080610e5f906147af565b915050610e19565b505050565b60608151835114610eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea990614342565b60405180910390fd5b6000835167ffffffffffffffff811115610ecf57610ece6148b4565b5b604051908082528060200260200182016040528015610efd5781602001602082028036833780820191505090505b50905060005b8451811015610f7a57610f4a858281518110610f2257610f21614885565b5b6020026020010151858381518110610f3d57610f3c614885565b5b6020026020010151610a0f565b828281518110610f5d57610f5c614885565b5b60200260200101818152505080610f73906147af565b9050610f03565b508091505092915050565b601a60009054906101000a900460ff1681565b601a60009054906101000a900460ff1615610fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdf90614382565b60405180910390fd5b600954421161102c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611023906141e2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561109c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611093906141c2565b60405180910390fd5b60003390506000600190508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611116576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110d90614262565b60405180910390fd5b600080600090505b6020811015611444576000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd85b039836040518263ffffffff1660e01b815260040161118491906143c2565b60206040518083038186803b15801561119c57600080fd5b505afa1580156111b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d49190613927565b90506000811115611430576000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e87856040518363ffffffff1660e01b815260040161123d929190614003565b60206040518083038186803b15801561125557600080fd5b505afa158015611269573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128d9190613927565b9050600081111561142e57601560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020839080600181540180825580915050600190039060005260206000200160009091909190915055601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150556000600b6000600a600087815260200190815260200160002054815260200190815260200160002054111561142d576000600b6000600a600087815260200190815260200160002054815260200190815260200160002054836113c791906145e4565b6014600a600087815260200190815260200160002054815481106113ee576113ed614885565b5b906000526020600020015460185461140691906145e4565b61141091906145b3565b9050818161141e91906145e4565b85611429919061455d565b9450505b5b505b50808061143c906147af565b91505061111e565b50600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632eb2c2d63384601560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020601660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518563ffffffff1660e01b81526004016115229493929190613f43565b600060405180830381600087803b15801561153c57600080fd5b505af1158015611550573d6000803e3d6000fd5b5050505061155e8382612237565b505050565b601a60009054906101000a900460ff166115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a990614242565b60405180910390fd5b6115ba611e8f565b60006115c4611795565b73ffffffffffffffffffffffffffffffffffffffff16476040516115e790613eab565b60006040518083038185875af1925050503d8060008114611624576040519150601f19603f3d011682016040523d82523d6000602084013e611629565b606091505b505090508061166d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611664906142c2565b60405180910390fd5b50565b600a6020528060005260406000206000915090505481565b611690611f0d565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806116d657506116d5836116d0611f0d565b611bc9565b5b611715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170c906141a2565b60405180910390fd5b611720838383612399565b505050565b600b6020528060005260406000206000915090505481565b600d5481565b61174b611e8f565b6117556000612668565b565b61175f611e8f565b8060188190555050565b60115481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6040518060400160405280600681526020017f574351504e44000000000000000000000000000000000000000000000000000081525081565b6015602052816000526040600020818154811061181457600080fd5b90600052602060002001600091509150505481565b61183b611834611f0d565b838361272e565b5050565b600e5481565b60195481565b600c5481565b611859611e8f565b601a60009054906101000a900460ff1615601a60006101000a81548160ff021916908315150217905550565b61188d611e8f565b60008251116118d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c890614142565b60405180910390fd5b60005b825181101561193c578181815181106118f0576118ef614885565b5b6020026020010151600b600085848151811061190f5761190e614885565b5b60200260200101518152602001908152602001600020819055508080611934906147af565b9150506118d4565b505050565b611949611e8f565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611a58611e8f565b60006127106014600781548110611a7257611a71614885565b5b9060005260206000200154601854611a8a91906145e4565b611a9491906145b3565b90506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611ade90613eab565b60006040518083038185875af1925050503d8060008114611b1b576040519150601f19603f3d011682016040523d82523d6000602084013e611b20565b606091505b5050905080611b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5b906142c2565b60405180910390fd5b5050565b60125481565b60148181548110611b7e57600080fd5b906000526020600020016000915090505481565b60166020528160005260406000208181548110611bae57600080fd5b90600052602060002001600091509150505481565b60095481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60135481565b611c6b611f0d565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611cb15750611cb085611cab611f0d565b611bc9565b5b611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce7906141a2565b60405180910390fd5b611cfd858585858561289b565b5050505050565b611d0c611e8f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7390614102565b60405180910390fd5b611d8581612668565b50565b611d90611f0d565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611dd65750611dd583611dd0611f0d565b611bc9565b5b611e15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0c906141a2565b60405180910390fd5b611e20838383612b37565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611e97611f0d565b73ffffffffffffffffffffffffffffffffffffffff16611eb5611795565b73ffffffffffffffffffffffffffffffffffffffff1614611f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f02906142e2565b60405180910390fd5b565b600033905090565b8151835114611f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5090614362565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc090614202565b60405180910390fd5b6000611fd3611f0d565b9050611fe3818787878787612d7e565b60005b845181101561219457600085828151811061200457612003614885565b5b60200260200101519050600085838151811061202357612022614885565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156120c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bb906142a2565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612179919061455d565b925050819055505050508061218d906147af565b9050611fe6565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161220b92919061404e565b60405180910390a4612221818787878787612d86565b61222f818787878787612d8e565b505050505050565b6000811161227a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227190614222565b60405180910390fd5b60006127108261228a91906145b3565b90508047116122ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c590614182565b60405180910390fd5b80601960008282546122e0919061463e565b9250508190555060008373ffffffffffffffffffffffffffffffffffffffff168260405161230d90613eab565b60006040518083038185875af1925050503d806000811461234a576040519150601f19603f3d011682016040523d82523d6000602084013e61234f565b606091505b5050905080612393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238a90614302565b60405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240090614282565b60405180910390fd5b805182511461244d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244490614362565b60405180910390fd5b6000612457611f0d565b905061247781856000868660405180602001604052806000815250612d7e565b60005b83518110156125c457600084828151811061249857612497614885565b5b6020026020010151905060008483815181106124b7576124b6614885565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254f90614122565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505080806125bc906147af565b91505061247a565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161263c92919061404e565b60405180910390a461266281856000868660405180602001604052806000815250612d86565b50505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561279d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279490614322565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161288e9190614085565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561290b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290290614202565b60405180910390fd5b6000612915611f0d565b9050600061292285612f75565b9050600061292f85612f75565b905061293f838989858589612d7e565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156129d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cd906142a2565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a8b919061455d565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612b089291906143dd565b60405180910390a4612b1e848a8a86868a612d86565b612b2c848a8a8a8a8a612fef565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9e90614282565b60405180910390fd5b6000612bb1611f0d565b90506000612bbe84612f75565b90506000612bcb84612f75565b9050612beb83876000858560405180602001604052806000815250612d7e565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612c82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7990614122565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612d4f9291906143dd565b60405180910390a4612d7584886000868660405180602001604052806000815250612d86565b50505050505050565b505050505050565b505050505050565b612dad8473ffffffffffffffffffffffffffffffffffffffff166131d6565b15612f6d578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612df3959493929190613edb565b602060405180830381600087803b158015612e0d57600080fd5b505af1925050508015612e3e57506040513d601f19601f82011682018060405250810190612e3b91906138cd565b60015b612ee457612e4a6148f6565b806308c379a01415612ea75750612e5f614f71565b80612e6a5750612ea9565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9e91906140a0565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612edb906143a2565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f62906140c2565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff811115612f9457612f936148b4565b5b604051908082528060200260200182016040528015612fc25781602001602082028036833780820191505090505b5090508281600081518110612fda57612fd9614885565b5b60200260200101818152505080915050919050565b61300e8473ffffffffffffffffffffffffffffffffffffffff166131d6565b156131ce578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401613054959493929190613fa9565b602060405180830381600087803b15801561306e57600080fd5b505af192505050801561309f57506040513d601f19601f8201168201806040525081019061309c91906138cd565b60015b613145576130ab6148f6565b806308c379a0141561310857506130c0614f71565b806130cb575061310a565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ff91906140a0565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313c906143a2565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146131cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c3906140c2565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600061320c6132078461442b565b614406565b9050808382526020820190508285602086028201111561322f5761322e61491d565b5b60005b8581101561325f5781613245888261331b565b845260208401935060208301925050600181019050613232565b5050509392505050565b600061327c61327784614457565b614406565b9050808382526020820190508285602086028201111561329f5761329e61491d565b5b60005b858110156132cf57816132b588826133f9565b8452602084019350602083019250506001810190506132a2565b5050509392505050565b60006132ec6132e784614483565b614406565b90508281526020810184848401111561330857613307614922565b5b6133138482856146f0565b509392505050565b60008135905061332a81615007565b92915050565b600082601f83011261334557613344614918565b5b81356133558482602086016131f9565b91505092915050565b600082601f83011261337357613372614918565b5b8135613383848260208601613269565b91505092915050565b60008135905061339b8161501e565b92915050565b6000813590506133b081615035565b92915050565b6000815190506133c581615035565b92915050565b600082601f8301126133e0576133df614918565b5b81356133f08482602086016132d9565b91505092915050565b6000813590506134088161504c565b92915050565b60008151905061341d8161504c565b92915050565b6000602082840312156134395761343861492c565b5b60006134478482850161331b565b91505092915050565b600080604083850312156134675761346661492c565b5b60006134758582860161331b565b92505060206134868582860161331b565b9150509250929050565b600080600080600060a086880312156134ac576134ab61492c565b5b60006134ba8882890161331b565b95505060206134cb8882890161331b565b945050604086013567ffffffffffffffff8111156134ec576134eb614927565b5b6134f88882890161335e565b935050606086013567ffffffffffffffff81111561351957613518614927565b5b6135258882890161335e565b925050608086013567ffffffffffffffff81111561354657613545614927565b5b613552888289016133cb565b9150509295509295909350565b600080600080600060a0868803121561357b5761357a61492c565b5b60006135898882890161331b565b955050602061359a8882890161331b565b94505060406135ab888289016133f9565b93505060606135bc888289016133f9565b925050608086013567ffffffffffffffff8111156135dd576135dc614927565b5b6135e9888289016133cb565b9150509295509295909350565b60008060006060848603121561360f5761360e61492c565b5b600061361d8682870161331b565b935050602084013567ffffffffffffffff81111561363e5761363d614927565b5b61364a8682870161335e565b925050604084013567ffffffffffffffff81111561366b5761366a614927565b5b6136778682870161335e565b9150509250925092565b600080604083850312156136985761369761492c565b5b60006136a68582860161331b565b92505060206136b78582860161338c565b9150509250929050565b600080604083850312156136d8576136d761492c565b5b60006136e68582860161331b565b92505060206136f7858286016133f9565b9150509250929050565b60008060006060848603121561371a5761371961492c565b5b60006137288682870161331b565b9350506020613739868287016133f9565b925050604061374a868287016133f9565b9150509250925092565b6000806040838503121561376b5761376a61492c565b5b600083013567ffffffffffffffff81111561378957613788614927565b5b61379585828601613330565b925050602083013567ffffffffffffffff8111156137b6576137b5614927565b5b6137c28582860161335e565b9150509250929050565b600080604083850312156137e3576137e261492c565b5b600083013567ffffffffffffffff81111561380157613800614927565b5b61380d8582860161335e565b925050602083013567ffffffffffffffff81111561382e5761382d614927565b5b61383a8582860161335e565b9150509250929050565b6000806040838503121561385b5761385a61492c565b5b600083013567ffffffffffffffff81111561387957613878614927565b5b6138858582860161335e565b9250506020613896858286016133f9565b9150509250929050565b6000602082840312156138b6576138b561492c565b5b60006138c4848285016133a1565b91505092915050565b6000602082840312156138e3576138e261492c565b5b60006138f1848285016133b6565b91505092915050565b6000602082840312156139105761390f61492c565b5b600061391e848285016133f9565b91505092915050565b60006020828403121561393d5761393c61492c565b5b600061394b8482850161340e565b91505092915050565b6000806040838503121561396b5761396a61492c565b5b6000613979858286016133f9565b925050602061398a858286016133f9565b9150509250929050565b60006139a08383613e8d565b60208301905092915050565b6139b58161467c565b82525050565b60006139c6826144d9565b6139d0818561451f565b93506139db836144b4565b8060005b83811015613a0c5781516139f38882613994565b97506139fe83614505565b9250506001810190506139df565b5085935050505092915050565b6000613a24826144e4565b613a2e818561451f565b9350613a39836144c4565b8060005b83811015613a7157613a4e826148e3565b613a588882613994565b9750613a6383614512565b925050600181019050613a3d565b5085935050505092915050565b613a878161468e565b82525050565b6000613a98826144ef565b613aa28185614530565b9350613ab28185602086016146ff565b613abb81614931565b840191505092915050565b6000613ad1826144fa565b613adb818561454c565b9350613aeb8185602086016146ff565b613af481614931565b840191505092915050565b6000613b0c60288361454c565b9150613b178261495c565b604082019050919050565b6000613b2f601c8361454c565b9150613b3a826149ab565b602082019050919050565b6000613b5260268361454c565b9150613b5d826149d4565b604082019050919050565b6000613b7560248361454c565b9150613b8082614a23565b604082019050919050565b6000613b98601f8361454c565b9150613ba382614a72565b602082019050919050565b6000613bbb602a8361454c565b9150613bc682614a9b565b604082019050919050565b6000613bde60368361454c565b9150613be982614aea565b604082019050919050565b6000613c01602e8361454c565b9150613c0c82614b39565b604082019050919050565b6000613c2460168361454c565b9150613c2f82614b88565b602082019050919050565b6000613c47601c8361454c565b9150613c5282614bb1565b602082019050919050565b6000613c6a60258361454c565b9150613c7582614bda565b604082019050919050565b6000613c8d601c8361454c565b9150613c9882614c29565b602082019050919050565b6000613cb060368361454c565b9150613cbb82614c52565b604082019050919050565b6000613cd360168361454c565b9150613cde82614ca1565b602082019050919050565b6000613cf660238361454c565b9150613d0182614cca565b604082019050919050565b6000613d19602a8361454c565b9150613d2482614d19565b604082019050919050565b6000613d3c60108361454c565b9150613d4782614d68565b602082019050919050565b6000613d5f60208361454c565b9150613d6a82614d91565b602082019050919050565b6000613d8260258361454c565b9150613d8d82614dba565b604082019050919050565b6000613da5600083614530565b9150613db082614e09565b600082019050919050565b6000613dc8600083614541565b9150613dd382614e09565b600082019050919050565b6000613deb60298361454c565b9150613df682614e0c565b604082019050919050565b6000613e0e60298361454c565b9150613e1982614e5b565b604082019050919050565b6000613e3160288361454c565b9150613e3c82614eaa565b604082019050919050565b6000613e54601b8361454c565b9150613e5f82614ef9565b602082019050919050565b6000613e7760348361454c565b9150613e8282614f22565b604082019050919050565b613e96816146e6565b82525050565b613ea5816146e6565b82525050565b6000613eb682613dbb565b9150819050919050565b6000602082019050613ed560008301846139ac565b92915050565b600060a082019050613ef060008301886139ac565b613efd60208301876139ac565b8181036040830152613f0f81866139bb565b90508181036060830152613f2381856139bb565b90508181036080830152613f378184613a8d565b90509695505050505050565b600060a082019050613f5860008301876139ac565b613f6560208301866139ac565b8181036040830152613f778185613a19565b90508181036060830152613f8b8184613a19565b90508181036080830152613f9e81613d98565b905095945050505050565b600060a082019050613fbe60008301886139ac565b613fcb60208301876139ac565b613fd86040830186613e9c565b613fe56060830185613e9c565b8181036080830152613ff78184613a8d565b90509695505050505050565b600060408201905061401860008301856139ac565b6140256020830184613e9c565b9392505050565b6000602082019050818103600083015261404681846139bb565b905092915050565b6000604082019050818103600083015261406881856139bb565b9050818103602083015261407c81846139bb565b90509392505050565b600060208201905061409a6000830184613a7e565b92915050565b600060208201905081810360008301526140ba8184613ac6565b905092915050565b600060208201905081810360008301526140db81613aff565b9050919050565b600060208201905081810360008301526140fb81613b22565b9050919050565b6000602082019050818103600083015261411b81613b45565b9050919050565b6000602082019050818103600083015261413b81613b68565b9050919050565b6000602082019050818103600083015261415b81613b8b565b9050919050565b6000602082019050818103600083015261417b81613bae565b9050919050565b6000602082019050818103600083015261419b81613bd1565b9050919050565b600060208201905081810360008301526141bb81613bf4565b9050919050565b600060208201905081810360008301526141db81613c17565b9050919050565b600060208201905081810360008301526141fb81613c3a565b9050919050565b6000602082019050818103600083015261421b81613c5d565b9050919050565b6000602082019050818103600083015261423b81613c80565b9050919050565b6000602082019050818103600083015261425b81613ca3565b9050919050565b6000602082019050818103600083015261427b81613cc6565b9050919050565b6000602082019050818103600083015261429b81613ce9565b9050919050565b600060208201905081810360008301526142bb81613d0c565b9050919050565b600060208201905081810360008301526142db81613d2f565b9050919050565b600060208201905081810360008301526142fb81613d52565b9050919050565b6000602082019050818103600083015261431b81613d75565b9050919050565b6000602082019050818103600083015261433b81613dde565b9050919050565b6000602082019050818103600083015261435b81613e01565b9050919050565b6000602082019050818103600083015261437b81613e24565b9050919050565b6000602082019050818103600083015261439b81613e47565b9050919050565b600060208201905081810360008301526143bb81613e6a565b9050919050565b60006020820190506143d76000830184613e9c565b92915050565b60006040820190506143f26000830185613e9c565b6143ff6020830184613e9c565b9392505050565b6000614410614421565b905061441c828261477e565b919050565b6000604051905090565b600067ffffffffffffffff821115614446576144456148b4565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614472576144716148b4565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561449e5761449d6148b4565b5b6144a782614931565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081549050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000600182019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000614568826146e6565b9150614573836146e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145a8576145a76147f8565b5b828201905092915050565b60006145be826146e6565b91506145c9836146e6565b9250826145d9576145d8614827565b5b828204905092915050565b60006145ef826146e6565b91506145fa836146e6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614633576146326147f8565b5b828202905092915050565b6000614649826146e6565b9150614654836146e6565b925082821015614667576146666147f8565b5b828203905092915050565b6000819050919050565b6000614687826146c6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561471d578082015181840152602081019050614702565b8381111561472c576000848401525b50505050565b6000600282049050600182168061474a57607f821691505b6020821081141561475e5761475d614856565b5b50919050565b600061477761477283614942565b614672565b9050919050565b61478782614931565b810181811067ffffffffffffffff821117156147a6576147a56148b4565b5b80604052505050565b60006147ba826146e6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147ed576147ec6147f8565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006148ef8254614764565b9050919050565b600060033d11156149155760046000803e61491260005161494f565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160001c9050919050565b60008160e01c9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f706c6561736520656e746572206174206c65617374206f6e6520496400000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f706c6561736520656e746572206174206c65617374206f6e65206c6576656c00600082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f72656d61696e696e67207072697a6520706f6f6c206d7573742062696767657260008201527f207468616e20636c61696d61626c6520616d6f756e7400000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b7f43616e6e6f74206265207a65726f206164647265737300000000000000000000600082015250565b7f646973747269627574696f6e206e6f7420737461727465642079657400000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f616d6f756e74206d75737420626967676572207468616e207a65726f00000000600082015250565b7f596f752063616e2075736520746869732066756e6374696f6e207768656e206460008201527f6973747269627574696f6e206973207061757365642100000000000000000000602082015250565b7f43616e6e6f74206265206275726e206164647265737300000000000000000000600082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65642100000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5472616e7366657248656c7065723a204d415449435f5452414e534645525f4660008201527f41494c4544000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f646973747269627574696f6e206973206e6f7420737461727465640000000000600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600060443d1015614f8157615004565b614f89614421565b60043d036004823e80513d602482011167ffffffffffffffff82111715614fb1575050615004565b808201805167ffffffffffffffff811115614fcf5750505050615004565b80602083010160043d038501811115614fec575050505050615004565b614ffb8260200185018661477e565b82955050505050505b90565b6150108161467c565b811461501b57600080fd5b50565b6150278161468e565b811461503257600080fd5b50565b61503e8161469a565b811461504957600080fd5b50565b615055816146e6565b811461506057600080fd5b5056fe576f726c642043757020516174617220323032322050726564696374696f6e204e465420446973747269627574696f6ea26469706673582212200e86cb0b00f7dedd74de642236815839eeb069cd80053be433ab33192633858064736f6c6343000807003300000000000000000000000000000000000000000000007680d81a135be80000
Deployed Bytecode
0x60806040526004361061026a5760003560e01c80638b15b80a11610144578063c6bbcaa5116100b6578063e6fd48bc1161007a578063e6fd48bc14610901578063e985e9c51461092c578063ea6ef2fe14610969578063f242432a14610994578063f2fde38b146109bd578063f5298aca146109e657610271565b8063c6bbcaa51461081c578063cdba3f8c14610845578063d6c210421461085c578063ded0bafb14610887578063dfbf8b16146108c457610271565b8063a22cb46511610108578063a22cb46514610732578063a8dd85421461075b578063b14d37c014610786578063b744721f146107b1578063c4549408146107dc578063c4c413c1146107f357610271565b80638b15b80a146106495780638c749102146106745780638da5cb5b1461069f57806395d89b41146106ca5780639f20bc92146106f557610271565b80633c93bc2b116101dd57806365ac656d116101a157806365ac656d1461053b5780636b20c454146105785780636d1860e3146105a15780636fccb22b146105de578063715018a6146106095780637bbeeb801461062057610271565b80633c93bc2b1461047c5780634e1273f4146104a55780635c975abb146104e25780635ee58efc1461050d5780635fd8c7101461052457610271565b80631c75f0851161022f5780631c75f0851461037e5780632297a1ba146103a957806326aa1842146103d45780632eb2c2d6146103fd57806336d2e7bf14610426578063398ab9a71461045157610271565b8062fdd58e1461027357806301ffc9a7146102b057806306fdde03146102ed5780630e89341c1461031857806314eb76ac1461035557610271565b3661027157005b005b34801561027f57600080fd5b5061029a600480360381019061029591906136c1565b610a0f565b6040516102a791906143c2565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d291906138a0565b610ad8565b6040516102e49190614085565b60405180910390f35b3480156102f957600080fd5b50610302610bba565b60405161030f91906140a0565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a91906138fa565b610bd6565b60405161034c91906140a0565b60405180910390f35b34801561036157600080fd5b5061037c60048036038101906103779190613423565b610c6a565b005b34801561038a57600080fd5b50610393610cb6565b6040516103a09190613ec0565b60405180910390f35b3480156103b557600080fd5b506103be610cdc565b6040516103cb91906143c2565b60405180910390f35b3480156103e057600080fd5b506103fb60048036038101906103f69190613954565b610ce2565b005b34801561040957600080fd5b50610424600480360381019061041f9190613490565b610d1d565b005b34801561043257600080fd5b5061043b610dbe565b60405161044891906143c2565b60405180910390f35b34801561045d57600080fd5b50610466610dc4565b60405161047391906143c2565b60405180910390f35b34801561048857600080fd5b506104a3600480360381019061049e9190613844565b610dca565b005b3480156104b157600080fd5b506104cc60048036038101906104c79190613754565b610e6c565b6040516104d9919061402c565b60405180910390f35b3480156104ee57600080fd5b506104f7610f85565b6040516105049190614085565b60405180910390f35b34801561051957600080fd5b50610522610f98565b005b34801561053057600080fd5b50610539611563565b005b34801561054757600080fd5b50610562600480360381019061055d91906138fa565b611670565b60405161056f91906143c2565b60405180910390f35b34801561058457600080fd5b5061059f600480360381019061059a91906135f6565b611688565b005b3480156105ad57600080fd5b506105c860048036038101906105c391906138fa565b611725565b6040516105d591906143c2565b60405180910390f35b3480156105ea57600080fd5b506105f361173d565b60405161060091906143c2565b60405180910390f35b34801561061557600080fd5b5061061e611743565b005b34801561062c57600080fd5b50610647600480360381019061064291906138fa565b611757565b005b34801561065557600080fd5b5061065e611769565b60405161066b91906143c2565b60405180910390f35b34801561068057600080fd5b5061068961176f565b6040516106969190613ec0565b60405180910390f35b3480156106ab57600080fd5b506106b4611795565b6040516106c19190613ec0565b60405180910390f35b3480156106d657600080fd5b506106df6117bf565b6040516106ec91906140a0565b60405180910390f35b34801561070157600080fd5b5061071c600480360381019061071791906136c1565b6117f8565b60405161072991906143c2565b60405180910390f35b34801561073e57600080fd5b5061075960048036038101906107549190613681565b611829565b005b34801561076757600080fd5b5061077061183f565b60405161077d91906143c2565b60405180910390f35b34801561079257600080fd5b5061079b611845565b6040516107a891906143c2565b60405180910390f35b3480156107bd57600080fd5b506107c661184b565b6040516107d391906143c2565b60405180910390f35b3480156107e857600080fd5b506107f1611851565b005b3480156107ff57600080fd5b5061081a600480360381019061081591906137cc565b611885565b005b34801561082857600080fd5b50610843600480360381019061083e9190613423565b611941565b005b34801561085157600080fd5b5061085a611a50565b005b34801561086857600080fd5b50610871611b68565b60405161087e91906143c2565b60405180910390f35b34801561089357600080fd5b506108ae60048036038101906108a991906138fa565b611b6e565b6040516108bb91906143c2565b60405180910390f35b3480156108d057600080fd5b506108eb60048036038101906108e691906136c1565b611b92565b6040516108f891906143c2565b60405180910390f35b34801561090d57600080fd5b50610916611bc3565b60405161092391906143c2565b60405180910390f35b34801561093857600080fd5b50610953600480360381019061094e9190613450565b611bc9565b6040516109609190614085565b60405180910390f35b34801561097557600080fd5b5061097e611c5d565b60405161098b91906143c2565b60405180910390f35b3480156109a057600080fd5b506109bb60048036038101906109b6919061355f565b611c63565b005b3480156109c957600080fd5b506109e460048036038101906109df9190613423565b611d04565b005b3480156109f257600080fd5b50610a0d6004803603810190610a089190613701565b611d88565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7790614162565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ba357507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bb35750610bb282611e25565b5b9050919050565b6040518060600160405280603081526020016150646030913981565b606060028054610be590614732565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1190614732565b8015610c5e5780601f10610c3357610100808354040283529160200191610c5e565b820191906000526020600020905b815481529060010190602001808311610c4157829003601f168201915b50505050509050919050565b610c72611e8f565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b610cea611e8f565b606481610cf791906145e4565b60148381548110610d0b57610d0a614885565b5b90600052602060002001819055505050565b610d25611f0d565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610d6b5750610d6a85610d65611f0d565b611bc9565b5b610daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da1906141a2565b60405180910390fd5b610db78585858585611f15565b5050505050565b600f5481565b60185481565b610dd2611e8f565b6000825111610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d906140e2565b60405180910390fd5b60005b8251811015610e675781600a6000858481518110610e3a57610e39614885565b5b60200260200101518152602001908152602001600020819055508080610e5f906147af565b915050610e19565b505050565b60608151835114610eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea990614342565b60405180910390fd5b6000835167ffffffffffffffff811115610ecf57610ece6148b4565b5b604051908082528060200260200182016040528015610efd5781602001602082028036833780820191505090505b50905060005b8451811015610f7a57610f4a858281518110610f2257610f21614885565b5b6020026020010151858381518110610f3d57610f3c614885565b5b6020026020010151610a0f565b828281518110610f5d57610f5c614885565b5b60200260200101818152505080610f73906147af565b9050610f03565b508091505092915050565b601a60009054906101000a900460ff1681565b601a60009054906101000a900460ff1615610fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdf90614382565b60405180910390fd5b600954421161102c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611023906141e2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561109c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611093906141c2565b60405180910390fd5b60003390506000600190508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611116576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110d90614262565b60405180910390fd5b600080600090505b6020811015611444576000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd85b039836040518263ffffffff1660e01b815260040161118491906143c2565b60206040518083038186803b15801561119c57600080fd5b505afa1580156111b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d49190613927565b90506000811115611430576000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e87856040518363ffffffff1660e01b815260040161123d929190614003565b60206040518083038186803b15801561125557600080fd5b505afa158015611269573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128d9190613927565b9050600081111561142e57601560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020839080600181540180825580915050600190039060005260206000200160009091909190915055601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150556000600b6000600a600087815260200190815260200160002054815260200190815260200160002054111561142d576000600b6000600a600087815260200190815260200160002054815260200190815260200160002054836113c791906145e4565b6014600a600087815260200190815260200160002054815481106113ee576113ed614885565b5b906000526020600020015460185461140691906145e4565b61141091906145b3565b9050818161141e91906145e4565b85611429919061455d565b9450505b5b505b50808061143c906147af565b91505061111e565b50600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632eb2c2d63384601560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020601660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518563ffffffff1660e01b81526004016115229493929190613f43565b600060405180830381600087803b15801561153c57600080fd5b505af1158015611550573d6000803e3d6000fd5b5050505061155e8382612237565b505050565b601a60009054906101000a900460ff166115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a990614242565b60405180910390fd5b6115ba611e8f565b60006115c4611795565b73ffffffffffffffffffffffffffffffffffffffff16476040516115e790613eab565b60006040518083038185875af1925050503d8060008114611624576040519150601f19603f3d011682016040523d82523d6000602084013e611629565b606091505b505090508061166d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611664906142c2565b60405180910390fd5b50565b600a6020528060005260406000206000915090505481565b611690611f0d565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806116d657506116d5836116d0611f0d565b611bc9565b5b611715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170c906141a2565b60405180910390fd5b611720838383612399565b505050565b600b6020528060005260406000206000915090505481565b600d5481565b61174b611e8f565b6117556000612668565b565b61175f611e8f565b8060188190555050565b60115481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6040518060400160405280600681526020017f574351504e44000000000000000000000000000000000000000000000000000081525081565b6015602052816000526040600020818154811061181457600080fd5b90600052602060002001600091509150505481565b61183b611834611f0d565b838361272e565b5050565b600e5481565b60195481565b600c5481565b611859611e8f565b601a60009054906101000a900460ff1615601a60006101000a81548160ff021916908315150217905550565b61188d611e8f565b60008251116118d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c890614142565b60405180910390fd5b60005b825181101561193c578181815181106118f0576118ef614885565b5b6020026020010151600b600085848151811061190f5761190e614885565b5b60200260200101518152602001908152602001600020819055508080611934906147af565b9150506118d4565b505050565b611949611e8f565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611a58611e8f565b60006127106014600781548110611a7257611a71614885565b5b9060005260206000200154601854611a8a91906145e4565b611a9491906145b3565b90506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611ade90613eab565b60006040518083038185875af1925050503d8060008114611b1b576040519150601f19603f3d011682016040523d82523d6000602084013e611b20565b606091505b5050905080611b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5b906142c2565b60405180910390fd5b5050565b60125481565b60148181548110611b7e57600080fd5b906000526020600020016000915090505481565b60166020528160005260406000208181548110611bae57600080fd5b90600052602060002001600091509150505481565b60095481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60135481565b611c6b611f0d565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611cb15750611cb085611cab611f0d565b611bc9565b5b611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce7906141a2565b60405180910390fd5b611cfd858585858561289b565b5050505050565b611d0c611e8f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7390614102565b60405180910390fd5b611d8581612668565b50565b611d90611f0d565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611dd65750611dd583611dd0611f0d565b611bc9565b5b611e15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0c906141a2565b60405180910390fd5b611e20838383612b37565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611e97611f0d565b73ffffffffffffffffffffffffffffffffffffffff16611eb5611795565b73ffffffffffffffffffffffffffffffffffffffff1614611f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f02906142e2565b60405180910390fd5b565b600033905090565b8151835114611f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5090614362565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc090614202565b60405180910390fd5b6000611fd3611f0d565b9050611fe3818787878787612d7e565b60005b845181101561219457600085828151811061200457612003614885565b5b60200260200101519050600085838151811061202357612022614885565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156120c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bb906142a2565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612179919061455d565b925050819055505050508061218d906147af565b9050611fe6565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161220b92919061404e565b60405180910390a4612221818787878787612d86565b61222f818787878787612d8e565b505050505050565b6000811161227a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227190614222565b60405180910390fd5b60006127108261228a91906145b3565b90508047116122ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c590614182565b60405180910390fd5b80601960008282546122e0919061463e565b9250508190555060008373ffffffffffffffffffffffffffffffffffffffff168260405161230d90613eab565b60006040518083038185875af1925050503d806000811461234a576040519150601f19603f3d011682016040523d82523d6000602084013e61234f565b606091505b5050905080612393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238a90614302565b60405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240090614282565b60405180910390fd5b805182511461244d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244490614362565b60405180910390fd5b6000612457611f0d565b905061247781856000868660405180602001604052806000815250612d7e565b60005b83518110156125c457600084828151811061249857612497614885565b5b6020026020010151905060008483815181106124b7576124b6614885565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254f90614122565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505080806125bc906147af565b91505061247a565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161263c92919061404e565b60405180910390a461266281856000868660405180602001604052806000815250612d86565b50505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561279d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279490614322565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161288e9190614085565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561290b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290290614202565b60405180910390fd5b6000612915611f0d565b9050600061292285612f75565b9050600061292f85612f75565b905061293f838989858589612d7e565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156129d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cd906142a2565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a8b919061455d565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612b089291906143dd565b60405180910390a4612b1e848a8a86868a612d86565b612b2c848a8a8a8a8a612fef565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9e90614282565b60405180910390fd5b6000612bb1611f0d565b90506000612bbe84612f75565b90506000612bcb84612f75565b9050612beb83876000858560405180602001604052806000815250612d7e565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612c82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7990614122565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612d4f9291906143dd565b60405180910390a4612d7584886000868660405180602001604052806000815250612d86565b50505050505050565b505050505050565b505050505050565b612dad8473ffffffffffffffffffffffffffffffffffffffff166131d6565b15612f6d578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612df3959493929190613edb565b602060405180830381600087803b158015612e0d57600080fd5b505af1925050508015612e3e57506040513d601f19601f82011682018060405250810190612e3b91906138cd565b60015b612ee457612e4a6148f6565b806308c379a01415612ea75750612e5f614f71565b80612e6a5750612ea9565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9e91906140a0565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612edb906143a2565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f62906140c2565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff811115612f9457612f936148b4565b5b604051908082528060200260200182016040528015612fc25781602001602082028036833780820191505090505b5090508281600081518110612fda57612fd9614885565b5b60200260200101818152505080915050919050565b61300e8473ffffffffffffffffffffffffffffffffffffffff166131d6565b156131ce578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401613054959493929190613fa9565b602060405180830381600087803b15801561306e57600080fd5b505af192505050801561309f57506040513d601f19601f8201168201806040525081019061309c91906138cd565b60015b613145576130ab6148f6565b806308c379a0141561310857506130c0614f71565b806130cb575061310a565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ff91906140a0565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313c906143a2565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146131cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c3906140c2565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600061320c6132078461442b565b614406565b9050808382526020820190508285602086028201111561322f5761322e61491d565b5b60005b8581101561325f5781613245888261331b565b845260208401935060208301925050600181019050613232565b5050509392505050565b600061327c61327784614457565b614406565b9050808382526020820190508285602086028201111561329f5761329e61491d565b5b60005b858110156132cf57816132b588826133f9565b8452602084019350602083019250506001810190506132a2565b5050509392505050565b60006132ec6132e784614483565b614406565b90508281526020810184848401111561330857613307614922565b5b6133138482856146f0565b509392505050565b60008135905061332a81615007565b92915050565b600082601f83011261334557613344614918565b5b81356133558482602086016131f9565b91505092915050565b600082601f83011261337357613372614918565b5b8135613383848260208601613269565b91505092915050565b60008135905061339b8161501e565b92915050565b6000813590506133b081615035565b92915050565b6000815190506133c581615035565b92915050565b600082601f8301126133e0576133df614918565b5b81356133f08482602086016132d9565b91505092915050565b6000813590506134088161504c565b92915050565b60008151905061341d8161504c565b92915050565b6000602082840312156134395761343861492c565b5b60006134478482850161331b565b91505092915050565b600080604083850312156134675761346661492c565b5b60006134758582860161331b565b92505060206134868582860161331b565b9150509250929050565b600080600080600060a086880312156134ac576134ab61492c565b5b60006134ba8882890161331b565b95505060206134cb8882890161331b565b945050604086013567ffffffffffffffff8111156134ec576134eb614927565b5b6134f88882890161335e565b935050606086013567ffffffffffffffff81111561351957613518614927565b5b6135258882890161335e565b925050608086013567ffffffffffffffff81111561354657613545614927565b5b613552888289016133cb565b9150509295509295909350565b600080600080600060a0868803121561357b5761357a61492c565b5b60006135898882890161331b565b955050602061359a8882890161331b565b94505060406135ab888289016133f9565b93505060606135bc888289016133f9565b925050608086013567ffffffffffffffff8111156135dd576135dc614927565b5b6135e9888289016133cb565b9150509295509295909350565b60008060006060848603121561360f5761360e61492c565b5b600061361d8682870161331b565b935050602084013567ffffffffffffffff81111561363e5761363d614927565b5b61364a8682870161335e565b925050604084013567ffffffffffffffff81111561366b5761366a614927565b5b6136778682870161335e565b9150509250925092565b600080604083850312156136985761369761492c565b5b60006136a68582860161331b565b92505060206136b78582860161338c565b9150509250929050565b600080604083850312156136d8576136d761492c565b5b60006136e68582860161331b565b92505060206136f7858286016133f9565b9150509250929050565b60008060006060848603121561371a5761371961492c565b5b60006137288682870161331b565b9350506020613739868287016133f9565b925050604061374a868287016133f9565b9150509250925092565b6000806040838503121561376b5761376a61492c565b5b600083013567ffffffffffffffff81111561378957613788614927565b5b61379585828601613330565b925050602083013567ffffffffffffffff8111156137b6576137b5614927565b5b6137c28582860161335e565b9150509250929050565b600080604083850312156137e3576137e261492c565b5b600083013567ffffffffffffffff81111561380157613800614927565b5b61380d8582860161335e565b925050602083013567ffffffffffffffff81111561382e5761382d614927565b5b61383a8582860161335e565b9150509250929050565b6000806040838503121561385b5761385a61492c565b5b600083013567ffffffffffffffff81111561387957613878614927565b5b6138858582860161335e565b9250506020613896858286016133f9565b9150509250929050565b6000602082840312156138b6576138b561492c565b5b60006138c4848285016133a1565b91505092915050565b6000602082840312156138e3576138e261492c565b5b60006138f1848285016133b6565b91505092915050565b6000602082840312156139105761390f61492c565b5b600061391e848285016133f9565b91505092915050565b60006020828403121561393d5761393c61492c565b5b600061394b8482850161340e565b91505092915050565b6000806040838503121561396b5761396a61492c565b5b6000613979858286016133f9565b925050602061398a858286016133f9565b9150509250929050565b60006139a08383613e8d565b60208301905092915050565b6139b58161467c565b82525050565b60006139c6826144d9565b6139d0818561451f565b93506139db836144b4565b8060005b83811015613a0c5781516139f38882613994565b97506139fe83614505565b9250506001810190506139df565b5085935050505092915050565b6000613a24826144e4565b613a2e818561451f565b9350613a39836144c4565b8060005b83811015613a7157613a4e826148e3565b613a588882613994565b9750613a6383614512565b925050600181019050613a3d565b5085935050505092915050565b613a878161468e565b82525050565b6000613a98826144ef565b613aa28185614530565b9350613ab28185602086016146ff565b613abb81614931565b840191505092915050565b6000613ad1826144fa565b613adb818561454c565b9350613aeb8185602086016146ff565b613af481614931565b840191505092915050565b6000613b0c60288361454c565b9150613b178261495c565b604082019050919050565b6000613b2f601c8361454c565b9150613b3a826149ab565b602082019050919050565b6000613b5260268361454c565b9150613b5d826149d4565b604082019050919050565b6000613b7560248361454c565b9150613b8082614a23565b604082019050919050565b6000613b98601f8361454c565b9150613ba382614a72565b602082019050919050565b6000613bbb602a8361454c565b9150613bc682614a9b565b604082019050919050565b6000613bde60368361454c565b9150613be982614aea565b604082019050919050565b6000613c01602e8361454c565b9150613c0c82614b39565b604082019050919050565b6000613c2460168361454c565b9150613c2f82614b88565b602082019050919050565b6000613c47601c8361454c565b9150613c5282614bb1565b602082019050919050565b6000613c6a60258361454c565b9150613c7582614bda565b604082019050919050565b6000613c8d601c8361454c565b9150613c9882614c29565b602082019050919050565b6000613cb060368361454c565b9150613cbb82614c52565b604082019050919050565b6000613cd360168361454c565b9150613cde82614ca1565b602082019050919050565b6000613cf660238361454c565b9150613d0182614cca565b604082019050919050565b6000613d19602a8361454c565b9150613d2482614d19565b604082019050919050565b6000613d3c60108361454c565b9150613d4782614d68565b602082019050919050565b6000613d5f60208361454c565b9150613d6a82614d91565b602082019050919050565b6000613d8260258361454c565b9150613d8d82614dba565b604082019050919050565b6000613da5600083614530565b9150613db082614e09565b600082019050919050565b6000613dc8600083614541565b9150613dd382614e09565b600082019050919050565b6000613deb60298361454c565b9150613df682614e0c565b604082019050919050565b6000613e0e60298361454c565b9150613e1982614e5b565b604082019050919050565b6000613e3160288361454c565b9150613e3c82614eaa565b604082019050919050565b6000613e54601b8361454c565b9150613e5f82614ef9565b602082019050919050565b6000613e7760348361454c565b9150613e8282614f22565b604082019050919050565b613e96816146e6565b82525050565b613ea5816146e6565b82525050565b6000613eb682613dbb565b9150819050919050565b6000602082019050613ed560008301846139ac565b92915050565b600060a082019050613ef060008301886139ac565b613efd60208301876139ac565b8181036040830152613f0f81866139bb565b90508181036060830152613f2381856139bb565b90508181036080830152613f378184613a8d565b90509695505050505050565b600060a082019050613f5860008301876139ac565b613f6560208301866139ac565b8181036040830152613f778185613a19565b90508181036060830152613f8b8184613a19565b90508181036080830152613f9e81613d98565b905095945050505050565b600060a082019050613fbe60008301886139ac565b613fcb60208301876139ac565b613fd86040830186613e9c565b613fe56060830185613e9c565b8181036080830152613ff78184613a8d565b90509695505050505050565b600060408201905061401860008301856139ac565b6140256020830184613e9c565b9392505050565b6000602082019050818103600083015261404681846139bb565b905092915050565b6000604082019050818103600083015261406881856139bb565b9050818103602083015261407c81846139bb565b90509392505050565b600060208201905061409a6000830184613a7e565b92915050565b600060208201905081810360008301526140ba8184613ac6565b905092915050565b600060208201905081810360008301526140db81613aff565b9050919050565b600060208201905081810360008301526140fb81613b22565b9050919050565b6000602082019050818103600083015261411b81613b45565b9050919050565b6000602082019050818103600083015261413b81613b68565b9050919050565b6000602082019050818103600083015261415b81613b8b565b9050919050565b6000602082019050818103600083015261417b81613bae565b9050919050565b6000602082019050818103600083015261419b81613bd1565b9050919050565b600060208201905081810360008301526141bb81613bf4565b9050919050565b600060208201905081810360008301526141db81613c17565b9050919050565b600060208201905081810360008301526141fb81613c3a565b9050919050565b6000602082019050818103600083015261421b81613c5d565b9050919050565b6000602082019050818103600083015261423b81613c80565b9050919050565b6000602082019050818103600083015261425b81613ca3565b9050919050565b6000602082019050818103600083015261427b81613cc6565b9050919050565b6000602082019050818103600083015261429b81613ce9565b9050919050565b600060208201905081810360008301526142bb81613d0c565b9050919050565b600060208201905081810360008301526142db81613d2f565b9050919050565b600060208201905081810360008301526142fb81613d52565b9050919050565b6000602082019050818103600083015261431b81613d75565b9050919050565b6000602082019050818103600083015261433b81613dde565b9050919050565b6000602082019050818103600083015261435b81613e01565b9050919050565b6000602082019050818103600083015261437b81613e24565b9050919050565b6000602082019050818103600083015261439b81613e47565b9050919050565b600060208201905081810360008301526143bb81613e6a565b9050919050565b60006020820190506143d76000830184613e9c565b92915050565b60006040820190506143f26000830185613e9c565b6143ff6020830184613e9c565b9392505050565b6000614410614421565b905061441c828261477e565b919050565b6000604051905090565b600067ffffffffffffffff821115614446576144456148b4565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614472576144716148b4565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561449e5761449d6148b4565b5b6144a782614931565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081549050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000600182019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000614568826146e6565b9150614573836146e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145a8576145a76147f8565b5b828201905092915050565b60006145be826146e6565b91506145c9836146e6565b9250826145d9576145d8614827565b5b828204905092915050565b60006145ef826146e6565b91506145fa836146e6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614633576146326147f8565b5b828202905092915050565b6000614649826146e6565b9150614654836146e6565b925082821015614667576146666147f8565b5b828203905092915050565b6000819050919050565b6000614687826146c6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561471d578082015181840152602081019050614702565b8381111561472c576000848401525b50505050565b6000600282049050600182168061474a57607f821691505b6020821081141561475e5761475d614856565b5b50919050565b600061477761477283614942565b614672565b9050919050565b61478782614931565b810181811067ffffffffffffffff821117156147a6576147a56148b4565b5b80604052505050565b60006147ba826146e6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147ed576147ec6147f8565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006148ef8254614764565b9050919050565b600060033d11156149155760046000803e61491260005161494f565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160001c9050919050565b60008160e01c9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f706c6561736520656e746572206174206c65617374206f6e6520496400000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f706c6561736520656e746572206174206c65617374206f6e65206c6576656c00600082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f72656d61696e696e67207072697a6520706f6f6c206d7573742062696767657260008201527f207468616e20636c61696d61626c6520616d6f756e7400000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b7f43616e6e6f74206265207a65726f206164647265737300000000000000000000600082015250565b7f646973747269627574696f6e206e6f7420737461727465642079657400000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f616d6f756e74206d75737420626967676572207468616e207a65726f00000000600082015250565b7f596f752063616e2075736520746869732066756e6374696f6e207768656e206460008201527f6973747269627574696f6e206973207061757365642100000000000000000000602082015250565b7f43616e6e6f74206265206275726e206164647265737300000000000000000000600082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65642100000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5472616e7366657248656c7065723a204d415449435f5452414e534645525f4660008201527f41494c4544000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f646973747269627574696f6e206973206e6f7420737461727465640000000000600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600060443d1015614f8157615004565b614f89614421565b60043d036004823e80513d602482011167ffffffffffffffff82111715614fb1575050615004565b808201805167ffffffffffffffff811115614fcf5750505050615004565b80602083010160043d038501811115614fec575050505050615004565b614ffb8260200185018661477e565b82955050505050505b90565b6150108161467c565b811461501b57600080fd5b50565b6150278161468e565b811461503257600080fd5b50565b61503e8161469a565b811461504957600080fd5b50565b615055816146e6565b811461506057600080fd5b5056fe576f726c642043757020516174617220323032322050726564696374696f6e204e465420446973747269627574696f6ea26469706673582212200e86cb0b00f7dedd74de642236815839eeb069cd80053be433ab33192633858064736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000007680d81a135be80000
-----Decoded View---------------
Arg [0] : _totalPool (uint256): 2186000000000000000000
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000007680d81a135be80000
Deployed Bytecode Sourcemap
66658:5962:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47834:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46869:298;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66835:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47578:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71870:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67094:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67673:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71069:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49757:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67628:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68179:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71239:290;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48230:504;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68314:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69188:1331;;;;;;;;;;;;;:::i;:::-;;72356:186;;;;;;;;;;;;;:::i;:::-;;67304:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64071:358;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67376:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67533:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27010:103;;;;;;;;;;;;;:::i;:::-;;71989:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67719:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66971:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26362:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66922:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68016;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48807:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67582:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68248:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67487:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70978:83;;;;;;;;;;;;;:::i;:::-;;71537:325;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68835:345;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72115:233;;;;;;;;;;;;;:::i;:::-;;67764:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67855:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68063:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67195:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49034:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67808:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49274:406;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27268:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63737:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47834:230;47920:7;47967:1;47948:21;;:7;:21;;;;47940:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;48034:9;:13;48044:2;48034:13;;;;;;;;;;;:22;48048:7;48034:22;;;;;;;;;;;;;;;;48027:29;;47834:230;;;;:::o;46869:298::-;46971:4;47019:26;47004:41;;;:11;:41;;;;:106;;;;47073:37;47058:52;;;:11;:52;;;;47004:106;:155;;;;47123:36;47147:11;47123:23;:36::i;:::-;47004:155;46988:171;;46869:298;;;:::o;66835:80::-;;;;;;;;;;;;;;;;;;;:::o;47578:105::-;47638:13;47671:4;47664:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47578:105;;;:::o;71870:111::-;26248:13;:11;:13::i;:::-;71962:11:::1;71948;;:25;;;;;;;;;;;;;;;;;;71870:111:::0;:::o;67094:71::-;;;;;;;;;;;;;:::o;67673:33::-;;;;:::o;71069:162::-;26248:13;:11;:13::i;:::-;71197:3:::1;71183:11;:17;;;;:::i;:::-;71162:8;71171;71162:18;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;71069:162:::0;;:::o;49757:438::-;49998:12;:10;:12::i;:::-;49990:20;;:4;:20;;;:60;;;;50014:36;50031:4;50037:12;:10;:12::i;:::-;50014:16;:36::i;:::-;49990:60;49968:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;50135:52;50158:4;50164:2;50168:3;50173:7;50182:4;50135:22;:52::i;:::-;49757:438;;;;;:::o;67628:32::-;;;;:::o;68179:29::-;;;;:::o;71239:290::-;26248:13;:11;:13::i;:::-;71368:1:::1;71350:8;:15;:19;71342:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;71418:9;71413:109;71437:8;:15;71433:1;:19;71413:109;;;71503:7;71474:13;:26;71488:8;71497:1;71488:11;;;;;;;;:::i;:::-;;;;;;;;71474:26;;;;;;;;;;;:36;;;;71454:3;;;;;:::i;:::-;;;;71413:109;;;;71239:290:::0;;:::o;48230:504::-;48366:16;48427:3;:10;48408:8;:15;:29;48400:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;48496:30;48543:8;:15;48529:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48496:63;;48577:9;48572:122;48596:8;:15;48592:1;:19;48572:122;;;48652:30;48662:8;48671:1;48662:11;;;;;;;;:::i;:::-;;;;;;;;48675:3;48679:1;48675:6;;;;;;;;:::i;:::-;;;;;;;;48652:9;:30::i;:::-;48633:13;48647:1;48633:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;48613:3;;;;:::i;:::-;;;48572:122;;;;48713:13;48706:20;;;48230:504;;;;:::o;68314:18::-;;;;;;;;;;;;;:::o;69188:1331::-;69241:6;;;;;;;;;;;69240:7;69232:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;69316:14;;69298:15;:32;69290:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;69405:1;69383:24;;:10;:24;;;;69375:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;69445:12;69460:10;69445:25;;69481:19;69503:42;69481:64;;69578:11;69564:25;;:10;:25;;;;69556:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;69627:19;69664:9;69676:1;69664:13;;69659:701;69683:2;69679:1;:6;69659:701;;;69707:23;69733:11;;;;;;;;;;;:23;;;69757:1;69733:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69707:52;;69796:1;69778:15;:19;69774:575;;;69818:20;69841:15;;;;;;;;;;;:25;;;69867:4;69873:1;69841:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69818:57;;69913:1;69898:12;:16;69894:440;;;69939:3;:9;69943:4;69939:9;;;;;;;;;;;;;;;69954:1;69939:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69979:7;:13;69987:4;69979:13;;;;;;;;;;;;;;;69998:12;69979:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70072:1;70038:13;:31;70052:13;:16;70066:1;70052:16;;;;;;;;;;;;70038:31;;;;;;;;;;;;:35;70034:281;;;70102:19;70191:13;:31;70205:13;:16;70219:1;70205:16;;;;;;;;;;;;70191:31;;;;;;;;;;;;70173:15;:49;;;;:::i;:::-;70143:8;70152:13;:16;70166:1;70152:16;;;;;;;;;;;;70143:26;;;;;;;;:::i;:::-;;;;;;;;;;70125:14;;:44;;;;:::i;:::-;70124:99;;;;:::i;:::-;70102:121;;70279:12;70265:11;:26;;;;:::i;:::-;70250:41;;;;;:::i;:::-;;;70075:240;70034:281;69894:440;69799:550;69774:575;69692:668;69687:3;;;;;:::i;:::-;;;;69659:701;;;;70372:15;;;;;;;;;;;:37;;;70410:10;70422:11;70435:3;:9;70439:4;70435:9;;;;;;;;;;;;;;;70446:7;:13;70454:4;70446:13;;;;;;;;;;;;;;;70372:92;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70475:36;70493:4;70499:11;70475:17;:36::i;:::-;69221:1298;;;69188:1331::o;72356:186::-;68380:6;;;;;;;;;;;68372:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26248:13:::1;:11;:13::i;:::-;72423:12:::2;72440:7;:5;:7::i;:::-;:12;;72461:21;72440:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72422:65;;;72506:7;72498:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;72411:131;72356:186::o:0;67304:48::-;;;;;;;;;;;;;;;;;:::o;64071:358::-;64247:12;:10;:12::i;:::-;64236:23;;:7;:23;;;:66;;;;64263:39;64280:7;64289:12;:10;:12::i;:::-;64263:16;:39::i;:::-;64236:66;64214:162;;;;;;;;;;;;:::i;:::-;;;;;;;;;64389:32;64400:7;64409:3;64414:6;64389:10;:32::i;:::-;64071:358;;;:::o;67376:48::-;;;;;;;;;;;;;;;;;:::o;67533:33::-;;;;:::o;27010:103::-;26248:13;:11;:13::i;:::-;27075:30:::1;27102:1;27075:18;:30::i;:::-;27010:103::o:0;71989:118::-;26248:13;:11;:13::i;:::-;72086::::1;72069:14;:30;;;;71989:118:::0;:::o;67719:30::-;;;;:::o;66971:85::-;;;;;;;;;;;;;:::o;26362:87::-;26408:7;26435:6;;;;;;;;;;;26428:13;;26362:87;:::o;66922:40::-;;;;;;;;;;;;;;;;;;;:::o;68016:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48807:155::-;48902:52;48921:12;:10;:12::i;:::-;48935:8;48945;48902:18;:52::i;:::-;48807:155;;:::o;67582:32::-;;;;:::o;68248:28::-;;;;:::o;67487:32::-;;;;:::o;70978:83::-;26248:13;:11;:13::i;:::-;71047:6:::1;;;;;;;;;;;71046:7;71037:6;;:16;;;;;;;;;;;;;;;;;;70978:83::o:0;71537:325::-;26248:13;:11;:13::i;:::-;71685:1:::1;71661:14;:21;:25;71653:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;71738:9;71733:122;71757:14;:21;71753:1;:25;71733:122;;;71835:5;71841:1;71835:8;;;;;;;;:::i;:::-;;;;;;;;71800:13;:32;71814:14;71829:1;71814:17;;;;;;;;:::i;:::-;;;;;;;;71800:32;;;;;;;;;;;:43;;;;71780:3;;;;;:::i;:::-;;;;71733:122;;;;71537:325:::0;;:::o;68835:345::-;26248:13;:11;:13::i;:::-;68956:22:::1;68928:25;;:50;;;;;;;;;;;;;;;;;;69026:22;68989:18;;:60;;;;;;;;;;;;;;;;;;69087:22;69060:15;;:50;;;;;;;;;;;;;;;;;;69149:22;69121:11;;:51;;;;;;;;;;;;;;;;;;68835:345:::0;:::o;72115:233::-;26248:13;:11;:13::i;:::-;72175:14:::1;72223:5;72209:8;72218:1;72209:11;;;;;;;;:::i;:::-;;;;;;;;;;72192:14;;:28;;;;:::i;:::-;:36;;;;:::i;:::-;72175:53;;72240:12;72257:11;;;;;;;;;;;:16;;72282:6;72257:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72239:54;;;72312:7;72304:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;72164:184;;72115:233::o:0;67764:31::-;;;;:::o;67855:123::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68063:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67195:42::-;;;;:::o;49034:168::-;49133:4;49157:18;:27;49176:7;49157:27;;;;;;;;;;;;;;;:37;49185:8;49157:37;;;;;;;;;;;;;;;;;;;;;;;;;49150:44;;49034:168;;;;:::o;67808:31::-;;;;:::o;49274:406::-;49490:12;:10;:12::i;:::-;49482:20;;:4;:20;;;:60;;;;49506:36;49523:4;49529:12;:10;:12::i;:::-;49506:16;:36::i;:::-;49482:60;49460:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;49627:45;49645:4;49651:2;49655;49659:6;49667:4;49627:17;:45::i;:::-;49274:406;;;;;:::o;27268:201::-;26248:13;:11;:13::i;:::-;27377:1:::1;27357:22;;:8;:22;;;;27349:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27433:28;27452:8;27433:18;:28::i;:::-;27268:201:::0;:::o;63737:326::-;63888:12;:10;:12::i;:::-;63877:23;;:7;:23;;;:66;;;;63904:39;63921:7;63930:12;:10;:12::i;:::-;63904:16;:39::i;:::-;63877:66;63855:162;;;;;;;;;;;;:::i;:::-;;;;;;;;;64030:25;64036:7;64045:2;64049:5;64030;:25::i;:::-;63737:326;;;:::o;38162:157::-;38247:4;38286:25;38271:40;;;:11;:40;;;;38264:47;;38162:157;;;:::o;26527:132::-;26602:12;:10;:12::i;:::-;26591:23;;:7;:5;:7::i;:::-;:23;;;26583:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26527:132::o;24913:98::-;24966:7;24993:10;24986:17;;24913:98;:::o;51979:1134::-;52206:7;:14;52192:3;:10;:28;52184:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;52298:1;52284:16;;:2;:16;;;;52276:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;52355:16;52374:12;:10;:12::i;:::-;52355:31;;52399:60;52420:8;52430:4;52436:2;52440:3;52445:7;52454:4;52399:20;:60::i;:::-;52477:9;52472:409;52496:3;:10;52492:1;:14;52472:409;;;52528:10;52541:3;52545:1;52541:6;;;;;;;;:::i;:::-;;;;;;;;52528:19;;52562:14;52579:7;52587:1;52579:10;;;;;;;;:::i;:::-;;;;;;;;52562:27;;52606:19;52628:9;:13;52638:2;52628:13;;;;;;;;;;;:19;52642:4;52628:19;;;;;;;;;;;;;;;;52606:41;;52685:6;52670:11;:21;;52662:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52810:6;52796:11;:20;52774:9;:13;52784:2;52774:13;;;;;;;;;;;:19;52788:4;52774:19;;;;;;;;;;;;;;;:42;;;;52863:6;52842:9;:13;52852:2;52842:13;;;;;;;;;;;:17;52856:2;52842:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;52513:368;;;52508:3;;;;:::i;:::-;;;52472:409;;;;52928:2;52898:47;;52922:4;52898:47;;52912:8;52898:47;;;52932:3;52937:7;52898:47;;;;;;;:::i;:::-;;;;;;;;52958:59;52978:8;52988:4;52994:2;52998:3;53003:7;53012:4;52958:19;:59::i;:::-;53030:75;53066:8;53076:4;53082:2;53086:3;53091:7;53100:4;53030:35;:75::i;:::-;52173:940;51979:1134;;;;;:::o;70529:441::-;70622:1;70613:6;:10;70605:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;70667:13;70692:5;70683:6;:14;;;;:::i;:::-;70667:30;;70740:5;70716:21;:29;70708:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;70832:5;70815:13;;:22;;;;;;;:::i;:::-;;;;;;;;70849:12;70866:4;:9;;70884:5;70866:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70848:46;;;70913:7;70905:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;70594:376;;70529:441;;:::o;57720:957::-;57888:1;57872:18;;:4;:18;;;;57864:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;57963:7;:14;57949:3;:10;:28;57941:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;58035:16;58054:12;:10;:12::i;:::-;58035:31;;58079:66;58100:8;58110:4;58124:1;58128:3;58133:7;58079:66;;;;;;;;;;;;:20;:66::i;:::-;58163:9;58158:361;58182:3;:10;58178:1;:14;58158:361;;;58214:10;58227:3;58231:1;58227:6;;;;;;;;:::i;:::-;;;;;;;;58214:19;;58248:14;58265:7;58273:1;58265:10;;;;;;;;:::i;:::-;;;;;;;;58248:27;;58292:19;58314:9;:13;58324:2;58314:13;;;;;;;;;;;:19;58328:4;58314:19;;;;;;;;;;;;;;;;58292:41;;58371:6;58356:11;:21;;58348:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;58490:6;58476:11;:20;58454:9;:13;58464:2;58454:13;;;;;;;;;;;:19;58468:4;58454:19;;;;;;;;;;;;;;;:42;;;;58199:320;;;58194:3;;;;;:::i;:::-;;;;58158:361;;;;58574:1;58536:55;;58560:4;58536:55;;58550:8;58536:55;;;58578:3;58583:7;58536:55;;;;;;;:::i;:::-;;;;;;;;58604:65;58624:8;58634:4;58648:1;58652:3;58657:7;58604:65;;;;;;;;;;;;:19;:65::i;:::-;57853:824;57720:957;;;:::o;27629:191::-;27703:16;27722:6;;;;;;;;;;;27703:25;;27748:8;27739:6;;:17;;;;;;;;;;;;;;;;;;27803:8;27772:40;;27793:8;27772:40;;;;;;;;;;;;27692:128;27629:191;:::o;58820:331::-;58975:8;58966:17;;:5;:17;;;;58958:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;59078:8;59040:18;:25;59059:5;59040:25;;;;;;;;;;;;;;;:35;59066:8;59040:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;59124:8;59102:41;;59117:5;59102:41;;;59134:8;59102:41;;;;;;:::i;:::-;;;;;;;;58820:331;;;:::o;50659:962::-;50861:1;50847:16;;:2;:16;;;;50839:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;50918:16;50937:12;:10;:12::i;:::-;50918:31;;50960:20;50983:21;51001:2;50983:17;:21::i;:::-;50960:44;;51015:24;51042:25;51060:6;51042:17;:25::i;:::-;51015:52;;51080:60;51101:8;51111:4;51117:2;51121:3;51126:7;51135:4;51080:20;:60::i;:::-;51153:19;51175:9;:13;51185:2;51175:13;;;;;;;;;;;:19;51189:4;51175:19;;;;;;;;;;;;;;;;51153:41;;51228:6;51213:11;:21;;51205:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;51345:6;51331:11;:20;51309:9;:13;51319:2;51309:13;;;;;;;;;;;:19;51323:4;51309:19;;;;;;;;;;;;;;;:42;;;;51390:6;51369:9;:13;51379:2;51369:13;;;;;;;;;;;:17;51383:2;51369:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;51445:2;51414:46;;51439:4;51414:46;;51429:8;51414:46;;;51449:2;51453:6;51414:46;;;;;;;:::i;:::-;;;;;;;;51473:59;51493:8;51503:4;51509:2;51513:3;51518:7;51527:4;51473:19;:59::i;:::-;51545:68;51576:8;51586:4;51592:2;51596;51600:6;51608:4;51545:30;:68::i;:::-;50828:793;;;;50659:962;;;;;:::o;56674:796::-;56817:1;56801:18;;:4;:18;;;;56793:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;56872:16;56891:12;:10;:12::i;:::-;56872:31;;56914:20;56937:21;56955:2;56937:17;:21::i;:::-;56914:44;;56969:24;56996:25;57014:6;56996:17;:25::i;:::-;56969:52;;57034:66;57055:8;57065:4;57079:1;57083:3;57088:7;57034:66;;;;;;;;;;;;:20;:66::i;:::-;57113:19;57135:9;:13;57145:2;57135:13;;;;;;;;;;;:19;57149:4;57135:19;;;;;;;;;;;;;;;;57113:41;;57188:6;57173:11;:21;;57165:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;57299:6;57285:11;:20;57263:9;:13;57273:2;57263:13;;;;;;;;;;;:19;57277:4;57263:19;;;;;;;;;;;;;;;:42;;;;57369:1;57330:54;;57355:4;57330:54;;57345:8;57330:54;;;57373:2;57377:6;57330:54;;;;;;;:::i;:::-;;;;;;;;57397:65;57417:8;57427:4;57441:1;57445:3;57450:7;57397:65;;;;;;;;;;;;:19;:65::i;:::-;56782:688;;;;56674:796;;;:::o;60109:221::-;;;;;;;:::o;61285:220::-;;;;;;;:::o;62265:813::-;62505:15;:2;:13;;;:15::i;:::-;62501:570;;;62558:2;62541:43;;;62585:8;62595:4;62601:3;62606:7;62615:4;62541:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;62537:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;62933:6;62926:14;;;;;;;;;;;:::i;:::-;;;;;;;;62537:523;;;62982:62;;;;;;;;;;:::i;:::-;;;;;;;;62537:523;62714:48;;;62702:60;;;:8;:60;;;;62698:159;;62787:50;;;;;;;;;;:::i;:::-;;;;;;;;62698:159;62621:251;62501:570;62265:813;;;;;;:::o;63086:198::-;63152:16;63181:22;63220:1;63206:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63181:41;;63244:7;63233:5;63239:1;63233:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;63271:5;63264:12;;;63086:198;;;:::o;61513:744::-;61728:15;:2;:13;;;:15::i;:::-;61724:526;;;61781:2;61764:38;;;61803:8;61813:4;61819:2;61823:6;61831:4;61764:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;61760:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;62112:6;62105:14;;;;;;;;;;;:::i;:::-;;;;;;;;61760:479;;;62161:62;;;;;;;;;;:::i;:::-;;;;;;;;61760:479;61898:43;;;61886:55;;;:8;:55;;;;61882:154;;61966:50;;;;;;;;;;:::i;:::-;;;;;;;;61882:154;61837:214;61724:526;61513:744;;;;;;:::o;29060:326::-;29120:4;29377:1;29355:7;:19;;;:23;29348:30;;29060:326;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:139::-;1959:5;1997:6;1984:20;1975:29;;2013:33;2040:5;2013:33;:::i;:::-;1913:139;;;;:::o;2075:370::-;2146:5;2195:3;2188:4;2180:6;2176:17;2172:27;2162:122;;2203:79;;:::i;:::-;2162:122;2320:6;2307:20;2345:94;2435:3;2427:6;2420:4;2412:6;2408:17;2345:94;:::i;:::-;2336:103;;2152:293;2075:370;;;;:::o;2468:::-;2539:5;2588:3;2581:4;2573:6;2569:17;2565:27;2555:122;;2596:79;;:::i;:::-;2555:122;2713:6;2700:20;2738:94;2828:3;2820:6;2813:4;2805:6;2801:17;2738:94;:::i;:::-;2729:103;;2545:293;2468:370;;;;:::o;2844:133::-;2887:5;2925:6;2912:20;2903:29;;2941:30;2965:5;2941:30;:::i;:::-;2844:133;;;;:::o;2983:137::-;3028:5;3066:6;3053:20;3044:29;;3082:32;3108:5;3082:32;:::i;:::-;2983:137;;;;:::o;3126:141::-;3182:5;3213:6;3207:13;3198:22;;3229:32;3255:5;3229:32;:::i;:::-;3126:141;;;;:::o;3286:338::-;3341:5;3390:3;3383:4;3375:6;3371:17;3367:27;3357:122;;3398:79;;:::i;:::-;3357:122;3515:6;3502:20;3540:78;3614:3;3606:6;3599:4;3591:6;3587:17;3540:78;:::i;:::-;3531:87;;3347:277;3286:338;;;;:::o;3630:139::-;3676:5;3714:6;3701:20;3692:29;;3730:33;3757:5;3730:33;:::i;:::-;3630:139;;;;:::o;3775:143::-;3832:5;3863:6;3857:13;3848:22;;3879:33;3906:5;3879:33;:::i;:::-;3775:143;;;;:::o;3924:329::-;3983:6;4032:2;4020:9;4011:7;4007:23;4003:32;4000:119;;;4038:79;;:::i;:::-;4000:119;4158:1;4183:53;4228:7;4219:6;4208:9;4204:22;4183:53;:::i;:::-;4173:63;;4129:117;3924:329;;;;:::o;4259:474::-;4327:6;4335;4384:2;4372:9;4363:7;4359:23;4355:32;4352:119;;;4390:79;;:::i;:::-;4352:119;4510:1;4535:53;4580:7;4571:6;4560:9;4556:22;4535:53;:::i;:::-;4525:63;;4481:117;4637:2;4663:53;4708:7;4699:6;4688:9;4684:22;4663:53;:::i;:::-;4653:63;;4608:118;4259:474;;;;;:::o;4739:1509::-;4893:6;4901;4909;4917;4925;4974:3;4962:9;4953:7;4949:23;4945:33;4942:120;;;4981:79;;:::i;:::-;4942:120;5101:1;5126:53;5171:7;5162:6;5151:9;5147:22;5126:53;:::i;:::-;5116:63;;5072:117;5228:2;5254:53;5299:7;5290:6;5279:9;5275:22;5254:53;:::i;:::-;5244:63;;5199:118;5384:2;5373:9;5369:18;5356:32;5415:18;5407:6;5404:30;5401:117;;;5437:79;;:::i;:::-;5401:117;5542:78;5612:7;5603:6;5592:9;5588:22;5542:78;:::i;:::-;5532:88;;5327:303;5697:2;5686:9;5682:18;5669:32;5728:18;5720:6;5717:30;5714:117;;;5750:79;;:::i;:::-;5714:117;5855:78;5925:7;5916:6;5905:9;5901:22;5855:78;:::i;:::-;5845:88;;5640:303;6010:3;5999:9;5995:19;5982:33;6042:18;6034:6;6031:30;6028:117;;;6064:79;;:::i;:::-;6028:117;6169:62;6223:7;6214:6;6203:9;6199:22;6169:62;:::i;:::-;6159:72;;5953:288;4739:1509;;;;;;;;:::o;6254:1089::-;6358:6;6366;6374;6382;6390;6439:3;6427:9;6418:7;6414:23;6410:33;6407:120;;;6446:79;;:::i;:::-;6407:120;6566:1;6591:53;6636:7;6627:6;6616:9;6612:22;6591:53;:::i;:::-;6581:63;;6537:117;6693:2;6719:53;6764:7;6755:6;6744:9;6740:22;6719:53;:::i;:::-;6709:63;;6664:118;6821:2;6847:53;6892:7;6883:6;6872:9;6868:22;6847:53;:::i;:::-;6837:63;;6792:118;6949:2;6975:53;7020:7;7011:6;7000:9;6996:22;6975:53;:::i;:::-;6965:63;;6920:118;7105:3;7094:9;7090:19;7077:33;7137:18;7129:6;7126:30;7123:117;;;7159:79;;:::i;:::-;7123:117;7264:62;7318:7;7309:6;7298:9;7294:22;7264:62;:::i;:::-;7254:72;;7048:288;6254:1089;;;;;;;;:::o;7349:1039::-;7476:6;7484;7492;7541:2;7529:9;7520:7;7516:23;7512:32;7509:119;;;7547:79;;:::i;:::-;7509:119;7667:1;7692:53;7737:7;7728:6;7717:9;7713:22;7692:53;:::i;:::-;7682:63;;7638:117;7822:2;7811:9;7807:18;7794:32;7853:18;7845:6;7842:30;7839:117;;;7875:79;;:::i;:::-;7839:117;7980:78;8050:7;8041:6;8030:9;8026:22;7980:78;:::i;:::-;7970:88;;7765:303;8135:2;8124:9;8120:18;8107:32;8166:18;8158:6;8155:30;8152:117;;;8188:79;;:::i;:::-;8152:117;8293:78;8363:7;8354:6;8343:9;8339:22;8293:78;:::i;:::-;8283:88;;8078:303;7349:1039;;;;;:::o;8394:468::-;8459:6;8467;8516:2;8504:9;8495:7;8491:23;8487:32;8484:119;;;8522:79;;:::i;:::-;8484:119;8642:1;8667:53;8712:7;8703:6;8692:9;8688:22;8667:53;:::i;:::-;8657:63;;8613:117;8769:2;8795:50;8837:7;8828:6;8817:9;8813:22;8795:50;:::i;:::-;8785:60;;8740:115;8394:468;;;;;:::o;8868:474::-;8936:6;8944;8993:2;8981:9;8972:7;8968:23;8964:32;8961:119;;;8999:79;;:::i;:::-;8961:119;9119:1;9144:53;9189:7;9180:6;9169:9;9165:22;9144:53;:::i;:::-;9134:63;;9090:117;9246:2;9272:53;9317:7;9308:6;9297:9;9293:22;9272:53;:::i;:::-;9262:63;;9217:118;8868:474;;;;;:::o;9348:619::-;9425:6;9433;9441;9490:2;9478:9;9469:7;9465:23;9461:32;9458:119;;;9496:79;;:::i;:::-;9458:119;9616:1;9641:53;9686:7;9677:6;9666:9;9662:22;9641:53;:::i;:::-;9631:63;;9587:117;9743:2;9769:53;9814:7;9805:6;9794:9;9790:22;9769:53;:::i;:::-;9759:63;;9714:118;9871:2;9897:53;9942:7;9933:6;9922:9;9918:22;9897:53;:::i;:::-;9887:63;;9842:118;9348:619;;;;;:::o;9973:894::-;10091:6;10099;10148:2;10136:9;10127:7;10123:23;10119:32;10116:119;;;10154:79;;:::i;:::-;10116:119;10302:1;10291:9;10287:17;10274:31;10332:18;10324:6;10321:30;10318:117;;;10354:79;;:::i;:::-;10318:117;10459:78;10529:7;10520:6;10509:9;10505:22;10459:78;:::i;:::-;10449:88;;10245:302;10614:2;10603:9;10599:18;10586:32;10645:18;10637:6;10634:30;10631:117;;;10667:79;;:::i;:::-;10631:117;10772:78;10842:7;10833:6;10822:9;10818:22;10772:78;:::i;:::-;10762:88;;10557:303;9973:894;;;;;:::o;10873:::-;10991:6;10999;11048:2;11036:9;11027:7;11023:23;11019:32;11016:119;;;11054:79;;:::i;:::-;11016:119;11202:1;11191:9;11187:17;11174:31;11232:18;11224:6;11221:30;11218:117;;;11254:79;;:::i;:::-;11218:117;11359:78;11429:7;11420:6;11409:9;11405:22;11359:78;:::i;:::-;11349:88;;11145:302;11514:2;11503:9;11499:18;11486:32;11545:18;11537:6;11534:30;11531:117;;;11567:79;;:::i;:::-;11531:117;11672:78;11742:7;11733:6;11722:9;11718:22;11672:78;:::i;:::-;11662:88;;11457:303;10873:894;;;;;:::o;11773:684::-;11866:6;11874;11923:2;11911:9;11902:7;11898:23;11894:32;11891:119;;;11929:79;;:::i;:::-;11891:119;12077:1;12066:9;12062:17;12049:31;12107:18;12099:6;12096:30;12093:117;;;12129:79;;:::i;:::-;12093:117;12234:78;12304:7;12295:6;12284:9;12280:22;12234:78;:::i;:::-;12224:88;;12020:302;12361:2;12387:53;12432:7;12423:6;12412:9;12408:22;12387:53;:::i;:::-;12377:63;;12332:118;11773:684;;;;;:::o;12463:327::-;12521:6;12570:2;12558:9;12549:7;12545:23;12541:32;12538:119;;;12576:79;;:::i;:::-;12538:119;12696:1;12721:52;12765:7;12756:6;12745:9;12741:22;12721:52;:::i;:::-;12711:62;;12667:116;12463:327;;;;:::o;12796:349::-;12865:6;12914:2;12902:9;12893:7;12889:23;12885:32;12882:119;;;12920:79;;:::i;:::-;12882:119;13040:1;13065:63;13120:7;13111:6;13100:9;13096:22;13065:63;:::i;:::-;13055:73;;13011:127;12796:349;;;;:::o;13151:329::-;13210:6;13259:2;13247:9;13238:7;13234:23;13230:32;13227:119;;;13265:79;;:::i;:::-;13227:119;13385:1;13410:53;13455:7;13446:6;13435:9;13431:22;13410:53;:::i;:::-;13400:63;;13356:117;13151:329;;;;:::o;13486:351::-;13556:6;13605:2;13593:9;13584:7;13580:23;13576:32;13573:119;;;13611:79;;:::i;:::-;13573:119;13731:1;13756:64;13812:7;13803:6;13792:9;13788:22;13756:64;:::i;:::-;13746:74;;13702:128;13486:351;;;;:::o;13843:474::-;13911:6;13919;13968:2;13956:9;13947:7;13943:23;13939:32;13936:119;;;13974:79;;:::i;:::-;13936:119;14094:1;14119:53;14164:7;14155:6;14144:9;14140:22;14119:53;:::i;:::-;14109:63;;14065:117;14221:2;14247:53;14292:7;14283:6;14272:9;14268:22;14247:53;:::i;:::-;14237:63;;14192:118;13843:474;;;;;:::o;14323:179::-;14392:10;14413:46;14455:3;14447:6;14413:46;:::i;:::-;14491:4;14486:3;14482:14;14468:28;;14323:179;;;;:::o;14508:118::-;14595:24;14613:5;14595:24;:::i;:::-;14590:3;14583:37;14508:118;;:::o;14662:732::-;14781:3;14810:54;14858:5;14810:54;:::i;:::-;14880:86;14959:6;14954:3;14880:86;:::i;:::-;14873:93;;14990:56;15040:5;14990:56;:::i;:::-;15069:7;15100:1;15085:284;15110:6;15107:1;15104:13;15085:284;;;15186:6;15180:13;15213:63;15272:3;15257:13;15213:63;:::i;:::-;15206:70;;15299:60;15352:6;15299:60;:::i;:::-;15289:70;;15145:224;15132:1;15129;15125:9;15120:14;;15085:284;;;15089:14;15385:3;15378:10;;14786:608;;;14662:732;;;;:::o;15430:751::-;15546:3;15575:51;15620:5;15575:51;:::i;:::-;15642:86;15721:6;15716:3;15642:86;:::i;:::-;15635:93;;15752:53;15799:5;15752:53;:::i;:::-;15828:7;15859:1;15844:312;15869:6;15866:1;15863:13;15844:312;;;15939:44;15976:6;15939:44;:::i;:::-;16003:63;16062:3;16047:13;16003:63;:::i;:::-;15996:70;;16089:57;16139:6;16089:57;:::i;:::-;16079:67;;15904:252;15891:1;15888;15884:9;15879:14;;15844:312;;;15848:14;16172:3;16165:10;;15551:630;;;15430:751;;;;:::o;16187:109::-;16268:21;16283:5;16268:21;:::i;:::-;16263:3;16256:34;16187:109;;:::o;16302:360::-;16388:3;16416:38;16448:5;16416:38;:::i;:::-;16470:70;16533:6;16528:3;16470:70;:::i;:::-;16463:77;;16549:52;16594:6;16589:3;16582:4;16575:5;16571:16;16549:52;:::i;:::-;16626:29;16648:6;16626:29;:::i;:::-;16621:3;16617:39;16610:46;;16392:270;16302:360;;;;:::o;16668:364::-;16756:3;16784:39;16817:5;16784:39;:::i;:::-;16839:71;16903:6;16898:3;16839:71;:::i;:::-;16832:78;;16919:52;16964:6;16959:3;16952:4;16945:5;16941:16;16919:52;:::i;:::-;16996:29;17018:6;16996:29;:::i;:::-;16991:3;16987:39;16980:46;;16760:272;16668:364;;;;:::o;17038:366::-;17180:3;17201:67;17265:2;17260:3;17201:67;:::i;:::-;17194:74;;17277:93;17366:3;17277:93;:::i;:::-;17395:2;17390:3;17386:12;17379:19;;17038:366;;;:::o;17410:::-;17552:3;17573:67;17637:2;17632:3;17573:67;:::i;:::-;17566:74;;17649:93;17738:3;17649:93;:::i;:::-;17767:2;17762:3;17758:12;17751:19;;17410:366;;;:::o;17782:::-;17924:3;17945:67;18009:2;18004:3;17945:67;:::i;:::-;17938:74;;18021:93;18110:3;18021:93;:::i;:::-;18139:2;18134:3;18130:12;18123:19;;17782:366;;;:::o;18154:::-;18296:3;18317:67;18381:2;18376:3;18317:67;:::i;:::-;18310:74;;18393:93;18482:3;18393:93;:::i;:::-;18511:2;18506:3;18502:12;18495:19;;18154:366;;;:::o;18526:::-;18668:3;18689:67;18753:2;18748:3;18689:67;:::i;:::-;18682:74;;18765:93;18854:3;18765:93;:::i;:::-;18883:2;18878:3;18874:12;18867:19;;18526:366;;;:::o;18898:::-;19040:3;19061:67;19125:2;19120:3;19061:67;:::i;:::-;19054:74;;19137:93;19226:3;19137:93;:::i;:::-;19255:2;19250:3;19246:12;19239:19;;18898:366;;;:::o;19270:::-;19412:3;19433:67;19497:2;19492:3;19433:67;:::i;:::-;19426:74;;19509:93;19598:3;19509:93;:::i;:::-;19627:2;19622:3;19618:12;19611:19;;19270:366;;;:::o;19642:::-;19784:3;19805:67;19869:2;19864:3;19805:67;:::i;:::-;19798:74;;19881:93;19970:3;19881:93;:::i;:::-;19999:2;19994:3;19990:12;19983:19;;19642:366;;;:::o;20014:::-;20156:3;20177:67;20241:2;20236:3;20177:67;:::i;:::-;20170:74;;20253:93;20342:3;20253:93;:::i;:::-;20371:2;20366:3;20362:12;20355:19;;20014:366;;;:::o;20386:::-;20528:3;20549:67;20613:2;20608:3;20549:67;:::i;:::-;20542:74;;20625:93;20714:3;20625:93;:::i;:::-;20743:2;20738:3;20734:12;20727:19;;20386:366;;;:::o;20758:::-;20900:3;20921:67;20985:2;20980:3;20921:67;:::i;:::-;20914:74;;20997:93;21086:3;20997:93;:::i;:::-;21115:2;21110:3;21106:12;21099:19;;20758:366;;;:::o;21130:::-;21272:3;21293:67;21357:2;21352:3;21293:67;:::i;:::-;21286:74;;21369:93;21458:3;21369:93;:::i;:::-;21487:2;21482:3;21478:12;21471:19;;21130:366;;;:::o;21502:::-;21644:3;21665:67;21729:2;21724:3;21665:67;:::i;:::-;21658:74;;21741:93;21830:3;21741:93;:::i;:::-;21859:2;21854:3;21850:12;21843:19;;21502:366;;;:::o;21874:::-;22016:3;22037:67;22101:2;22096:3;22037:67;:::i;:::-;22030:74;;22113:93;22202:3;22113:93;:::i;:::-;22231:2;22226:3;22222:12;22215:19;;21874:366;;;:::o;22246:::-;22388:3;22409:67;22473:2;22468:3;22409:67;:::i;:::-;22402:74;;22485:93;22574:3;22485:93;:::i;:::-;22603:2;22598:3;22594:12;22587:19;;22246:366;;;:::o;22618:::-;22760:3;22781:67;22845:2;22840:3;22781:67;:::i;:::-;22774:74;;22857:93;22946:3;22857:93;:::i;:::-;22975:2;22970:3;22966:12;22959:19;;22618:366;;;:::o;22990:::-;23132:3;23153:67;23217:2;23212:3;23153:67;:::i;:::-;23146:74;;23229:93;23318:3;23229:93;:::i;:::-;23347:2;23342:3;23338:12;23331:19;;22990:366;;;:::o;23362:::-;23504:3;23525:67;23589:2;23584:3;23525:67;:::i;:::-;23518:74;;23601:93;23690:3;23601:93;:::i;:::-;23719:2;23714:3;23710:12;23703:19;;23362:366;;;:::o;23734:::-;23876:3;23897:67;23961:2;23956:3;23897:67;:::i;:::-;23890:74;;23973:93;24062:3;23973:93;:::i;:::-;24091:2;24086:3;24082:12;24075:19;;23734:366;;;:::o;24106:362::-;24247:3;24268:65;24331:1;24326:3;24268:65;:::i;:::-;24261:72;;24342:93;24431:3;24342:93;:::i;:::-;24460:1;24455:3;24451:11;24444:18;;24106:362;;;:::o;24474:398::-;24633:3;24654:83;24735:1;24730:3;24654:83;:::i;:::-;24647:90;;24746:93;24835:3;24746:93;:::i;:::-;24864:1;24859:3;24855:11;24848:18;;24474:398;;;:::o;24878:366::-;25020:3;25041:67;25105:2;25100:3;25041:67;:::i;:::-;25034:74;;25117:93;25206:3;25117:93;:::i;:::-;25235:2;25230:3;25226:12;25219:19;;24878:366;;;:::o;25250:::-;25392:3;25413:67;25477:2;25472:3;25413:67;:::i;:::-;25406:74;;25489:93;25578:3;25489:93;:::i;:::-;25607:2;25602:3;25598:12;25591:19;;25250:366;;;:::o;25622:::-;25764:3;25785:67;25849:2;25844:3;25785:67;:::i;:::-;25778:74;;25861:93;25950:3;25861:93;:::i;:::-;25979:2;25974:3;25970:12;25963:19;;25622:366;;;:::o;25994:::-;26136:3;26157:67;26221:2;26216:3;26157:67;:::i;:::-;26150:74;;26233:93;26322:3;26233:93;:::i;:::-;26351:2;26346:3;26342:12;26335:19;;25994:366;;;:::o;26366:::-;26508:3;26529:67;26593:2;26588:3;26529:67;:::i;:::-;26522:74;;26605:93;26694:3;26605:93;:::i;:::-;26723:2;26718:3;26714:12;26707:19;;26366:366;;;:::o;26738:108::-;26815:24;26833:5;26815:24;:::i;:::-;26810:3;26803:37;26738:108;;:::o;26852:118::-;26939:24;26957:5;26939:24;:::i;:::-;26934:3;26927:37;26852:118;;:::o;26976:379::-;27160:3;27182:147;27325:3;27182:147;:::i;:::-;27175:154;;27346:3;27339:10;;26976:379;;;:::o;27361:222::-;27454:4;27492:2;27481:9;27477:18;27469:26;;27505:71;27573:1;27562:9;27558:17;27549:6;27505:71;:::i;:::-;27361:222;;;;:::o;27589:1053::-;27912:4;27950:3;27939:9;27935:19;27927:27;;27964:71;28032:1;28021:9;28017:17;28008:6;27964:71;:::i;:::-;28045:72;28113:2;28102:9;28098:18;28089:6;28045:72;:::i;:::-;28164:9;28158:4;28154:20;28149:2;28138:9;28134:18;28127:48;28192:108;28295:4;28286:6;28192:108;:::i;:::-;28184:116;;28347:9;28341:4;28337:20;28332:2;28321:9;28317:18;28310:48;28375:108;28478:4;28469:6;28375:108;:::i;:::-;28367:116;;28531:9;28525:4;28521:20;28515:3;28504:9;28500:19;28493:49;28559:76;28630:4;28621:6;28559:76;:::i;:::-;28551:84;;27589:1053;;;;;;;;:::o;28648:1149::-;29019:4;29057:3;29046:9;29042:19;29034:27;;29071:71;29139:1;29128:9;29124:17;29115:6;29071:71;:::i;:::-;29152:72;29220:2;29209:9;29205:18;29196:6;29152:72;:::i;:::-;29271:9;29265:4;29261:20;29256:2;29245:9;29241:18;29234:48;29299:105;29399:4;29390:6;29299:105;:::i;:::-;29291:113;;29451:9;29445:4;29441:20;29436:2;29425:9;29421:18;29414:48;29479:105;29579:4;29570:6;29479:105;:::i;:::-;29471:113;;29632:9;29626:4;29622:20;29616:3;29605:9;29601:19;29594:49;29660:130;29785:4;29660:130;:::i;:::-;29652:138;;28648:1149;;;;;;;:::o;29803:751::-;30026:4;30064:3;30053:9;30049:19;30041:27;;30078:71;30146:1;30135:9;30131:17;30122:6;30078:71;:::i;:::-;30159:72;30227:2;30216:9;30212:18;30203:6;30159:72;:::i;:::-;30241;30309:2;30298:9;30294:18;30285:6;30241:72;:::i;:::-;30323;30391:2;30380:9;30376:18;30367:6;30323:72;:::i;:::-;30443:9;30437:4;30433:20;30427:3;30416:9;30412:19;30405:49;30471:76;30542:4;30533:6;30471:76;:::i;:::-;30463:84;;29803:751;;;;;;;;:::o;30560:332::-;30681:4;30719:2;30708:9;30704:18;30696:26;;30732:71;30800:1;30789:9;30785:17;30776:6;30732:71;:::i;:::-;30813:72;30881:2;30870:9;30866:18;30857:6;30813:72;:::i;:::-;30560:332;;;;;:::o;30898:373::-;31041:4;31079:2;31068:9;31064:18;31056:26;;31128:9;31122:4;31118:20;31114:1;31103:9;31099:17;31092:47;31156:108;31259:4;31250:6;31156:108;:::i;:::-;31148:116;;30898:373;;;;:::o;31277:634::-;31498:4;31536:2;31525:9;31521:18;31513:26;;31585:9;31579:4;31575:20;31571:1;31560:9;31556:17;31549:47;31613:108;31716:4;31707:6;31613:108;:::i;:::-;31605:116;;31768:9;31762:4;31758:20;31753:2;31742:9;31738:18;31731:48;31796:108;31899:4;31890:6;31796:108;:::i;:::-;31788:116;;31277:634;;;;;:::o;31917:210::-;32004:4;32042:2;32031:9;32027:18;32019:26;;32055:65;32117:1;32106:9;32102:17;32093:6;32055:65;:::i;:::-;31917:210;;;;:::o;32133:313::-;32246:4;32284:2;32273:9;32269:18;32261:26;;32333:9;32327:4;32323:20;32319:1;32308:9;32304:17;32297:47;32361:78;32434:4;32425:6;32361:78;:::i;:::-;32353:86;;32133:313;;;;:::o;32452:419::-;32618:4;32656:2;32645:9;32641:18;32633:26;;32705:9;32699:4;32695:20;32691:1;32680:9;32676:17;32669:47;32733:131;32859:4;32733:131;:::i;:::-;32725:139;;32452:419;;;:::o;32877:::-;33043:4;33081:2;33070:9;33066:18;33058:26;;33130:9;33124:4;33120:20;33116:1;33105:9;33101:17;33094:47;33158:131;33284:4;33158:131;:::i;:::-;33150:139;;32877:419;;;:::o;33302:::-;33468:4;33506:2;33495:9;33491:18;33483:26;;33555:9;33549:4;33545:20;33541:1;33530:9;33526:17;33519:47;33583:131;33709:4;33583:131;:::i;:::-;33575:139;;33302:419;;;:::o;33727:::-;33893:4;33931:2;33920:9;33916:18;33908:26;;33980:9;33974:4;33970:20;33966:1;33955:9;33951:17;33944:47;34008:131;34134:4;34008:131;:::i;:::-;34000:139;;33727:419;;;:::o;34152:::-;34318:4;34356:2;34345:9;34341:18;34333:26;;34405:9;34399:4;34395:20;34391:1;34380:9;34376:17;34369:47;34433:131;34559:4;34433:131;:::i;:::-;34425:139;;34152:419;;;:::o;34577:::-;34743:4;34781:2;34770:9;34766:18;34758:26;;34830:9;34824:4;34820:20;34816:1;34805:9;34801:17;34794:47;34858:131;34984:4;34858:131;:::i;:::-;34850:139;;34577:419;;;:::o;35002:::-;35168:4;35206:2;35195:9;35191:18;35183:26;;35255:9;35249:4;35245:20;35241:1;35230:9;35226:17;35219:47;35283:131;35409:4;35283:131;:::i;:::-;35275:139;;35002:419;;;:::o;35427:::-;35593:4;35631:2;35620:9;35616:18;35608:26;;35680:9;35674:4;35670:20;35666:1;35655:9;35651:17;35644:47;35708:131;35834:4;35708:131;:::i;:::-;35700:139;;35427:419;;;:::o;35852:::-;36018:4;36056:2;36045:9;36041:18;36033:26;;36105:9;36099:4;36095:20;36091:1;36080:9;36076:17;36069:47;36133:131;36259:4;36133:131;:::i;:::-;36125:139;;35852:419;;;:::o;36277:::-;36443:4;36481:2;36470:9;36466:18;36458:26;;36530:9;36524:4;36520:20;36516:1;36505:9;36501:17;36494:47;36558:131;36684:4;36558:131;:::i;:::-;36550:139;;36277:419;;;:::o;36702:::-;36868:4;36906:2;36895:9;36891:18;36883:26;;36955:9;36949:4;36945:20;36941:1;36930:9;36926:17;36919:47;36983:131;37109:4;36983:131;:::i;:::-;36975:139;;36702:419;;;:::o;37127:::-;37293:4;37331:2;37320:9;37316:18;37308:26;;37380:9;37374:4;37370:20;37366:1;37355:9;37351:17;37344:47;37408:131;37534:4;37408:131;:::i;:::-;37400:139;;37127:419;;;:::o;37552:::-;37718:4;37756:2;37745:9;37741:18;37733:26;;37805:9;37799:4;37795:20;37791:1;37780:9;37776:17;37769:47;37833:131;37959:4;37833:131;:::i;:::-;37825:139;;37552:419;;;:::o;37977:::-;38143:4;38181:2;38170:9;38166:18;38158:26;;38230:9;38224:4;38220:20;38216:1;38205:9;38201:17;38194:47;38258:131;38384:4;38258:131;:::i;:::-;38250:139;;37977:419;;;:::o;38402:::-;38568:4;38606:2;38595:9;38591:18;38583:26;;38655:9;38649:4;38645:20;38641:1;38630:9;38626:17;38619:47;38683:131;38809:4;38683:131;:::i;:::-;38675:139;;38402:419;;;:::o;38827:::-;38993:4;39031:2;39020:9;39016:18;39008:26;;39080:9;39074:4;39070:20;39066:1;39055:9;39051:17;39044:47;39108:131;39234:4;39108:131;:::i;:::-;39100:139;;38827:419;;;:::o;39252:::-;39418:4;39456:2;39445:9;39441:18;39433:26;;39505:9;39499:4;39495:20;39491:1;39480:9;39476:17;39469:47;39533:131;39659:4;39533:131;:::i;:::-;39525:139;;39252:419;;;:::o;39677:::-;39843:4;39881:2;39870:9;39866:18;39858:26;;39930:9;39924:4;39920:20;39916:1;39905:9;39901:17;39894:47;39958:131;40084:4;39958:131;:::i;:::-;39950:139;;39677:419;;;:::o;40102:::-;40268:4;40306:2;40295:9;40291:18;40283:26;;40355:9;40349:4;40345:20;40341:1;40330:9;40326:17;40319:47;40383:131;40509:4;40383:131;:::i;:::-;40375:139;;40102:419;;;:::o;40527:::-;40693:4;40731:2;40720:9;40716:18;40708:26;;40780:9;40774:4;40770:20;40766:1;40755:9;40751:17;40744:47;40808:131;40934:4;40808:131;:::i;:::-;40800:139;;40527:419;;;:::o;40952:::-;41118:4;41156:2;41145:9;41141:18;41133:26;;41205:9;41199:4;41195:20;41191:1;41180:9;41176:17;41169:47;41233:131;41359:4;41233:131;:::i;:::-;41225:139;;40952:419;;;:::o;41377:::-;41543:4;41581:2;41570:9;41566:18;41558:26;;41630:9;41624:4;41620:20;41616:1;41605:9;41601:17;41594:47;41658:131;41784:4;41658:131;:::i;:::-;41650:139;;41377:419;;;:::o;41802:::-;41968:4;42006:2;41995:9;41991:18;41983:26;;42055:9;42049:4;42045:20;42041:1;42030:9;42026:17;42019:47;42083:131;42209:4;42083:131;:::i;:::-;42075:139;;41802:419;;;:::o;42227:::-;42393:4;42431:2;42420:9;42416:18;42408:26;;42480:9;42474:4;42470:20;42466:1;42455:9;42451:17;42444:47;42508:131;42634:4;42508:131;:::i;:::-;42500:139;;42227:419;;;:::o;42652:222::-;42745:4;42783:2;42772:9;42768:18;42760:26;;42796:71;42864:1;42853:9;42849:17;42840:6;42796:71;:::i;:::-;42652:222;;;;:::o;42880:332::-;43001:4;43039:2;43028:9;43024:18;43016:26;;43052:71;43120:1;43109:9;43105:17;43096:6;43052:71;:::i;:::-;43133:72;43201:2;43190:9;43186:18;43177:6;43133:72;:::i;:::-;42880:332;;;;;:::o;43218:129::-;43252:6;43279:20;;:::i;:::-;43269:30;;43308:33;43336:4;43328:6;43308:33;:::i;:::-;43218:129;;;:::o;43353:75::-;43386:6;43419:2;43413:9;43403:19;;43353:75;:::o;43434:311::-;43511:4;43601:18;43593:6;43590:30;43587:56;;;43623:18;;:::i;:::-;43587:56;43673:4;43665:6;43661:17;43653:25;;43733:4;43727;43723:15;43715:23;;43434:311;;;:::o;43751:::-;43828:4;43918:18;43910:6;43907:30;43904:56;;;43940:18;;:::i;:::-;43904:56;43990:4;43982:6;43978:17;43970:25;;44050:4;44044;44040:15;44032:23;;43751:311;;;:::o;44068:307::-;44129:4;44219:18;44211:6;44208:30;44205:56;;;44241:18;;:::i;:::-;44205:56;44279:29;44301:6;44279:29;:::i;:::-;44271:37;;44363:4;44357;44353:15;44345:23;;44068:307;;;:::o;44381:132::-;44448:4;44471:3;44463:11;;44501:4;44496:3;44492:14;44484:22;;44381:132;;;:::o;44519:156::-;44583:4;44606:3;44598:11;;44629:3;44626:1;44619:14;44663:4;44660:1;44650:18;44642:26;;44519:156;;;:::o;44681:114::-;44748:6;44782:5;44776:12;44766:22;;44681:114;;;:::o;44801:111::-;44865:6;44899:5;44893:12;44883:22;;44801:111;;;:::o;44918:98::-;44969:6;45003:5;44997:12;44987:22;;44918:98;;;:::o;45022:99::-;45074:6;45108:5;45102:12;45092:22;;45022:99;;;:::o;45127:113::-;45197:4;45229;45224:3;45220:14;45212:22;;45127:113;;;:::o;45246:110::-;45313:4;45345;45340:3;45336:14;45328:22;;45246:110;;;:::o;45362:184::-;45461:11;45495:6;45490:3;45483:19;45535:4;45530:3;45526:14;45511:29;;45362:184;;;;:::o;45552:168::-;45635:11;45669:6;45664:3;45657:19;45709:4;45704:3;45700:14;45685:29;;45552:168;;;;:::o;45726:147::-;45827:11;45864:3;45849:18;;45726:147;;;;:::o;45879:169::-;45963:11;45997:6;45992:3;45985:19;46037:4;46032:3;46028:14;46013:29;;45879:169;;;;:::o;46054:305::-;46094:3;46113:20;46131:1;46113:20;:::i;:::-;46108:25;;46147:20;46165:1;46147:20;:::i;:::-;46142:25;;46301:1;46233:66;46229:74;46226:1;46223:81;46220:107;;;46307:18;;:::i;:::-;46220:107;46351:1;46348;46344:9;46337:16;;46054:305;;;;:::o;46365:185::-;46405:1;46422:20;46440:1;46422:20;:::i;:::-;46417:25;;46456:20;46474:1;46456:20;:::i;:::-;46451:25;;46495:1;46485:35;;46500:18;;:::i;:::-;46485:35;46542:1;46539;46535:9;46530:14;;46365:185;;;;:::o;46556:348::-;46596:7;46619:20;46637:1;46619:20;:::i;:::-;46614:25;;46653:20;46671:1;46653:20;:::i;:::-;46648:25;;46841:1;46773:66;46769:74;46766:1;46763:81;46758:1;46751:9;46744:17;46740:105;46737:131;;;46848:18;;:::i;:::-;46737:131;46896:1;46893;46889:9;46878:20;;46556:348;;;;:::o;46910:191::-;46950:4;46970:20;46988:1;46970:20;:::i;:::-;46965:25;;47004:20;47022:1;47004:20;:::i;:::-;46999:25;;47043:1;47040;47037:8;47034:34;;;47048:18;;:::i;:::-;47034:34;47093:1;47090;47086:9;47078:17;;46910:191;;;;:::o;47107:90::-;47157:7;47186:5;47175:16;;47107:90;;;:::o;47203:96::-;47240:7;47269:24;47287:5;47269:24;:::i;:::-;47258:35;;47203:96;;;:::o;47305:90::-;47339:7;47382:5;47375:13;47368:21;47357:32;;47305:90;;;:::o;47401:149::-;47437:7;47477:66;47470:5;47466:78;47455:89;;47401:149;;;:::o;47556:126::-;47593:7;47633:42;47626:5;47622:54;47611:65;;47556:126;;;:::o;47688:77::-;47725:7;47754:5;47743:16;;47688:77;;;:::o;47771:154::-;47855:6;47850:3;47845;47832:30;47917:1;47908:6;47903:3;47899:16;47892:27;47771:154;;;:::o;47931:307::-;47999:1;48009:113;48023:6;48020:1;48017:13;48009:113;;;48108:1;48103:3;48099:11;48093:18;48089:1;48084:3;48080:11;48073:39;48045:2;48042:1;48038:10;48033:15;;48009:113;;;48140:6;48137:1;48134:13;48131:101;;;48220:1;48211:6;48206:3;48202:16;48195:27;48131:101;47980:258;47931:307;;;:::o;48244:320::-;48288:6;48325:1;48319:4;48315:12;48305:22;;48372:1;48366:4;48362:12;48393:18;48383:81;;48449:4;48441:6;48437:17;48427:27;;48383:81;48511:2;48503:6;48500:14;48480:18;48477:38;48474:84;;;48530:18;;:::i;:::-;48474:84;48295:269;48244:320;;;:::o;48570:166::-;48639:5;48664:66;48695:34;48718:10;48695:34;:::i;:::-;48664:66;:::i;:::-;48655:75;;48570:166;;;:::o;48742:281::-;48825:27;48847:4;48825:27;:::i;:::-;48817:6;48813:40;48955:6;48943:10;48940:22;48919:18;48907:10;48904:34;48901:62;48898:88;;;48966:18;;:::i;:::-;48898:88;49006:10;49002:2;48995:22;48785:238;48742:281;;:::o;49029:233::-;49068:3;49091:24;49109:5;49091:24;:::i;:::-;49082:33;;49137:66;49130:5;49127:77;49124:103;;;49207:18;;:::i;:::-;49124:103;49254:1;49247:5;49243:13;49236:20;;49029:233;;;:::o;49268:180::-;49316:77;49313:1;49306:88;49413:4;49410:1;49403:15;49437:4;49434:1;49427:15;49454:180;49502:77;49499:1;49492:88;49599:4;49596:1;49589:15;49623:4;49620:1;49613:15;49640:180;49688:77;49685:1;49678:88;49785:4;49782:1;49775:15;49809:4;49806:1;49799:15;49826:180;49874:77;49871:1;49864:88;49971:4;49968:1;49961:15;49995:4;49992:1;49985:15;50012:180;50060:77;50057:1;50050:88;50157:4;50154:1;50147:15;50181:4;50178:1;50171:15;50198:144;50253:5;50278:57;50329:4;50323:11;50278:57;:::i;:::-;50269:66;;50198:144;;;:::o;50348:183::-;50383:3;50421:1;50403:16;50400:23;50397:128;;;50459:1;50456;50453;50438:23;50481:34;50512:1;50506:8;50481:34;:::i;:::-;50474:41;;50397:128;50348:183;:::o;50537:117::-;50646:1;50643;50636:12;50660:117;50769:1;50766;50759:12;50783:117;50892:1;50889;50882:12;50906:117;51015:1;51012;51005:12;51029:117;51138:1;51135;51128:12;51152:102;51193:6;51244:2;51240:7;51235:2;51228:5;51224:14;51220:28;51210:38;;51152:102;;;:::o;51260:::-;51302:8;51349:5;51346:1;51342:13;51321:34;;51260:102;;;:::o;51368:106::-;51412:8;51461:5;51456:3;51452:15;51431:36;;51368:106;;;:::o;51480:227::-;51620:34;51616:1;51608:6;51604:14;51597:58;51689:10;51684:2;51676:6;51672:15;51665:35;51480:227;:::o;51713:178::-;51853:30;51849:1;51841:6;51837:14;51830:54;51713:178;:::o;51897:225::-;52037:34;52033:1;52025:6;52021:14;52014:58;52106:8;52101:2;52093:6;52089:15;52082:33;51897:225;:::o;52128:223::-;52268:34;52264:1;52256:6;52252:14;52245:58;52337:6;52332:2;52324:6;52320:15;52313:31;52128:223;:::o;52357:181::-;52497:33;52493:1;52485:6;52481:14;52474:57;52357:181;:::o;52544:229::-;52684:34;52680:1;52672:6;52668:14;52661:58;52753:12;52748:2;52740:6;52736:15;52729:37;52544:229;:::o;52779:241::-;52919:34;52915:1;52907:6;52903:14;52896:58;52988:24;52983:2;52975:6;52971:15;52964:49;52779:241;:::o;53026:233::-;53166:34;53162:1;53154:6;53150:14;53143:58;53235:16;53230:2;53222:6;53218:15;53211:41;53026:233;:::o;53265:172::-;53405:24;53401:1;53393:6;53389:14;53382:48;53265:172;:::o;53443:178::-;53583:30;53579:1;53571:6;53567:14;53560:54;53443:178;:::o;53627:224::-;53767:34;53763:1;53755:6;53751:14;53744:58;53836:7;53831:2;53823:6;53819:15;53812:32;53627:224;:::o;53857:178::-;53997:30;53993:1;53985:6;53981:14;53974:54;53857:178;:::o;54041:241::-;54181:34;54177:1;54169:6;54165:14;54158:58;54250:24;54245:2;54237:6;54233:15;54226:49;54041:241;:::o;54288:172::-;54428:24;54424:1;54416:6;54412:14;54405:48;54288:172;:::o;54466:222::-;54606:34;54602:1;54594:6;54590:14;54583:58;54675:5;54670:2;54662:6;54658:15;54651:30;54466:222;:::o;54694:229::-;54834:34;54830:1;54822:6;54818:14;54811:58;54903:12;54898:2;54890:6;54886:15;54879:37;54694:229;:::o;54929:166::-;55069:18;55065:1;55057:6;55053:14;55046:42;54929:166;:::o;55101:182::-;55241:34;55237:1;55229:6;55225:14;55218:58;55101:182;:::o;55289:224::-;55429:34;55425:1;55417:6;55413:14;55406:58;55498:7;55493:2;55485:6;55481:15;55474:32;55289:224;:::o;55519:114::-;;:::o;55639:228::-;55779:34;55775:1;55767:6;55763:14;55756:58;55848:11;55843:2;55835:6;55831:15;55824:36;55639:228;:::o;55873:::-;56013:34;56009:1;56001:6;55997:14;55990:58;56082:11;56077:2;56069:6;56065:15;56058:36;55873:228;:::o;56107:227::-;56247:34;56243:1;56235:6;56231:14;56224:58;56316:10;56311:2;56303:6;56299:15;56292:35;56107:227;:::o;56340:177::-;56480:29;56476:1;56468:6;56464:14;56457:53;56340:177;:::o;56523:239::-;56663:34;56659:1;56651:6;56647:14;56640:58;56732:22;56727:2;56719:6;56715:15;56708:47;56523:239;:::o;56768:711::-;56807:3;56845:4;56827:16;56824:26;56821:39;;;56853:5;;56821:39;56882:20;;:::i;:::-;56957:1;56939:16;56935:24;56932:1;56926:4;56911:49;56990:4;56984:11;57089:16;57082:4;57074:6;57070:17;57067:39;57034:18;57026:6;57023:30;57007:113;57004:146;;;57135:5;;;;57004:146;57181:6;57175:4;57171:17;57217:3;57211:10;57244:18;57236:6;57233:30;57230:43;;;57266:5;;;;;;57230:43;57314:6;57307:4;57302:3;57298:14;57294:27;57373:1;57355:16;57351:24;57345:4;57341:35;57336:3;57333:44;57330:57;;;57380:5;;;;;;;57330:57;57397;57445:6;57439:4;57435:17;57427:6;57423:30;57417:4;57397:57;:::i;:::-;57470:3;57463:10;;56811:668;;;;;56768:711;;:::o;57485:122::-;57558:24;57576:5;57558:24;:::i;:::-;57551:5;57548:35;57538:63;;57597:1;57594;57587:12;57538:63;57485:122;:::o;57613:116::-;57683:21;57698:5;57683:21;:::i;:::-;57676:5;57673:32;57663:60;;57719:1;57716;57709:12;57663:60;57613:116;:::o;57735:120::-;57807:23;57824:5;57807:23;:::i;:::-;57800:5;57797:34;57787:62;;57845:1;57842;57835:12;57787:62;57735:120;:::o;57861:122::-;57934:24;57952:5;57934:24;:::i;:::-;57927:5;57924:35;57914:63;;57973:1;57970;57963:12;57914:63;57861:122;:::o
Swarm Source
ipfs://0e86cb0b00f7dedd74de642236815839eeb069cd80053be433ab331926338580
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.