Polygon Sponsored slots available. Book your slot here!
More Info
Private Name Tags
ContractCreator
TokenTracker
Multichain Info
No addresses found
Latest 25 from a total of 4,807 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer | 52786067 | 416 days ago | IN | 0 POL | 0.00191754 | ||||
Transfer | 51184474 | 458 days ago | IN | 0 POL | 0.01005635 | ||||
Transfer | 49613464 | 498 days ago | IN | 0 POL | 0.01030342 | ||||
Transfer | 48478441 | 527 days ago | IN | 0 POL | 0.0030737 | ||||
Transfer | 48464724 | 527 days ago | IN | 0 POL | 0.0030737 | ||||
Transfer | 48464697 | 527 days ago | IN | 0 POL | 0.0030737 | ||||
Transfer | 47923516 | 541 days ago | IN | 0 POL | 0.00619782 | ||||
Transfer | 47217306 | 559 days ago | IN | 0 POL | 0.0062567 | ||||
Transfer | 46887720 | 567 days ago | IN | 0 POL | 0.00630831 | ||||
Transfer | 46657609 | 573 days ago | IN | 0 POL | 0.00578233 | ||||
Transfer | 46657605 | 573 days ago | IN | 0 POL | 0.00567815 | ||||
Transfer | 46657601 | 573 days ago | IN | 0 POL | 0.00405821 | ||||
Transfer | 46657593 | 573 days ago | IN | 0 POL | 0.00413936 | ||||
Transfer | 46657587 | 573 days ago | IN | 0 POL | 0.00410407 | ||||
Transfer | 46657582 | 573 days ago | IN | 0 POL | 0.00390712 | ||||
Transfer | 46657579 | 573 days ago | IN | 0 POL | 0.00412172 | ||||
Transfer | 46657573 | 573 days ago | IN | 0 POL | 0.00575229 | ||||
Transfer | 46657568 | 573 days ago | IN | 0 POL | 0.00572139 | ||||
Transfer | 46657563 | 573 days ago | IN | 0 POL | 0.00580159 | ||||
Transfer | 46657559 | 573 days ago | IN | 0 POL | 0.00404323 | ||||
Transfer | 46657553 | 573 days ago | IN | 0 POL | 0.00405622 | ||||
Transfer | 46657546 | 573 days ago | IN | 0 POL | 0.00409869 | ||||
Transfer | 46657541 | 573 days ago | IN | 0 POL | 0.00402198 | ||||
Transfer | 46657538 | 573 days ago | IN | 0 POL | 0.00401774 | ||||
Transfer | 46654861 | 573 days ago | IN | 0 POL | 0.004579 |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
SenecaPresaleToken
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2023-07-03 */ // 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/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.9.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) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 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 256, 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 << 3) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.9.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 `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @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); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.9.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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/utils/Multicall.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Multicall.sol) pragma solidity ^0.8.0; /** * @dev Provides a function to batch together multiple calls in a single external call. * * _Available since v4.1._ */ abstract contract Multicall { /** * @dev Receives and executes a batch of function calls on this contract. * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function multicall(bytes[] calldata data) external virtual returns (bytes[] memory results) { results = new bytes[](data.length); for (uint256 i = 0; i < data.length; i++) { results[i] = Address.functionDelegateCall(address(this), data[i]); } return results; } } // 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/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} } // File: Seneca.sol pragma solidity ^0.8.18; /** * @title Presale token which will be used to get allocated SNCA tokens. * @dev A custom ERC20 token with additional round configuration functionality. * @notice Regular users can not transfer their presale tokens, they can (eventually) burn them to get their SNCA tokens. */ contract SenecaPresaleToken is ERC20, Pausable, Multicall, AccessControl { bytes32 public constant DISTRIBUTOR_ROLE = keccak256("DISTRIBUTOR_ROLE"); bool public burnAllowed; uint32 public tokenCostMilliCents; uint32 public referralMilliPercentage; uint32 public minMilliTokenContribution; uint32 public maxMilliTokenContribution; struct bonus{ uint32 amount; uint32 percentage; } bonus[] public bonusValues; uint64 public maxTotalSupply; constructor(address distributor, uint64 _maxTotalSupply) ERC20("SenecaPresale", "pSNCA") { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(DISTRIBUTOR_ROLE, msg.sender); _grantRole(DISTRIBUTOR_ROLE, distributor); maxTotalSupply = _maxTotalSupply; burnAllowed = false; } function decimals() public view virtual override returns (uint8) { return 3; } function mint(address to, uint256 amount) public onlyRole(DEFAULT_ADMIN_ROLE) { require( totalSupply() + amount <= maxTotalSupply, "Can't mint, total supply would exceed maxTotalSupply." ); _mint(to, amount); } function pause() public onlyRole(DEFAULT_ADMIN_ROLE) { _pause(); } function unpause() public onlyRole(DEFAULT_ADMIN_ROLE) { _unpause(); } function _beforeTokenTransfer(address from, address to, uint256 amount) internal whenNotPaused override { super._beforeTokenTransfer(from, to, amount); } function _transfer( address sender, address recipient, uint256 amount ) internal override onlyRole(DISTRIBUTOR_ROLE) { super._transfer(sender, recipient, amount); } function _approve( address owner, address spender, uint256 amount ) internal override whenNotPaused onlyRole(DISTRIBUTOR_ROLE) { super._approve(owner, spender, amount); } function _burn( address account, uint256 amount ) internal override { require(burnAllowed, "Burn not allowed."); super._burn(account, amount); } function setBurnStatus(bool _burnAllowed) public onlyRole(DEFAULT_ADMIN_ROLE) { burnAllowed = _burnAllowed; } function setRound( address distributor, uint256 amount, uint32 _tokenCostMilliCents, uint32 _referralMilliPercentage, uint32 _minMilliTokenContribution, uint32 _maxMilliTokenContribution, uint32[] memory milliAmounts, uint32[] memory milliPercentages ) public onlyRole(DEFAULT_ADMIN_ROLE) { require( milliAmounts.length == milliPercentages.length, "Length of arrays milliAmounts and milliPercentages must be same" ); _mint(distributor, amount); tokenCostMilliCents = _tokenCostMilliCents; referralMilliPercentage = _referralMilliPercentage; minMilliTokenContribution = _minMilliTokenContribution; maxMilliTokenContribution = _maxMilliTokenContribution; for(uint i = 0; i< milliAmounts.length; i++){ bonusValues.push(bonus({amount : milliAmounts[i], percentage : milliPercentages[i]})); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"distributor","type":"address"},{"internalType":"uint64","name":"_maxTotalSupply","type":"uint64"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISTRIBUTOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bonusValues","outputs":[{"internalType":"uint32","name":"amount","type":"uint32"},{"internalType":"uint32","name":"percentage","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMilliTokenContribution","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTotalSupply","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minMilliTokenContribution","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralMilliPercentage","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_burnAllowed","type":"bool"}],"name":"setBurnStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"distributor","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint32","name":"_tokenCostMilliCents","type":"uint32"},{"internalType":"uint32","name":"_referralMilliPercentage","type":"uint32"},{"internalType":"uint32","name":"_minMilliTokenContribution","type":"uint32"},{"internalType":"uint32","name":"_maxMilliTokenContribution","type":"uint32"},{"internalType":"uint32[]","name":"milliAmounts","type":"uint32[]"},{"internalType":"uint32[]","name":"milliPercentages","type":"uint32[]"}],"name":"setRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCostMilliCents","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003c1238038062003c128339818101604052810190620000379190620003bd565b6040518060400160405280600d81526020017f53656e65636150726573616c65000000000000000000000000000000000000008152506040518060400160405280600581526020017f70534e43410000000000000000000000000000000000000000000000000000008152508160039081620000b491906200067e565b508060049081620000c691906200067e565b5050506000600560006101000a81548160ff021916908315150217905550620000f96000801b33620001a960201b60201c565b6200012b7ffbd454f36a7e1a388bd6fc3ab10d434aa4578f811acbbcf33afb1c697486313c33620001a960201b60201c565b6200015d7ffbd454f36a7e1a388bd6fc3ab10d434aa4578f811acbbcf33afb1c697486313c83620001a960201b60201c565b80600960006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600760006101000a81548160ff021916908315150217905550505062000765565b620001bb82826200029b60201b60201c565b620002975760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200023c6200030660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003408262000313565b9050919050565b620003528162000333565b81146200035e57600080fd5b50565b600081519050620003728162000347565b92915050565b600067ffffffffffffffff82169050919050565b620003978162000378565b8114620003a357600080fd5b50565b600081519050620003b7816200038c565b92915050565b60008060408385031215620003d757620003d66200030e565b5b6000620003e78582860162000361565b9250506020620003fa85828601620003a6565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200048657607f821691505b6020821081036200049c576200049b6200043e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004c7565b620005128683620004c7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200055f6200055962000553846200052a565b62000534565b6200052a565b9050919050565b6000819050919050565b6200057b836200053e565b620005936200058a8262000566565b848454620004d4565b825550505050565b600090565b620005aa6200059b565b620005b781848462000570565b505050565b5b81811015620005df57620005d3600082620005a0565b600181019050620005bd565b5050565b601f8211156200062e57620005f881620004a2565b6200060384620004b7565b8101602085101562000613578190505b6200062b6200062285620004b7565b830182620005bc565b50505b505050565b600082821c905092915050565b6000620006536000198460080262000633565b1980831691505092915050565b60006200066e838362000640565b9150826002028217905092915050565b620006898262000404565b67ffffffffffffffff811115620006a557620006a46200040f565b5b620006b182546200046d565b620006be828285620005e3565b600060209050601f831160018114620006f65760008415620006e1578287015190505b620006ed858262000660565b8655506200075d565b601f1984166200070686620004a2565b60005b82811015620007305784890151825560018201915060208501945060208101905062000709565b868310156200075057848901516200074c601f89168262000640565b8355505b6001600288020188555050505b505050505050565b61349d80620007756000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80635c975abb1161011a57806397a2d0eb116100ad578063ac9650d81161007c578063ac9650d8146105cb578063d547741f146105fb578063dd62ed3e14610617578063ed84e00114610647578063f0bd87cc14610665576101fb565b806397a2d0eb14610531578063a217fddf1461054d578063a457c2d71461056b578063a9059cbb1461059b576101fb565b80638456cb59116100e95780638456cb59146104bb5780638d4fee24146104c557806391d14854146104e357806395d89b4114610513576101fb565b80635c975abb1461041e5780635da3e9cd1461043c578063634c688a1461046d57806370a082311461048b576101fb565b80632f2ff15d11610192578063395093511161016157806339509351146103ac5780633f4ba83a146103dc57806340c10f19146103e65780634c82a3be14610402576101fb565b80632f2ff15d14610338578063309e23b814610354578063313ce5671461037257806336568abe14610390576101fb565b806318160ddd116101ce57806318160ddd1461029c57806323b872dd146102ba578063248a9ca3146102ea5780632ab4d0521461031a576101fb565b806301ffc9a71461020057806306fdde0314610230578063095ea7b31461024e57806315032c791461027e575b600080fd5b61021a60048036038101906102159190611fb3565b610683565b6040516102279190611ffb565b60405180910390f35b6102386106fd565b60405161024591906120a6565b60405180910390f35b6102686004803603810190610263919061215c565b61078f565b6040516102759190611ffb565b60405180910390f35b6102866107b2565b60405161029391906121bb565b60405180910390f35b6102a46107c8565b6040516102b191906121e5565b60405180910390f35b6102d460048036038101906102cf9190612200565b6107d2565b6040516102e19190611ffb565b60405180910390f35b61030460048036038101906102ff9190612289565b610801565b60405161031191906122c5565b60405180910390f35b610322610821565b60405161032f9190612303565b60405180910390f35b610352600480360381019061034d919061231e565b61083b565b005b61035c61085c565b60405161036991906121bb565b60405180910390f35b61037a610872565b604051610387919061237a565b60405180910390f35b6103aa60048036038101906103a5919061231e565b61087b565b005b6103c660048036038101906103c1919061215c565b6108fe565b6040516103d39190611ffb565b60405180910390f35b6103e4610935565b005b61040060048036038101906103fb919061215c565b61094d565b005b61041c60048036038101906104179190612509565b6109de565b005b610426610bb4565b6040516104339190611ffb565b60405180910390f35b610456600480360381019061045191906125f7565b610bcb565b604051610464929190612624565b60405180910390f35b610475610c1b565b6040516104829190611ffb565b60405180910390f35b6104a560048036038101906104a0919061264d565b610c2e565b6040516104b291906121e5565b60405180910390f35b6104c3610c76565b005b6104cd610c8e565b6040516104da91906121bb565b60405180910390f35b6104fd60048036038101906104f8919061231e565b610ca4565b60405161050a9190611ffb565b60405180910390f35b61051b610d0f565b60405161052891906120a6565b60405180910390f35b61054b600480360381019061054691906126a6565b610da1565b005b610555610dcc565b60405161056291906122c5565b60405180910390f35b6105856004803603810190610580919061215c565b610dd3565b6040516105929190611ffb565b60405180910390f35b6105b560048036038101906105b0919061215c565b610e4a565b6040516105c29190611ffb565b60405180910390f35b6105e560048036038101906105e0919061272e565b610e6d565b6040516105f29190612892565b60405180910390f35b6106156004803603810190610610919061231e565b610f79565b005b610631600480360381019061062c91906128b4565b610f9a565b60405161063e91906121e5565b60405180910390f35b61064f611021565b60405161065c91906121bb565b60405180910390f35b61066d611037565b60405161067a91906122c5565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106f657506106f58261105b565b5b9050919050565b60606003805461070c90612923565b80601f016020809104026020016040519081016040528092919081815260200182805461073890612923565b80156107855780601f1061075a57610100808354040283529160200191610785565b820191906000526020600020905b81548152906001019060200180831161076857829003601f168201915b5050505050905090565b60008061079a6110c5565b90506107a78185856110cd565b600191505092915050565b600760059054906101000a900463ffffffff1681565b6000600254905090565b6000806107dd6110c5565b90506107ea858285611110565b6107f585858561119c565b60019150509392505050565b600060066000838152602001908152602001600020600101549050919050565b600960009054906101000a900467ffffffffffffffff1681565b61084482610801565b61084d816111d7565b61085783836111eb565b505050565b600760099054906101000a900463ffffffff1681565b60006003905090565b6108836110c5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e7906129c6565b60405180910390fd5b6108fa82826112cc565b5050565b6000806109096110c5565b905061092a81858561091b8589610f9a565b6109259190612a15565b6110cd565b600191505092915050565b6000801b610942816111d7565b61094a6113ae565b50565b6000801b61095a816111d7565b600960009054906101000a900467ffffffffffffffff1667ffffffffffffffff16826109846107c8565b61098e9190612a15565b11156109cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c690612abb565b60405180910390fd5b6109d98383611411565b505050565b6000801b6109eb816111d7565b8151835114610a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2690612b4d565b60405180910390fd5b610a398989611411565b86600760016101000a81548163ffffffff021916908363ffffffff16021790555085600760056101000a81548163ffffffff021916908363ffffffff16021790555084600760096101000a81548163ffffffff021916908363ffffffff160217905550836007600d6101000a81548163ffffffff021916908363ffffffff16021790555060005b8351811015610ba85760086040518060400160405280868481518110610ae957610ae8612b6d565b5b602002602001015163ffffffff168152602001858481518110610b0f57610b0e612b6d565b5b602002602001015163ffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555050508080610ba090612b9c565b915050610ac0565b50505050505050505050565b6000600560009054906101000a900460ff16905090565b60088181548110610bdb57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900463ffffffff16905082565b600760009054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000801b610c83816111d7565b610c8b611567565b50565b6007600d9054906101000a900463ffffffff1681565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054610d1e90612923565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4a90612923565b8015610d975780601f10610d6c57610100808354040283529160200191610d97565b820191906000526020600020905b815481529060010190602001808311610d7a57829003601f168201915b5050505050905090565b6000801b610dae816111d7565b81600760006101000a81548160ff0219169083151502179055505050565b6000801b81565b600080610dde6110c5565b90506000610dec8286610f9a565b905083811015610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890612c56565b60405180910390fd5b610e3e82868684036110cd565b60019250505092915050565b600080610e556110c5565b9050610e6281858561119c565b600191505092915050565b60608282905067ffffffffffffffff811115610e8c57610e8b6123c6565b5b604051908082528060200260200182016040528015610ebf57816020015b6060815260200190600190039081610eaa5790505b50905060005b83839050811015610f7257610f4130858584818110610ee757610ee6612b6d565b5b9050602002810190610ef99190612c85565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506115ca565b828281518110610f5457610f53612b6d565b5b60200260200101819052508080610f6a90612b9c565b915050610ec5565b5092915050565b610f8282610801565b610f8b816111d7565b610f9583836112cc565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600760019054906101000a900463ffffffff1681565b7ffbd454f36a7e1a388bd6fc3ab10d434aa4578f811acbbcf33afb1c697486313c81565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6110d56115f7565b7ffbd454f36a7e1a388bd6fc3ab10d434aa4578f811acbbcf33afb1c697486313c6110ff816111d7565b61110a848484611641565b50505050565b600061111c8484610f9a565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146111965781811015611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117f90612d34565b60405180910390fd5b61119584848484036110cd565b5b50505050565b7ffbd454f36a7e1a388bd6fc3ab10d434aa4578f811acbbcf33afb1c697486313c6111c6816111d7565b6111d184848461180a565b50505050565b6111e8816111e36110c5565b611a80565b50565b6111f58282610ca4565b6112c85760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061126d6110c5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6112d68282610ca4565b156113aa5760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061134f6110c5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6113b6611b05565b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6113fa6110c5565b6040516114079190612d63565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147790612dca565b60405180910390fd5b61148c60008383611b4e565b806002600082825461149e9190612a15565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161154f91906121e5565b60405180910390a361156360008383611b66565b5050565b61156f6115f7565b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586115b36110c5565b6040516115c09190612d63565b60405180910390a1565b60606115ef838360405180606001604052806027815260200161344160279139611b6b565b905092915050565b6115ff610bb4565b1561163f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163690612e36565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a790612ec8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361171f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171690612f5a565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117fd91906121e5565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611879576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187090612fec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118df9061307e565b60405180910390fd5b6118f3838383611b4e565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611979576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197090613110565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a6791906121e5565b60405180910390a3611a7a848484611b66565b50505050565b611a8a8282610ca4565b611b0157611a9781611bf1565b611aa58360001c6020611c1e565b604051602001611ab6929190613204565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af891906120a6565b60405180910390fd5b5050565b611b0d610bb4565b611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b439061328a565b60405180910390fd5b565b611b566115f7565b611b61838383611e5a565b505050565b505050565b60606000808573ffffffffffffffffffffffffffffffffffffffff1685604051611b9591906132e6565b600060405180830381855af49150503d8060008114611bd0576040519150601f19603f3d011682016040523d82523d6000602084013e611bd5565b606091505b5091509150611be686838387611e5f565b925050509392505050565b6060611c178273ffffffffffffffffffffffffffffffffffffffff16601460ff16611c1e565b9050919050565b606060006002836002611c3191906132fd565b611c3b9190612a15565b67ffffffffffffffff811115611c5457611c536123c6565b5b6040519080825280601f01601f191660200182016040528015611c865781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611cbe57611cbd612b6d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611d2257611d21612b6d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611d6291906132fd565b611d6c9190612a15565b90505b6001811115611e0c577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611dae57611dad612b6d565b5b1a60f81b828281518110611dc557611dc4612b6d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611e059061333f565b9050611d6f565b5060008414611e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e47906133b4565b60405180910390fd5b8091505092915050565b505050565b60608315611ec1576000835103611eb957611e7985611ed4565b611eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaf90613420565b60405180910390fd5b5b829050611ecc565b611ecb8383611ef7565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115611f0a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3e91906120a6565b60405180910390fd5b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611f9081611f5b565b8114611f9b57600080fd5b50565b600081359050611fad81611f87565b92915050565b600060208284031215611fc957611fc8611f51565b5b6000611fd784828501611f9e565b91505092915050565b60008115159050919050565b611ff581611fe0565b82525050565b60006020820190506120106000830184611fec565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612050578082015181840152602081019050612035565b60008484015250505050565b6000601f19601f8301169050919050565b600061207882612016565b6120828185612021565b9350612092818560208601612032565b61209b8161205c565b840191505092915050565b600060208201905081810360008301526120c0818461206d565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006120f3826120c8565b9050919050565b612103816120e8565b811461210e57600080fd5b50565b600081359050612120816120fa565b92915050565b6000819050919050565b61213981612126565b811461214457600080fd5b50565b60008135905061215681612130565b92915050565b6000806040838503121561217357612172611f51565b5b600061218185828601612111565b925050602061219285828601612147565b9150509250929050565b600063ffffffff82169050919050565b6121b58161219c565b82525050565b60006020820190506121d060008301846121ac565b92915050565b6121df81612126565b82525050565b60006020820190506121fa60008301846121d6565b92915050565b60008060006060848603121561221957612218611f51565b5b600061222786828701612111565b935050602061223886828701612111565b925050604061224986828701612147565b9150509250925092565b6000819050919050565b61226681612253565b811461227157600080fd5b50565b6000813590506122838161225d565b92915050565b60006020828403121561229f5761229e611f51565b5b60006122ad84828501612274565b91505092915050565b6122bf81612253565b82525050565b60006020820190506122da60008301846122b6565b92915050565b600067ffffffffffffffff82169050919050565b6122fd816122e0565b82525050565b600060208201905061231860008301846122f4565b92915050565b6000806040838503121561233557612334611f51565b5b600061234385828601612274565b925050602061235485828601612111565b9150509250929050565b600060ff82169050919050565b6123748161235e565b82525050565b600060208201905061238f600083018461236b565b92915050565b61239e8161219c565b81146123a957600080fd5b50565b6000813590506123bb81612395565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6123fe8261205c565b810181811067ffffffffffffffff8211171561241d5761241c6123c6565b5b80604052505050565b6000612430611f47565b905061243c82826123f5565b919050565b600067ffffffffffffffff82111561245c5761245b6123c6565b5b602082029050602081019050919050565b600080fd5b600061248561248084612441565b612426565b905080838252602082019050602084028301858111156124a8576124a761246d565b5b835b818110156124d157806124bd88826123ac565b8452602084019350506020810190506124aa565b5050509392505050565b600082601f8301126124f0576124ef6123c1565b5b8135612500848260208601612472565b91505092915050565b600080600080600080600080610100898b03121561252a57612529611f51565b5b60006125388b828c01612111565b98505060206125498b828c01612147565b975050604061255a8b828c016123ac565b965050606061256b8b828c016123ac565b955050608061257c8b828c016123ac565b94505060a061258d8b828c016123ac565b93505060c089013567ffffffffffffffff8111156125ae576125ad611f56565b5b6125ba8b828c016124db565b92505060e089013567ffffffffffffffff8111156125db576125da611f56565b5b6125e78b828c016124db565b9150509295985092959890939650565b60006020828403121561260d5761260c611f51565b5b600061261b84828501612147565b91505092915050565b600060408201905061263960008301856121ac565b61264660208301846121ac565b9392505050565b60006020828403121561266357612662611f51565b5b600061267184828501612111565b91505092915050565b61268381611fe0565b811461268e57600080fd5b50565b6000813590506126a08161267a565b92915050565b6000602082840312156126bc576126bb611f51565b5b60006126ca84828501612691565b91505092915050565b600080fd5b60008083601f8401126126ee576126ed6123c1565b5b8235905067ffffffffffffffff81111561270b5761270a6126d3565b5b6020830191508360208202830111156127275761272661246d565b5b9250929050565b6000806020838503121561274557612744611f51565b5b600083013567ffffffffffffffff81111561276357612762611f56565b5b61276f858286016126d8565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60006127ce826127a7565b6127d881856127b2565b93506127e8818560208601612032565b6127f18161205c565b840191505092915050565b600061280883836127c3565b905092915050565b6000602082019050919050565b60006128288261277b565b6128328185612786565b93508360208202850161284485612797565b8060005b85811015612880578484038952815161286185826127fc565b945061286c83612810565b925060208a01995050600181019050612848565b50829750879550505050505092915050565b600060208201905081810360008301526128ac818461281d565b905092915050565b600080604083850312156128cb576128ca611f51565b5b60006128d985828601612111565b92505060206128ea85828601612111565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061293b57607f821691505b60208210810361294e5761294d6128f4565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006129b0602f83612021565b91506129bb82612954565b604082019050919050565b600060208201905081810360008301526129df816129a3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a2082612126565b9150612a2b83612126565b9250828201905080821115612a4357612a426129e6565b5b92915050565b7f43616e2774206d696e742c20746f74616c20737570706c7920776f756c64206560008201527f7863656564206d6178546f74616c537570706c792e0000000000000000000000602082015250565b6000612aa5603583612021565b9150612ab082612a49565b604082019050919050565b60006020820190508181036000830152612ad481612a98565b9050919050565b7f4c656e677468206f6620617272617973206d696c6c69416d6f756e747320616e60008201527f64206d696c6c6950657263656e7461676573206d7573742062652073616d6500602082015250565b6000612b37603f83612021565b9150612b4282612adb565b604082019050919050565b60006020820190508181036000830152612b6681612b2a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612ba782612126565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612bd957612bd86129e6565b5b600182019050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612c40602583612021565b9150612c4b82612be4565b604082019050919050565b60006020820190508181036000830152612c6f81612c33565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612ca257612ca1612c76565b5b80840192508235915067ffffffffffffffff821115612cc457612cc3612c7b565b5b602083019250600182023603831315612ce057612cdf612c80565b5b509250929050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612d1e601d83612021565b9150612d2982612ce8565b602082019050919050565b60006020820190508181036000830152612d4d81612d11565b9050919050565b612d5d816120e8565b82525050565b6000602082019050612d786000830184612d54565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612db4601f83612021565b9150612dbf82612d7e565b602082019050919050565b60006020820190508181036000830152612de381612da7565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612e20601083612021565b9150612e2b82612dea565b602082019050919050565b60006020820190508181036000830152612e4f81612e13565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612eb2602483612021565b9150612ebd82612e56565b604082019050919050565b60006020820190508181036000830152612ee181612ea5565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612f44602283612021565b9150612f4f82612ee8565b604082019050919050565b60006020820190508181036000830152612f7381612f37565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612fd6602583612021565b9150612fe182612f7a565b604082019050919050565b6000602082019050818103600083015261300581612fc9565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613068602383612021565b91506130738261300c565b604082019050919050565b600060208201905081810360008301526130978161305b565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006130fa602683612021565b91506131058261309e565b604082019050919050565b60006020820190508181036000830152613129816130ed565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613171601783613130565b915061317c8261313b565b601782019050919050565b600061319282612016565b61319c8185613130565b93506131ac818560208601612032565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006131ee601183613130565b91506131f9826131b8565b601182019050919050565b600061320f82613164565b915061321b8285613187565b9150613226826131e1565b91506132328284613187565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613274601483612021565b915061327f8261323e565b602082019050919050565b600060208201905081810360008301526132a381613267565b9050919050565b600081905092915050565b60006132c0826127a7565b6132ca81856132aa565b93506132da818560208601612032565b80840191505092915050565b60006132f282846132b5565b915081905092915050565b600061330882612126565b915061331383612126565b925082820261332181612126565b91508282048414831517613338576133376129e6565b5b5092915050565b600061334a82612126565b91506000820361335d5761335c6129e6565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061339e602083612021565b91506133a982613368565b602082019050919050565b600060208201905081810360008301526133cd81613391565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b600061340a601d83612021565b9150613415826133d4565b602082019050919050565b60006020820190508181036000830152613439816133fd565b905091905056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c9c2465dd0e8beef5704dfc8345652dca62a80cadb7a52c557a5034ed2e2746d64736f6c634300081200330000000000000000000000008340d81c6099d90a4cd1c0f2f17657a313f2fbd200000000000000000000000000000000000000000000000000000013ca651200
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80635c975abb1161011a57806397a2d0eb116100ad578063ac9650d81161007c578063ac9650d8146105cb578063d547741f146105fb578063dd62ed3e14610617578063ed84e00114610647578063f0bd87cc14610665576101fb565b806397a2d0eb14610531578063a217fddf1461054d578063a457c2d71461056b578063a9059cbb1461059b576101fb565b80638456cb59116100e95780638456cb59146104bb5780638d4fee24146104c557806391d14854146104e357806395d89b4114610513576101fb565b80635c975abb1461041e5780635da3e9cd1461043c578063634c688a1461046d57806370a082311461048b576101fb565b80632f2ff15d11610192578063395093511161016157806339509351146103ac5780633f4ba83a146103dc57806340c10f19146103e65780634c82a3be14610402576101fb565b80632f2ff15d14610338578063309e23b814610354578063313ce5671461037257806336568abe14610390576101fb565b806318160ddd116101ce57806318160ddd1461029c57806323b872dd146102ba578063248a9ca3146102ea5780632ab4d0521461031a576101fb565b806301ffc9a71461020057806306fdde0314610230578063095ea7b31461024e57806315032c791461027e575b600080fd5b61021a60048036038101906102159190611fb3565b610683565b6040516102279190611ffb565b60405180910390f35b6102386106fd565b60405161024591906120a6565b60405180910390f35b6102686004803603810190610263919061215c565b61078f565b6040516102759190611ffb565b60405180910390f35b6102866107b2565b60405161029391906121bb565b60405180910390f35b6102a46107c8565b6040516102b191906121e5565b60405180910390f35b6102d460048036038101906102cf9190612200565b6107d2565b6040516102e19190611ffb565b60405180910390f35b61030460048036038101906102ff9190612289565b610801565b60405161031191906122c5565b60405180910390f35b610322610821565b60405161032f9190612303565b60405180910390f35b610352600480360381019061034d919061231e565b61083b565b005b61035c61085c565b60405161036991906121bb565b60405180910390f35b61037a610872565b604051610387919061237a565b60405180910390f35b6103aa60048036038101906103a5919061231e565b61087b565b005b6103c660048036038101906103c1919061215c565b6108fe565b6040516103d39190611ffb565b60405180910390f35b6103e4610935565b005b61040060048036038101906103fb919061215c565b61094d565b005b61041c60048036038101906104179190612509565b6109de565b005b610426610bb4565b6040516104339190611ffb565b60405180910390f35b610456600480360381019061045191906125f7565b610bcb565b604051610464929190612624565b60405180910390f35b610475610c1b565b6040516104829190611ffb565b60405180910390f35b6104a560048036038101906104a0919061264d565b610c2e565b6040516104b291906121e5565b60405180910390f35b6104c3610c76565b005b6104cd610c8e565b6040516104da91906121bb565b60405180910390f35b6104fd60048036038101906104f8919061231e565b610ca4565b60405161050a9190611ffb565b60405180910390f35b61051b610d0f565b60405161052891906120a6565b60405180910390f35b61054b600480360381019061054691906126a6565b610da1565b005b610555610dcc565b60405161056291906122c5565b60405180910390f35b6105856004803603810190610580919061215c565b610dd3565b6040516105929190611ffb565b60405180910390f35b6105b560048036038101906105b0919061215c565b610e4a565b6040516105c29190611ffb565b60405180910390f35b6105e560048036038101906105e0919061272e565b610e6d565b6040516105f29190612892565b60405180910390f35b6106156004803603810190610610919061231e565b610f79565b005b610631600480360381019061062c91906128b4565b610f9a565b60405161063e91906121e5565b60405180910390f35b61064f611021565b60405161065c91906121bb565b60405180910390f35b61066d611037565b60405161067a91906122c5565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106f657506106f58261105b565b5b9050919050565b60606003805461070c90612923565b80601f016020809104026020016040519081016040528092919081815260200182805461073890612923565b80156107855780601f1061075a57610100808354040283529160200191610785565b820191906000526020600020905b81548152906001019060200180831161076857829003601f168201915b5050505050905090565b60008061079a6110c5565b90506107a78185856110cd565b600191505092915050565b600760059054906101000a900463ffffffff1681565b6000600254905090565b6000806107dd6110c5565b90506107ea858285611110565b6107f585858561119c565b60019150509392505050565b600060066000838152602001908152602001600020600101549050919050565b600960009054906101000a900467ffffffffffffffff1681565b61084482610801565b61084d816111d7565b61085783836111eb565b505050565b600760099054906101000a900463ffffffff1681565b60006003905090565b6108836110c5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e7906129c6565b60405180910390fd5b6108fa82826112cc565b5050565b6000806109096110c5565b905061092a81858561091b8589610f9a565b6109259190612a15565b6110cd565b600191505092915050565b6000801b610942816111d7565b61094a6113ae565b50565b6000801b61095a816111d7565b600960009054906101000a900467ffffffffffffffff1667ffffffffffffffff16826109846107c8565b61098e9190612a15565b11156109cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c690612abb565b60405180910390fd5b6109d98383611411565b505050565b6000801b6109eb816111d7565b8151835114610a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2690612b4d565b60405180910390fd5b610a398989611411565b86600760016101000a81548163ffffffff021916908363ffffffff16021790555085600760056101000a81548163ffffffff021916908363ffffffff16021790555084600760096101000a81548163ffffffff021916908363ffffffff160217905550836007600d6101000a81548163ffffffff021916908363ffffffff16021790555060005b8351811015610ba85760086040518060400160405280868481518110610ae957610ae8612b6d565b5b602002602001015163ffffffff168152602001858481518110610b0f57610b0e612b6d565b5b602002602001015163ffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555050508080610ba090612b9c565b915050610ac0565b50505050505050505050565b6000600560009054906101000a900460ff16905090565b60088181548110610bdb57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900463ffffffff16905082565b600760009054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000801b610c83816111d7565b610c8b611567565b50565b6007600d9054906101000a900463ffffffff1681565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054610d1e90612923565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4a90612923565b8015610d975780601f10610d6c57610100808354040283529160200191610d97565b820191906000526020600020905b815481529060010190602001808311610d7a57829003601f168201915b5050505050905090565b6000801b610dae816111d7565b81600760006101000a81548160ff0219169083151502179055505050565b6000801b81565b600080610dde6110c5565b90506000610dec8286610f9a565b905083811015610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890612c56565b60405180910390fd5b610e3e82868684036110cd565b60019250505092915050565b600080610e556110c5565b9050610e6281858561119c565b600191505092915050565b60608282905067ffffffffffffffff811115610e8c57610e8b6123c6565b5b604051908082528060200260200182016040528015610ebf57816020015b6060815260200190600190039081610eaa5790505b50905060005b83839050811015610f7257610f4130858584818110610ee757610ee6612b6d565b5b9050602002810190610ef99190612c85565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506115ca565b828281518110610f5457610f53612b6d565b5b60200260200101819052508080610f6a90612b9c565b915050610ec5565b5092915050565b610f8282610801565b610f8b816111d7565b610f9583836112cc565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600760019054906101000a900463ffffffff1681565b7ffbd454f36a7e1a388bd6fc3ab10d434aa4578f811acbbcf33afb1c697486313c81565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6110d56115f7565b7ffbd454f36a7e1a388bd6fc3ab10d434aa4578f811acbbcf33afb1c697486313c6110ff816111d7565b61110a848484611641565b50505050565b600061111c8484610f9a565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146111965781811015611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117f90612d34565b60405180910390fd5b61119584848484036110cd565b5b50505050565b7ffbd454f36a7e1a388bd6fc3ab10d434aa4578f811acbbcf33afb1c697486313c6111c6816111d7565b6111d184848461180a565b50505050565b6111e8816111e36110c5565b611a80565b50565b6111f58282610ca4565b6112c85760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061126d6110c5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6112d68282610ca4565b156113aa5760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061134f6110c5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6113b6611b05565b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6113fa6110c5565b6040516114079190612d63565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147790612dca565b60405180910390fd5b61148c60008383611b4e565b806002600082825461149e9190612a15565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161154f91906121e5565b60405180910390a361156360008383611b66565b5050565b61156f6115f7565b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586115b36110c5565b6040516115c09190612d63565b60405180910390a1565b60606115ef838360405180606001604052806027815260200161344160279139611b6b565b905092915050565b6115ff610bb4565b1561163f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163690612e36565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a790612ec8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361171f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171690612f5a565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117fd91906121e5565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611879576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187090612fec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118df9061307e565b60405180910390fd5b6118f3838383611b4e565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611979576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197090613110565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a6791906121e5565b60405180910390a3611a7a848484611b66565b50505050565b611a8a8282610ca4565b611b0157611a9781611bf1565b611aa58360001c6020611c1e565b604051602001611ab6929190613204565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af891906120a6565b60405180910390fd5b5050565b611b0d610bb4565b611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b439061328a565b60405180910390fd5b565b611b566115f7565b611b61838383611e5a565b505050565b505050565b60606000808573ffffffffffffffffffffffffffffffffffffffff1685604051611b9591906132e6565b600060405180830381855af49150503d8060008114611bd0576040519150601f19603f3d011682016040523d82523d6000602084013e611bd5565b606091505b5091509150611be686838387611e5f565b925050509392505050565b6060611c178273ffffffffffffffffffffffffffffffffffffffff16601460ff16611c1e565b9050919050565b606060006002836002611c3191906132fd565b611c3b9190612a15565b67ffffffffffffffff811115611c5457611c536123c6565b5b6040519080825280601f01601f191660200182016040528015611c865781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611cbe57611cbd612b6d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611d2257611d21612b6d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611d6291906132fd565b611d6c9190612a15565b90505b6001811115611e0c577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611dae57611dad612b6d565b5b1a60f81b828281518110611dc557611dc4612b6d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611e059061333f565b9050611d6f565b5060008414611e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e47906133b4565b60405180910390fd5b8091505092915050565b505050565b60608315611ec1576000835103611eb957611e7985611ed4565b611eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaf90613420565b60405180910390fd5b5b829050611ecc565b611ecb8383611ef7565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115611f0a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3e91906120a6565b60405180910390fd5b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611f9081611f5b565b8114611f9b57600080fd5b50565b600081359050611fad81611f87565b92915050565b600060208284031215611fc957611fc8611f51565b5b6000611fd784828501611f9e565b91505092915050565b60008115159050919050565b611ff581611fe0565b82525050565b60006020820190506120106000830184611fec565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612050578082015181840152602081019050612035565b60008484015250505050565b6000601f19601f8301169050919050565b600061207882612016565b6120828185612021565b9350612092818560208601612032565b61209b8161205c565b840191505092915050565b600060208201905081810360008301526120c0818461206d565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006120f3826120c8565b9050919050565b612103816120e8565b811461210e57600080fd5b50565b600081359050612120816120fa565b92915050565b6000819050919050565b61213981612126565b811461214457600080fd5b50565b60008135905061215681612130565b92915050565b6000806040838503121561217357612172611f51565b5b600061218185828601612111565b925050602061219285828601612147565b9150509250929050565b600063ffffffff82169050919050565b6121b58161219c565b82525050565b60006020820190506121d060008301846121ac565b92915050565b6121df81612126565b82525050565b60006020820190506121fa60008301846121d6565b92915050565b60008060006060848603121561221957612218611f51565b5b600061222786828701612111565b935050602061223886828701612111565b925050604061224986828701612147565b9150509250925092565b6000819050919050565b61226681612253565b811461227157600080fd5b50565b6000813590506122838161225d565b92915050565b60006020828403121561229f5761229e611f51565b5b60006122ad84828501612274565b91505092915050565b6122bf81612253565b82525050565b60006020820190506122da60008301846122b6565b92915050565b600067ffffffffffffffff82169050919050565b6122fd816122e0565b82525050565b600060208201905061231860008301846122f4565b92915050565b6000806040838503121561233557612334611f51565b5b600061234385828601612274565b925050602061235485828601612111565b9150509250929050565b600060ff82169050919050565b6123748161235e565b82525050565b600060208201905061238f600083018461236b565b92915050565b61239e8161219c565b81146123a957600080fd5b50565b6000813590506123bb81612395565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6123fe8261205c565b810181811067ffffffffffffffff8211171561241d5761241c6123c6565b5b80604052505050565b6000612430611f47565b905061243c82826123f5565b919050565b600067ffffffffffffffff82111561245c5761245b6123c6565b5b602082029050602081019050919050565b600080fd5b600061248561248084612441565b612426565b905080838252602082019050602084028301858111156124a8576124a761246d565b5b835b818110156124d157806124bd88826123ac565b8452602084019350506020810190506124aa565b5050509392505050565b600082601f8301126124f0576124ef6123c1565b5b8135612500848260208601612472565b91505092915050565b600080600080600080600080610100898b03121561252a57612529611f51565b5b60006125388b828c01612111565b98505060206125498b828c01612147565b975050604061255a8b828c016123ac565b965050606061256b8b828c016123ac565b955050608061257c8b828c016123ac565b94505060a061258d8b828c016123ac565b93505060c089013567ffffffffffffffff8111156125ae576125ad611f56565b5b6125ba8b828c016124db565b92505060e089013567ffffffffffffffff8111156125db576125da611f56565b5b6125e78b828c016124db565b9150509295985092959890939650565b60006020828403121561260d5761260c611f51565b5b600061261b84828501612147565b91505092915050565b600060408201905061263960008301856121ac565b61264660208301846121ac565b9392505050565b60006020828403121561266357612662611f51565b5b600061267184828501612111565b91505092915050565b61268381611fe0565b811461268e57600080fd5b50565b6000813590506126a08161267a565b92915050565b6000602082840312156126bc576126bb611f51565b5b60006126ca84828501612691565b91505092915050565b600080fd5b60008083601f8401126126ee576126ed6123c1565b5b8235905067ffffffffffffffff81111561270b5761270a6126d3565b5b6020830191508360208202830111156127275761272661246d565b5b9250929050565b6000806020838503121561274557612744611f51565b5b600083013567ffffffffffffffff81111561276357612762611f56565b5b61276f858286016126d8565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60006127ce826127a7565b6127d881856127b2565b93506127e8818560208601612032565b6127f18161205c565b840191505092915050565b600061280883836127c3565b905092915050565b6000602082019050919050565b60006128288261277b565b6128328185612786565b93508360208202850161284485612797565b8060005b85811015612880578484038952815161286185826127fc565b945061286c83612810565b925060208a01995050600181019050612848565b50829750879550505050505092915050565b600060208201905081810360008301526128ac818461281d565b905092915050565b600080604083850312156128cb576128ca611f51565b5b60006128d985828601612111565b92505060206128ea85828601612111565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061293b57607f821691505b60208210810361294e5761294d6128f4565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006129b0602f83612021565b91506129bb82612954565b604082019050919050565b600060208201905081810360008301526129df816129a3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a2082612126565b9150612a2b83612126565b9250828201905080821115612a4357612a426129e6565b5b92915050565b7f43616e2774206d696e742c20746f74616c20737570706c7920776f756c64206560008201527f7863656564206d6178546f74616c537570706c792e0000000000000000000000602082015250565b6000612aa5603583612021565b9150612ab082612a49565b604082019050919050565b60006020820190508181036000830152612ad481612a98565b9050919050565b7f4c656e677468206f6620617272617973206d696c6c69416d6f756e747320616e60008201527f64206d696c6c6950657263656e7461676573206d7573742062652073616d6500602082015250565b6000612b37603f83612021565b9150612b4282612adb565b604082019050919050565b60006020820190508181036000830152612b6681612b2a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612ba782612126565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612bd957612bd86129e6565b5b600182019050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612c40602583612021565b9150612c4b82612be4565b604082019050919050565b60006020820190508181036000830152612c6f81612c33565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612ca257612ca1612c76565b5b80840192508235915067ffffffffffffffff821115612cc457612cc3612c7b565b5b602083019250600182023603831315612ce057612cdf612c80565b5b509250929050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612d1e601d83612021565b9150612d2982612ce8565b602082019050919050565b60006020820190508181036000830152612d4d81612d11565b9050919050565b612d5d816120e8565b82525050565b6000602082019050612d786000830184612d54565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612db4601f83612021565b9150612dbf82612d7e565b602082019050919050565b60006020820190508181036000830152612de381612da7565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612e20601083612021565b9150612e2b82612dea565b602082019050919050565b60006020820190508181036000830152612e4f81612e13565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612eb2602483612021565b9150612ebd82612e56565b604082019050919050565b60006020820190508181036000830152612ee181612ea5565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612f44602283612021565b9150612f4f82612ee8565b604082019050919050565b60006020820190508181036000830152612f7381612f37565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612fd6602583612021565b9150612fe182612f7a565b604082019050919050565b6000602082019050818103600083015261300581612fc9565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613068602383612021565b91506130738261300c565b604082019050919050565b600060208201905081810360008301526130978161305b565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006130fa602683612021565b91506131058261309e565b604082019050919050565b60006020820190508181036000830152613129816130ed565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613171601783613130565b915061317c8261313b565b601782019050919050565b600061319282612016565b61319c8185613130565b93506131ac818560208601612032565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006131ee601183613130565b91506131f9826131b8565b601182019050919050565b600061320f82613164565b915061321b8285613187565b9150613226826131e1565b91506132328284613187565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613274601483612021565b915061327f8261323e565b602082019050919050565b600060208201905081810360008301526132a381613267565b9050919050565b600081905092915050565b60006132c0826127a7565b6132ca81856132aa565b93506132da818560208601612032565b80840191505092915050565b60006132f282846132b5565b915081905092915050565b600061330882612126565b915061331383612126565b925082820261332181612126565b91508282048414831517613338576133376129e6565b5b5092915050565b600061334a82612126565b91506000820361335d5761335c6129e6565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061339e602083612021565b91506133a982613368565b602082019050919050565b600060208201905081810360008301526133cd81613391565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b600061340a601d83612021565b9150613415826133d4565b602082019050919050565b60006020820190508181036000830152613439816133fd565b905091905056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c9c2465dd0e8beef5704dfc8345652dca62a80cadb7a52c557a5034ed2e2746d64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008340d81c6099d90a4cd1c0f2f17657a313f2fbd200000000000000000000000000000000000000000000000000000013ca651200
-----Decoded View---------------
Arg [0] : distributor (address): 0x8340D81C6099d90A4cD1C0f2F17657A313f2fbD2
Arg [1] : _maxTotalSupply (uint64): 85000000000
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000008340d81c6099d90a4cd1c0f2f17657a313f2fbd2
Arg [1] : 00000000000000000000000000000000000000000000000000000013ca651200
Deployed Bytecode Sourcemap
61749:3423:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39002:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50399:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52759:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61986:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51528:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53540:261;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40825:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62241:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41266:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62032:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62622:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42410:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54210:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63097:84;;;:::i;:::-;;62722:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64173:996;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35316:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62206:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;61912:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51699:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63009:80;;;:::i;:::-;;62078:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39298:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50618:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64042:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38403:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54951:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52032:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32429:314;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41706:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52288:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61944:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61831:72;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39002:204;39087:4;39126:32;39111:47;;;:11;:47;;;;:87;;;;39162:36;39186:11;39162:23;:36::i;:::-;39111:87;39104:94;;39002:204;;;:::o;50399:100::-;50453:13;50486:5;50479:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50399:100;:::o;52759:201::-;52842:4;52859:13;52875:12;:10;:12::i;:::-;52859:28;;52898:32;52907:5;52914:7;52923:6;52898:8;:32::i;:::-;52948:4;52941:11;;;52759:201;;;;:::o;61986:37::-;;;;;;;;;;;;;:::o;51528:108::-;51589:7;51616:12;;51609:19;;51528:108;:::o;53540:261::-;53637:4;53654:15;53672:12;:10;:12::i;:::-;53654:30;;53695:38;53711:4;53717:7;53726:6;53695:15;:38::i;:::-;53744:27;53754:4;53760:2;53764:6;53744:9;:27::i;:::-;53789:4;53782:11;;;53540:261;;;;;:::o;40825:131::-;40899:7;40926:6;:12;40933:4;40926:12;;;;;;;;;;;:22;;;40919:29;;40825:131;;;:::o;62241:28::-;;;;;;;;;;;;;:::o;41266:147::-;41349:18;41362:4;41349:12;:18::i;:::-;38894:16;38905:4;38894:10;:16::i;:::-;41380:25:::1;41391:4;41397:7;41380:10;:25::i;:::-;41266:147:::0;;;:::o;62032:39::-;;;;;;;;;;;;;:::o;62622:92::-;62680:5;62705:1;62698:8;;62622:92;:::o;42410:218::-;42517:12;:10;:12::i;:::-;42506:23;;:7;:23;;;42498:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;42594:26;42606:4;42612:7;42594:11;:26::i;:::-;42410:218;;:::o;54210:238::-;54298:4;54315:13;54331:12;:10;:12::i;:::-;54315:28;;54354:64;54363:5;54370:7;54407:10;54379:25;54389:5;54396:7;54379:9;:25::i;:::-;:38;;;;:::i;:::-;54354:8;:64::i;:::-;54436:4;54429:11;;;54210:238;;;;:::o;63097:84::-;38448:4;63132:18;;38894:16;38905:4;38894:10;:16::i;:::-;63163:10:::1;:8;:10::i;:::-;63097:84:::0;:::o;62722:279::-;38448:4;62780:18;;38894:16;38905:4;38894:10;:16::i;:::-;62869:14:::1;;;;;;;;;;;62843:40;;62859:6;62843:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:40;;62821:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;62976:17;62982:2;62986:6;62976:5;:17::i;:::-;62722:279:::0;;;:::o;64173:996::-;38448:4;64520:18;;38894:16;38905:4;38894:10;:16::i;:::-;64596::::1;:23;64573:12;:19;:46;64551:159;;;;;;;;;;;;:::i;:::-;;;;;;;;;64723:26;64729:11;64742:6;64723:5;:26::i;:::-;64782:20;64760:19;;:42;;;;;;;;;;;;;;;;;;64839:24;64813:23;;:50;;;;;;;;;;;;;;;;;;64902:26;64874:25;;:54;;;;;;;;;;;;;;;;;;64967:26;64939:25;;:54;;;;;;;;;;;;;;;;;;65010:6;65006:156;65025:12;:19;65022:1;:22;65006:156;;;65065:11;65082:67;;;;;;;;65098:12;65111:1;65098:15;;;;;;;;:::i;:::-;;;;;;;;65082:67;;;;;;65128:16;65145:1;65128:19;;;;;;;;:::i;:::-;;;;;;;;65082:67;;;;::::0;65065:85:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65046:3;;;;;:::i;:::-;;;;65006:156;;;;64173:996:::0;;;;;;;;;:::o;35316:86::-;35363:4;35387:7;;;;;;;;;;;35380:14;;35316:86;:::o;62206:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61912:23::-;;;;;;;;;;;;;:::o;51699:127::-;51773:7;51800:9;:18;51810:7;51800:18;;;;;;;;;;;;;;;;51793:25;;51699:127;;;:::o;63009:80::-;38448:4;63042:18;;38894:16;38905:4;38894:10;:16::i;:::-;63073:8:::1;:6;:8::i;:::-;63009:80:::0;:::o;62078:39::-;;;;;;;;;;;;;:::o;39298:147::-;39384:4;39408:6;:12;39415:4;39408:12;;;;;;;;;;;:20;;:29;39429:7;39408:29;;;;;;;;;;;;;;;;;;;;;;;;;39401:36;;39298:147;;;;:::o;50618:104::-;50674:13;50707:7;50700:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50618:104;:::o;64042:123::-;38448:4;64100:18;;38894:16;38905:4;38894:10;:16::i;:::-;64145:12:::1;64131:11;;:26;;;;;;;;;;;;;;;;;;64042:123:::0;;:::o;38403:49::-;38448:4;38403:49;;;:::o;54951:436::-;55044:4;55061:13;55077:12;:10;:12::i;:::-;55061:28;;55100:24;55127:25;55137:5;55144:7;55127:9;:25::i;:::-;55100:52;;55191:15;55171:16;:35;;55163:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;55284:60;55293:5;55300:7;55328:15;55309:16;:34;55284:8;:60::i;:::-;55375:4;55368:11;;;;54951:436;;;;:::o;52032:193::-;52111:4;52128:13;52144:12;:10;:12::i;:::-;52128:28;;52167;52177:5;52184:2;52188:6;52167:9;:28::i;:::-;52213:4;52206:11;;;52032:193;;;;:::o;32429:314::-;32497:22;32554:4;;:11;;32542:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32532:34;;32582:9;32577:134;32601:4;;:11;;32597:1;:15;32577:134;;;32647:52;32684:4;32691;;32696:1;32691:7;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;32647:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28;:52::i;:::-;32634:7;32642:1;32634:10;;;;;;;;:::i;:::-;;;;;;;:65;;;;32614:3;;;;;:::i;:::-;;;;32577:134;;;;32429:314;;;;:::o;41706:149::-;41790:18;41803:4;41790:12;:18::i;:::-;38894:16;38905:4;38894:10;:16::i;:::-;41821:26:::1;41833:4;41839:7;41821:11;:26::i;:::-;41706:149:::0;;;:::o;52288:151::-;52377:7;52404:11;:18;52416:5;52404:18;;;;;;;;;;;;;;;:27;52423:7;52404:27;;;;;;;;;;;;;;;;52397:34;;52288:151;;;;:::o;61944:33::-;;;;;;;;;;;;;:::o;61831:72::-;61874:29;61831:72;:::o;1782:157::-;1867:4;1906:25;1891:40;;;:11;:40;;;;1884:47;;1782:157;;;:::o;33429:98::-;33482:7;33509:10;33502:17;;33429:98;:::o;63618:216::-;34921:19;:17;:19::i;:::-;61874:29:::1;38894:16;38905:4;38894:10;:16::i;:::-;63788:38:::2;63803:5;63810:7;63819:6;63788:14;:38::i;:::-;34951:1:::1;63618:216:::0;;;:::o;59581:419::-;59682:24;59709:25;59719:5;59726:7;59709:9;:25::i;:::-;59682:52;;59769:17;59749:16;:37;59745:248;;59831:6;59811:16;:26;;59803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59915:51;59924:5;59931:7;59959:6;59940:16;:25;59915:8;:51::i;:::-;59745:248;59671:329;59581:419;;;:::o;63400:210::-;61874:29;38894:16;38905:4;38894:10;:16::i;:::-;63560:42:::1;63576:6;63584:9;63595:6;63560:15;:42::i;:::-;63400:210:::0;;;;:::o;39749:105::-;39816:30;39827:4;39833:12;:10;:12::i;:::-;39816:10;:30::i;:::-;39749:105;:::o;44007:238::-;44091:22;44099:4;44105:7;44091;:22::i;:::-;44086:152;;44162:4;44130:6;:12;44137:4;44130:12;;;;;;;;;;;:20;;:29;44151:7;44130:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;44213:12;:10;:12::i;:::-;44186:40;;44204:7;44186:40;;44198:4;44186:40;;;;;;;;;;44086:152;44007:238;;:::o;44425:239::-;44509:22;44517:4;44523:7;44509;:22::i;:::-;44505:152;;;44580:5;44548:6;:12;44555:4;44548:12;;;;;;;;;;;:20;;:29;44569:7;44548:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;44632:12;:10;:12::i;:::-;44605:40;;44623:7;44605:40;;44617:4;44605:40;;;;;;;;;;44505:152;44425:239;;:::o;36171:120::-;35180:16;:14;:16::i;:::-;36240:5:::1;36230:7;;:15;;;;;;;;;;;;;;;;;;36261:22;36270:12;:10;:12::i;:::-;36261:22;;;;;;:::i;:::-;;;;;;;;36171:120::o:0;56950:548::-;57053:1;57034:21;;:7;:21;;;57026:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;57104:49;57133:1;57137:7;57146:6;57104:20;:49::i;:::-;57182:6;57166:12;;:22;;;;;;;:::i;:::-;;;;;;;;57359:6;57337:9;:18;57347:7;57337:18;;;;;;;;;;;;;;;;:28;;;;;;;;;;;57413:7;57392:37;;57409:1;57392:37;;;57422:6;57392:37;;;;;;:::i;:::-;;;;;;;;57442:48;57470:1;57474:7;57483:6;57442:19;:48::i;:::-;56950:548;;:::o;35912:118::-;34921:19;:17;:19::i;:::-;35982:4:::1;35972:7;;:14;;;;;;;;;;;;;;;;;;36002:20;36009:12;:10;:12::i;:::-;36002:20;;;;;;:::i;:::-;;;;;;;;35912:118::o:0;29175:200::-;29258:12;29290:77;29311:6;29319:4;29290:77;;;;;;;;;;;;;;;;;:20;:77::i;:::-;29283:84;;29175:200;;;;:::o;35475:108::-;35546:8;:6;:8::i;:::-;35545:9;35537:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;35475:108::o;58944:346::-;59063:1;59046:19;;:5;:19;;;59038:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59144:1;59125:21;;:7;:21;;;59117:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59228:6;59198:11;:18;59210:5;59198:18;;;;;;;;;;;;;;;:27;59217:7;59198:27;;;;;;;;;;;;;;;:36;;;;59266:7;59250:32;;59259:5;59250:32;;;59275:6;59250:32;;;;;;:::i;:::-;;;;;;;;58944:346;;;:::o;55857:806::-;55970:1;55954:18;;:4;:18;;;55946:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56047:1;56033:16;;:2;:16;;;56025:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;56102:38;56123:4;56129:2;56133:6;56102:20;:38::i;:::-;56153:19;56175:9;:15;56185:4;56175:15;;;;;;;;;;;;;;;;56153:37;;56224:6;56209:11;:21;;56201:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;56341:6;56327:11;:20;56309:9;:15;56319:4;56309:15;;;;;;;;;;;;;;;:38;;;;56544:6;56527:9;:13;56537:2;56527:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;56594:2;56579:26;;56588:4;56579:26;;;56598:6;56579:26;;;;;;:::i;:::-;;;;;;;;56618:37;56638:4;56644:2;56648:6;56618:19;:37::i;:::-;55935:728;55857:806;;;:::o;40144:492::-;40233:22;40241:4;40247:7;40233;:22::i;:::-;40228:401;;40421:28;40441:7;40421:19;:28::i;:::-;40522:38;40550:4;40542:13;;40557:2;40522:19;:38::i;:::-;40326:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40272:345;;;;;;;;;;;:::i;:::-;;;;;;;;40228:401;40144:492;;:::o;35660:108::-;35727:8;:6;:8::i;:::-;35719:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;35660:108::o;63193:199::-;34921:19;:17;:19::i;:::-;63340:44:::1;63367:4;63373:2;63377:6;63340:26;:44::i;:::-;63193:199:::0;;;:::o;61295:90::-;;;;:::o;29569:332::-;29714:12;29740;29754:23;29781:6;:19;;29801:4;29781:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29739:67;;;;29824:69;29851:6;29859:7;29868:10;29880:12;29824:26;:69::i;:::-;29817:76;;;;29569:332;;;;;:::o;18882:151::-;18940:13;18973:52;19001:4;18985:22;;16757:2;18973:52;;:11;:52::i;:::-;18966:59;;18882:151;;;:::o;18278:447::-;18353:13;18379:19;18424:1;18415:6;18411:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18401:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18379:47;;18437:15;:6;18444:1;18437:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18463;:6;18470:1;18463:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18494:9;18519:1;18510:6;18506:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18494:26;;18489:131;18526:1;18522;:5;18489:131;;;18561:8;18578:3;18570:5;:11;18561:21;;;;;;;:::i;:::-;;;;;18549:6;18556:1;18549:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;18607:1;18597:11;;;;;18529:3;;;;:::i;:::-;;;18489:131;;;;18647:1;18638:5;:10;18630:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;18710:6;18696:21;;;18278:447;;;;:::o;60600:91::-;;;;:::o;30197:644::-;30382:12;30411:7;30407:427;;;30460:1;30439:10;:17;:22;30435:290;;30657:18;30668:6;30657:10;:18::i;:::-;30649:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;30435:290;30746:10;30739:17;;;;30407:427;30789:33;30797:10;30809:12;30789:7;:33::i;:::-;30197:644;;;;;;;:::o;23783:326::-;23843:4;24100:1;24078:7;:19;;;:23;24071:30;;23783:326;;;:::o;31383:552::-;31564:1;31544:10;:17;:21;31540:388;;;31776:10;31770:17;31833:15;31820:10;31816:2;31812:19;31805:44;31540:388;31903:12;31896:20;;;;;;;;;;;:::i;:::-;;;;;;;;7:75:1;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:126::-;2897:7;2937:42;2930:5;2926:54;2915:65;;2860:126;;;:::o;2992:96::-;3029:7;3058:24;3076:5;3058:24;:::i;:::-;3047:35;;2992:96;;;:::o;3094:122::-;3167:24;3185:5;3167:24;:::i;:::-;3160:5;3157:35;3147:63;;3206:1;3203;3196:12;3147:63;3094:122;:::o;3222:139::-;3268:5;3306:6;3293:20;3284:29;;3322:33;3349:5;3322:33;:::i;:::-;3222:139;;;;:::o;3367:77::-;3404:7;3433:5;3422:16;;3367:77;;;:::o;3450:122::-;3523:24;3541:5;3523:24;:::i;:::-;3516:5;3513:35;3503:63;;3562:1;3559;3552:12;3503:63;3450:122;:::o;3578:139::-;3624:5;3662:6;3649:20;3640:29;;3678:33;3705:5;3678:33;:::i;:::-;3578:139;;;;:::o;3723:474::-;3791:6;3799;3848:2;3836:9;3827:7;3823:23;3819:32;3816:119;;;3854:79;;:::i;:::-;3816:119;3974:1;3999:53;4044:7;4035:6;4024:9;4020:22;3999:53;:::i;:::-;3989:63;;3945:117;4101:2;4127:53;4172:7;4163:6;4152:9;4148:22;4127:53;:::i;:::-;4117:63;;4072:118;3723:474;;;;;:::o;4203:93::-;4239:7;4279:10;4272:5;4268:22;4257:33;;4203:93;;;:::o;4302:115::-;4387:23;4404:5;4387:23;:::i;:::-;4382:3;4375:36;4302:115;;:::o;4423:218::-;4514:4;4552:2;4541:9;4537:18;4529:26;;4565:69;4631:1;4620:9;4616:17;4607:6;4565:69;:::i;:::-;4423:218;;;;:::o;4647:118::-;4734:24;4752:5;4734:24;:::i;:::-;4729:3;4722:37;4647:118;;:::o;4771:222::-;4864:4;4902:2;4891:9;4887:18;4879:26;;4915:71;4983:1;4972:9;4968:17;4959:6;4915:71;:::i;:::-;4771:222;;;;:::o;4999:619::-;5076:6;5084;5092;5141:2;5129:9;5120:7;5116:23;5112:32;5109:119;;;5147:79;;:::i;:::-;5109:119;5267:1;5292:53;5337:7;5328:6;5317:9;5313:22;5292:53;:::i;:::-;5282:63;;5238:117;5394:2;5420:53;5465:7;5456:6;5445:9;5441:22;5420:53;:::i;:::-;5410:63;;5365:118;5522:2;5548:53;5593:7;5584:6;5573:9;5569:22;5548:53;:::i;:::-;5538:63;;5493:118;4999:619;;;;;:::o;5624:77::-;5661:7;5690:5;5679:16;;5624:77;;;:::o;5707:122::-;5780:24;5798:5;5780:24;:::i;:::-;5773:5;5770:35;5760:63;;5819:1;5816;5809:12;5760:63;5707:122;:::o;5835:139::-;5881:5;5919:6;5906:20;5897:29;;5935:33;5962:5;5935:33;:::i;:::-;5835:139;;;;:::o;5980:329::-;6039:6;6088:2;6076:9;6067:7;6063:23;6059:32;6056:119;;;6094:79;;:::i;:::-;6056:119;6214:1;6239:53;6284:7;6275:6;6264:9;6260:22;6239:53;:::i;:::-;6229:63;;6185:117;5980:329;;;;:::o;6315:118::-;6402:24;6420:5;6402:24;:::i;:::-;6397:3;6390:37;6315:118;;:::o;6439:222::-;6532:4;6570:2;6559:9;6555:18;6547:26;;6583:71;6651:1;6640:9;6636:17;6627:6;6583:71;:::i;:::-;6439:222;;;;:::o;6667:101::-;6703:7;6743:18;6736:5;6732:30;6721:41;;6667:101;;;:::o;6774:115::-;6859:23;6876:5;6859:23;:::i;:::-;6854:3;6847:36;6774:115;;:::o;6895:218::-;6986:4;7024:2;7013:9;7009:18;7001:26;;7037:69;7103:1;7092:9;7088:17;7079:6;7037:69;:::i;:::-;6895:218;;;;:::o;7119:474::-;7187:6;7195;7244:2;7232:9;7223:7;7219:23;7215:32;7212:119;;;7250:79;;:::i;:::-;7212:119;7370:1;7395:53;7440:7;7431:6;7420:9;7416:22;7395:53;:::i;:::-;7385:63;;7341:117;7497:2;7523:53;7568:7;7559:6;7548:9;7544:22;7523:53;:::i;:::-;7513:63;;7468:118;7119:474;;;;;:::o;7599:86::-;7634:7;7674:4;7667:5;7663:16;7652:27;;7599:86;;;:::o;7691:112::-;7774:22;7790:5;7774:22;:::i;:::-;7769:3;7762:35;7691:112;;:::o;7809:214::-;7898:4;7936:2;7925:9;7921:18;7913:26;;7949:67;8013:1;8002:9;7998:17;7989:6;7949:67;:::i;:::-;7809:214;;;;:::o;8029:120::-;8101:23;8118:5;8101:23;:::i;:::-;8094:5;8091:34;8081:62;;8139:1;8136;8129:12;8081:62;8029:120;:::o;8155:137::-;8200:5;8238:6;8225:20;8216:29;;8254:32;8280:5;8254:32;:::i;:::-;8155:137;;;;:::o;8298:117::-;8407:1;8404;8397:12;8421:180;8469:77;8466:1;8459:88;8566:4;8563:1;8556:15;8590:4;8587:1;8580:15;8607:281;8690:27;8712:4;8690:27;:::i;:::-;8682:6;8678:40;8820:6;8808:10;8805:22;8784:18;8772:10;8769:34;8766:62;8763:88;;;8831:18;;:::i;:::-;8763:88;8871:10;8867:2;8860:22;8650:238;8607:281;;:::o;8894:129::-;8928:6;8955:20;;:::i;:::-;8945:30;;8984:33;9012:4;9004:6;8984:33;:::i;:::-;8894:129;;;:::o;9029:310::-;9105:4;9195:18;9187:6;9184:30;9181:56;;;9217:18;;:::i;:::-;9181:56;9267:4;9259:6;9255:17;9247:25;;9327:4;9321;9317:15;9309:23;;9029:310;;;:::o;9345:117::-;9454:1;9451;9444:12;9484:707;9579:5;9604:80;9620:63;9676:6;9620:63;:::i;:::-;9604:80;:::i;:::-;9595:89;;9704:5;9733:6;9726:5;9719:21;9767:4;9760:5;9756:16;9749:23;;9820:4;9812:6;9808:17;9800:6;9796:30;9849:3;9841:6;9838:15;9835:122;;;9868:79;;:::i;:::-;9835:122;9983:6;9966:219;10000:6;9995:3;9992:15;9966:219;;;10075:3;10104:36;10136:3;10124:10;10104:36;:::i;:::-;10099:3;10092:49;10170:4;10165:3;10161:14;10154:21;;10042:143;10026:4;10021:3;10017:14;10010:21;;9966:219;;;9970:21;9585:606;;9484:707;;;;;:::o;10213:368::-;10283:5;10332:3;10325:4;10317:6;10313:17;10309:27;10299:122;;10340:79;;:::i;:::-;10299:122;10457:6;10444:20;10482:93;10571:3;10563:6;10556:4;10548:6;10544:17;10482:93;:::i;:::-;10473:102;;10289:292;10213:368;;;;:::o;10587:1757::-;10753:6;10761;10769;10777;10785;10793;10801;10809;10858:3;10846:9;10837:7;10833:23;10829:33;10826:120;;;10865:79;;:::i;:::-;10826:120;10985:1;11010:53;11055:7;11046:6;11035:9;11031:22;11010:53;:::i;:::-;11000:63;;10956:117;11112:2;11138:53;11183:7;11174:6;11163:9;11159:22;11138:53;:::i;:::-;11128:63;;11083:118;11240:2;11266:52;11310:7;11301:6;11290:9;11286:22;11266:52;:::i;:::-;11256:62;;11211:117;11367:2;11393:52;11437:7;11428:6;11417:9;11413:22;11393:52;:::i;:::-;11383:62;;11338:117;11494:3;11521:52;11565:7;11556:6;11545:9;11541:22;11521:52;:::i;:::-;11511:62;;11465:118;11622:3;11649:52;11693:7;11684:6;11673:9;11669:22;11649:52;:::i;:::-;11639:62;;11593:118;11778:3;11767:9;11763:19;11750:33;11810:18;11802:6;11799:30;11796:117;;;11832:79;;:::i;:::-;11796:117;11937:77;12006:7;11997:6;11986:9;11982:22;11937:77;:::i;:::-;11927:87;;11721:303;12091:3;12080:9;12076:19;12063:33;12123:18;12115:6;12112:30;12109:117;;;12145:79;;:::i;:::-;12109:117;12250:77;12319:7;12310:6;12299:9;12295:22;12250:77;:::i;:::-;12240:87;;12034:303;10587:1757;;;;;;;;;;;:::o;12350:329::-;12409:6;12458:2;12446:9;12437:7;12433:23;12429:32;12426:119;;;12464:79;;:::i;:::-;12426:119;12584:1;12609:53;12654:7;12645:6;12634:9;12630:22;12609:53;:::i;:::-;12599:63;;12555:117;12350:329;;;;:::o;12685:324::-;12802:4;12840:2;12829:9;12825:18;12817:26;;12853:69;12919:1;12908:9;12904:17;12895:6;12853:69;:::i;:::-;12932:70;12998:2;12987:9;12983:18;12974:6;12932:70;:::i;:::-;12685:324;;;;;:::o;13015:329::-;13074:6;13123:2;13111:9;13102:7;13098:23;13094:32;13091:119;;;13129:79;;:::i;:::-;13091:119;13249:1;13274:53;13319:7;13310:6;13299:9;13295:22;13274:53;:::i;:::-;13264:63;;13220:117;13015:329;;;;:::o;13350:116::-;13420:21;13435:5;13420:21;:::i;:::-;13413:5;13410:32;13400:60;;13456:1;13453;13446:12;13400:60;13350:116;:::o;13472:133::-;13515:5;13553:6;13540:20;13531:29;;13569:30;13593:5;13569:30;:::i;:::-;13472:133;;;;:::o;13611:323::-;13667:6;13716:2;13704:9;13695:7;13691:23;13687:32;13684:119;;;13722:79;;:::i;:::-;13684:119;13842:1;13867:50;13909:7;13900:6;13889:9;13885:22;13867:50;:::i;:::-;13857:60;;13813:114;13611:323;;;;:::o;13940:117::-;14049:1;14046;14039:12;14078:579;14162:8;14172:6;14222:3;14215:4;14207:6;14203:17;14199:27;14189:122;;14230:79;;:::i;:::-;14189:122;14343:6;14330:20;14320:30;;14373:18;14365:6;14362:30;14359:117;;;14395:79;;:::i;:::-;14359:117;14509:4;14501:6;14497:17;14485:29;;14563:3;14555:4;14547:6;14543:17;14533:8;14529:32;14526:41;14523:128;;;14570:79;;:::i;:::-;14523:128;14078:579;;;;;:::o;14663:581::-;14760:6;14768;14817:2;14805:9;14796:7;14792:23;14788:32;14785:119;;;14823:79;;:::i;:::-;14785:119;14971:1;14960:9;14956:17;14943:31;15001:18;14993:6;14990:30;14987:117;;;15023:79;;:::i;:::-;14987:117;15136:91;15219:7;15210:6;15199:9;15195:22;15136:91;:::i;:::-;15118:109;;;;14914:323;14663:581;;;;;:::o;15250:123::-;15326:6;15360:5;15354:12;15344:22;;15250:123;;;:::o;15379:193::-;15487:11;15521:6;15516:3;15509:19;15561:4;15556:3;15552:14;15537:29;;15379:193;;;;:::o;15578:141::-;15654:4;15677:3;15669:11;;15707:4;15702:3;15698:14;15690:22;;15578:141;;;:::o;15725:98::-;15776:6;15810:5;15804:12;15794:22;;15725:98;;;:::o;15829:158::-;15902:11;15936:6;15931:3;15924:19;15976:4;15971:3;15967:14;15952:29;;15829:158;;;;:::o;15993:353::-;16069:3;16097:38;16129:5;16097:38;:::i;:::-;16151:60;16204:6;16199:3;16151:60;:::i;:::-;16144:67;;16220:65;16278:6;16273:3;16266:4;16259:5;16255:16;16220:65;:::i;:::-;16310:29;16332:6;16310:29;:::i;:::-;16305:3;16301:39;16294:46;;16073:273;15993:353;;;;:::o;16352:192::-;16439:10;16474:64;16534:3;16526:6;16474:64;:::i;:::-;16460:78;;16352:192;;;;:::o;16550:122::-;16629:4;16661;16656:3;16652:14;16644:22;;16550:122;;;:::o;16704:983::-;16841:3;16870:63;16927:5;16870:63;:::i;:::-;16949:95;17037:6;17032:3;16949:95;:::i;:::-;16942:102;;17070:3;17115:4;17107:6;17103:17;17098:3;17094:27;17145:65;17204:5;17145:65;:::i;:::-;17233:7;17264:1;17249:393;17274:6;17271:1;17268:13;17249:393;;;17345:9;17339:4;17335:20;17330:3;17323:33;17396:6;17390:13;17424:82;17501:4;17486:13;17424:82;:::i;:::-;17416:90;;17529:69;17591:6;17529:69;:::i;:::-;17519:79;;17627:4;17622:3;17618:14;17611:21;;17309:333;17296:1;17293;17289:9;17284:14;;17249:393;;;17253:14;17658:4;17651:11;;17678:3;17671:10;;16846:841;;;;;16704:983;;;;:::o;17693:409::-;17854:4;17892:2;17881:9;17877:18;17869:26;;17941:9;17935:4;17931:20;17927:1;17916:9;17912:17;17905:47;17969:126;18090:4;18081:6;17969:126;:::i;:::-;17961:134;;17693:409;;;;:::o;18108:474::-;18176:6;18184;18233:2;18221:9;18212:7;18208:23;18204:32;18201:119;;;18239:79;;:::i;:::-;18201:119;18359:1;18384:53;18429:7;18420:6;18409:9;18405:22;18384:53;:::i;:::-;18374:63;;18330:117;18486:2;18512:53;18557:7;18548:6;18537:9;18533:22;18512:53;:::i;:::-;18502:63;;18457:118;18108:474;;;;;:::o;18588:180::-;18636:77;18633:1;18626:88;18733:4;18730:1;18723:15;18757:4;18754:1;18747:15;18774:320;18818:6;18855:1;18849:4;18845:12;18835:22;;18902:1;18896:4;18892:12;18923:18;18913:81;;18979:4;18971:6;18967:17;18957:27;;18913:81;19041:2;19033:6;19030:14;19010:18;19007:38;19004:84;;19060:18;;:::i;:::-;19004:84;18825:269;18774:320;;;:::o;19100:234::-;19240:34;19236:1;19228:6;19224:14;19217:58;19309:17;19304:2;19296:6;19292:15;19285:42;19100:234;:::o;19340:366::-;19482:3;19503:67;19567:2;19562:3;19503:67;:::i;:::-;19496:74;;19579:93;19668:3;19579:93;:::i;:::-;19697:2;19692:3;19688:12;19681:19;;19340:366;;;:::o;19712:419::-;19878:4;19916:2;19905:9;19901:18;19893:26;;19965:9;19959:4;19955:20;19951:1;19940:9;19936:17;19929:47;19993:131;20119:4;19993:131;:::i;:::-;19985:139;;19712:419;;;:::o;20137:180::-;20185:77;20182:1;20175:88;20282:4;20279:1;20272:15;20306:4;20303:1;20296:15;20323:191;20363:3;20382:20;20400:1;20382:20;:::i;:::-;20377:25;;20416:20;20434:1;20416:20;:::i;:::-;20411:25;;20459:1;20456;20452:9;20445:16;;20480:3;20477:1;20474:10;20471:36;;;20487:18;;:::i;:::-;20471:36;20323:191;;;;:::o;20520:240::-;20660:34;20656:1;20648:6;20644:14;20637:58;20729:23;20724:2;20716:6;20712:15;20705:48;20520:240;:::o;20766:366::-;20908:3;20929:67;20993:2;20988:3;20929:67;:::i;:::-;20922:74;;21005:93;21094:3;21005:93;:::i;:::-;21123:2;21118:3;21114:12;21107:19;;20766:366;;;:::o;21138:419::-;21304:4;21342:2;21331:9;21327:18;21319:26;;21391:9;21385:4;21381:20;21377:1;21366:9;21362:17;21355:47;21419:131;21545:4;21419:131;:::i;:::-;21411:139;;21138:419;;;:::o;21563:250::-;21703:34;21699:1;21691:6;21687:14;21680:58;21772:33;21767:2;21759:6;21755:15;21748:58;21563:250;:::o;21819:366::-;21961:3;21982:67;22046:2;22041:3;21982:67;:::i;:::-;21975:74;;22058:93;22147:3;22058:93;:::i;:::-;22176:2;22171:3;22167:12;22160:19;;21819:366;;;:::o;22191:419::-;22357:4;22395:2;22384:9;22380:18;22372:26;;22444:9;22438:4;22434:20;22430:1;22419:9;22415:17;22408:47;22472:131;22598:4;22472:131;:::i;:::-;22464:139;;22191:419;;;:::o;22616:180::-;22664:77;22661:1;22654:88;22761:4;22758:1;22751:15;22785:4;22782:1;22775:15;22802:233;22841:3;22864:24;22882:5;22864:24;:::i;:::-;22855:33;;22910:66;22903:5;22900:77;22897:103;;22980:18;;:::i;:::-;22897:103;23027:1;23020:5;23016:13;23009:20;;22802:233;;;:::o;23041:224::-;23181:34;23177:1;23169:6;23165:14;23158:58;23250:7;23245:2;23237:6;23233:15;23226:32;23041:224;:::o;23271:366::-;23413:3;23434:67;23498:2;23493:3;23434:67;:::i;:::-;23427:74;;23510:93;23599:3;23510:93;:::i;:::-;23628:2;23623:3;23619:12;23612:19;;23271:366;;;:::o;23643:419::-;23809:4;23847:2;23836:9;23832:18;23824:26;;23896:9;23890:4;23886:20;23882:1;23871:9;23867:17;23860:47;23924:131;24050:4;23924:131;:::i;:::-;23916:139;;23643:419;;;:::o;24068:117::-;24177:1;24174;24167:12;24191:117;24300:1;24297;24290:12;24314:117;24423:1;24420;24413:12;24437:724;24514:4;24520:6;24576:11;24563:25;24676:1;24670:4;24666:12;24655:8;24639:14;24635:29;24631:48;24611:18;24607:73;24597:168;;24684:79;;:::i;:::-;24597:168;24796:18;24786:8;24782:33;24774:41;;24848:4;24835:18;24825:28;;24876:18;24868:6;24865:30;24862:117;;;24898:79;;:::i;:::-;24862:117;25006:2;25000:4;24996:13;24988:21;;25063:4;25055:6;25051:17;25035:14;25031:38;25025:4;25021:49;25018:136;;;25073:79;;:::i;:::-;25018:136;24527:634;24437:724;;;;;:::o;25167:179::-;25307:31;25303:1;25295:6;25291:14;25284:55;25167:179;:::o;25352:366::-;25494:3;25515:67;25579:2;25574:3;25515:67;:::i;:::-;25508:74;;25591:93;25680:3;25591:93;:::i;:::-;25709:2;25704:3;25700:12;25693:19;;25352:366;;;:::o;25724:419::-;25890:4;25928:2;25917:9;25913:18;25905:26;;25977:9;25971:4;25967:20;25963:1;25952:9;25948:17;25941:47;26005:131;26131:4;26005:131;:::i;:::-;25997:139;;25724:419;;;:::o;26149:118::-;26236:24;26254:5;26236:24;:::i;:::-;26231:3;26224:37;26149:118;;:::o;26273:222::-;26366:4;26404:2;26393:9;26389:18;26381:26;;26417:71;26485:1;26474:9;26470:17;26461:6;26417:71;:::i;:::-;26273:222;;;;:::o;26501:181::-;26641:33;26637:1;26629:6;26625:14;26618:57;26501:181;:::o;26688:366::-;26830:3;26851:67;26915:2;26910:3;26851:67;:::i;:::-;26844:74;;26927:93;27016:3;26927:93;:::i;:::-;27045:2;27040:3;27036:12;27029:19;;26688:366;;;:::o;27060:419::-;27226:4;27264:2;27253:9;27249:18;27241:26;;27313:9;27307:4;27303:20;27299:1;27288:9;27284:17;27277:47;27341:131;27467:4;27341:131;:::i;:::-;27333:139;;27060:419;;;:::o;27485:166::-;27625:18;27621:1;27613:6;27609:14;27602:42;27485:166;:::o;27657:366::-;27799:3;27820:67;27884:2;27879:3;27820:67;:::i;:::-;27813:74;;27896:93;27985:3;27896:93;:::i;:::-;28014:2;28009:3;28005:12;27998:19;;27657:366;;;:::o;28029:419::-;28195:4;28233:2;28222:9;28218:18;28210:26;;28282:9;28276:4;28272:20;28268:1;28257:9;28253:17;28246:47;28310:131;28436:4;28310:131;:::i;:::-;28302:139;;28029:419;;;:::o;28454:223::-;28594:34;28590:1;28582:6;28578:14;28571:58;28663:6;28658:2;28650:6;28646:15;28639:31;28454:223;:::o;28683:366::-;28825:3;28846:67;28910:2;28905:3;28846:67;:::i;:::-;28839:74;;28922:93;29011:3;28922:93;:::i;:::-;29040:2;29035:3;29031:12;29024:19;;28683:366;;;:::o;29055:419::-;29221:4;29259:2;29248:9;29244:18;29236:26;;29308:9;29302:4;29298:20;29294:1;29283:9;29279:17;29272:47;29336:131;29462:4;29336:131;:::i;:::-;29328:139;;29055:419;;;:::o;29480:221::-;29620:34;29616:1;29608:6;29604:14;29597:58;29689:4;29684:2;29676:6;29672:15;29665:29;29480:221;:::o;29707:366::-;29849:3;29870:67;29934:2;29929:3;29870:67;:::i;:::-;29863:74;;29946:93;30035:3;29946:93;:::i;:::-;30064:2;30059:3;30055:12;30048:19;;29707:366;;;:::o;30079:419::-;30245:4;30283:2;30272:9;30268:18;30260:26;;30332:9;30326:4;30322:20;30318:1;30307:9;30303:17;30296:47;30360:131;30486:4;30360:131;:::i;:::-;30352:139;;30079:419;;;:::o;30504:224::-;30644:34;30640:1;30632:6;30628:14;30621:58;30713:7;30708:2;30700:6;30696:15;30689:32;30504:224;:::o;30734:366::-;30876:3;30897:67;30961:2;30956:3;30897:67;:::i;:::-;30890:74;;30973:93;31062:3;30973:93;:::i;:::-;31091:2;31086:3;31082:12;31075:19;;30734:366;;;:::o;31106:419::-;31272:4;31310:2;31299:9;31295:18;31287:26;;31359:9;31353:4;31349:20;31345:1;31334:9;31330:17;31323:47;31387:131;31513:4;31387:131;:::i;:::-;31379:139;;31106:419;;;:::o;31531:222::-;31671:34;31667:1;31659:6;31655:14;31648:58;31740:5;31735:2;31727:6;31723:15;31716:30;31531:222;:::o;31759:366::-;31901:3;31922:67;31986:2;31981:3;31922:67;:::i;:::-;31915:74;;31998:93;32087:3;31998:93;:::i;:::-;32116:2;32111:3;32107:12;32100:19;;31759:366;;;:::o;32131:419::-;32297:4;32335:2;32324:9;32320:18;32312:26;;32384:9;32378:4;32374:20;32370:1;32359:9;32355:17;32348:47;32412:131;32538:4;32412:131;:::i;:::-;32404:139;;32131:419;;;:::o;32556:225::-;32696:34;32692:1;32684:6;32680:14;32673:58;32765:8;32760:2;32752:6;32748:15;32741:33;32556:225;:::o;32787:366::-;32929:3;32950:67;33014:2;33009:3;32950:67;:::i;:::-;32943:74;;33026:93;33115:3;33026:93;:::i;:::-;33144:2;33139:3;33135:12;33128:19;;32787:366;;;:::o;33159:419::-;33325:4;33363:2;33352:9;33348:18;33340:26;;33412:9;33406:4;33402:20;33398:1;33387:9;33383:17;33376:47;33440:131;33566:4;33440:131;:::i;:::-;33432:139;;33159:419;;;:::o;33584:148::-;33686:11;33723:3;33708:18;;33584:148;;;;:::o;33738:173::-;33878:25;33874:1;33866:6;33862:14;33855:49;33738:173;:::o;33917:402::-;34077:3;34098:85;34180:2;34175:3;34098:85;:::i;:::-;34091:92;;34192:93;34281:3;34192:93;:::i;:::-;34310:2;34305:3;34301:12;34294:19;;33917:402;;;:::o;34325:390::-;34431:3;34459:39;34492:5;34459:39;:::i;:::-;34514:89;34596:6;34591:3;34514:89;:::i;:::-;34507:96;;34612:65;34670:6;34665:3;34658:4;34651:5;34647:16;34612:65;:::i;:::-;34702:6;34697:3;34693:16;34686:23;;34435:280;34325:390;;;;:::o;34721:167::-;34861:19;34857:1;34849:6;34845:14;34838:43;34721:167;:::o;34894:402::-;35054:3;35075:85;35157:2;35152:3;35075:85;:::i;:::-;35068:92;;35169:93;35258:3;35169:93;:::i;:::-;35287:2;35282:3;35278:12;35271:19;;34894:402;;;:::o;35302:967::-;35684:3;35706:148;35850:3;35706:148;:::i;:::-;35699:155;;35871:95;35962:3;35953:6;35871:95;:::i;:::-;35864:102;;35983:148;36127:3;35983:148;:::i;:::-;35976:155;;36148:95;36239:3;36230:6;36148:95;:::i;:::-;36141:102;;36260:3;36253:10;;35302:967;;;;;:::o;36275:170::-;36415:22;36411:1;36403:6;36399:14;36392:46;36275:170;:::o;36451:366::-;36593:3;36614:67;36678:2;36673:3;36614:67;:::i;:::-;36607:74;;36690:93;36779:3;36690:93;:::i;:::-;36808:2;36803:3;36799:12;36792:19;;36451:366;;;:::o;36823:419::-;36989:4;37027:2;37016:9;37012:18;37004:26;;37076:9;37070:4;37066:20;37062:1;37051:9;37047:17;37040:47;37104:131;37230:4;37104:131;:::i;:::-;37096:139;;36823:419;;;:::o;37248:147::-;37349:11;37386:3;37371:18;;37248:147;;;;:::o;37401:386::-;37505:3;37533:38;37565:5;37533:38;:::i;:::-;37587:88;37668:6;37663:3;37587:88;:::i;:::-;37580:95;;37684:65;37742:6;37737:3;37730:4;37723:5;37719:16;37684:65;:::i;:::-;37774:6;37769:3;37765:16;37758:23;;37509:278;37401:386;;;;:::o;37793:271::-;37923:3;37945:93;38034:3;38025:6;37945:93;:::i;:::-;37938:100;;38055:3;38048:10;;37793:271;;;;:::o;38070:410::-;38110:7;38133:20;38151:1;38133:20;:::i;:::-;38128:25;;38167:20;38185:1;38167:20;:::i;:::-;38162:25;;38222:1;38219;38215:9;38244:30;38262:11;38244:30;:::i;:::-;38233:41;;38423:1;38414:7;38410:15;38407:1;38404:22;38384:1;38377:9;38357:83;38334:139;;38453:18;;:::i;:::-;38334:139;38118:362;38070:410;;;;:::o;38486:171::-;38525:3;38548:24;38566:5;38548:24;:::i;:::-;38539:33;;38594:4;38587:5;38584:15;38581:41;;38602:18;;:::i;:::-;38581:41;38649:1;38642:5;38638:13;38631:20;;38486:171;;;:::o;38663:182::-;38803:34;38799:1;38791:6;38787:14;38780:58;38663:182;:::o;38851:366::-;38993:3;39014:67;39078:2;39073:3;39014:67;:::i;:::-;39007:74;;39090:93;39179:3;39090:93;:::i;:::-;39208:2;39203:3;39199:12;39192:19;;38851:366;;;:::o;39223:419::-;39389:4;39427:2;39416:9;39412:18;39404:26;;39476:9;39470:4;39466:20;39462:1;39451:9;39447:17;39440:47;39504:131;39630:4;39504:131;:::i;:::-;39496:139;;39223:419;;;:::o;39648:179::-;39788:31;39784:1;39776:6;39772:14;39765:55;39648:179;:::o;39833:366::-;39975:3;39996:67;40060:2;40055:3;39996:67;:::i;:::-;39989:74;;40072:93;40161:3;40072:93;:::i;:::-;40190:2;40185:3;40181:12;40174:19;;39833:366;;;:::o;40205:419::-;40371:4;40409:2;40398:9;40394:18;40386:26;;40458:9;40452:4;40448:20;40444:1;40433:9;40429:17;40422:47;40486:131;40612:4;40486:131;:::i;:::-;40478:139;;40205:419;;;:::o
Swarm Source
ipfs://c9c2465dd0e8beef5704dfc8345652dca62a80cadb7a52c557a5034ed2e2746d
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.