Overview
APE Balance
APE Value
$4.39 (@ $0.73/APE)More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 906 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Evolve | 10296743 | 3 days ago | IN | 2 APE | 0.00312778 | ||||
Evolve | 9990727 | 7 days ago | IN | 2 APE | 0.00300576 | ||||
Evolve | 9887333 | 8 days ago | IN | 2 APE | 0.00300576 | ||||
Release All | 9723970 | 10 days ago | IN | 0 APE | 0.00265341 | ||||
Evolve | 9722019 | 10 days ago | IN | 2 APE | 0.00300576 | ||||
Evolve | 9715674 | 10 days ago | IN | 2 APE | 0.00312778 | ||||
Evolve | 9715274 | 10 days ago | IN | 2 APE | 0.00312778 | ||||
Evolve | 9713205 | 10 days ago | IN | 2 APE | 0.00312778 | ||||
Evolve | 9709407 | 10 days ago | IN | 2 APE | 0.00312781 | ||||
Evolve | 9709204 | 10 days ago | IN | 2 APE | 0.00312778 | ||||
Evolve | 9709123 | 10 days ago | IN | 2 APE | 0.00300576 | ||||
Evolve | 9709111 | 10 days ago | IN | 2 APE | 0.00312778 | ||||
Evolve | 9708794 | 10 days ago | IN | 2 APE | 0.00300579 | ||||
Evolve | 9708018 | 10 days ago | IN | 2 APE | 0.00300576 | ||||
Evolve | 9705312 | 10 days ago | IN | 2 APE | 0.00300576 | ||||
Evolve | 9704232 | 10 days ago | IN | 2 APE | 0.00312778 | ||||
Evolve | 9698535 | 10 days ago | IN | 2 APE | 0.00312778 | ||||
Evolve | 9695917 | 10 days ago | IN | 2 APE | 0.00312781 | ||||
Evolve | 9695896 | 10 days ago | IN | 2 APE | 0.00312781 | ||||
Evolve | 9692648 | 10 days ago | IN | 2 APE | 0.00300576 | ||||
Evolve | 9691286 | 10 days ago | IN | 2 APE | 0.00312778 | ||||
Evolve | 9691016 | 10 days ago | IN | 2 APE | 0.00312781 | ||||
Evolve | 9686745 | 10 days ago | IN | 2 APE | 0.00300576 | ||||
Evolve | 9685563 | 10 days ago | IN | 2 APE | 0.00312781 | ||||
Evolve | 9685546 | 10 days ago | IN | 2 APE | 0.00312781 |
Latest 18 internal transactions
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
9723970 | 10 days ago | 352.8 APE | ||||
9723970 | 10 days ago | 75.6 APE | ||||
9723970 | 10 days ago | 75.6 APE | ||||
9655576 | 11 days ago | 634.2 APE | ||||
9655576 | 11 days ago | 135.9 APE | ||||
9655576 | 11 days ago | 135.9 APE | ||||
9580086 | 13 days ago | 1,150.8 APE | ||||
9580086 | 13 days ago | 246.6 APE | ||||
9580086 | 13 days ago | 246.6 APE | ||||
9506316 | 14 days ago | 548.8 APE | ||||
9506316 | 14 days ago | 117.6 APE | ||||
9506316 | 14 days ago | 117.6 APE | ||||
9007550 | 23 days ago | 1,407 APE | ||||
9007550 | 23 days ago | 301.5 APE | ||||
9007550 | 23 days ago | 301.5 APE | ||||
8641283 | 31 days ago | 5,801.6 APE | ||||
8641283 | 31 days ago | 1,243.2 APE | ||||
8641283 | 31 days ago | 1,243.2 APE |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
BadoogiesEvolve
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at apescan.io on 2025-01-21 */ // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * 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. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) 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 FailedInnerCall(); } } } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } } // File: @openzeppelin/contracts/finance/PaymentSplitter.sol // OpenZeppelin Contracts (last updated v4.8.0) (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. The distribution of shares is set at the * time of contract deployment and can't be updated thereafter. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(IERC20 => uint256) private _erc20TotalReleased; mapping(IERC20 => mapping(address => uint256)) private _erc20Released; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(IERC20 token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(IERC20 token, address account) public view returns (uint256) { return _erc20Released[token][account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Getter for the amount of payee's releasable Ether. */ function releasable(address account) public view returns (uint256) { uint256 totalReceived = address(this).balance + totalReleased(); return _pendingPayment(account, totalReceived, released(account)); } /** * @dev Getter for the amount of payee's releasable `token` tokens. `token` should be the address of an * IERC20 contract. */ function releasable(IERC20 token, address account) public view returns (uint256) { uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); return _pendingPayment(account, totalReceived, released(token, account)); } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 payment = releasable(account); require(payment != 0, "PaymentSplitter: account is not due payment"); // _totalReleased is the sum of all values in _released. // If "_totalReleased += payment" does not overflow, then "_released[account] += payment" cannot overflow. _totalReleased += payment; unchecked { _released[account] += payment; } Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, address account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 payment = releasable(token, account); require(payment != 0, "PaymentSplitter: account is not due payment"); // _erc20TotalReleased[token] is the sum of all values in _erc20Released[token]. // If "_erc20TotalReleased[token] += payment" does not overflow, then "_erc20Released[token][account] += payment" // cannot overflow. _erc20TotalReleased[token] += payment; unchecked { _erc20Released[token][account] += payment; } SafeERC20.safeTransfer(token, account, payment); emit ERC20PaymentReleased(token, account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } } // File: contracts/BadoogiesEvolve.sol pragma solidity ^0.8.23; // Minimal interface to call balanceOf() and burn() on your Boxes contract interface IBoujeeBoxes { function balanceOf(address account, uint256 id) external view returns (uint256); function burn(address account, uint256 tokenId, uint256 amount) external; } contract BadoogiesEvolve is Ownable, ReentrancyGuard, PaymentSplitter { /// @notice Price to evolve a single Oogie uint256 public evolutionPrice = 28 ether; /// @notice Deadline timestamp. Evolve is only possible if block.timestamp < endDate. uint256 public endDate = 1737579600; /// @notice ERC1155 (Boxes) contract address address public boxesAddress = 0xB523BF1E06a92a935358753a9309955e7b74FD66; /// @notice Struct to track each evolution event struct Evolution { address evolver; // wallet address uint256 boxType; // which box type was burned (1,2,3,4) uint256 oogieId; // which Oogie was evolved (1..3333) } /// @notice An array storing each evolution event Evolution[] public evolutions; /// @notice Number of payees for PaymentSplitter uint256 private teamLength; /** * @notice Constructor * @param _initialOwner The owner of the contract. * @param _payees The array of payee addresses. * @param _shares The array of share allocations corresponding to each payee. */ constructor( address _initialOwner, address[] memory _payees, uint256[] memory _shares ) Ownable(_initialOwner) PaymentSplitter(_payees, _shares) { teamLength = _payees.length; } // ------------------------------------------------------------------------ // Owner functions // ------------------------------------------------------------------------ /** * @notice Allows the owner to set or update the evolution price. */ function setEvolutionPrice(uint256 _evolutionPrice) external onlyOwner { evolutionPrice = _evolutionPrice; } /** * @notice Allows the owner to set or update the end date (UNIX timestamp). * Only allows evolutions strictly before this timestamp. */ function setEndDate(uint256 _endDate) external onlyOwner { endDate = _endDate; } /** * @notice Sets the address of the BoujeeBoxes contract. */ function setBoxesAddress(address _boxesAddress) external onlyOwner { boxesAddress = _boxesAddress; } /** * @notice Distributes accumulated Ether to all payees in one go. */ function releaseAll() external onlyOwner { for (uint256 i = 0; i < teamLength; i++) { release(payable(payee(i))); } } // ------------------------------------------------------------------------ // Public evolve logic // ------------------------------------------------------------------------ /** * @notice Evolve by burning a single box of a given `boxType`, paying `evolutionPrice`, * and logging the chosen `oogieId`. * * @param boxType The type of box to burn (1,2,3,4). * @param oogieId The Oogie ID (1..3333) for which this evolution applies. */ function evolve(uint256 boxType, uint256 oogieId) external payable nonReentrant { // Check time-based sale window require(block.timestamp < endDate, "Evolve is not active at this time"); // Check payment in ETH require(msg.value == evolutionPrice, "Incorrect evolution amount"); // Check user owns at least 1 box of that type require(IBoujeeBoxes(boxesAddress).balanceOf(msg.sender, boxType) > 0, "You do not own the specified box type"); // Burn exactly 1 box of that type from user IBoujeeBoxes(boxesAddress).burn(msg.sender, boxType, 1); // Record the evolution event evolutions.push(Evolution({ evolver: msg.sender, boxType: boxType, oogieId: oogieId })); } // ------------------------------------------------------------------------ // View functions // ------------------------------------------------------------------------ /** * @notice Returns the total number of evolve events recorded. */ function getEvolutionsCount() external view returns (uint256) { return evolutions.length; } /** * @notice Returns the evolution details at a given index in the evolutions array. */ function getEvolution(uint256 index) external view returns ( address evolver, uint256 boxType, uint256 oogieId ) { require(index < evolutions.length, "Index out of range"); Evolution memory evo = evolutions[index]; return (evo.evolver, evo.boxType, evo.oogieId); } /** * @notice Returns all evolution entries. * Caution: This can be very gas-heavy if the array grows large. */ function getAllEvolutions() external view returns (Evolution[] memory) { return evolutions; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_initialOwner","type":"address"},{"internalType":"address[]","name":"_payees","type":"address[]"},{"internalType":"uint256[]","name":"_shares","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"inputs":[],"name":"boxesAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"evolutionPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"evolutions","outputs":[{"internalType":"address","name":"evolver","type":"address"},{"internalType":"uint256","name":"boxType","type":"uint256"},{"internalType":"uint256","name":"oogieId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"boxType","type":"uint256"},{"internalType":"uint256","name":"oogieId","type":"uint256"}],"name":"evolve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getAllEvolutions","outputs":[{"components":[{"internalType":"address","name":"evolver","type":"address"},{"internalType":"uint256","name":"boxType","type":"uint256"},{"internalType":"uint256","name":"oogieId","type":"uint256"}],"internalType":"struct BadoogiesEvolve.Evolution[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getEvolution","outputs":[{"internalType":"address","name":"evolver","type":"address"},{"internalType":"uint256","name":"boxType","type":"uint256"},{"internalType":"uint256","name":"oogieId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEvolutionsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_boxesAddress","type":"address"}],"name":"setBoxesAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_endDate","type":"uint256"}],"name":"setEndDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_evolutionPrice","type":"uint256"}],"name":"setEvolutionPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405268018493fba64ef000006009556367915c50600a5573b523bf1e06a92a935358753a9309955e7b74fd66600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015610078575f80fd5b50604051612f9a380380612f9a833981810160405281019061009a91906107ab565b8181845f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361010d575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101049190610842565b60405180910390fd5b61011c8161021a60201b60201c565b50600180819055508051825114610168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015f906108db565b60405180910390fd5b5f8251116101ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101a290610943565b60405180910390fd5b5f5b8251811015610207576101fa8382815181106101cc576101cb610961565b5b60200260200101518383815181106101e7576101e6610961565b5b60200260200101516102db60201b60201c565b80806001019150506101ad565b5050508151600d81905550505050610ba8565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610349576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610340906109fe565b60405180910390fd5b5f811161038b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038290610a66565b60405180910390fd5b5f60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541461040a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040190610af4565b60405180910390fd5b600682908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550806002546104ba9190610b3f565b6002819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac82826040516104f1929190610b81565b60405180910390a15050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6105378261050e565b9050919050565b6105478161052d565b8114610551575f80fd5b50565b5f815190506105628161053e565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6105b28261056c565b810181811067ffffffffffffffff821117156105d1576105d061057c565b5b80604052505050565b5f6105e36104fd565b90506105ef82826105a9565b919050565b5f67ffffffffffffffff82111561060e5761060d61057c565b5b602082029050602081019050919050565b5f80fd5b5f610635610630846105f4565b6105da565b905080838252602082019050602084028301858111156106585761065761061f565b5b835b81811015610681578061066d8882610554565b84526020840193505060208101905061065a565b5050509392505050565b5f82601f83011261069f5761069e610568565b5b81516106af848260208601610623565b91505092915050565b5f67ffffffffffffffff8211156106d2576106d161057c565b5b602082029050602081019050919050565b5f819050919050565b6106f5816106e3565b81146106ff575f80fd5b50565b5f81519050610710816106ec565b92915050565b5f610728610723846106b8565b6105da565b9050808382526020820190506020840283018581111561074b5761074a61061f565b5b835b8181101561077457806107608882610702565b84526020840193505060208101905061074d565b5050509392505050565b5f82601f83011261079257610791610568565b5b81516107a2848260208601610716565b91505092915050565b5f805f606084860312156107c2576107c1610506565b5b5f6107cf86828701610554565b935050602084015167ffffffffffffffff8111156107f0576107ef61050a565b5b6107fc8682870161068b565b925050604084015167ffffffffffffffff81111561081d5761081c61050a565b5b6108298682870161077e565b9150509250925092565b61083c8161052d565b82525050565b5f6020820190506108555f830184610833565b92915050565b5f82825260208201905092915050565b7f5061796d656e7453706c69747465723a2070617965657320616e6420736861725f8201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b5f6108c560328361085b565b91506108d08261086b565b604082019050919050565b5f6020820190508181035f8301526108f2816108b9565b9050919050565b7f5061796d656e7453706c69747465723a206e6f207061796565730000000000005f82015250565b5f61092d601a8361085b565b9150610938826108f9565b602082019050919050565b5f6020820190508181035f83015261095a81610921565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f5061796d656e7453706c69747465723a206163636f756e7420697320746865205f8201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b5f6109e8602c8361085b565b91506109f38261098e565b604082019050919050565b5f6020820190508181035f830152610a15816109dc565b9050919050565b7f5061796d656e7453706c69747465723a207368617265732061726520300000005f82015250565b5f610a50601d8361085b565b9150610a5b82610a1c565b602082019050919050565b5f6020820190508181035f830152610a7d81610a44565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420616c72656164795f8201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b5f610ade602b8361085b565b9150610ae982610a84565b604082019050919050565b5f6020820190508181035f830152610b0b81610ad2565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610b49826106e3565b9150610b54836106e3565b9250828201905080821115610b6c57610b6b610b12565b5b92915050565b610b7b816106e3565b82525050565b5f604082019050610b945f830185610833565b610ba16020830184610b72565b9392505050565b6123e580610bb55f395ff3fe608060405260043610610184575f3560e01c80638b380663116100d0578063c24a0f8b11610089578063d11a461f11610063578063d11a461f146105ab578063d79779b2146105e9578063e33b7de314610625578063f2fde38b1461064f576101cb565b8063c24a0f8b14610509578063c45ac05014610533578063ce7c2ac21461056f576101cb565b80638b380663146103d75780638b83209b146104015780638da5cb5b1461043d5780639852595c14610467578063a2b05c7c146104a3578063a3f8eace146104cd576101cb565b8063406072a91161013d57806350ccda0c1161011757806350ccda0c146103655780635be7fde81461038157806364de99a414610397578063715018a6146103c1576101cb565b8063406072a9146102d7578063479cdf641461031357806348b750441461033d576101cb565b806319165587146101cf578063316d86a4146101f757806333f41b901461021f5780633784f0001461025d5780633a98ef39146102855780633bcf1e37146102af576101cb565b366101cb577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706101b2610677565b346040516101c19291906118f9565b60405180910390a1005b5f80fd5b3480156101da575f80fd5b506101f560048036038101906101f0919061195f565b61067e565b005b348015610202575f80fd5b5061021d600480360381019061021891906119b4565b6107f4565b005b34801561022a575f80fd5b50610245600480360381019061024091906119b4565b610806565b604051610254939291906119df565b60405180910390f35b348015610268575f80fd5b50610283600480360381019061027e91906119b4565b610902565b005b348015610290575f80fd5b50610299610914565b6040516102a69190611a14565b60405180910390f35b3480156102ba575f80fd5b506102d560048036038101906102d09190611a57565b61091d565b005b3480156102e2575f80fd5b506102fd60048036038101906102f89190611abd565b610968565b60405161030a9190611a14565b60405180910390f35b34801561031e575f80fd5b506103276109ea565b6040516103349190611afb565b60405180910390f35b348015610348575f80fd5b50610363600480360381019061035e9190611abd565b610a0f565b005b61037f600480360381019061037a9190611b14565b610c15565b005b34801561038c575f80fd5b50610395610ecb565b005b3480156103a2575f80fd5b506103ab610f00565b6040516103b89190611a14565b60405180910390f35b3480156103cc575f80fd5b506103d5610f0c565b005b3480156103e2575f80fd5b506103eb610f1f565b6040516103f89190611a14565b60405180910390f35b34801561040c575f80fd5b50610427600480360381019061042291906119b4565b610f25565b6040516104349190611afb565b60405180910390f35b348015610448575f80fd5b50610451610f69565b60405161045e9190611afb565b60405180910390f35b348015610472575f80fd5b5061048d60048036038101906104889190611a57565b610f90565b60405161049a9190611a14565b60405180910390f35b3480156104ae575f80fd5b506104b7610fd6565b6040516104c49190611c58565b60405180910390f35b3480156104d8575f80fd5b506104f360048036038101906104ee9190611a57565b61109a565b6040516105009190611a14565b60405180910390f35b348015610514575f80fd5b5061051d6110cc565b60405161052a9190611a14565b60405180910390f35b34801561053e575f80fd5b5061055960048036038101906105549190611abd565b6110d2565b6040516105669190611a14565b60405180910390f35b34801561057a575f80fd5b5061059560048036038101906105909190611a57565b61117e565b6040516105a29190611a14565b60405180910390f35b3480156105b6575f80fd5b506105d160048036038101906105cc91906119b4565b6111c4565b6040516105e0939291906119df565b60405180910390f35b3480156105f4575f80fd5b5061060f600480360381019061060a9190611c78565b611218565b60405161061c9190611a14565b60405180910390f35b348015610630575f80fd5b5061063961125e565b6040516106469190611a14565b60405180910390f35b34801561065a575f80fd5b5061067560048036038101906106709190611a57565b611267565b005b5f33905090565b5f60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054116106fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f490611d23565b60405180910390fd5b5f6107078261109a565b90505f810361074b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074290611db1565b60405180910390fd5b8060035f82825461075c9190611dfc565b925050819055508060055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055506107b782826112eb565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05682826040516107e8929190611e8a565b60405180910390a15050565b6107fc6113d4565b8060098190555050565b5f805f600c805490508410610850576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084790611efb565b60405180910390fd5b5f600c858154811061086557610864611f19565b5b905f5260205f2090600302016040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815250509050805f015181602001518260400151935093509350509193909250565b61090a6113d4565b80600a8190555050565b5f600254905090565b6109256113d4565b80600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205411610a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8590611d23565b60405180910390fd5b5f610a9983836110d2565b90505f8103610add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad490611db1565b60405180910390fd5b8060075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610b299190611dfc565b925050819055508060085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550610bc083838361145b565b8273ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8383604051610c089291906118f9565b60405180910390a2505050565b610c1d6114da565b600a544210610c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5890611fb6565b60405180910390fd5b6009543414610ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9c9061201e565b60405180910390fd5b5f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e33856040518363ffffffff1660e01b8152600401610d019291906118f9565b602060405180830381865afa158015610d1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d409190612050565b11610d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d77906120eb565b60405180910390fd5b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f5298aca338460016040518463ffffffff1660e01b8152600401610ddf93929190612142565b5f604051808303815f87803b158015610df6575f80fd5b505af1158015610e08573d5f803e3d5ffd5b50505050600c60405180606001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815250908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201555050610ec7611529565b5050565b610ed36113d4565b5f5b600d54811015610efd57610ef0610eeb82610f25565b61067e565b8080600101915050610ed5565b50565b5f600c80549050905090565b610f146113d4565b610f1d5f611532565b565b60095481565b5f60068281548110610f3a57610f39611f19565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6060600c805480602002602001604051908101604052809291908181526020015f905b82821015611091578382905f5260205f2090600302016040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152505081526020019060010190610ff9565b50505050905090565b5f806110a461125e565b476110af9190611dfc565b90506110c483826110bf86610f90565b6115f3565b915050919050565b600a5481565b5f806110dd84611218565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111169190611afb565b602060405180830381865afa158015611131573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111559190612050565b61115f9190611dfc565b905061117583826111708787610968565b6115f3565b91505092915050565b5f60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b600c81815481106111d3575f80fd5b905f5260205f2090600302015f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905083565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f600354905090565b61126f6113d4565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112df575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016112d69190611afb565b60405180910390fd5b6112e881611532565b50565b8047101561133057306040517fcd7860590000000000000000000000000000000000000000000000000000000081526004016113279190611afb565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff1682604051611355906121a4565b5f6040518083038185875af1925050503d805f811461138f576040519150601f19603f3d011682016040523d82523d5f602084013e611394565b606091505b50509050806113cf576040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b6113dc610677565b73ffffffffffffffffffffffffffffffffffffffff166113fa610f69565b73ffffffffffffffffffffffffffffffffffffffff16146114595761141d610677565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016114509190611afb565b60405180910390fd5b565b6114d5838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb858560405160240161148e9291906118f9565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061165e565b505050565b60026001540361151f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151690612202565b60405180910390fd5b6002600181905550565b60018081905550565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f8160025460045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054856116419190612220565b61164b919061228e565b61165591906122be565b90509392505050565b5f611688828473ffffffffffffffffffffffffffffffffffffffff166116f390919063ffffffff16565b90505f8151141580156116ac5750808060200190518101906116aa9190612326565b155b156116ee57826040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016116e59190611afb565b60405180910390fd5b505050565b606061170083835f611708565b905092915050565b60608147101561174f57306040517fcd7860590000000000000000000000000000000000000000000000000000000081526004016117469190611afb565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff1684866040516117779190612399565b5f6040518083038185875af1925050503d805f81146117b1576040519150601f19603f3d011682016040523d82523d5f602084013e6117b6565b606091505b50915091506117c68683836117d1565b925050509392505050565b6060826117e6576117e18261185e565b611856565b5f825114801561180c57505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561184e57836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016118459190611afb565b60405180910390fd5b819050611857565b5b9392505050565b5f815111156118705780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6118cb826118a2565b9050919050565b6118db816118c1565b82525050565b5f819050919050565b6118f3816118e1565b82525050565b5f60408201905061190c5f8301856118d2565b61191960208301846118ea565b9392505050565b5f80fd5b5f61192e826118a2565b9050919050565b61193e81611924565b8114611948575f80fd5b50565b5f8135905061195981611935565b92915050565b5f6020828403121561197457611973611920565b5b5f6119818482850161194b565b91505092915050565b611993816118e1565b811461199d575f80fd5b50565b5f813590506119ae8161198a565b92915050565b5f602082840312156119c9576119c8611920565b5b5f6119d6848285016119a0565b91505092915050565b5f6060820190506119f25f8301866118d2565b6119ff60208301856118ea565b611a0c60408301846118ea565b949350505050565b5f602082019050611a275f8301846118ea565b92915050565b611a36816118c1565b8114611a40575f80fd5b50565b5f81359050611a5181611a2d565b92915050565b5f60208284031215611a6c57611a6b611920565b5b5f611a7984828501611a43565b91505092915050565b5f611a8c826118c1565b9050919050565b611a9c81611a82565b8114611aa6575f80fd5b50565b5f81359050611ab781611a93565b92915050565b5f8060408385031215611ad357611ad2611920565b5b5f611ae085828601611aa9565b9250506020611af185828601611a43565b9150509250929050565b5f602082019050611b0e5f8301846118d2565b92915050565b5f8060408385031215611b2a57611b29611920565b5b5f611b37858286016119a0565b9250506020611b48858286016119a0565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611b84816118c1565b82525050565b611b93816118e1565b82525050565b606082015f820151611bad5f850182611b7b565b506020820151611bc06020850182611b8a565b506040820151611bd36040850182611b8a565b50505050565b5f611be48383611b99565b60608301905092915050565b5f602082019050919050565b5f611c0682611b52565b611c108185611b5c565b9350611c1b83611b6c565b805f5b83811015611c4b578151611c328882611bd9565b9750611c3d83611bf0565b925050600181019050611c1e565b5085935050505092915050565b5f6020820190508181035f830152611c708184611bfc565b905092915050565b5f60208284031215611c8d57611c8c611920565b5b5f611c9a84828501611aa9565b91505092915050565b5f82825260208201905092915050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f205f8201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b5f611d0d602683611ca3565b9150611d1882611cb3565b604082019050919050565b5f6020820190508181035f830152611d3a81611d01565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f74205f8201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b5f611d9b602b83611ca3565b9150611da682611d41565b604082019050919050565b5f6020820190508181035f830152611dc881611d8f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611e06826118e1565b9150611e11836118e1565b9250828201905080821115611e2957611e28611dcf565b5b92915050565b5f819050919050565b5f611e52611e4d611e48846118a2565b611e2f565b6118a2565b9050919050565b5f611e6382611e38565b9050919050565b5f611e7482611e59565b9050919050565b611e8481611e6a565b82525050565b5f604082019050611e9d5f830185611e7b565b611eaa60208301846118ea565b9392505050565b7f496e646578206f7574206f662072616e676500000000000000000000000000005f82015250565b5f611ee5601283611ca3565b9150611ef082611eb1565b602082019050919050565b5f6020820190508181035f830152611f1281611ed9565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f45766f6c7665206973206e6f742061637469766520617420746869732074696d5f8201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b5f611fa0602183611ca3565b9150611fab82611f46565b604082019050919050565b5f6020820190508181035f830152611fcd81611f94565b9050919050565b7f496e636f72726563742065766f6c7574696f6e20616d6f756e740000000000005f82015250565b5f612008601a83611ca3565b915061201382611fd4565b602082019050919050565b5f6020820190508181035f83015261203581611ffc565b9050919050565b5f8151905061204a8161198a565b92915050565b5f6020828403121561206557612064611920565b5b5f6120728482850161203c565b91505092915050565b7f596f7520646f206e6f74206f776e207468652073706563696669656420626f785f8201527f2074797065000000000000000000000000000000000000000000000000000000602082015250565b5f6120d5602583611ca3565b91506120e08261207b565b604082019050919050565b5f6020820190508181035f830152612102816120c9565b9050919050565b5f819050919050565b5f61212c61212761212284612109565b611e2f565b6118e1565b9050919050565b61213c81612112565b82525050565b5f6060820190506121555f8301866118d2565b61216260208301856118ea565b61216f6040830184612133565b949350505050565b5f81905092915050565b50565b5f61218f5f83612177565b915061219a82612181565b5f82019050919050565b5f6121ae82612184565b9150819050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6121ec601f83611ca3565b91506121f7826121b8565b602082019050919050565b5f6020820190508181035f830152612219816121e0565b9050919050565b5f61222a826118e1565b9150612235836118e1565b9250828202612243816118e1565b9150828204841483151761225a57612259611dcf565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612298826118e1565b91506122a3836118e1565b9250826122b3576122b2612261565b5b828204905092915050565b5f6122c8826118e1565b91506122d3836118e1565b92508282039050818111156122eb576122ea611dcf565b5b92915050565b5f8115159050919050565b612305816122f1565b811461230f575f80fd5b50565b5f81519050612320816122fc565b92915050565b5f6020828403121561233b5761233a611920565b5b5f61234884828501612312565b91505092915050565b5f81519050919050565b8281835e5f83830152505050565b5f61237382612351565b61237d8185612177565b935061238d81856020860161235b565b80840191505092915050565b5f6123a48284612369565b91508190509291505056fea2646970667358221220e5b247233b50781c7c6251f4a615f80600aeb6393283a0cdd83b5ffe7ac8854b64736f6c634300081a00330000000000000000000000003303c4350259c2b8f3c560b2ec70ad3ed87a5e72000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000599afdfa9e2e663bde649da2b1922a282f18f6200000000000000000000000007b26cf06d223640c1fe05e8c8057fe96c0a1737b000000000000000000000000dbced55ef6c66192aa078587f70a6b2379e6fccc0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000046
Deployed Bytecode
0x608060405260043610610184575f3560e01c80638b380663116100d0578063c24a0f8b11610089578063d11a461f11610063578063d11a461f146105ab578063d79779b2146105e9578063e33b7de314610625578063f2fde38b1461064f576101cb565b8063c24a0f8b14610509578063c45ac05014610533578063ce7c2ac21461056f576101cb565b80638b380663146103d75780638b83209b146104015780638da5cb5b1461043d5780639852595c14610467578063a2b05c7c146104a3578063a3f8eace146104cd576101cb565b8063406072a91161013d57806350ccda0c1161011757806350ccda0c146103655780635be7fde81461038157806364de99a414610397578063715018a6146103c1576101cb565b8063406072a9146102d7578063479cdf641461031357806348b750441461033d576101cb565b806319165587146101cf578063316d86a4146101f757806333f41b901461021f5780633784f0001461025d5780633a98ef39146102855780633bcf1e37146102af576101cb565b366101cb577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706101b2610677565b346040516101c19291906118f9565b60405180910390a1005b5f80fd5b3480156101da575f80fd5b506101f560048036038101906101f0919061195f565b61067e565b005b348015610202575f80fd5b5061021d600480360381019061021891906119b4565b6107f4565b005b34801561022a575f80fd5b50610245600480360381019061024091906119b4565b610806565b604051610254939291906119df565b60405180910390f35b348015610268575f80fd5b50610283600480360381019061027e91906119b4565b610902565b005b348015610290575f80fd5b50610299610914565b6040516102a69190611a14565b60405180910390f35b3480156102ba575f80fd5b506102d560048036038101906102d09190611a57565b61091d565b005b3480156102e2575f80fd5b506102fd60048036038101906102f89190611abd565b610968565b60405161030a9190611a14565b60405180910390f35b34801561031e575f80fd5b506103276109ea565b6040516103349190611afb565b60405180910390f35b348015610348575f80fd5b50610363600480360381019061035e9190611abd565b610a0f565b005b61037f600480360381019061037a9190611b14565b610c15565b005b34801561038c575f80fd5b50610395610ecb565b005b3480156103a2575f80fd5b506103ab610f00565b6040516103b89190611a14565b60405180910390f35b3480156103cc575f80fd5b506103d5610f0c565b005b3480156103e2575f80fd5b506103eb610f1f565b6040516103f89190611a14565b60405180910390f35b34801561040c575f80fd5b50610427600480360381019061042291906119b4565b610f25565b6040516104349190611afb565b60405180910390f35b348015610448575f80fd5b50610451610f69565b60405161045e9190611afb565b60405180910390f35b348015610472575f80fd5b5061048d60048036038101906104889190611a57565b610f90565b60405161049a9190611a14565b60405180910390f35b3480156104ae575f80fd5b506104b7610fd6565b6040516104c49190611c58565b60405180910390f35b3480156104d8575f80fd5b506104f360048036038101906104ee9190611a57565b61109a565b6040516105009190611a14565b60405180910390f35b348015610514575f80fd5b5061051d6110cc565b60405161052a9190611a14565b60405180910390f35b34801561053e575f80fd5b5061055960048036038101906105549190611abd565b6110d2565b6040516105669190611a14565b60405180910390f35b34801561057a575f80fd5b5061059560048036038101906105909190611a57565b61117e565b6040516105a29190611a14565b60405180910390f35b3480156105b6575f80fd5b506105d160048036038101906105cc91906119b4565b6111c4565b6040516105e0939291906119df565b60405180910390f35b3480156105f4575f80fd5b5061060f600480360381019061060a9190611c78565b611218565b60405161061c9190611a14565b60405180910390f35b348015610630575f80fd5b5061063961125e565b6040516106469190611a14565b60405180910390f35b34801561065a575f80fd5b5061067560048036038101906106709190611a57565b611267565b005b5f33905090565b5f60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054116106fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f490611d23565b60405180910390fd5b5f6107078261109a565b90505f810361074b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074290611db1565b60405180910390fd5b8060035f82825461075c9190611dfc565b925050819055508060055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055506107b782826112eb565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05682826040516107e8929190611e8a565b60405180910390a15050565b6107fc6113d4565b8060098190555050565b5f805f600c805490508410610850576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084790611efb565b60405180910390fd5b5f600c858154811061086557610864611f19565b5b905f5260205f2090600302016040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815250509050805f015181602001518260400151935093509350509193909250565b61090a6113d4565b80600a8190555050565b5f600254905090565b6109256113d4565b80600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205411610a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8590611d23565b60405180910390fd5b5f610a9983836110d2565b90505f8103610add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad490611db1565b60405180910390fd5b8060075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610b299190611dfc565b925050819055508060085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550610bc083838361145b565b8273ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8383604051610c089291906118f9565b60405180910390a2505050565b610c1d6114da565b600a544210610c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5890611fb6565b60405180910390fd5b6009543414610ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9c9061201e565b60405180910390fd5b5f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e33856040518363ffffffff1660e01b8152600401610d019291906118f9565b602060405180830381865afa158015610d1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d409190612050565b11610d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d77906120eb565b60405180910390fd5b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f5298aca338460016040518463ffffffff1660e01b8152600401610ddf93929190612142565b5f604051808303815f87803b158015610df6575f80fd5b505af1158015610e08573d5f803e3d5ffd5b50505050600c60405180606001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815250908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201555050610ec7611529565b5050565b610ed36113d4565b5f5b600d54811015610efd57610ef0610eeb82610f25565b61067e565b8080600101915050610ed5565b50565b5f600c80549050905090565b610f146113d4565b610f1d5f611532565b565b60095481565b5f60068281548110610f3a57610f39611f19565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6060600c805480602002602001604051908101604052809291908181526020015f905b82821015611091578382905f5260205f2090600302016040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152505081526020019060010190610ff9565b50505050905090565b5f806110a461125e565b476110af9190611dfc565b90506110c483826110bf86610f90565b6115f3565b915050919050565b600a5481565b5f806110dd84611218565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111169190611afb565b602060405180830381865afa158015611131573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111559190612050565b61115f9190611dfc565b905061117583826111708787610968565b6115f3565b91505092915050565b5f60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b600c81815481106111d3575f80fd5b905f5260205f2090600302015f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905083565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f600354905090565b61126f6113d4565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112df575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016112d69190611afb565b60405180910390fd5b6112e881611532565b50565b8047101561133057306040517fcd7860590000000000000000000000000000000000000000000000000000000081526004016113279190611afb565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff1682604051611355906121a4565b5f6040518083038185875af1925050503d805f811461138f576040519150601f19603f3d011682016040523d82523d5f602084013e611394565b606091505b50509050806113cf576040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b6113dc610677565b73ffffffffffffffffffffffffffffffffffffffff166113fa610f69565b73ffffffffffffffffffffffffffffffffffffffff16146114595761141d610677565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016114509190611afb565b60405180910390fd5b565b6114d5838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb858560405160240161148e9291906118f9565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061165e565b505050565b60026001540361151f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151690612202565b60405180910390fd5b6002600181905550565b60018081905550565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f8160025460045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054856116419190612220565b61164b919061228e565b61165591906122be565b90509392505050565b5f611688828473ffffffffffffffffffffffffffffffffffffffff166116f390919063ffffffff16565b90505f8151141580156116ac5750808060200190518101906116aa9190612326565b155b156116ee57826040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016116e59190611afb565b60405180910390fd5b505050565b606061170083835f611708565b905092915050565b60608147101561174f57306040517fcd7860590000000000000000000000000000000000000000000000000000000081526004016117469190611afb565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff1684866040516117779190612399565b5f6040518083038185875af1925050503d805f81146117b1576040519150601f19603f3d011682016040523d82523d5f602084013e6117b6565b606091505b50915091506117c68683836117d1565b925050509392505050565b6060826117e6576117e18261185e565b611856565b5f825114801561180c57505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561184e57836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016118459190611afb565b60405180910390fd5b819050611857565b5b9392505050565b5f815111156118705780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6118cb826118a2565b9050919050565b6118db816118c1565b82525050565b5f819050919050565b6118f3816118e1565b82525050565b5f60408201905061190c5f8301856118d2565b61191960208301846118ea565b9392505050565b5f80fd5b5f61192e826118a2565b9050919050565b61193e81611924565b8114611948575f80fd5b50565b5f8135905061195981611935565b92915050565b5f6020828403121561197457611973611920565b5b5f6119818482850161194b565b91505092915050565b611993816118e1565b811461199d575f80fd5b50565b5f813590506119ae8161198a565b92915050565b5f602082840312156119c9576119c8611920565b5b5f6119d6848285016119a0565b91505092915050565b5f6060820190506119f25f8301866118d2565b6119ff60208301856118ea565b611a0c60408301846118ea565b949350505050565b5f602082019050611a275f8301846118ea565b92915050565b611a36816118c1565b8114611a40575f80fd5b50565b5f81359050611a5181611a2d565b92915050565b5f60208284031215611a6c57611a6b611920565b5b5f611a7984828501611a43565b91505092915050565b5f611a8c826118c1565b9050919050565b611a9c81611a82565b8114611aa6575f80fd5b50565b5f81359050611ab781611a93565b92915050565b5f8060408385031215611ad357611ad2611920565b5b5f611ae085828601611aa9565b9250506020611af185828601611a43565b9150509250929050565b5f602082019050611b0e5f8301846118d2565b92915050565b5f8060408385031215611b2a57611b29611920565b5b5f611b37858286016119a0565b9250506020611b48858286016119a0565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611b84816118c1565b82525050565b611b93816118e1565b82525050565b606082015f820151611bad5f850182611b7b565b506020820151611bc06020850182611b8a565b506040820151611bd36040850182611b8a565b50505050565b5f611be48383611b99565b60608301905092915050565b5f602082019050919050565b5f611c0682611b52565b611c108185611b5c565b9350611c1b83611b6c565b805f5b83811015611c4b578151611c328882611bd9565b9750611c3d83611bf0565b925050600181019050611c1e565b5085935050505092915050565b5f6020820190508181035f830152611c708184611bfc565b905092915050565b5f60208284031215611c8d57611c8c611920565b5b5f611c9a84828501611aa9565b91505092915050565b5f82825260208201905092915050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f205f8201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b5f611d0d602683611ca3565b9150611d1882611cb3565b604082019050919050565b5f6020820190508181035f830152611d3a81611d01565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f74205f8201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b5f611d9b602b83611ca3565b9150611da682611d41565b604082019050919050565b5f6020820190508181035f830152611dc881611d8f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611e06826118e1565b9150611e11836118e1565b9250828201905080821115611e2957611e28611dcf565b5b92915050565b5f819050919050565b5f611e52611e4d611e48846118a2565b611e2f565b6118a2565b9050919050565b5f611e6382611e38565b9050919050565b5f611e7482611e59565b9050919050565b611e8481611e6a565b82525050565b5f604082019050611e9d5f830185611e7b565b611eaa60208301846118ea565b9392505050565b7f496e646578206f7574206f662072616e676500000000000000000000000000005f82015250565b5f611ee5601283611ca3565b9150611ef082611eb1565b602082019050919050565b5f6020820190508181035f830152611f1281611ed9565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f45766f6c7665206973206e6f742061637469766520617420746869732074696d5f8201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b5f611fa0602183611ca3565b9150611fab82611f46565b604082019050919050565b5f6020820190508181035f830152611fcd81611f94565b9050919050565b7f496e636f72726563742065766f6c7574696f6e20616d6f756e740000000000005f82015250565b5f612008601a83611ca3565b915061201382611fd4565b602082019050919050565b5f6020820190508181035f83015261203581611ffc565b9050919050565b5f8151905061204a8161198a565b92915050565b5f6020828403121561206557612064611920565b5b5f6120728482850161203c565b91505092915050565b7f596f7520646f206e6f74206f776e207468652073706563696669656420626f785f8201527f2074797065000000000000000000000000000000000000000000000000000000602082015250565b5f6120d5602583611ca3565b91506120e08261207b565b604082019050919050565b5f6020820190508181035f830152612102816120c9565b9050919050565b5f819050919050565b5f61212c61212761212284612109565b611e2f565b6118e1565b9050919050565b61213c81612112565b82525050565b5f6060820190506121555f8301866118d2565b61216260208301856118ea565b61216f6040830184612133565b949350505050565b5f81905092915050565b50565b5f61218f5f83612177565b915061219a82612181565b5f82019050919050565b5f6121ae82612184565b9150819050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6121ec601f83611ca3565b91506121f7826121b8565b602082019050919050565b5f6020820190508181035f830152612219816121e0565b9050919050565b5f61222a826118e1565b9150612235836118e1565b9250828202612243816118e1565b9150828204841483151761225a57612259611dcf565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612298826118e1565b91506122a3836118e1565b9250826122b3576122b2612261565b5b828204905092915050565b5f6122c8826118e1565b91506122d3836118e1565b92508282039050818111156122eb576122ea611dcf565b5b92915050565b5f8115159050919050565b612305816122f1565b811461230f575f80fd5b50565b5f81519050612320816122fc565b92915050565b5f6020828403121561233b5761233a611920565b5b5f61234884828501612312565b91505092915050565b5f81519050919050565b8281835e5f83830152505050565b5f61237382612351565b61237d8185612177565b935061238d81856020860161235b565b80840191505092915050565b5f6123a48284612369565b91508190509291505056fea2646970667358221220e5b247233b50781c7c6251f4a615f80600aeb6393283a0cdd83b5ffe7ac8854b64736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003303c4350259c2b8f3c560b2ec70ad3ed87a5e72000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000599afdfa9e2e663bde649da2b1922a282f18f6200000000000000000000000007b26cf06d223640c1fe05e8c8057fe96c0a1737b000000000000000000000000dbced55ef6c66192aa078587f70a6b2379e6fccc0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000046
-----Decoded View---------------
Arg [0] : _initialOwner (address): 0x3303C4350259C2B8F3C560B2ec70aD3ed87A5E72
Arg [1] : _payees (address[]): 0x599AfdfA9e2e663BdE649dA2B1922a282f18F620,0x7b26cF06d223640c1fE05e8c8057fe96c0A1737B,0xdBcED55eF6C66192Aa078587F70A6b2379e6fCCC
Arg [2] : _shares (uint256[]): 15,15,70
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000003303c4350259c2b8f3c560b2ec70ad3ed87a5e72
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [4] : 000000000000000000000000599afdfa9e2e663bde649da2b1922a282f18f620
Arg [5] : 0000000000000000000000007b26cf06d223640c1fe05e8c8057fe96c0a1737b
Arg [6] : 000000000000000000000000dbced55ef6c66192aa078587f70a6b2379e6fccc
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [9] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000046
Deployed Bytecode Sourcemap
35446:4912:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29746:40;29762:12;:10;:12::i;:::-;29776:9;29746:40;;;;;;;:::i;:::-;;;;;;;;35446:4912;;;;;32267:671;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37100:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39768:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;37400:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29877:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37582:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31006:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35805:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33206:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38456:812;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37793:153;;;;;;;;;;;;;:::i;:::-;;39549:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3254:103;;;;;;;;;;;;;:::i;:::-;;35571:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31232:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2579:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30728:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40248:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31422:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35711:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31807:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30524:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36203:29;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;30314:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30062:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3512:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;695:98;748:7;775:10;768:17;;695:98;:::o;32267:671::-;32362:1;32343:7;:16;32351:7;32343:16;;;;;;;;;;;;;;;;:20;32335:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;32419:15;32437:19;32448:7;32437:10;:19::i;:::-;32419:37;;32488:1;32477:7;:12;32469:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32750:7;32732:14;;:25;;;;;;;:::i;:::-;;;;;;;;32815:7;32793:9;:18;32803:7;32793:18;;;;;;;;;;;;;;;;:29;;;;;;;;;;;32846:35;32864:7;32873;32846:17;:35::i;:::-;32897:33;32913:7;32922;32897:33;;;;;;;:::i;:::-;;;;;;;;32324:614;32267:671;:::o;37100:122::-;2465:13;:11;:13::i;:::-;37199:15:::1;37182:14;:32;;;;37100:122:::0;:::o;39768:328::-;39838:15;39864;39890;39940:10;:17;;;;39932:5;:25;39924:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;39991:20;40014:10;40025:5;40014:17;;;;;;;;:::i;:::-;;;;;;;;;;;;39991:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40050:3;:11;;;40063:3;:11;;;40076:3;:11;;;40042:46;;;;;;;39768:328;;;;;:::o;37400:94::-;2465:13;:11;:13::i;:::-;37478:8:::1;37468:7;:18;;;;37400:94:::0;:::o;29877:91::-;29921:7;29948:12;;29941:19;;29877:91;:::o;37582:114::-;2465:13;:11;:13::i;:::-;37675::::1;37660:12;;:28;;;;;;;;;;;;;;;;;;37582:114:::0;:::o;31006:135::-;31076:7;31103:14;:21;31118:5;31103:21;;;;;;;;;;;;;;;:30;31125:7;31103:30;;;;;;;;;;;;;;;;31096:37;;31006:135;;;;:::o;35805:72::-;;;;;;;;;;;;;:::o;33206:792::-;33307:1;33288:7;:16;33296:7;33288:16;;;;;;;;;;;;;;;;:20;33280:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;33364:15;33382:26;33393:5;33400:7;33382:10;:26::i;:::-;33364:44;;33440:1;33429:7;:12;33421:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33774:7;33744:19;:26;33764:5;33744:26;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;33851:7;33817:14;:21;33832:5;33817:21;;;;;;;;;;;;;;;:30;33839:7;33817:30;;;;;;;;;;;;;;;;:41;;;;;;;;;;;33882:47;33905:5;33912:7;33921;33882:22;:47::i;:::-;33966:5;33945:45;;;33973:7;33982;33945:45;;;;;;;:::i;:::-;;;;;;;;33269:729;33206:792;;:::o;38456:812::-;6435:21;:19;:21::i;:::-;38614:7:::1;;38596:15;:25;38588:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;38726:14;;38713:9;:27;38705:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;38908:1;38861:12;;;;;;;;;;;38848:36;;;38885:10;38897:7;38848:57;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;38840:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;39031:12;;;;;;;;;;;39018:31;;;39050:10;39062:7;39071:1;39018:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39125:10;39141:118;;;;;;;;39175:10;39141:118;;;;;;39209:7;39141:118;;;;39240:7;39141:118;;::::0;39125:135:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6479:20:::0;:18;:20::i;:::-;38456:812;;:::o;37793:153::-;2465:13;:11;:13::i;:::-;37850:9:::1;37845:94;37869:10;;37865:1;:14;37845:94;;;37901:26;37917:8;37923:1;37917:5;:8::i;:::-;37901:7;:26::i;:::-;37881:3;;;;;;;37845:94;;;;37793:153::o:0;39549:105::-;39602:7;39629:10;:17;;;;39622:24;;39549:105;:::o;3254:103::-;2465:13;:11;:13::i;:::-;3319:30:::1;3346:1;3319:18;:30::i;:::-;3254:103::o:0;35571:40::-;;;;:::o;31232:100::-;31283:7;31310;31318:5;31310:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31303:21;;31232:100;;;:::o;2579:87::-;2625:7;2652:6;;;;;;;;;;;2645:13;;2579:87;:::o;30728:109::-;30784:7;30811:9;:18;30821:7;30811:18;;;;;;;;;;;;;;;;30804:25;;30728:109;;;:::o;40248:107::-;40299:18;40337:10;40330:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40248:107;:::o;31422:225::-;31480:7;31500:21;31548:15;:13;:15::i;:::-;31524:21;:39;;;;:::i;:::-;31500:63;;31581:58;31597:7;31606:13;31621:17;31630:7;31621:8;:17::i;:::-;31581:15;:58::i;:::-;31574:65;;;31422:225;;;:::o;35711:35::-;;;;:::o;31807:260::-;31879:7;31899:21;31956:20;31970:5;31956:13;:20::i;:::-;31923:5;:15;;;31947:4;31923:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;31899:77;;31994:65;32010:7;32019:13;32034:24;32043:5;32050:7;32034:8;:24::i;:::-;31994:15;:65::i;:::-;31987:72;;;31807:260;;;;:::o;30524:105::-;30578:7;30605;:16;30613:7;30605:16;;;;;;;;;;;;;;;;30598:23;;30524:105;;;:::o;36203:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30314:119::-;30372:7;30399:19;:26;30419:5;30399:26;;;;;;;;;;;;;;;;30392:33;;30314:119;;;:::o;30062:95::-;30108:7;30135:14;;30128:21;;30062:95;:::o;3512:220::-;2465:13;:11;:13::i;:::-;3617:1:::1;3597:22;;:8;:22;;::::0;3593:93:::1;;3671:1;3643:31;;;;;;;;;;;:::i;:::-;;;;;;;;3593:93;3696:28;3715:8;3696:18;:28::i;:::-;3512:220:::0;:::o;15752:340::-;15862:6;15838:21;:30;15834:111;;;15927:4;15892:41;;;;;;;;;;;:::i;:::-;;;;;;;;15834:111;15958:12;15976:9;:14;;15998:6;15976:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15957:52;;;16025:7;16020:65;;16056:17;;;;;;;;;;;;;;16020:65;15823:269;15752:340;;:::o;2744:166::-;2815:12;:10;:12::i;:::-;2804:23;;:7;:5;:7::i;:::-;:23;;;2800:103;;2878:12;:10;:12::i;:::-;2851:40;;;;;;;;;;;:::i;:::-;;;;;;;;2800:103;2744:166::o;21829:162::-;21912:71;21932:5;21954;:14;;;21971:2;21975:5;21939:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21912:19;:71::i;:::-;21829:162;;;:::o;6515:293::-;5917:1;6649:7;;:19;6641:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5917:1;6782:7;:18;;;;6515:293::o;6816:213::-;5873:1;6999:7;:22;;;;6816:213::o;3892:191::-;3966:16;3985:6;;;;;;;;;;;3966:25;;4011:8;4002:6;;:17;;;;;;;;;;;;;;;;;;4066:8;4035:40;;4056:8;4035:40;;;;;;;;;;;;3955:128;3892:191;:::o;34176:248::-;34322:7;34401:15;34386:12;;34366:7;:16;34374:7;34366:16;;;;;;;;;;;;;;;;34350:13;:32;;;;:::i;:::-;34349:49;;;;:::i;:::-;:67;;;;:::i;:::-;34342:74;;34176:248;;;;;:::o;24640:638::-;25064:23;25090:33;25118:4;25098:5;25090:27;;;;:33;;;;:::i;:::-;25064:59;;25159:1;25138:10;:17;:22;;:57;;;;;25176:10;25165:30;;;;;;;;;;;;:::i;:::-;25164:31;25138:57;25134:137;;;25252:5;25219:40;;;;;;;;;;;:::i;:::-;;;;;;;;25134:137;24710:568;24640:638;;:::o;16955:153::-;17030:12;17062:38;17084:6;17092:4;17098:1;17062:21;:38::i;:::-;17055:45;;16955:153;;;;:::o;17443:398::-;17542:12;17595:5;17571:21;:29;17567:110;;;17659:4;17624:41;;;;;;;;;;;:::i;:::-;;;;;;;;17567:110;17688:12;17702:23;17729:6;:11;;17748:5;17755:4;17729:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17687:73;;;;17778:55;17805:6;17813:7;17822:10;17778:26;:55::i;:::-;17771:62;;;;17443:398;;;;;:::o;18919:597::-;19067:12;19097:7;19092:417;;19121:19;19129:10;19121:7;:19::i;:::-;19092:417;;;19370:1;19349:10;:17;:22;:49;;;;;19397:1;19375:6;:18;;;:23;19349:49;19345:121;;;19443:6;19426:24;;;;;;;;;;;:::i;:::-;;;;;;;;19345:121;19487:10;19480:17;;;;19092:417;18919:597;;;;;;:::o;20069:528::-;20222:1;20202:10;:17;:21;20198:392;;;20434:10;20428:17;20491:15;20478:10;20474:2;20470:19;20463:44;20198:392;20561:17;;;;;;;;;;;;;;7:126:1;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:77::-;402:7;431:5;420:16;;365:77;;;:::o;448:118::-;535:24;553:5;535:24;:::i;:::-;530:3;523:37;448:118;;:::o;572:332::-;693:4;731:2;720:9;716:18;708:26;;744:71;812:1;801:9;797:17;788:6;744:71;:::i;:::-;825:72;893:2;882:9;878:18;869:6;825:72;:::i;:::-;572:332;;;;;:::o;991:117::-;1100:1;1097;1090:12;1237:104;1282:7;1311:24;1329:5;1311:24;:::i;:::-;1300:35;;1237:104;;;:::o;1347:138::-;1428:32;1454:5;1428:32;:::i;:::-;1421:5;1418:43;1408:71;;1475:1;1472;1465:12;1408:71;1347:138;:::o;1491:155::-;1545:5;1583:6;1570:20;1561:29;;1599:41;1634:5;1599:41;:::i;:::-;1491:155;;;;:::o;1652:345::-;1719:6;1768:2;1756:9;1747:7;1743:23;1739:32;1736:119;;;1774:79;;:::i;:::-;1736:119;1894:1;1919:61;1972:7;1963:6;1952:9;1948:22;1919:61;:::i;:::-;1909:71;;1865:125;1652:345;;;;:::o;2003:122::-;2076:24;2094:5;2076:24;:::i;:::-;2069:5;2066:35;2056:63;;2115:1;2112;2105:12;2056:63;2003:122;:::o;2131:139::-;2177:5;2215:6;2202:20;2193:29;;2231:33;2258:5;2231:33;:::i;:::-;2131:139;;;;:::o;2276:329::-;2335:6;2384:2;2372:9;2363:7;2359:23;2355:32;2352:119;;;2390:79;;:::i;:::-;2352:119;2510:1;2535:53;2580:7;2571:6;2560:9;2556:22;2535:53;:::i;:::-;2525:63;;2481:117;2276:329;;;;:::o;2611:442::-;2760:4;2798:2;2787:9;2783:18;2775:26;;2811:71;2879:1;2868:9;2864:17;2855:6;2811:71;:::i;:::-;2892:72;2960:2;2949:9;2945:18;2936:6;2892:72;:::i;:::-;2974;3042:2;3031:9;3027:18;3018:6;2974:72;:::i;:::-;2611:442;;;;;;:::o;3059:222::-;3152:4;3190:2;3179:9;3175:18;3167:26;;3203:71;3271:1;3260:9;3256:17;3247:6;3203:71;:::i;:::-;3059:222;;;;:::o;3287:122::-;3360:24;3378:5;3360:24;:::i;:::-;3353:5;3350:35;3340:63;;3399:1;3396;3389:12;3340:63;3287:122;:::o;3415:139::-;3461:5;3499:6;3486:20;3477:29;;3515:33;3542:5;3515:33;:::i;:::-;3415:139;;;;:::o;3560:329::-;3619:6;3668:2;3656:9;3647:7;3643:23;3639:32;3636:119;;;3674:79;;:::i;:::-;3636:119;3794:1;3819:53;3864:7;3855:6;3844:9;3840:22;3819:53;:::i;:::-;3809:63;;3765:117;3560:329;;;;:::o;3895:110::-;3946:7;3975:24;3993:5;3975:24;:::i;:::-;3964:35;;3895:110;;;:::o;4011:150::-;4098:38;4130:5;4098:38;:::i;:::-;4091:5;4088:49;4078:77;;4151:1;4148;4141:12;4078:77;4011:150;:::o;4167:167::-;4227:5;4265:6;4252:20;4243:29;;4281:47;4322:5;4281:47;:::i;:::-;4167:167;;;;:::o;4340:502::-;4422:6;4430;4479:2;4467:9;4458:7;4454:23;4450:32;4447:119;;;4485:79;;:::i;:::-;4447:119;4605:1;4630:67;4689:7;4680:6;4669:9;4665:22;4630:67;:::i;:::-;4620:77;;4576:131;4746:2;4772:53;4817:7;4808:6;4797:9;4793:22;4772:53;:::i;:::-;4762:63;;4717:118;4340:502;;;;;:::o;4848:222::-;4941:4;4979:2;4968:9;4964:18;4956:26;;4992:71;5060:1;5049:9;5045:17;5036:6;4992:71;:::i;:::-;4848:222;;;;:::o;5076:474::-;5144:6;5152;5201:2;5189:9;5180:7;5176:23;5172:32;5169:119;;;5207:79;;:::i;:::-;5169:119;5327:1;5352:53;5397:7;5388:6;5377:9;5373:22;5352:53;:::i;:::-;5342:63;;5298:117;5454:2;5480:53;5525:7;5516:6;5505:9;5501:22;5480:53;:::i;:::-;5470:63;;5425:118;5076:474;;;;;:::o;5556:141::-;5650:6;5684:5;5678:12;5668:22;;5556:141;;;:::o;5703:211::-;5829:11;5863:6;5858:3;5851:19;5903:4;5898:3;5894:14;5879:29;;5703:211;;;;:::o;5920:159::-;6014:4;6037:3;6029:11;;6067:4;6062:3;6058:14;6050:22;;5920:159;;;:::o;6085:108::-;6162:24;6180:5;6162:24;:::i;:::-;6157:3;6150:37;6085:108;;:::o;6199:::-;6276:24;6294:5;6276:24;:::i;:::-;6271:3;6264:37;6199:108;;:::o;6389:684::-;6530:4;6525:3;6521:14;6620:4;6613:5;6609:16;6603:23;6639:63;6696:4;6691:3;6687:14;6673:12;6639:63;:::i;:::-;6545:167;6797:4;6790:5;6786:16;6780:23;6816:63;6873:4;6868:3;6864:14;6850:12;6816:63;:::i;:::-;6722:167;6974:4;6967:5;6963:16;6957:23;6993:63;7050:4;7045:3;7041:14;7027:12;6993:63;:::i;:::-;6899:167;6499:574;6389:684;;:::o;7079:287::-;7202:10;7223:100;7319:3;7311:6;7223:100;:::i;:::-;7355:4;7350:3;7346:14;7332:28;;7079:287;;;;:::o;7372:140::-;7469:4;7501;7496:3;7492:14;7484:22;;7372:140;;;:::o;7598:948::-;7771:3;7800:81;7875:5;7800:81;:::i;:::-;7897:113;8003:6;7998:3;7897:113;:::i;:::-;7890:120;;8034:83;8111:5;8034:83;:::i;:::-;8140:7;8171:1;8156:365;8181:6;8178:1;8175:13;8156:365;;;8257:6;8251:13;8284:117;8397:3;8382:13;8284:117;:::i;:::-;8277:124;;8424:87;8504:6;8424:87;:::i;:::-;8414:97;;8216:305;8203:1;8200;8196:9;8191:14;;8156:365;;;8160:14;8537:3;8530:10;;7776:770;;;7598:948;;;;:::o;8552:481::-;8749:4;8787:2;8776:9;8772:18;8764:26;;8836:9;8830:4;8826:20;8822:1;8811:9;8807:17;8800:47;8864:162;9021:4;9012:6;8864:162;:::i;:::-;8856:170;;8552:481;;;;:::o;9039:357::-;9112:6;9161:2;9149:9;9140:7;9136:23;9132:32;9129:119;;;9167:79;;:::i;:::-;9129:119;9287:1;9312:67;9371:7;9362:6;9351:9;9347:22;9312:67;:::i;:::-;9302:77;;9258:131;9039:357;;;;:::o;9402:169::-;9486:11;9520:6;9515:3;9508:19;9560:4;9555:3;9551:14;9536:29;;9402:169;;;;:::o;9577:225::-;9717:34;9713:1;9705:6;9701:14;9694:58;9786:8;9781:2;9773:6;9769:15;9762:33;9577:225;:::o;9808:366::-;9950:3;9971:67;10035:2;10030:3;9971:67;:::i;:::-;9964:74;;10047:93;10136:3;10047:93;:::i;:::-;10165:2;10160:3;10156:12;10149:19;;9808:366;;;:::o;10180:419::-;10346:4;10384:2;10373:9;10369:18;10361:26;;10433:9;10427:4;10423:20;10419:1;10408:9;10404:17;10397:47;10461:131;10587:4;10461:131;:::i;:::-;10453:139;;10180:419;;;:::o;10605:230::-;10745:34;10741:1;10733:6;10729:14;10722:58;10814:13;10809:2;10801:6;10797:15;10790:38;10605:230;:::o;10841:366::-;10983:3;11004:67;11068:2;11063:3;11004:67;:::i;:::-;10997:74;;11080:93;11169:3;11080:93;:::i;:::-;11198:2;11193:3;11189:12;11182:19;;10841:366;;;:::o;11213:419::-;11379:4;11417:2;11406:9;11402:18;11394:26;;11466:9;11460:4;11456:20;11452:1;11441:9;11437:17;11430:47;11494:131;11620:4;11494:131;:::i;:::-;11486:139;;11213:419;;;:::o;11638:180::-;11686:77;11683:1;11676:88;11783:4;11780:1;11773:15;11807:4;11804:1;11797:15;11824:191;11864:3;11883:20;11901:1;11883:20;:::i;:::-;11878:25;;11917:20;11935:1;11917:20;:::i;:::-;11912:25;;11960:1;11957;11953:9;11946:16;;11981:3;11978:1;11975:10;11972:36;;;11988:18;;:::i;:::-;11972:36;11824:191;;;;:::o;12021:60::-;12049:3;12070:5;12063:12;;12021:60;;;:::o;12087:142::-;12137:9;12170:53;12188:34;12197:24;12215:5;12197:24;:::i;:::-;12188:34;:::i;:::-;12170:53;:::i;:::-;12157:66;;12087:142;;;:::o;12235:126::-;12285:9;12318:37;12349:5;12318:37;:::i;:::-;12305:50;;12235:126;;;:::o;12367:134::-;12425:9;12458:37;12489:5;12458:37;:::i;:::-;12445:50;;12367:134;;;:::o;12507:147::-;12602:45;12641:5;12602:45;:::i;:::-;12597:3;12590:58;12507:147;;:::o;12660:348::-;12789:4;12827:2;12816:9;12812:18;12804:26;;12840:79;12916:1;12905:9;12901:17;12892:6;12840:79;:::i;:::-;12929:72;12997:2;12986:9;12982:18;12973:6;12929:72;:::i;:::-;12660:348;;;;;:::o;13014:168::-;13154:20;13150:1;13142:6;13138:14;13131:44;13014:168;:::o;13188:366::-;13330:3;13351:67;13415:2;13410:3;13351:67;:::i;:::-;13344:74;;13427:93;13516:3;13427:93;:::i;:::-;13545:2;13540:3;13536:12;13529:19;;13188:366;;;:::o;13560:419::-;13726:4;13764:2;13753:9;13749:18;13741:26;;13813:9;13807:4;13803:20;13799:1;13788:9;13784:17;13777:47;13841:131;13967:4;13841:131;:::i;:::-;13833:139;;13560:419;;;:::o;13985:180::-;14033:77;14030:1;14023:88;14130:4;14127:1;14120:15;14154:4;14151:1;14144:15;14171:220;14311:34;14307:1;14299:6;14295:14;14288:58;14380:3;14375:2;14367:6;14363:15;14356:28;14171:220;:::o;14397:366::-;14539:3;14560:67;14624:2;14619:3;14560:67;:::i;:::-;14553:74;;14636:93;14725:3;14636:93;:::i;:::-;14754:2;14749:3;14745:12;14738:19;;14397:366;;;:::o;14769:419::-;14935:4;14973:2;14962:9;14958:18;14950:26;;15022:9;15016:4;15012:20;15008:1;14997:9;14993:17;14986:47;15050:131;15176:4;15050:131;:::i;:::-;15042:139;;14769:419;;;:::o;15194:176::-;15334:28;15330:1;15322:6;15318:14;15311:52;15194:176;:::o;15376:366::-;15518:3;15539:67;15603:2;15598:3;15539:67;:::i;:::-;15532:74;;15615:93;15704:3;15615:93;:::i;:::-;15733:2;15728:3;15724:12;15717:19;;15376:366;;;:::o;15748:419::-;15914:4;15952:2;15941:9;15937:18;15929:26;;16001:9;15995:4;15991:20;15987:1;15976:9;15972:17;15965:47;16029:131;16155:4;16029:131;:::i;:::-;16021:139;;15748:419;;;:::o;16173:143::-;16230:5;16261:6;16255:13;16246:22;;16277:33;16304:5;16277:33;:::i;:::-;16173:143;;;;:::o;16322:351::-;16392:6;16441:2;16429:9;16420:7;16416:23;16412:32;16409:119;;;16447:79;;:::i;:::-;16409:119;16567:1;16592:64;16648:7;16639:6;16628:9;16624:22;16592:64;:::i;:::-;16582:74;;16538:128;16322:351;;;;:::o;16679:224::-;16819:34;16815:1;16807:6;16803:14;16796:58;16888:7;16883:2;16875:6;16871:15;16864:32;16679:224;:::o;16909:366::-;17051:3;17072:67;17136:2;17131:3;17072:67;:::i;:::-;17065:74;;17148:93;17237:3;17148:93;:::i;:::-;17266:2;17261:3;17257:12;17250:19;;16909:366;;;:::o;17281:419::-;17447:4;17485:2;17474:9;17470:18;17462:26;;17534:9;17528:4;17524:20;17520:1;17509:9;17505:17;17498:47;17562:131;17688:4;17562:131;:::i;:::-;17554:139;;17281:419;;;:::o;17706:85::-;17751:7;17780:5;17769:16;;17706:85;;;:::o;17797:158::-;17855:9;17888:61;17906:42;17915:32;17941:5;17915:32;:::i;:::-;17906:42;:::i;:::-;17888:61;:::i;:::-;17875:74;;17797:158;;;:::o;17961:147::-;18056:45;18095:5;18056:45;:::i;:::-;18051:3;18044:58;17961:147;;:::o;18114:458::-;18271:4;18309:2;18298:9;18294:18;18286:26;;18322:71;18390:1;18379:9;18375:17;18366:6;18322:71;:::i;:::-;18403:72;18471:2;18460:9;18456:18;18447:6;18403:72;:::i;:::-;18485:80;18561:2;18550:9;18546:18;18537:6;18485:80;:::i;:::-;18114:458;;;;;;:::o;18578:147::-;18679:11;18716:3;18701:18;;18578:147;;;;:::o;18731:114::-;;:::o;18851:398::-;19010:3;19031:83;19112:1;19107:3;19031:83;:::i;:::-;19024:90;;19123:93;19212:3;19123:93;:::i;:::-;19241:1;19236:3;19232:11;19225:18;;18851:398;;;:::o;19255:379::-;19439:3;19461:147;19604:3;19461:147;:::i;:::-;19454:154;;19625:3;19618:10;;19255:379;;;:::o;19640:181::-;19780:33;19776:1;19768:6;19764:14;19757:57;19640:181;:::o;19827:366::-;19969:3;19990:67;20054:2;20049:3;19990:67;:::i;:::-;19983:74;;20066:93;20155:3;20066:93;:::i;:::-;20184:2;20179:3;20175:12;20168:19;;19827:366;;;:::o;20199:419::-;20365:4;20403:2;20392:9;20388:18;20380:26;;20452:9;20446:4;20442:20;20438:1;20427:9;20423:17;20416:47;20480:131;20606:4;20480:131;:::i;:::-;20472:139;;20199:419;;;:::o;20624:410::-;20664:7;20687:20;20705:1;20687:20;:::i;:::-;20682:25;;20721:20;20739:1;20721:20;:::i;:::-;20716:25;;20776:1;20773;20769:9;20798:30;20816:11;20798:30;:::i;:::-;20787:41;;20977:1;20968:7;20964:15;20961:1;20958:22;20938:1;20931:9;20911:83;20888:139;;21007:18;;:::i;:::-;20888:139;20672:362;20624:410;;;;:::o;21040:180::-;21088:77;21085:1;21078:88;21185:4;21182:1;21175:15;21209:4;21206:1;21199:15;21226:185;21266:1;21283:20;21301:1;21283:20;:::i;:::-;21278:25;;21317:20;21335:1;21317:20;:::i;:::-;21312:25;;21356:1;21346:35;;21361:18;;:::i;:::-;21346:35;21403:1;21400;21396:9;21391:14;;21226:185;;;;:::o;21417:194::-;21457:4;21477:20;21495:1;21477:20;:::i;:::-;21472:25;;21511:20;21529:1;21511:20;:::i;:::-;21506:25;;21555:1;21552;21548:9;21540:17;;21579:1;21573:4;21570:11;21567:37;;;21584:18;;:::i;:::-;21567:37;21417:194;;;;:::o;21617:90::-;21651:7;21694:5;21687:13;21680:21;21669:32;;21617:90;;;:::o;21713:116::-;21783:21;21798:5;21783:21;:::i;:::-;21776:5;21773:32;21763:60;;21819:1;21816;21809:12;21763:60;21713:116;:::o;21835:137::-;21889:5;21920:6;21914:13;21905:22;;21936:30;21960:5;21936:30;:::i;:::-;21835:137;;;;:::o;21978:345::-;22045:6;22094:2;22082:9;22073:7;22069:23;22065:32;22062:119;;;22100:79;;:::i;:::-;22062:119;22220:1;22245:61;22298:7;22289:6;22278:9;22274:22;22245:61;:::i;:::-;22235:71;;22191:125;21978:345;;;;:::o;22329:98::-;22380:6;22414:5;22408:12;22398:22;;22329:98;;;:::o;22433:139::-;22522:6;22517:3;22512;22506:23;22563:1;22554:6;22549:3;22545:16;22538:27;22433:139;;;:::o;22578:386::-;22682:3;22710:38;22742:5;22710:38;:::i;:::-;22764:88;22845:6;22840:3;22764:88;:::i;:::-;22757:95;;22861:65;22919:6;22914:3;22907:4;22900:5;22896:16;22861:65;:::i;:::-;22951:6;22946:3;22942:16;22935:23;;22686:278;22578:386;;;;:::o;22970:271::-;23100:3;23122:93;23211:3;23202:6;23122:93;:::i;:::-;23115:100;;23232:3;23225:10;;22970:271;;;;:::o
Swarm Source
ipfs://e5b247233b50781c7c6251f4a615f80600aeb6393283a0cdd83b5ffe7ac8854b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
APE | 100.00% | $0.732055 | 6 | $4.39 |
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.