ERC-721
Overview
Max Total Supply
10,000 MF3RS
Holders
2,457
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
6 MF3RSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MF3RS
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-20 */ // Sources flattened with hardhat v2.4.0 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @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); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @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; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @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, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File @openzeppelin/contracts/finance/[email protected] // OpenZeppelin Contracts v4.4.1 (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. * * `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 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 totalReceived = address(this).balance + totalReleased(); uint256 payment = _pendingPayment(account, totalReceived, released(account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] += payment; _totalReleased += 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 totalReceived = token.balanceOf(address(this)) + totalReleased(token); uint256 payment = _pendingPayment(account, totalReceived, released(token, account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _erc20Released[token][account] += payment; _erc20TotalReleased[token] += 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 @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File contracts/libs/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error AuxQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev See {IERC721Enumerable-totalSupply}. * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { if (owner == address(0)) revert AuxQueryForZeroAddress(); return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { if (owner == address(0)) revert AuxQueryForZeroAddress(); _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File contracts/libs/ECRecoverLib.sol pragma solidity <0.9.0; library ECRecoverLib { string private constant REQUIRED_SIG_HEADER = "\x19Ethereum Signed Message:\n32"; struct ECDSAVariables { uint8 v; bytes32 r; bytes32 s; } function verifySig( ECDSAVariables memory self, address signer, bytes32 signerHash ) internal pure { require( signer == ecrecover( keccak256(abi.encodePacked(REQUIRED_SIG_HEADER, signerHash)), self.v, self.r, self.s ), "Invalid Signature" ); } } // File contracts/mf3rs.sol pragma solidity ^0.8.0; contract MF3RS is ERC721A, PaymentSplitter, Ownable { using ECRecoverLib for ECRecoverLib.ECDSAVariables; uint256 private constant _MAX_TOKENS = 10000; // 10,028 - 21 1/1s uint256 private constant _MAX_TOKENS_FOR_MFERS = 3004; uint256 private constant _MAX_TOKENS_PER_MFER = 10; uint256 private constant _MAX_TOKENS_PER_PUBLIC_MFER = 1; uint256 private constant _CROAKZ = 0; uint256 private constant _MFERS = 1; uint256 private constant _DEV_MINT = 0; uint256 private constant _MFERS_CAPPED_MINT = 1; uint256 private constant _MFERS_UNCAPPED_MINT = 2; uint256 private constant _PUBLIC_MINT = 3; uint256 private constant _CLOSED_MINT = 4; uint256 private mintPhase = 0; uint256 private numberOfMferMints = 0; bool private devMintLocked = false; mapping (address => uint256) private croakzMinted; mapping (address => uint256) private mfersMinted; mapping (address => uint256) private publicMinted; address signingAuth; constructor( string memory name_, string memory symbol_, address[] memory payees, uint256[] memory shares_ ) ERC721A(name_, symbol_) PaymentSplitter(payees, shares_) {} function setSigningAuth(address _signingAuth) external onlyOwner { signingAuth = _signingAuth; } function changeMintPhase(uint256 _mintPhase) public onlyOwner { require(_mintPhase > mintPhase, "No back-stepping!"); require(_mintPhase <= _CLOSED_MINT, "Final phase is CLOSED"); mintPhase = _mintPhase; } function getMintPhase() public view returns (uint256) { return mintPhase; } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function totalMinted() public view returns (uint256) { return _totalMinted(); } // // metadata URI string private _baseTokenURI; function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function exists(uint256 tokenId) public view returns (bool) { return _exists(tokenId); } modifier callerIsUser() { require(tx.origin == msg.sender, "No contracts!"); _; } function publicMint(uint256 quantity) external callerIsUser { require(mintPhase == _PUBLIC_MINT, "Public mint not available"); // overflow checks here require(_totalMinted() + quantity <= _MAX_TOKENS, "Cannot exceed max supply"); unchecked { publicMinted[msg.sender] += quantity; } require(mfersMinted[msg.sender] <= _MAX_TOKENS_PER_PUBLIC_MFER, "Cannot exceed capped supply per public address"); _safeMint(msg.sender, quantity); } function mint(uint256 quantity, uint256 project, uint256 held, ECRecoverLib.ECDSAVariables memory wlECDSA) external callerIsUser { require(mintPhase > _DEV_MINT, "Minting has not started"); // overflow checks here require(_totalMinted() + quantity <= _MAX_TOKENS, "Cannot exceed max supply"); // Prove to contract that sender was in snapshot bytes32 senderHash = keccak256(abi.encodePacked(msg.sender, project, held)); wlECDSA.verifySig(signingAuth, senderHash); unchecked { if(project == _CROAKZ) { croakzMinted[msg.sender] += quantity; require(croakzMinted[msg.sender] <= held, "1 CROAK = 1 MF3R!"); _safeMint(msg.sender, quantity); } else if(project == _MFERS) { mfersMinted[msg.sender] += quantity; require(mfersMinted[msg.sender] <= held, "1 MFER = 1 MF3R!"); numberOfMferMints += quantity; if(mintPhase == _MFERS_CAPPED_MINT) { require(numberOfMferMints <= _MAX_TOKENS_FOR_MFERS, "Cannot exceed capped supply for mfers"); require(mfersMinted[msg.sender] <= _MAX_TOKENS_PER_MFER, "Cannot exceed capped supply per mfer"); } _safeMint(msg.sender, quantity); } } } // dev mint special 1/1s function mintSpecial(address [] memory recipients) external onlyOwner { require(!devMintLocked, "Dev Mint Permanently Locked"); unchecked { for (uint256 i = 0; i < recipients.length; i++) { _safeMint(recipients[i], 1); } } } function lockDevMint() external onlyOwner { devMintLocked = true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares_","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPhase","type":"uint256"}],"name":"changeMintPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDevMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"project","type":"uint256"},{"internalType":"uint256","name":"held","type":"uint256"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ECRecoverLib.ECDSAVariables","name":"wlECDSA","type":"tuple"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"}],"name":"mintSpecial","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","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":"tokenId","type":"uint256"}],"name":"ownerOf","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":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"nonpayable","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":[{"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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signingAuth","type":"address"}],"name":"setSigningAuth","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600060105560006011556000601260006101000a81548160ff0219169083151502179055503480156200003657600080fd5b50604051620066343803806200663483398181016040528101906200005c919062000799565b81818585816002908051906020019062000078929190620004e1565b50806003908051906020019062000091929190620004e1565b50620000a2620001d460201b60201c565b60008190555050508051825114620000f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000e890620009bb565b60405180910390fd5b600082511162000138576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200012f90620009ff565b60405180910390fd5b60005b8251811015620001a757620001918382815181106200015f576200015e62000cfa565b5b60200260200101518383815181106200017d576200017c62000cfa565b5b6020026020010151620001d960201b60201c565b80806200019e9062000c4e565b9150506200013b565b505050620001ca620001be6200041360201b60201c565b6200041b60201b60201c565b5050505062000ef5565b600090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200024c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002439062000999565b60405180910390fd5b6000811162000292576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002899062000a21565b60405180910390fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541462000317576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200030e90620009dd565b60405180910390fd5b600c829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600854620003ce919062000b11565b6008819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac8282604051620004079291906200096c565b60405180910390a15050565b600033905090565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004ef9062000be2565b90600052602060002090601f0160209004810192826200051357600085556200055f565b82601f106200052e57805160ff19168380011785556200055f565b828001600101855582156200055f579182015b828111156200055e57825182559160200191906001019062000541565b5b5090506200056e919062000572565b5090565b5b808211156200058d57600081600090555060010162000573565b5090565b6000620005a8620005a28462000a6c565b62000a43565b90508083825260208201905082856020860282011115620005ce57620005cd62000d5d565b5b60005b85811015620006025781620005e78882620006d2565b845260208401935060208301925050600181019050620005d1565b5050509392505050565b6000620006236200061d8462000a9b565b62000a43565b9050808382526020820190508285602086028201111562000649576200064862000d5d565b5b60005b858110156200067d578162000662888262000782565b8452602084019350602083019250506001810190506200064c565b5050509392505050565b60006200069e620006988462000aca565b62000a43565b905082815260208101848484011115620006bd57620006bc62000d62565b5b620006ca84828562000bac565b509392505050565b600081519050620006e38162000ec1565b92915050565b600082601f83011262000701576200070062000d58565b5b81516200071384826020860162000591565b91505092915050565b600082601f83011262000734576200073362000d58565b5b8151620007468482602086016200060c565b91505092915050565b600082601f83011262000767576200076662000d58565b5b81516200077984826020860162000687565b91505092915050565b600081519050620007938162000edb565b92915050565b60008060008060808587031215620007b657620007b562000d6c565b5b600085015167ffffffffffffffff811115620007d757620007d662000d67565b5b620007e5878288016200074f565b945050602085015167ffffffffffffffff81111562000809576200080862000d67565b5b62000817878288016200074f565b935050604085015167ffffffffffffffff8111156200083b576200083a62000d67565b5b6200084987828801620006e9565b925050606085015167ffffffffffffffff8111156200086d576200086c62000d67565b5b6200087b878288016200071c565b91505092959194509250565b620008928162000b6e565b82525050565b6000620008a7602c8362000b00565b9150620008b48262000d82565b604082019050919050565b6000620008ce60328362000b00565b9150620008db8262000dd1565b604082019050919050565b6000620008f5602b8362000b00565b9150620009028262000e20565b604082019050919050565b60006200091c601a8362000b00565b9150620009298262000e6f565b602082019050919050565b600062000943601d8362000b00565b9150620009508262000e98565b602082019050919050565b620009668162000ba2565b82525050565b600060408201905062000983600083018562000887565b6200099260208301846200095b565b9392505050565b60006020820190508181036000830152620009b48162000898565b9050919050565b60006020820190508181036000830152620009d681620008bf565b9050919050565b60006020820190508181036000830152620009f881620008e6565b9050919050565b6000602082019050818103600083015262000a1a816200090d565b9050919050565b6000602082019050818103600083015262000a3c8162000934565b9050919050565b600062000a4f62000a62565b905062000a5d828262000c18565b919050565b6000604051905090565b600067ffffffffffffffff82111562000a8a5762000a8962000d29565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000ab95762000ab862000d29565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000ae85762000ae762000d29565b5b62000af38262000d71565b9050602081019050919050565b600082825260208201905092915050565b600062000b1e8262000ba2565b915062000b2b8362000ba2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000b635762000b6262000c9c565b5b828201905092915050565b600062000b7b8262000b82565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000bcc57808201518184015260208101905062000baf565b8381111562000bdc576000848401525b50505050565b6000600282049050600182168062000bfb57607f821691505b6020821081141562000c125762000c1162000ccb565b5b50919050565b62000c238262000d71565b810181811067ffffffffffffffff8211171562000c455762000c4462000d29565b5b80604052505050565b600062000c5b8262000ba2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000c915762000c9062000c9c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b62000ecc8162000b6e565b811462000ed857600080fd5b50565b62000ee68162000ba2565b811462000ef257600080fd5b50565b61572f8062000f056000396000f3fe60806040526004361061021e5760003560e01c806370a0823111610123578063b88d4fde116100ab578063d79779b21161006f578063d79779b21461083c578063dc33e68114610879578063e33b7de3146108b6578063e985e9c5146108e1578063f2fde38b1461091e57610265565b8063b88d4fde14610745578063bec59f7a1461076e578063c52766c614610797578063c87b56dd146107c2578063ce7c2ac2146107ff57610265565b806395d89b41116100f257806395d89b41146106605780639852595c1461068b578063a22cb465146106c8578063a2309ff8146106f1578063a3ea97851461071c57610265565b806370a08231146105a4578063715018a6146105e15780638b83209b146105f85780638da5cb5b1461063557610265565b80632db11544116101a657806348b750441161017557806348b75044146104af5780634f558e79146104d857806355f804b314610515578063615d166e1461053e5780636352211e1461056757610265565b80632db11544146103f55780633a98ef391461041e578063406072a91461044957806342842e0e1461048657610265565b8063081812fc116101ed578063081812fc14610312578063095ea7b31461034f57806318160ddd1461037857806319165587146103a357806323b872dd146103cc57610265565b8063014b0c8a1461026a57806301ffc9a71461029357806306fd5133146102d057806306fdde03146102e757610265565b36610265577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061024c610947565b3460405161025b92919061488f565b60405180910390a1005b600080fd5b34801561027657600080fd5b50610291600480360381019061028c9190614067565b61094f565b005b34801561029f57600080fd5b506102ba60048036038101906102b591906140dd565b610a5d565b6040516102c791906148b8565b60405180910390f35b3480156102dc57600080fd5b506102e5610b3f565b005b3480156102f357600080fd5b506102fc610bd8565b6040516103099190614918565b60405180910390f35b34801561031e57600080fd5b50610339600480360381019061033491906141f1565b610c6a565b60405161034691906147ff565b60405180910390f35b34801561035b57600080fd5b5061037660048036038101906103719190614027565b610ce6565b005b34801561038457600080fd5b5061038d610df1565b60405161039a9190614bfa565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190613ea4565b610e08565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190613f11565b610fb3565b005b34801561040157600080fd5b5061041c600480360381019061041791906141f1565b610fc3565b005b34801561042a57600080fd5b506104336111aa565b6040516104409190614bfa565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b9190614164565b6111b4565b60405161047d9190614bfa565b60405180910390f35b34801561049257600080fd5b506104ad60048036038101906104a89190613f11565b61123b565b005b3480156104bb57600080fd5b506104d660048036038101906104d19190614164565b61125b565b005b3480156104e457600080fd5b506104ff60048036038101906104fa91906141f1565b611523565b60405161050c91906148b8565b60405180910390f35b34801561052157600080fd5b5061053c600480360381019061053791906141a4565b611535565b005b34801561054a57600080fd5b50610565600480360381019061056091906141f1565b6115c7565b005b34801561057357600080fd5b5061058e600480360381019061058991906141f1565b6116d5565b60405161059b91906147ff565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c69190613e77565b6116eb565b6040516105d89190614bfa565b60405180910390f35b3480156105ed57600080fd5b506105f66117bb565b005b34801561060457600080fd5b5061061f600480360381019061061a91906141f1565b611843565b60405161062c91906147ff565b60405180910390f35b34801561064157600080fd5b5061064a61188b565b60405161065791906147ff565b60405180910390f35b34801561066c57600080fd5b506106756118b5565b6040516106829190614918565b60405180910390f35b34801561069757600080fd5b506106b260048036038101906106ad9190613e77565b611947565b6040516106bf9190614bfa565b60405180910390f35b3480156106d457600080fd5b506106ef60048036038101906106ea9190613fe7565b611990565b005b3480156106fd57600080fd5b50610706611b08565b6040516107139190614bfa565b60405180910390f35b34801561072857600080fd5b50610743600480360381019061073e9190613e77565b611b17565b005b34801561075157600080fd5b5061076c60048036038101906107679190613f64565b611bd7565b005b34801561077a57600080fd5b506107956004803603810190610790919061424b565b611c53565b005b3480156107a357600080fd5b506107ac61207b565b6040516107b99190614bfa565b60405180910390f35b3480156107ce57600080fd5b506107e960048036038101906107e491906141f1565b612085565b6040516107f69190614918565b60405180910390f35b34801561080b57600080fd5b5061082660048036038101906108219190613e77565b612124565b6040516108339190614bfa565b60405180910390f35b34801561084857600080fd5b50610863600480360381019061085e9190614137565b61216d565b6040516108709190614bfa565b60405180910390f35b34801561088557600080fd5b506108a0600480360381019061089b9190613e77565b6121b6565b6040516108ad9190614bfa565b60405180910390f35b3480156108c257600080fd5b506108cb6121c8565b6040516108d89190614bfa565b60405180910390f35b3480156108ed57600080fd5b5061090860048036038101906109039190613ed1565b6121d2565b60405161091591906148b8565b60405180910390f35b34801561092a57600080fd5b5061094560048036038101906109409190613e77565b612266565b005b600033905090565b610957610947565b73ffffffffffffffffffffffffffffffffffffffff1661097561188b565b73ffffffffffffffffffffffffffffffffffffffff16146109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c290614ada565b60405180910390fd5b601260009054906101000a900460ff1615610a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1290614b5a565b60405180910390fd5b60005b8151811015610a5957610a4c828281518110610a3d57610a3c6150c3565b5b6020026020010151600161235e565b8080600101915050610a1e565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b385750610b378261237c565b5b9050919050565b610b47610947565b73ffffffffffffffffffffffffffffffffffffffff16610b6561188b565b73ffffffffffffffffffffffffffffffffffffffff1614610bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb290614ada565b60405180910390fd5b6001601260006101000a81548160ff021916908315150217905550565b606060028054610be790614f21565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1390614f21565b8015610c605780601f10610c3557610100808354040283529160200191610c60565b820191906000526020600020905b815481529060010190602001808311610c4357829003601f168201915b5050505050905090565b6000610c75826123e6565b610cab576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cf1826116d5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d59576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d78610947565b73ffffffffffffffffffffffffffffffffffffffff1614158015610daa5750610da881610da3610947565b6121d2565b155b15610de1576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dec838383612434565b505050565b6000610dfb6124e6565b6001546000540303905090565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e81906149ba565b60405180910390fd5b6000610e946121c8565b47610e9f9190614ce5565b90506000610eb68383610eb186611947565b6124eb565b90506000811415610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef390614a5a565b60405180910390fd5b80600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f4b9190614ce5565b925050819055508060096000828254610f649190614ce5565b92505081905550610f758382612559565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610fa692919061481a565b60405180910390a1505050565b610fbe83838361264d565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102890614b1a565b60405180910390fd5b600360105414611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106d9061499a565b60405180910390fd5b61271081611082612b3e565b61108c9190614ce5565b11156110cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c490614a9a565b60405180910390fd5b80601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561119d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119490614afa565b60405180910390fd5b6111a7338261235e565b50565b6000600854905090565b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61125683838360405180602001604052806000815250611bd7565b505050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116112dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d4906149ba565b60405180910390fd5b60006112e88361216d565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161132191906147ff565b60206040518083038186803b15801561133957600080fd5b505afa15801561134d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611371919061421e565b61137b9190614ce5565b90506000611393838361138e87876111b4565b6124eb565b905060008114156113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d090614a5a565b60405180910390fd5b80600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114659190614ce5565b9250508190555080600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114bb9190614ce5565b925050819055506114cd848483612b51565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a848360405161151592919061488f565b60405180910390a250505050565b600061152e826123e6565b9050919050565b61153d610947565b73ffffffffffffffffffffffffffffffffffffffff1661155b61188b565b73ffffffffffffffffffffffffffffffffffffffff16146115b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a890614ada565b60405180910390fd5b8181601791906115c2929190613ae2565b505050565b6115cf610947565b73ffffffffffffffffffffffffffffffffffffffff166115ed61188b565b73ffffffffffffffffffffffffffffffffffffffff1614611643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163a90614ada565b60405180910390fd5b6010548111611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e90614bda565b60405180910390fd5b60048111156116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c290614b9a565b60405180910390fd5b8060108190555050565b60006116e082612bd7565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611753576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6117c3610947565b73ffffffffffffffffffffffffffffffffffffffff166117e161188b565b73ffffffffffffffffffffffffffffffffffffffff1614611837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182e90614ada565b60405180910390fd5b6118416000612e66565b565b6000600c8281548110611859576118586150c3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546118c490614f21565b80601f01602080910402602001604051908101604052809291908181526020018280546118f090614f21565b801561193d5780601f106119125761010080835404028352916020019161193d565b820191906000526020600020905b81548152906001019060200180831161192057829003601f168201915b5050505050905090565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611998610947565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119fd576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611a0a610947565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ab7610947565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611afc91906148b8565b60405180910390a35050565b6000611b12612b3e565b905090565b611b1f610947565b73ffffffffffffffffffffffffffffffffffffffff16611b3d61188b565b73ffffffffffffffffffffffffffffffffffffffff1614611b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8a90614ada565b60405180910390fd5b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611be284848461264d565b611c018373ffffffffffffffffffffffffffffffffffffffff16612f2c565b8015611c165750611c1484848484612f4f565b155b15611c4d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb890614b1a565b60405180910390fd5b600060105411611d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfd90614bba565b60405180910390fd5b61271084611d12612b3e565b611d1c9190614ce5565b1115611d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5490614a9a565b60405180910390fd5b6000338484604051602001611d749392919061474a565b604051602081830303815290604052805190602001209050611dc3601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682846130af9092919063ffffffff16565b6000841415611eaa5784601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555082601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e929061493a565b60405180910390fd5b611ea5338661235e565b612074565b60018414156120735784601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555082601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7990614a7a565b60405180910390fd5b846011600082825401925050819055506001601054141561206857610bbc6011541115611fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdb9061497a565b60405180910390fd5b600a601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115612067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205e906149da565b60405180910390fd5b5b612072338661235e565b5b5b5050505050565b6000601054905090565b6060612090826123e6565b6120c6576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006120d06131d9565b90506000815114156120f1576040518060200160405280600081525061211c565b806120fb8461326b565b60405160200161210c9291906147c6565b6040516020818303038152906040525b915050919050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006121c1826133cc565b9050919050565b6000600954905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61226e610947565b73ffffffffffffffffffffffffffffffffffffffff1661228c61188b565b73ffffffffffffffffffffffffffffffffffffffff16146122e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d990614ada565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612352576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123499061495a565b60405180910390fd5b61235b81612e66565b50565b61237882826040518060200160405280600081525061349c565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816123f16124e6565b11158015612400575060005482105b801561242d575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600081600854600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561253c9190614d6c565b6125469190614d3b565b6125509190614dc6565b90509392505050565b8047101561259c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259390614a1a565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516125c2906147ea565b60006040518083038185875af1925050503d80600081146125ff576040519150601f19603f3d011682016040523d82523d6000602084013e612604565b606091505b5050905080612648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263f906149fa565b60405180910390fd5b505050565b600061265882612bd7565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661267f610947565b73ffffffffffffffffffffffffffffffffffffffff1614806126b257506126b182600001516126ac610947565b6121d2565b5b806126f757506126c0610947565b73ffffffffffffffffffffffffffffffffffffffff166126df84610c6a565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612730576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612799576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612800576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61280d85858560016134ae565b61281d6000848460000151612434565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612ace57600054811015612acd5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b3785858560016134b4565b5050505050565b6000612b486124e6565b60005403905090565b612bd28363a9059cbb60e01b8484604051602401612b7092919061488f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506134ba565b505050565b612bdf613b68565b600082905080612bed6124e6565b11158015612bfc575060005481105b15612e2f576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612e2d57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d11578092505050612e61565b5b600115612e2c57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e27578092505050612e61565b612d12565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f75610947565b8786866040518563ffffffff1660e01b8152600401612f979493929190614843565b602060405180830381600087803b158015612fb157600080fd5b505af1925050508015612fe257506040513d601f19601f82011682018060405250810190612fdf919061410a565b60015b61305c573d8060008114613012576040519150601f19603f3d011682016040523d82523d6000602084013e613017565b606091505b50600081511415613054576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60016040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250826040516020016130f992919061479e565b604051602081830303815290604052805190602001208460000151856020015186604001516040516000815260200160405260405161313b94939291906148d3565b6020604051602081039080840390855afa15801561315d573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cb90614aba565b60405180910390fd5b505050565b6060601780546131e890614f21565b80601f016020809104026020016040519081016040528092919081815260200182805461321490614f21565b80156132615780601f1061323657610100808354040283529160200191613261565b820191906000526020600020905b81548152906001019060200180831161324457829003601f168201915b5050505050905090565b606060008214156132b3576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133c7565b600082905060005b600082146132e55780806132ce90614f84565b915050600a826132de9190614d3b565b91506132bb565b60008167ffffffffffffffff811115613301576133006150f2565b5b6040519080825280601f01601f1916602001820160405280156133335781602001600182028036833780820191505090505b5090505b600085146133c05760018261334c9190614dc6565b9150600a8561335b9190615005565b60306133679190614ce5565b60f81b81838151811061337d5761337c6150c3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133b99190614d3b565b9450613337565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613434576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6134a98383836001613581565b505050565b50505050565b50505050565b600061351c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661394f9092919063ffffffff16565b905060008151111561357c578080602001905181019061353c91906140b0565b61357b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357290614b7a565b60405180910390fd5b5b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156135ee576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613629576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61363660008683876134ae565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561380057506137ff8773ffffffffffffffffffffffffffffffffffffffff16612f2c565b5b156138c6575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138756000888480600101955088612f4f565b6138ab576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156138065782600054146138c157600080fd5b613932565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156138c7575b81600081905550505061394860008683876134b4565b5050505050565b606061395e8484600085613967565b90509392505050565b6060824710156139ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139a390614a3a565b60405180910390fd5b6139b585612f2c565b6139f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139eb90614b3a565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613a1d9190614787565b60006040518083038185875af1925050503d8060008114613a5a576040519150601f19603f3d011682016040523d82523d6000602084013e613a5f565b606091505b5091509150613a6f828286613a7b565b92505050949350505050565b60608315613a8b57829050613adb565b600083511115613a9e5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ad29190614918565b60405180910390fd5b9392505050565b828054613aee90614f21565b90600052602060002090601f016020900481019282613b105760008555613b57565b82601f10613b2957803560ff1916838001178555613b57565b82800160010185558215613b57579182015b82811115613b56578235825591602001919060010190613b3b565b5b509050613b649190613bab565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613bc4576000816000905550600101613bac565b5090565b6000613bdb613bd684614c3a565b614c15565b90508083825260208201905082856020860282011115613bfe57613bfd615130565b5b60005b85811015613c2e5781613c148882613c7a565b845260208401935060208301925050600181019050613c01565b5050509392505050565b6000613c4b613c4684614c66565b614c15565b905082815260208101848484011115613c6757613c66615135565b5b613c72848285614edf565b509392505050565b600081359050613c8981615641565b92915050565b600081359050613c9e81615658565b92915050565b600082601f830112613cb957613cb8615126565b5b8135613cc9848260208601613bc8565b91505092915050565b600081359050613ce18161566f565b92915050565b600081519050613cf68161566f565b92915050565b600081359050613d0b81615686565b92915050565b600081359050613d208161569d565b92915050565b600081519050613d358161569d565b92915050565b600082601f830112613d5057613d4f615126565b5b8135613d60848260208601613c38565b91505092915050565b600081359050613d78816156b4565b92915050565b60008083601f840112613d9457613d93615126565b5b8235905067ffffffffffffffff811115613db157613db0615121565b5b602083019150836001820283011115613dcd57613dcc615130565b5b9250929050565b600060608284031215613dea57613de961512b565b5b613df46060614c15565b90506000613e0484828501613e62565b6000830152506020613e1884828501613cfc565b6020830152506040613e2c84828501613cfc565b60408301525092915050565b600081359050613e47816156cb565b92915050565b600081519050613e5c816156cb565b92915050565b600081359050613e71816156e2565b92915050565b600060208284031215613e8d57613e8c61513f565b5b6000613e9b84828501613c7a565b91505092915050565b600060208284031215613eba57613eb961513f565b5b6000613ec884828501613c8f565b91505092915050565b60008060408385031215613ee857613ee761513f565b5b6000613ef685828601613c7a565b9250506020613f0785828601613c7a565b9150509250929050565b600080600060608486031215613f2a57613f2961513f565b5b6000613f3886828701613c7a565b9350506020613f4986828701613c7a565b9250506040613f5a86828701613e38565b9150509250925092565b60008060008060808587031215613f7e57613f7d61513f565b5b6000613f8c87828801613c7a565b9450506020613f9d87828801613c7a565b9350506040613fae87828801613e38565b925050606085013567ffffffffffffffff811115613fcf57613fce61513a565b5b613fdb87828801613d3b565b91505092959194509250565b60008060408385031215613ffe57613ffd61513f565b5b600061400c85828601613c7a565b925050602061401d85828601613cd2565b9150509250929050565b6000806040838503121561403e5761403d61513f565b5b600061404c85828601613c7a565b925050602061405d85828601613e38565b9150509250929050565b60006020828403121561407d5761407c61513f565b5b600082013567ffffffffffffffff81111561409b5761409a61513a565b5b6140a784828501613ca4565b91505092915050565b6000602082840312156140c6576140c561513f565b5b60006140d484828501613ce7565b91505092915050565b6000602082840312156140f3576140f261513f565b5b600061410184828501613d11565b91505092915050565b6000602082840312156141205761411f61513f565b5b600061412e84828501613d26565b91505092915050565b60006020828403121561414d5761414c61513f565b5b600061415b84828501613d69565b91505092915050565b6000806040838503121561417b5761417a61513f565b5b600061418985828601613d69565b925050602061419a85828601613c7a565b9150509250929050565b600080602083850312156141bb576141ba61513f565b5b600083013567ffffffffffffffff8111156141d9576141d861513a565b5b6141e585828601613d7e565b92509250509250929050565b6000602082840312156142075761420661513f565b5b600061421584828501613e38565b91505092915050565b6000602082840312156142345761423361513f565b5b600061424284828501613e4d565b91505092915050565b60008060008060c085870312156142655761426461513f565b5b600061427387828801613e38565b945050602061428487828801613e38565b935050604061429587828801613e38565b92505060606142a687828801613dd4565b91505092959194509250565b6142bb81614ea9565b82525050565b6142ca81614dfa565b82525050565b6142e16142dc82614dfa565b614fcd565b82525050565b6142f081614e1e565b82525050565b6142ff81614e2a565b82525050565b61431661431182614e2a565b614fdf565b82525050565b600061432782614c97565b6143318185614cad565b9350614341818560208601614eee565b61434a81615144565b840191505092915050565b600061436082614c97565b61436a8185614cbe565b935061437a818560208601614eee565b80840191505092915050565b600061439182614ca2565b61439b8185614cc9565b93506143ab818560208601614eee565b6143b481615144565b840191505092915050565b60006143ca82614ca2565b6143d48185614cda565b93506143e4818560208601614eee565b80840191505092915050565b60006143fd601183614cc9565b915061440882615162565b602082019050919050565b6000614420602683614cc9565b915061442b8261518b565b604082019050919050565b6000614443602583614cc9565b915061444e826151da565b604082019050919050565b6000614466601983614cc9565b915061447182615229565b602082019050919050565b6000614489602683614cc9565b915061449482615252565b604082019050919050565b60006144ac602483614cc9565b91506144b7826152a1565b604082019050919050565b60006144cf603a83614cc9565b91506144da826152f0565b604082019050919050565b60006144f2601d83614cc9565b91506144fd8261533f565b602082019050919050565b6000614515602683614cc9565b915061452082615368565b604082019050919050565b6000614538602b83614cc9565b9150614543826153b7565b604082019050919050565b600061455b601083614cc9565b915061456682615406565b602082019050919050565b600061457e601883614cc9565b91506145898261542f565b602082019050919050565b60006145a1601183614cc9565b91506145ac82615458565b602082019050919050565b60006145c4602083614cc9565b91506145cf82615481565b602082019050919050565b60006145e7602e83614cc9565b91506145f2826154aa565b604082019050919050565b600061460a600d83614cc9565b9150614615826154f9565b602082019050919050565b600061462d600083614cbe565b915061463882615522565b600082019050919050565b6000614650601d83614cc9565b915061465b82615525565b602082019050919050565b6000614673601b83614cc9565b915061467e8261554e565b602082019050919050565b6000614696602a83614cc9565b91506146a182615577565b604082019050919050565b60006146b9601583614cc9565b91506146c4826155c6565b602082019050919050565b60006146dc601783614cc9565b91506146e7826155ef565b602082019050919050565b60006146ff601183614cc9565b915061470a82615618565b602082019050919050565b61471e81614e92565b82525050565b61473561473082614e92565b614ffb565b82525050565b61474481614e9c565b82525050565b600061475682866142d0565b6014820191506147668285614724565b6020820191506147768284614724565b602082019150819050949350505050565b60006147938284614355565b915081905092915050565b60006147aa82856143bf565b91506147b68284614305565b6020820191508190509392505050565b60006147d282856143bf565b91506147de82846143bf565b91508190509392505050565b60006147f582614620565b9150819050919050565b600060208201905061481460008301846142c1565b92915050565b600060408201905061482f60008301856142b2565b61483c6020830184614715565b9392505050565b600060808201905061485860008301876142c1565b61486560208301866142c1565b6148726040830185614715565b8181036060830152614884818461431c565b905095945050505050565b60006040820190506148a460008301856142c1565b6148b16020830184614715565b9392505050565b60006020820190506148cd60008301846142e7565b92915050565b60006080820190506148e860008301876142f6565b6148f5602083018661473b565b61490260408301856142f6565b61490f60608301846142f6565b95945050505050565b600060208201905081810360008301526149328184614386565b905092915050565b60006020820190508181036000830152614953816143f0565b9050919050565b6000602082019050818103600083015261497381614413565b9050919050565b6000602082019050818103600083015261499381614436565b9050919050565b600060208201905081810360008301526149b381614459565b9050919050565b600060208201905081810360008301526149d38161447c565b9050919050565b600060208201905081810360008301526149f38161449f565b9050919050565b60006020820190508181036000830152614a13816144c2565b9050919050565b60006020820190508181036000830152614a33816144e5565b9050919050565b60006020820190508181036000830152614a5381614508565b9050919050565b60006020820190508181036000830152614a738161452b565b9050919050565b60006020820190508181036000830152614a938161454e565b9050919050565b60006020820190508181036000830152614ab381614571565b9050919050565b60006020820190508181036000830152614ad381614594565b9050919050565b60006020820190508181036000830152614af3816145b7565b9050919050565b60006020820190508181036000830152614b13816145da565b9050919050565b60006020820190508181036000830152614b33816145fd565b9050919050565b60006020820190508181036000830152614b5381614643565b9050919050565b60006020820190508181036000830152614b7381614666565b9050919050565b60006020820190508181036000830152614b9381614689565b9050919050565b60006020820190508181036000830152614bb3816146ac565b9050919050565b60006020820190508181036000830152614bd3816146cf565b9050919050565b60006020820190508181036000830152614bf3816146f2565b9050919050565b6000602082019050614c0f6000830184614715565b92915050565b6000614c1f614c30565b9050614c2b8282614f53565b919050565b6000604051905090565b600067ffffffffffffffff821115614c5557614c546150f2565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614c8157614c806150f2565b5b614c8a82615144565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614cf082614e92565b9150614cfb83614e92565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d3057614d2f615036565b5b828201905092915050565b6000614d4682614e92565b9150614d5183614e92565b925082614d6157614d60615065565b5b828204905092915050565b6000614d7782614e92565b9150614d8283614e92565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614dbb57614dba615036565b5b828202905092915050565b6000614dd182614e92565b9150614ddc83614e92565b925082821015614def57614dee615036565b5b828203905092915050565b6000614e0582614e72565b9050919050565b6000614e1782614e72565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614e6b82614dfa565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614eb482614ebb565b9050919050565b6000614ec682614ecd565b9050919050565b6000614ed882614e72565b9050919050565b82818337600083830152505050565b60005b83811015614f0c578082015181840152602081019050614ef1565b83811115614f1b576000848401525b50505050565b60006002820490506001821680614f3957607f821691505b60208210811415614f4d57614f4c615094565b5b50919050565b614f5c82615144565b810181811067ffffffffffffffff82111715614f7b57614f7a6150f2565b5b80604052505050565b6000614f8f82614e92565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614fc257614fc1615036565b5b600182019050919050565b6000614fd882614fe9565b9050919050565b6000819050919050565b6000614ff482615155565b9050919050565b6000819050919050565b600061501082614e92565b915061501b83614e92565b92508261502b5761502a615065565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f312043524f414b203d2031204d46335221000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74206578636565642063617070656420737570706c7920666f722060008201527f6d66657273000000000000000000000000000000000000000000000000000000602082015250565b7f5075626c6963206d696e74206e6f7420617661696c61626c6500000000000000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74206578636565642063617070656420737570706c79207065722060008201527f6d66657200000000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f31204d464552203d2031204d4633522100000000000000000000000000000000600082015250565b7f43616e6e6f7420657863656564206d617820737570706c790000000000000000600082015250565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616e6e6f74206578636565642063617070656420737570706c79207065722060008201527f7075626c69632061646472657373000000000000000000000000000000000000602082015250565b7f4e6f20636f6e7472616374732100000000000000000000000000000000000000600082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f446576204d696e74205065726d616e656e746c79204c6f636b65640000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f46696e616c20706861736520697320434c4f5345440000000000000000000000600082015250565b7f4d696e74696e6720686173206e6f742073746172746564000000000000000000600082015250565b7f4e6f206261636b2d7374657070696e6721000000000000000000000000000000600082015250565b61564a81614dfa565b811461565557600080fd5b50565b61566181614e0c565b811461566c57600080fd5b50565b61567881614e1e565b811461568357600080fd5b50565b61568f81614e2a565b811461569a57600080fd5b50565b6156a681614e34565b81146156b157600080fd5b50565b6156bd81614e60565b81146156c857600080fd5b50565b6156d481614e92565b81146156df57600080fd5b50565b6156eb81614e9c565b81146156f657600080fd5b5056fea2646970667358221220ffc8bb45d24fa8d44c9571ec27a3ebe58db9e14cb46089c27fbf96e544fff4f464736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000056d6633727300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054d46335253000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000092bce497efe4332a8f611004f67e14093b5d0e8c00000000000000000000000060a7b634ff8ab48268fd2369ea86f2099a0f17770000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002d0000000000000000000000000000000000000000000000000000000000000037
Deployed Bytecode
0x60806040526004361061021e5760003560e01c806370a0823111610123578063b88d4fde116100ab578063d79779b21161006f578063d79779b21461083c578063dc33e68114610879578063e33b7de3146108b6578063e985e9c5146108e1578063f2fde38b1461091e57610265565b8063b88d4fde14610745578063bec59f7a1461076e578063c52766c614610797578063c87b56dd146107c2578063ce7c2ac2146107ff57610265565b806395d89b41116100f257806395d89b41146106605780639852595c1461068b578063a22cb465146106c8578063a2309ff8146106f1578063a3ea97851461071c57610265565b806370a08231146105a4578063715018a6146105e15780638b83209b146105f85780638da5cb5b1461063557610265565b80632db11544116101a657806348b750441161017557806348b75044146104af5780634f558e79146104d857806355f804b314610515578063615d166e1461053e5780636352211e1461056757610265565b80632db11544146103f55780633a98ef391461041e578063406072a91461044957806342842e0e1461048657610265565b8063081812fc116101ed578063081812fc14610312578063095ea7b31461034f57806318160ddd1461037857806319165587146103a357806323b872dd146103cc57610265565b8063014b0c8a1461026a57806301ffc9a71461029357806306fd5133146102d057806306fdde03146102e757610265565b36610265577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061024c610947565b3460405161025b92919061488f565b60405180910390a1005b600080fd5b34801561027657600080fd5b50610291600480360381019061028c9190614067565b61094f565b005b34801561029f57600080fd5b506102ba60048036038101906102b591906140dd565b610a5d565b6040516102c791906148b8565b60405180910390f35b3480156102dc57600080fd5b506102e5610b3f565b005b3480156102f357600080fd5b506102fc610bd8565b6040516103099190614918565b60405180910390f35b34801561031e57600080fd5b50610339600480360381019061033491906141f1565b610c6a565b60405161034691906147ff565b60405180910390f35b34801561035b57600080fd5b5061037660048036038101906103719190614027565b610ce6565b005b34801561038457600080fd5b5061038d610df1565b60405161039a9190614bfa565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190613ea4565b610e08565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190613f11565b610fb3565b005b34801561040157600080fd5b5061041c600480360381019061041791906141f1565b610fc3565b005b34801561042a57600080fd5b506104336111aa565b6040516104409190614bfa565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b9190614164565b6111b4565b60405161047d9190614bfa565b60405180910390f35b34801561049257600080fd5b506104ad60048036038101906104a89190613f11565b61123b565b005b3480156104bb57600080fd5b506104d660048036038101906104d19190614164565b61125b565b005b3480156104e457600080fd5b506104ff60048036038101906104fa91906141f1565b611523565b60405161050c91906148b8565b60405180910390f35b34801561052157600080fd5b5061053c600480360381019061053791906141a4565b611535565b005b34801561054a57600080fd5b50610565600480360381019061056091906141f1565b6115c7565b005b34801561057357600080fd5b5061058e600480360381019061058991906141f1565b6116d5565b60405161059b91906147ff565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c69190613e77565b6116eb565b6040516105d89190614bfa565b60405180910390f35b3480156105ed57600080fd5b506105f66117bb565b005b34801561060457600080fd5b5061061f600480360381019061061a91906141f1565b611843565b60405161062c91906147ff565b60405180910390f35b34801561064157600080fd5b5061064a61188b565b60405161065791906147ff565b60405180910390f35b34801561066c57600080fd5b506106756118b5565b6040516106829190614918565b60405180910390f35b34801561069757600080fd5b506106b260048036038101906106ad9190613e77565b611947565b6040516106bf9190614bfa565b60405180910390f35b3480156106d457600080fd5b506106ef60048036038101906106ea9190613fe7565b611990565b005b3480156106fd57600080fd5b50610706611b08565b6040516107139190614bfa565b60405180910390f35b34801561072857600080fd5b50610743600480360381019061073e9190613e77565b611b17565b005b34801561075157600080fd5b5061076c60048036038101906107679190613f64565b611bd7565b005b34801561077a57600080fd5b506107956004803603810190610790919061424b565b611c53565b005b3480156107a357600080fd5b506107ac61207b565b6040516107b99190614bfa565b60405180910390f35b3480156107ce57600080fd5b506107e960048036038101906107e491906141f1565b612085565b6040516107f69190614918565b60405180910390f35b34801561080b57600080fd5b5061082660048036038101906108219190613e77565b612124565b6040516108339190614bfa565b60405180910390f35b34801561084857600080fd5b50610863600480360381019061085e9190614137565b61216d565b6040516108709190614bfa565b60405180910390f35b34801561088557600080fd5b506108a0600480360381019061089b9190613e77565b6121b6565b6040516108ad9190614bfa565b60405180910390f35b3480156108c257600080fd5b506108cb6121c8565b6040516108d89190614bfa565b60405180910390f35b3480156108ed57600080fd5b5061090860048036038101906109039190613ed1565b6121d2565b60405161091591906148b8565b60405180910390f35b34801561092a57600080fd5b5061094560048036038101906109409190613e77565b612266565b005b600033905090565b610957610947565b73ffffffffffffffffffffffffffffffffffffffff1661097561188b565b73ffffffffffffffffffffffffffffffffffffffff16146109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c290614ada565b60405180910390fd5b601260009054906101000a900460ff1615610a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1290614b5a565b60405180910390fd5b60005b8151811015610a5957610a4c828281518110610a3d57610a3c6150c3565b5b6020026020010151600161235e565b8080600101915050610a1e565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b385750610b378261237c565b5b9050919050565b610b47610947565b73ffffffffffffffffffffffffffffffffffffffff16610b6561188b565b73ffffffffffffffffffffffffffffffffffffffff1614610bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb290614ada565b60405180910390fd5b6001601260006101000a81548160ff021916908315150217905550565b606060028054610be790614f21565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1390614f21565b8015610c605780601f10610c3557610100808354040283529160200191610c60565b820191906000526020600020905b815481529060010190602001808311610c4357829003601f168201915b5050505050905090565b6000610c75826123e6565b610cab576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cf1826116d5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d59576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d78610947565b73ffffffffffffffffffffffffffffffffffffffff1614158015610daa5750610da881610da3610947565b6121d2565b155b15610de1576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dec838383612434565b505050565b6000610dfb6124e6565b6001546000540303905090565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e81906149ba565b60405180910390fd5b6000610e946121c8565b47610e9f9190614ce5565b90506000610eb68383610eb186611947565b6124eb565b90506000811415610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef390614a5a565b60405180910390fd5b80600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f4b9190614ce5565b925050819055508060096000828254610f649190614ce5565b92505081905550610f758382612559565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610fa692919061481a565b60405180910390a1505050565b610fbe83838361264d565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102890614b1a565b60405180910390fd5b600360105414611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106d9061499a565b60405180910390fd5b61271081611082612b3e565b61108c9190614ce5565b11156110cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c490614a9a565b60405180910390fd5b80601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561119d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119490614afa565b60405180910390fd5b6111a7338261235e565b50565b6000600854905090565b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61125683838360405180602001604052806000815250611bd7565b505050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116112dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d4906149ba565b60405180910390fd5b60006112e88361216d565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161132191906147ff565b60206040518083038186803b15801561133957600080fd5b505afa15801561134d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611371919061421e565b61137b9190614ce5565b90506000611393838361138e87876111b4565b6124eb565b905060008114156113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d090614a5a565b60405180910390fd5b80600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114659190614ce5565b9250508190555080600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114bb9190614ce5565b925050819055506114cd848483612b51565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a848360405161151592919061488f565b60405180910390a250505050565b600061152e826123e6565b9050919050565b61153d610947565b73ffffffffffffffffffffffffffffffffffffffff1661155b61188b565b73ffffffffffffffffffffffffffffffffffffffff16146115b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a890614ada565b60405180910390fd5b8181601791906115c2929190613ae2565b505050565b6115cf610947565b73ffffffffffffffffffffffffffffffffffffffff166115ed61188b565b73ffffffffffffffffffffffffffffffffffffffff1614611643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163a90614ada565b60405180910390fd5b6010548111611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e90614bda565b60405180910390fd5b60048111156116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c290614b9a565b60405180910390fd5b8060108190555050565b60006116e082612bd7565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611753576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6117c3610947565b73ffffffffffffffffffffffffffffffffffffffff166117e161188b565b73ffffffffffffffffffffffffffffffffffffffff1614611837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182e90614ada565b60405180910390fd5b6118416000612e66565b565b6000600c8281548110611859576118586150c3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546118c490614f21565b80601f01602080910402602001604051908101604052809291908181526020018280546118f090614f21565b801561193d5780601f106119125761010080835404028352916020019161193d565b820191906000526020600020905b81548152906001019060200180831161192057829003601f168201915b5050505050905090565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611998610947565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119fd576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611a0a610947565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ab7610947565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611afc91906148b8565b60405180910390a35050565b6000611b12612b3e565b905090565b611b1f610947565b73ffffffffffffffffffffffffffffffffffffffff16611b3d61188b565b73ffffffffffffffffffffffffffffffffffffffff1614611b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8a90614ada565b60405180910390fd5b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611be284848461264d565b611c018373ffffffffffffffffffffffffffffffffffffffff16612f2c565b8015611c165750611c1484848484612f4f565b155b15611c4d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb890614b1a565b60405180910390fd5b600060105411611d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfd90614bba565b60405180910390fd5b61271084611d12612b3e565b611d1c9190614ce5565b1115611d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5490614a9a565b60405180910390fd5b6000338484604051602001611d749392919061474a565b604051602081830303815290604052805190602001209050611dc3601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682846130af9092919063ffffffff16565b6000841415611eaa5784601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555082601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e929061493a565b60405180910390fd5b611ea5338661235e565b612074565b60018414156120735784601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555082601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7990614a7a565b60405180910390fd5b846011600082825401925050819055506001601054141561206857610bbc6011541115611fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdb9061497a565b60405180910390fd5b600a601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115612067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205e906149da565b60405180910390fd5b5b612072338661235e565b5b5b5050505050565b6000601054905090565b6060612090826123e6565b6120c6576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006120d06131d9565b90506000815114156120f1576040518060200160405280600081525061211c565b806120fb8461326b565b60405160200161210c9291906147c6565b6040516020818303038152906040525b915050919050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006121c1826133cc565b9050919050565b6000600954905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61226e610947565b73ffffffffffffffffffffffffffffffffffffffff1661228c61188b565b73ffffffffffffffffffffffffffffffffffffffff16146122e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d990614ada565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612352576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123499061495a565b60405180910390fd5b61235b81612e66565b50565b61237882826040518060200160405280600081525061349c565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816123f16124e6565b11158015612400575060005482105b801561242d575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600081600854600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561253c9190614d6c565b6125469190614d3b565b6125509190614dc6565b90509392505050565b8047101561259c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259390614a1a565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516125c2906147ea565b60006040518083038185875af1925050503d80600081146125ff576040519150601f19603f3d011682016040523d82523d6000602084013e612604565b606091505b5050905080612648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263f906149fa565b60405180910390fd5b505050565b600061265882612bd7565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661267f610947565b73ffffffffffffffffffffffffffffffffffffffff1614806126b257506126b182600001516126ac610947565b6121d2565b5b806126f757506126c0610947565b73ffffffffffffffffffffffffffffffffffffffff166126df84610c6a565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612730576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612799576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612800576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61280d85858560016134ae565b61281d6000848460000151612434565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612ace57600054811015612acd5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b3785858560016134b4565b5050505050565b6000612b486124e6565b60005403905090565b612bd28363a9059cbb60e01b8484604051602401612b7092919061488f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506134ba565b505050565b612bdf613b68565b600082905080612bed6124e6565b11158015612bfc575060005481105b15612e2f576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612e2d57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d11578092505050612e61565b5b600115612e2c57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e27578092505050612e61565b612d12565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f75610947565b8786866040518563ffffffff1660e01b8152600401612f979493929190614843565b602060405180830381600087803b158015612fb157600080fd5b505af1925050508015612fe257506040513d601f19601f82011682018060405250810190612fdf919061410a565b60015b61305c573d8060008114613012576040519150601f19603f3d011682016040523d82523d6000602084013e613017565b606091505b50600081511415613054576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60016040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250826040516020016130f992919061479e565b604051602081830303815290604052805190602001208460000151856020015186604001516040516000815260200160405260405161313b94939291906148d3565b6020604051602081039080840390855afa15801561315d573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cb90614aba565b60405180910390fd5b505050565b6060601780546131e890614f21565b80601f016020809104026020016040519081016040528092919081815260200182805461321490614f21565b80156132615780601f1061323657610100808354040283529160200191613261565b820191906000526020600020905b81548152906001019060200180831161324457829003601f168201915b5050505050905090565b606060008214156132b3576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133c7565b600082905060005b600082146132e55780806132ce90614f84565b915050600a826132de9190614d3b565b91506132bb565b60008167ffffffffffffffff811115613301576133006150f2565b5b6040519080825280601f01601f1916602001820160405280156133335781602001600182028036833780820191505090505b5090505b600085146133c05760018261334c9190614dc6565b9150600a8561335b9190615005565b60306133679190614ce5565b60f81b81838151811061337d5761337c6150c3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133b99190614d3b565b9450613337565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613434576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6134a98383836001613581565b505050565b50505050565b50505050565b600061351c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661394f9092919063ffffffff16565b905060008151111561357c578080602001905181019061353c91906140b0565b61357b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357290614b7a565b60405180910390fd5b5b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156135ee576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613629576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61363660008683876134ae565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561380057506137ff8773ffffffffffffffffffffffffffffffffffffffff16612f2c565b5b156138c6575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138756000888480600101955088612f4f565b6138ab576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156138065782600054146138c157600080fd5b613932565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156138c7575b81600081905550505061394860008683876134b4565b5050505050565b606061395e8484600085613967565b90509392505050565b6060824710156139ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139a390614a3a565b60405180910390fd5b6139b585612f2c565b6139f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139eb90614b3a565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613a1d9190614787565b60006040518083038185875af1925050503d8060008114613a5a576040519150601f19603f3d011682016040523d82523d6000602084013e613a5f565b606091505b5091509150613a6f828286613a7b565b92505050949350505050565b60608315613a8b57829050613adb565b600083511115613a9e5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ad29190614918565b60405180910390fd5b9392505050565b828054613aee90614f21565b90600052602060002090601f016020900481019282613b105760008555613b57565b82601f10613b2957803560ff1916838001178555613b57565b82800160010185558215613b57579182015b82811115613b56578235825591602001919060010190613b3b565b5b509050613b649190613bab565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613bc4576000816000905550600101613bac565b5090565b6000613bdb613bd684614c3a565b614c15565b90508083825260208201905082856020860282011115613bfe57613bfd615130565b5b60005b85811015613c2e5781613c148882613c7a565b845260208401935060208301925050600181019050613c01565b5050509392505050565b6000613c4b613c4684614c66565b614c15565b905082815260208101848484011115613c6757613c66615135565b5b613c72848285614edf565b509392505050565b600081359050613c8981615641565b92915050565b600081359050613c9e81615658565b92915050565b600082601f830112613cb957613cb8615126565b5b8135613cc9848260208601613bc8565b91505092915050565b600081359050613ce18161566f565b92915050565b600081519050613cf68161566f565b92915050565b600081359050613d0b81615686565b92915050565b600081359050613d208161569d565b92915050565b600081519050613d358161569d565b92915050565b600082601f830112613d5057613d4f615126565b5b8135613d60848260208601613c38565b91505092915050565b600081359050613d78816156b4565b92915050565b60008083601f840112613d9457613d93615126565b5b8235905067ffffffffffffffff811115613db157613db0615121565b5b602083019150836001820283011115613dcd57613dcc615130565b5b9250929050565b600060608284031215613dea57613de961512b565b5b613df46060614c15565b90506000613e0484828501613e62565b6000830152506020613e1884828501613cfc565b6020830152506040613e2c84828501613cfc565b60408301525092915050565b600081359050613e47816156cb565b92915050565b600081519050613e5c816156cb565b92915050565b600081359050613e71816156e2565b92915050565b600060208284031215613e8d57613e8c61513f565b5b6000613e9b84828501613c7a565b91505092915050565b600060208284031215613eba57613eb961513f565b5b6000613ec884828501613c8f565b91505092915050565b60008060408385031215613ee857613ee761513f565b5b6000613ef685828601613c7a565b9250506020613f0785828601613c7a565b9150509250929050565b600080600060608486031215613f2a57613f2961513f565b5b6000613f3886828701613c7a565b9350506020613f4986828701613c7a565b9250506040613f5a86828701613e38565b9150509250925092565b60008060008060808587031215613f7e57613f7d61513f565b5b6000613f8c87828801613c7a565b9450506020613f9d87828801613c7a565b9350506040613fae87828801613e38565b925050606085013567ffffffffffffffff811115613fcf57613fce61513a565b5b613fdb87828801613d3b565b91505092959194509250565b60008060408385031215613ffe57613ffd61513f565b5b600061400c85828601613c7a565b925050602061401d85828601613cd2565b9150509250929050565b6000806040838503121561403e5761403d61513f565b5b600061404c85828601613c7a565b925050602061405d85828601613e38565b9150509250929050565b60006020828403121561407d5761407c61513f565b5b600082013567ffffffffffffffff81111561409b5761409a61513a565b5b6140a784828501613ca4565b91505092915050565b6000602082840312156140c6576140c561513f565b5b60006140d484828501613ce7565b91505092915050565b6000602082840312156140f3576140f261513f565b5b600061410184828501613d11565b91505092915050565b6000602082840312156141205761411f61513f565b5b600061412e84828501613d26565b91505092915050565b60006020828403121561414d5761414c61513f565b5b600061415b84828501613d69565b91505092915050565b6000806040838503121561417b5761417a61513f565b5b600061418985828601613d69565b925050602061419a85828601613c7a565b9150509250929050565b600080602083850312156141bb576141ba61513f565b5b600083013567ffffffffffffffff8111156141d9576141d861513a565b5b6141e585828601613d7e565b92509250509250929050565b6000602082840312156142075761420661513f565b5b600061421584828501613e38565b91505092915050565b6000602082840312156142345761423361513f565b5b600061424284828501613e4d565b91505092915050565b60008060008060c085870312156142655761426461513f565b5b600061427387828801613e38565b945050602061428487828801613e38565b935050604061429587828801613e38565b92505060606142a687828801613dd4565b91505092959194509250565b6142bb81614ea9565b82525050565b6142ca81614dfa565b82525050565b6142e16142dc82614dfa565b614fcd565b82525050565b6142f081614e1e565b82525050565b6142ff81614e2a565b82525050565b61431661431182614e2a565b614fdf565b82525050565b600061432782614c97565b6143318185614cad565b9350614341818560208601614eee565b61434a81615144565b840191505092915050565b600061436082614c97565b61436a8185614cbe565b935061437a818560208601614eee565b80840191505092915050565b600061439182614ca2565b61439b8185614cc9565b93506143ab818560208601614eee565b6143b481615144565b840191505092915050565b60006143ca82614ca2565b6143d48185614cda565b93506143e4818560208601614eee565b80840191505092915050565b60006143fd601183614cc9565b915061440882615162565b602082019050919050565b6000614420602683614cc9565b915061442b8261518b565b604082019050919050565b6000614443602583614cc9565b915061444e826151da565b604082019050919050565b6000614466601983614cc9565b915061447182615229565b602082019050919050565b6000614489602683614cc9565b915061449482615252565b604082019050919050565b60006144ac602483614cc9565b91506144b7826152a1565b604082019050919050565b60006144cf603a83614cc9565b91506144da826152f0565b604082019050919050565b60006144f2601d83614cc9565b91506144fd8261533f565b602082019050919050565b6000614515602683614cc9565b915061452082615368565b604082019050919050565b6000614538602b83614cc9565b9150614543826153b7565b604082019050919050565b600061455b601083614cc9565b915061456682615406565b602082019050919050565b600061457e601883614cc9565b91506145898261542f565b602082019050919050565b60006145a1601183614cc9565b91506145ac82615458565b602082019050919050565b60006145c4602083614cc9565b91506145cf82615481565b602082019050919050565b60006145e7602e83614cc9565b91506145f2826154aa565b604082019050919050565b600061460a600d83614cc9565b9150614615826154f9565b602082019050919050565b600061462d600083614cbe565b915061463882615522565b600082019050919050565b6000614650601d83614cc9565b915061465b82615525565b602082019050919050565b6000614673601b83614cc9565b915061467e8261554e565b602082019050919050565b6000614696602a83614cc9565b91506146a182615577565b604082019050919050565b60006146b9601583614cc9565b91506146c4826155c6565b602082019050919050565b60006146dc601783614cc9565b91506146e7826155ef565b602082019050919050565b60006146ff601183614cc9565b915061470a82615618565b602082019050919050565b61471e81614e92565b82525050565b61473561473082614e92565b614ffb565b82525050565b61474481614e9c565b82525050565b600061475682866142d0565b6014820191506147668285614724565b6020820191506147768284614724565b602082019150819050949350505050565b60006147938284614355565b915081905092915050565b60006147aa82856143bf565b91506147b68284614305565b6020820191508190509392505050565b60006147d282856143bf565b91506147de82846143bf565b91508190509392505050565b60006147f582614620565b9150819050919050565b600060208201905061481460008301846142c1565b92915050565b600060408201905061482f60008301856142b2565b61483c6020830184614715565b9392505050565b600060808201905061485860008301876142c1565b61486560208301866142c1565b6148726040830185614715565b8181036060830152614884818461431c565b905095945050505050565b60006040820190506148a460008301856142c1565b6148b16020830184614715565b9392505050565b60006020820190506148cd60008301846142e7565b92915050565b60006080820190506148e860008301876142f6565b6148f5602083018661473b565b61490260408301856142f6565b61490f60608301846142f6565b95945050505050565b600060208201905081810360008301526149328184614386565b905092915050565b60006020820190508181036000830152614953816143f0565b9050919050565b6000602082019050818103600083015261497381614413565b9050919050565b6000602082019050818103600083015261499381614436565b9050919050565b600060208201905081810360008301526149b381614459565b9050919050565b600060208201905081810360008301526149d38161447c565b9050919050565b600060208201905081810360008301526149f38161449f565b9050919050565b60006020820190508181036000830152614a13816144c2565b9050919050565b60006020820190508181036000830152614a33816144e5565b9050919050565b60006020820190508181036000830152614a5381614508565b9050919050565b60006020820190508181036000830152614a738161452b565b9050919050565b60006020820190508181036000830152614a938161454e565b9050919050565b60006020820190508181036000830152614ab381614571565b9050919050565b60006020820190508181036000830152614ad381614594565b9050919050565b60006020820190508181036000830152614af3816145b7565b9050919050565b60006020820190508181036000830152614b13816145da565b9050919050565b60006020820190508181036000830152614b33816145fd565b9050919050565b60006020820190508181036000830152614b5381614643565b9050919050565b60006020820190508181036000830152614b7381614666565b9050919050565b60006020820190508181036000830152614b9381614689565b9050919050565b60006020820190508181036000830152614bb3816146ac565b9050919050565b60006020820190508181036000830152614bd3816146cf565b9050919050565b60006020820190508181036000830152614bf3816146f2565b9050919050565b6000602082019050614c0f6000830184614715565b92915050565b6000614c1f614c30565b9050614c2b8282614f53565b919050565b6000604051905090565b600067ffffffffffffffff821115614c5557614c546150f2565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614c8157614c806150f2565b5b614c8a82615144565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614cf082614e92565b9150614cfb83614e92565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d3057614d2f615036565b5b828201905092915050565b6000614d4682614e92565b9150614d5183614e92565b925082614d6157614d60615065565b5b828204905092915050565b6000614d7782614e92565b9150614d8283614e92565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614dbb57614dba615036565b5b828202905092915050565b6000614dd182614e92565b9150614ddc83614e92565b925082821015614def57614dee615036565b5b828203905092915050565b6000614e0582614e72565b9050919050565b6000614e1782614e72565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614e6b82614dfa565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614eb482614ebb565b9050919050565b6000614ec682614ecd565b9050919050565b6000614ed882614e72565b9050919050565b82818337600083830152505050565b60005b83811015614f0c578082015181840152602081019050614ef1565b83811115614f1b576000848401525b50505050565b60006002820490506001821680614f3957607f821691505b60208210811415614f4d57614f4c615094565b5b50919050565b614f5c82615144565b810181811067ffffffffffffffff82111715614f7b57614f7a6150f2565b5b80604052505050565b6000614f8f82614e92565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614fc257614fc1615036565b5b600182019050919050565b6000614fd882614fe9565b9050919050565b6000819050919050565b6000614ff482615155565b9050919050565b6000819050919050565b600061501082614e92565b915061501b83614e92565b92508261502b5761502a615065565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f312043524f414b203d2031204d46335221000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74206578636565642063617070656420737570706c7920666f722060008201527f6d66657273000000000000000000000000000000000000000000000000000000602082015250565b7f5075626c6963206d696e74206e6f7420617661696c61626c6500000000000000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74206578636565642063617070656420737570706c79207065722060008201527f6d66657200000000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f31204d464552203d2031204d4633522100000000000000000000000000000000600082015250565b7f43616e6e6f7420657863656564206d617820737570706c790000000000000000600082015250565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616e6e6f74206578636565642063617070656420737570706c79207065722060008201527f7075626c69632061646472657373000000000000000000000000000000000000602082015250565b7f4e6f20636f6e7472616374732100000000000000000000000000000000000000600082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f446576204d696e74205065726d616e656e746c79204c6f636b65640000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f46696e616c20706861736520697320434c4f5345440000000000000000000000600082015250565b7f4d696e74696e6720686173206e6f742073746172746564000000000000000000600082015250565b7f4e6f206261636b2d7374657070696e6721000000000000000000000000000000600082015250565b61564a81614dfa565b811461565557600080fd5b50565b61566181614e0c565b811461566c57600080fd5b50565b61567881614e1e565b811461568357600080fd5b50565b61568f81614e2a565b811461569a57600080fd5b50565b6156a681614e34565b81146156b157600080fd5b50565b6156bd81614e60565b81146156c857600080fd5b50565b6156d481614e92565b81146156df57600080fd5b50565b6156eb81614e9c565b81146156f657600080fd5b5056fea2646970667358221220ffc8bb45d24fa8d44c9571ec27a3ebe58db9e14cb46089c27fbf96e544fff4f464736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000056d6633727300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054d46335253000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000092bce497efe4332a8f611004f67e14093b5d0e8c00000000000000000000000060a7b634ff8ab48268fd2369ea86f2099a0f17770000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002d0000000000000000000000000000000000000000000000000000000000000037
-----Decoded View---------------
Arg [0] : name_ (string): mf3rs
Arg [1] : symbol_ (string): MF3RS
Arg [2] : payees (address[]): 0x92BCE497EfE4332a8F611004F67E14093B5d0e8c,0x60A7B634FF8Ab48268Fd2369Ea86F2099a0F1777
Arg [3] : shares_ (uint256[]): 45,55
-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 6d66337273000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 4d46335253000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [9] : 00000000000000000000000092bce497efe4332a8f611004f67e14093b5d0e8c
Arg [10] : 00000000000000000000000060a7b634ff8ab48268fd2369ea86f2099a0f1777
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [12] : 000000000000000000000000000000000000000000000000000000000000002d
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000037
Deployed Bytecode Sourcemap
63954:4775:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24944:40;24960:12;:10;:12::i;:::-;24974:9;24944:40;;;;;;;:::i;:::-;;;;;;;;63954:4775;;;;;68329:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45693:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68645:81;;;;;;;;;;;;;:::i;:::-;;49078:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50581:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50144:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44942:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26730:566;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51438:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66399:502;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25075:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26204:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51679:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27564:641;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66177:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66063:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65316:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48887:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46062:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2713:103;;;;;;;;;;;;;:::i;:::-;;26430:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2062:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49247:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25926:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50857:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65779:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65198:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51935:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66909:1382;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65561:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49422:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25722:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25512:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65658:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25260:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51207:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2971:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;780:98;833:7;860:10;853:17;;780:98;:::o;68329:308::-;2293:12;:10;:12::i;:::-;2282:23;;:7;:5;:7::i;:::-;:23;;;2274:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68427:13:::1;;;;;;;;;;;68426:14;68418:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;68514:9;68509:110;68533:10;:17;68529:1;:21;68509:110;;;68576:27;68586:10;68597:1;68586:13;;;;;;;;:::i;:::-;;;;;;;;68601:1;68576:9;:27::i;:::-;68552:3;;;;;;;68509:110;;;;68329:308:::0;:::o;45693:305::-;45795:4;45847:25;45832:40;;;:11;:40;;;;:105;;;;45904:33;45889:48;;;:11;:48;;;;45832:105;:158;;;;45954:36;45978:11;45954:23;:36::i;:::-;45832:158;45812:178;;45693:305;;;:::o;68645:81::-;2293:12;:10;:12::i;:::-;2282:23;;:7;:5;:7::i;:::-;:23;;;2274:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68714:4:::1;68698:13;;:20;;;;;;;;;;;;;;;;;;68645:81::o:0;49078:100::-;49132:13;49165:5;49158:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49078:100;:::o;50581:204::-;50649:7;50674:16;50682:7;50674;:16::i;:::-;50669:64;;50699:34;;;;;;;;;;;;;;50669:64;50753:15;:24;50769:7;50753:24;;;;;;;;;;;;;;;;;;;;;50746:31;;50581:204;;;:::o;50144:371::-;50217:13;50233:24;50249:7;50233:15;:24::i;:::-;50217:40;;50278:5;50272:11;;:2;:11;;;50268:48;;;50292:24;;;;;;;;;;;;;;50268:48;50349:5;50333:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;50359:37;50376:5;50383:12;:10;:12::i;:::-;50359:16;:37::i;:::-;50358:38;50333:63;50329:138;;;50420:35;;;;;;;;;;;;;;50329:138;50479:28;50488:2;50492:7;50501:5;50479:8;:28::i;:::-;50206:309;50144:371;;:::o;44942:303::-;44986:7;45211:15;:13;:15::i;:::-;45196:12;;45180:13;;:28;:46;45173:53;;44942:303;:::o;26730:566::-;26825:1;26806:7;:16;26814:7;26806:16;;;;;;;;;;;;;;;;:20;26798:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26882:21;26930:15;:13;:15::i;:::-;26906:21;:39;;;;:::i;:::-;26882:63;;26956:15;26974:58;26990:7;26999:13;27014:17;27023:7;27014:8;:17::i;:::-;26974:15;:58::i;:::-;26956:76;;27064:1;27053:7;:12;;27045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27148:7;27126:9;:18;27136:7;27126:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;27184:7;27166:14;;:25;;;;;;;:::i;:::-;;;;;;;;27204:35;27222:7;27231;27204:17;:35::i;:::-;27255:33;27271:7;27280;27255:33;;;;;;;:::i;:::-;;;;;;;;26787:509;;26730:566;:::o;51438:170::-;51572:28;51582:4;51588:2;51592:7;51572:9;:28::i;:::-;51438:170;;;:::o;66399:502::-;66343:10;66330:23;;:9;:23;;;66322:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;64618:1:::1;66478:9;;:25;66470:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;64113:5;66602:8;66585:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:40;;66577:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;66715:8;66687:12;:24;66700:10;66687:24;;;;;;;;;;;;;;;;:36;;;;;;;;;;;64326:1;66744:11;:23;66756:10;66744:23;;;;;;;;;;;;;;;;:54;;66736:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;66862:31;66872:10;66884:8;66862:9;:31::i;:::-;66399:502:::0;:::o;25075:91::-;25119:7;25146:12;;25139:19;;25075:91;:::o;26204:135::-;26274:7;26301:14;:21;26316:5;26301:21;;;;;;;;;;;;;;;:30;26323:7;26301:30;;;;;;;;;;;;;;;;26294:37;;26204:135;;;;:::o;51679:185::-;51817:39;51834:4;51840:2;51844:7;51817:39;;;;;;;;;;;;:16;:39::i;:::-;51679:185;;;:::o;27564:641::-;27665:1;27646:7;:16;27654:7;27646:16;;;;;;;;;;;;;;;;:20;27638:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;27722:21;27779:20;27793:5;27779:13;:20::i;:::-;27746:5;:15;;;27770:4;27746:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;27722:77;;27810:15;27828:65;27844:7;27853:13;27868:24;27877:5;27884:7;27868:8;:24::i;:::-;27828:15;:65::i;:::-;27810:83;;27925:1;27914:7;:12;;27906:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28021:7;27987:14;:21;28002:5;27987:21;;;;;;;;;;;;;;;:30;28009:7;27987:30;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;28069:7;28039:19;:26;28059:5;28039:26;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;28089:47;28112:5;28119:7;28128;28089:22;:47::i;:::-;28173:5;28152:45;;;28180:7;28189;28152:45;;;;;;;:::i;:::-;;;;;;;;27627:578;;27564:641;;:::o;66177:102::-;66231:4;66255:16;66263:7;66255;:16::i;:::-;66248:23;;66177:102;;;:::o;66063:106::-;2293:12;:10;:12::i;:::-;2282:23;;:7;:5;:7::i;:::-;:23;;;2274:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66154:7:::1;;66138:13;:23;;;;;;;:::i;:::-;;66063:106:::0;;:::o;65316:237::-;2293:12;:10;:12::i;:::-;2282:23;;:7;:5;:7::i;:::-;:23;;;2274:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65410:9:::1;;65397:10;:22;65389:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;64666:1;65460:10;:26;;65452:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;65535:10;65523:9;:22;;;;65316:237:::0;:::o;48887:124::-;48951:7;48978:20;48990:7;48978:11;:20::i;:::-;:25;;;48971:32;;48887:124;;;:::o;46062:206::-;46126:7;46167:1;46150:19;;:5;:19;;;46146:60;;;46178:28;;;;;;;;;;;;;;46146:60;46232:12;:19;46245:5;46232:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;46224:36;;46217:43;;46062:206;;;:::o;2713:103::-;2293:12;:10;:12::i;:::-;2282:23;;:7;:5;:7::i;:::-;:23;;;2274:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2778:30:::1;2805:1;2778:18;:30::i;:::-;2713:103::o:0;26430:100::-;26481:7;26508;26516:5;26508:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26501:21;;26430:100;;;:::o;2062:87::-;2108:7;2135:6;;;;;;;;;;;2128:13;;2062:87;:::o;49247:104::-;49303:13;49336:7;49329:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49247:104;:::o;25926:109::-;25982:7;26009:9;:18;26019:7;26009:18;;;;;;;;;;;;;;;;26002:25;;25926:109;;;:::o;50857:279::-;50960:12;:10;:12::i;:::-;50948:24;;:8;:24;;;50944:54;;;50981:17;;;;;;;;;;;;;;50944:54;51056:8;51011:18;:32;51030:12;:10;:12::i;:::-;51011:32;;;;;;;;;;;;;;;:42;51044:8;51011:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;51109:8;51080:48;;51095:12;:10;:12::i;:::-;51080:48;;;51119:8;51080:48;;;;;;:::i;:::-;;;;;;;;50857:279;;:::o;65779:93::-;65823:7;65850:14;:12;:14::i;:::-;65843:21;;65779:93;:::o;65198:110::-;2293:12;:10;:12::i;:::-;2282:23;;:7;:5;:7::i;:::-;:23;;;2274:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65288:12:::1;65274:11;;:26;;;;;;;;;;;;;;;;;;65198:110:::0;:::o;51935:369::-;52102:28;52112:4;52118:2;52122:7;52102:9;:28::i;:::-;52145:15;:2;:13;;;:15::i;:::-;:76;;;;;52165:56;52196:4;52202:2;52206:7;52215:5;52165:30;:56::i;:::-;52164:57;52145:76;52141:156;;;52245:40;;;;;;;;;;;;;;52141:156;51935:369;;;;:::o;66909:1382::-;66343:10;66330:23;;:9;:23;;;66322:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;64460:1:::1;67057:9;;:21;67049:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;64113:5;67175:8;67158:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:40;;67150:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;67298:18;67346:10;67358:7;67367:4;67329:43;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67319:54;;;;;;67298:75;;67384:42;67402:11;;;;;;;;;;;67415:10;67384:7;:17;;:42;;;;;:::i;:::-;64371:1;67468:7;:18;67465:808;;;67535:8;67507:12;:24;67520:10;67507:24;;;;;;;;;;;;;;;;:36;;;;;;;;;;;67598:4;67570:12;:24;67583:10;67570:24;;;;;;;;;;;;;;;;:32;;67562:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;67643:31;67653:10;67665:8;67643:9;:31::i;:::-;67465:808;;;64413:1;67699:7;:17;67696:577;;;67764:8;67737:11;:23;67749:10;67737:23;;;;;;;;;;;;;;;;:35;;;;;;;;;;;67826:4;67799:11;:23;67811:10;67799:23;;;;;;;;;;;;;;;;:31;;67791:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;67891:8;67870:17;;:29;;;;;;;;;;;64514:1;67921:9;;:31;67918:290;;;64201:4;67985:17;;:42;;67977:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;64260:2;68100:11;:23;68112:10;68100:23;;;;;;;;;;;;;;;;:47;;68092:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;67918:290;68226:31;68236:10;68248:8;68226:9;:31::i;:::-;67696:577;67465:808;67038:1253;66909:1382:::0;;;;:::o;65561:89::-;65606:7;65633:9;;65626:16;;65561:89;:::o;49422:318::-;49495:13;49526:16;49534:7;49526;:16::i;:::-;49521:59;;49551:29;;;;;;;;;;;;;;49521:59;49593:21;49617:10;:8;:10::i;:::-;49593:34;;49670:1;49651:7;49645:21;:26;;:87;;;;;;;;;;;;;;;;;49698:7;49707:18;:7;:16;:18::i;:::-;49681:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49645:87;49638:94;;;49422:318;;;:::o;25722:105::-;25776:7;25803;:16;25811:7;25803:16;;;;;;;;;;;;;;;;25796:23;;25722:105;;;:::o;25512:119::-;25570:7;25597:19;:26;25617:5;25597:26;;;;;;;;;;;;;;;;25590:33;;25512:119;;;:::o;65658:113::-;65716:7;65743:20;65757:5;65743:13;:20::i;:::-;65736:27;;65658:113;;;:::o;25260:95::-;25306:7;25333:14;;25326:21;;25260:95;:::o;51207:164::-;51304:4;51328:18;:25;51347:5;51328:25;;;;;;;;;;;;;;;:35;51354:8;51328:35;;;;;;;;;;;;;;;;;;;;;;;;;51321:42;;51207:164;;;;:::o;2971:201::-;2293:12;:10;:12::i;:::-;2282:23;;:7;:5;:7::i;:::-;:23;;;2274:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3080:1:::1;3060:22;;:8;:22;;;;3052:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3136:28;3155:8;3136:18;:28::i;:::-;2971:201:::0;:::o;52754:104::-;52823:27;52833:2;52837:8;52823:27;;;;;;;;;;;;:9;:27::i;:::-;52754:104;;:::o;41043:157::-;41128:4;41167:25;41152:40;;;:11;:40;;;;41145:47;;41043:157;;;:::o;52559:187::-;52616:4;52659:7;52640:15;:13;:15::i;:::-;:26;;:53;;;;;52680:13;;52670:7;:23;52640:53;:98;;;;;52711:11;:20;52723:7;52711:20;;;;;;;;;;;:27;;;;;;;;;;;;52710:28;52640:98;52633:105;;52559:187;;;:::o;60170:196::-;60312:2;60285:15;:24;60301:7;60285:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;60350:7;60346:2;60330:28;;60339:5;60330:28;;;;;;;;;;;;60170:196;;;:::o;44666:92::-;44722:7;44666:92;:::o;28383:248::-;28529:7;28608:15;28593:12;;28573:7;:16;28581:7;28573:16;;;;;;;;;;;;;;;;28557:13;:32;;;;:::i;:::-;28556:49;;;;:::i;:::-;:67;;;;:::i;:::-;28549:74;;28383:248;;;;;:::o;11686:317::-;11801:6;11776:21;:31;;11768:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11855:12;11873:9;:14;;11895:6;11873:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11854:52;;;11925:7;11917:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;11757:246;11686:317;;:::o;55672:2112::-;55787:35;55825:20;55837:7;55825:11;:20::i;:::-;55787:58;;55858:22;55900:13;:18;;;55884:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;55935:50;55952:13;:18;;;55972:12;:10;:12::i;:::-;55935:16;:50::i;:::-;55884:101;:154;;;;56026:12;:10;:12::i;:::-;56002:36;;:20;56014:7;56002:11;:20::i;:::-;:36;;;55884:154;55858:181;;56057:17;56052:66;;56083:35;;;;;;;;;;;;;;56052:66;56155:4;56133:26;;:13;:18;;;:26;;;56129:67;;56168:28;;;;;;;;;;;;;;56129:67;56225:1;56211:16;;:2;:16;;;56207:52;;;56236:23;;;;;;;;;;;;;;56207:52;56272:43;56294:4;56300:2;56304:7;56313:1;56272:21;:43::i;:::-;56380:49;56397:1;56401:7;56410:13;:18;;;56380:8;:49::i;:::-;56755:1;56725:12;:18;56738:4;56725:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56799:1;56771:12;:16;56784:2;56771:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56845:2;56817:11;:20;56829:7;56817:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;56907:15;56862:11;:20;56874:7;56862:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;57175:19;57207:1;57197:7;:11;57175:33;;57268:1;57227:43;;:11;:24;57239:11;57227:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;57223:445;;;57452:13;;57438:11;:27;57434:219;;;57522:13;:18;;;57490:11;:24;57502:11;57490:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;57605:13;:28;;;57563:11;:24;57575:11;57563:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;57434:219;57223:445;56700:979;57715:7;57711:2;57696:27;;57705:4;57696:27;;;;;;;;;;;;57734:42;57755:4;57761:2;57765:7;57774:1;57734:20;:42::i;:::-;55776:2008;;55672:2112;;;:::o;45338:283::-;45385:7;45587:15;:13;:15::i;:::-;45571:13;;:31;45564:38;;45338:283;:::o;18398:211::-;18515:86;18535:5;18565:23;;;18590:2;18594:5;18542:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18515:19;:86::i;:::-;18398:211;;;:::o;47717:1108::-;47778:21;;:::i;:::-;47812:12;47827:7;47812:22;;47895:4;47876:15;:13;:15::i;:::-;:23;;:47;;;;;47910:13;;47903:4;:20;47876:47;47872:886;;;47944:31;47978:11;:17;47990:4;47978:17;;;;;;;;;;;47944:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48019:9;:16;;;48014:729;;48090:1;48064:28;;:9;:14;;;:28;;;48060:101;;48128:9;48121:16;;;;;;48060:101;48463:261;48470:4;48463:261;;;48503:6;;;;;;;;48548:11;:17;48560:4;48548:17;;;;;;;;;;;48536:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48622:1;48596:28;;:9;:14;;;:28;;;48592:109;;48664:9;48657:16;;;;;;48592:109;48463:261;;;48014:729;47925:833;47872:886;48786:31;;;;;;;;;;;;;;47717:1108;;;;:::o;3332:191::-;3406:16;3425:6;;;;;;;;;;;3406:25;;3451:8;3442:6;;:17;;;;;;;;;;;;;;;;;;3506:8;3475:40;;3496:8;3475:40;;;;;;;;;;;;3395:128;3332:191;:::o;10425:326::-;10485:4;10742:1;10720:7;:19;;;:23;10713:30;;10425:326;;;:::o;60858:667::-;61021:4;61058:2;61042:36;;;61079:12;:10;:12::i;:::-;61093:4;61099:7;61108:5;61042:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;61038:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61293:1;61276:6;:13;:18;61272:235;;;61322:40;;;;;;;;;;;;;;61272:235;61465:6;61459:13;61450:6;61446:2;61442:15;61435:38;61038:480;61171:45;;;61161:55;;;:6;:55;;;;61154:62;;;60858:667;;;;;;:::o;63443:442::-;63634:198;63693:19;;;;;;;;;;;;;;;;;63714:10;63676:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63666:60;;;;;;63749:4;:6;;;63778:4;:6;;;63807:4;:6;;;63634:198;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63607:225;;:6;:225;;;63585:292;;;;;;;;;;;;:::i;:::-;;;;;;;;;63443:442;;;:::o;65941:114::-;66001:13;66034;66027:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65941:114;:::o;38413:723::-;38469:13;38699:1;38690:5;:10;38686:53;;;38717:10;;;;;;;;;;;;;;;;;;;;;38686:53;38749:12;38764:5;38749:20;;38780:14;38805:78;38820:1;38812:4;:9;38805:78;;38838:8;;;;;:::i;:::-;;;;38869:2;38861:10;;;;;:::i;:::-;;;38805:78;;;38893:19;38925:6;38915:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38893:39;;38943:154;38959:1;38950:5;:10;38943:154;;38987:1;38977:11;;;;;:::i;:::-;;;39054:2;39046:5;:10;;;;:::i;:::-;39033:2;:24;;;;:::i;:::-;39020:39;;39003:6;39010;39003:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;39083:2;39074:11;;;;;:::i;:::-;;;38943:154;;;39121:6;39107:21;;;;;38413:723;;;;:::o;46350:207::-;46411:7;46452:1;46435:19;;:5;:19;;;46431:59;;;46463:27;;;;;;;;;;;;;;46431:59;46516:12;:19;46529:5;46516:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;46508:41;;46501:48;;46350:207;;;:::o;53221:163::-;53344:32;53350:2;53354:8;53364:5;53371:4;53344:5;:32::i;:::-;53221:163;;;:::o;62173:159::-;;;;;:::o;62991:158::-;;;;;:::o;20971:716::-;21395:23;21421:69;21449:4;21421:69;;;;;;;;;;;;;;;;;21429:5;21421:27;;;;:69;;;;;:::i;:::-;21395:95;;21525:1;21505:10;:17;:21;21501:179;;;21602:10;21591:30;;;;;;;;;;;;:::i;:::-;21583:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;21501:179;21041:646;20971:716;;:::o;53643:1775::-;53782:20;53805:13;;53782:36;;53847:1;53833:16;;:2;:16;;;53829:48;;;53858:19;;;;;;;;;;;;;;53829:48;53904:1;53892:8;:13;53888:44;;;53914:18;;;;;;;;;;;;;;53888:44;53945:61;53975:1;53979:2;53983:12;53997:8;53945:21;:61::i;:::-;54318:8;54283:12;:16;54296:2;54283:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54382:8;54342:12;:16;54355:2;54342:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54441:2;54408:11;:25;54420:12;54408:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;54508:15;54458:11;:25;54470:12;54458:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;54541:20;54564:12;54541:35;;54591:11;54620:8;54605:12;:23;54591:37;;54649:4;:23;;;;;54657:15;:2;:13;;;:15::i;:::-;54649:23;54645:641;;;54693:314;54749:12;54745:2;54724:38;;54741:1;54724:38;;;;;;;;;;;;54790:69;54829:1;54833:2;54837:14;;;;;;54853:5;54790:30;:69::i;:::-;54785:174;;54895:40;;;;;;;;;;;;;;54785:174;55002:3;54986:12;:19;;54693:314;;55088:12;55071:13;;:29;55067:43;;55102:8;;;55067:43;54645:641;;;55151:120;55207:14;;;;;;55203:2;55182:40;;55199:1;55182:40;;;;;;;;;;;;55266:3;55250:12;:19;;55151:120;;54645:641;55316:12;55300:13;:28;;;;54258:1082;;55350:60;55379:1;55383:2;55387:12;55401:8;55350:20;:60::i;:::-;53771:1647;53643:1775;;;;:::o;13170:229::-;13307:12;13339:52;13361:6;13369:4;13375:1;13378:12;13339:21;:52::i;:::-;13332:59;;13170:229;;;;;:::o;14290:510::-;14460:12;14518:5;14493:21;:30;;14485:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;14585:18;14596:6;14585:10;:18::i;:::-;14577:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;14651:12;14665:23;14692:6;:11;;14711:5;14718:4;14692:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14650:73;;;;14741:51;14758:7;14767:10;14779:12;14741:16;:51::i;:::-;14734:58;;;;14290:510;;;;;;:::o;16976:712::-;17126:12;17155:7;17151:530;;;17186:10;17179:17;;;;17151:530;17320:1;17300:10;:17;:21;17296:374;;;17498:10;17492:17;17559:15;17546:10;17542:2;17538:19;17531:44;17296:374;17641:12;17634:20;;;;;;;;;;;:::i;:::-;;;;;;;;16976:712;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:139::-;1214:5;1252:6;1239:20;1230:29;;1268:33;1295:5;1268:33;:::i;:::-;1168:139;;;;:::o;1313:155::-;1367:5;1405:6;1392:20;1383:29;;1421:41;1456:5;1421:41;:::i;:::-;1313:155;;;;:::o;1491:370::-;1562:5;1611:3;1604:4;1596:6;1592:17;1588:27;1578:122;;1619:79;;:::i;:::-;1578:122;1736:6;1723:20;1761:94;1851:3;1843:6;1836:4;1828:6;1824:17;1761:94;:::i;:::-;1752:103;;1568:293;1491:370;;;;:::o;1867:133::-;1910:5;1948:6;1935:20;1926:29;;1964:30;1988:5;1964:30;:::i;:::-;1867:133;;;;:::o;2006:137::-;2060:5;2091:6;2085:13;2076:22;;2107:30;2131:5;2107:30;:::i;:::-;2006:137;;;;:::o;2149:139::-;2195:5;2233:6;2220:20;2211:29;;2249:33;2276:5;2249:33;:::i;:::-;2149:139;;;;:::o;2294:137::-;2339:5;2377:6;2364:20;2355:29;;2393:32;2419:5;2393:32;:::i;:::-;2294:137;;;;:::o;2437:141::-;2493:5;2524:6;2518:13;2509:22;;2540:32;2566:5;2540:32;:::i;:::-;2437:141;;;;:::o;2597:338::-;2652:5;2701:3;2694:4;2686:6;2682:17;2678:27;2668:122;;2709:79;;:::i;:::-;2668:122;2826:6;2813:20;2851:78;2925:3;2917:6;2910:4;2902:6;2898:17;2851:78;:::i;:::-;2842:87;;2658:277;2597:338;;;;:::o;2941:167::-;3001:5;3039:6;3026:20;3017:29;;3055:47;3096:5;3055:47;:::i;:::-;2941:167;;;;:::o;3128:553::-;3186:8;3196:6;3246:3;3239:4;3231:6;3227:17;3223:27;3213:122;;3254:79;;:::i;:::-;3213:122;3367:6;3354:20;3344:30;;3397:18;3389:6;3386:30;3383:117;;;3419:79;;:::i;:::-;3383:117;3533:4;3525:6;3521:17;3509:29;;3587:3;3579:4;3571:6;3567:17;3557:8;3553:32;3550:41;3547:128;;;3594:79;;:::i;:::-;3547:128;3128:553;;;;;:::o;3729:731::-;3810:5;3854:4;3842:9;3837:3;3833:19;3829:30;3826:117;;;3862:79;;:::i;:::-;3826:117;3961:21;3977:4;3961:21;:::i;:::-;3952:30;;4038:1;4078:47;4121:3;4112:6;4101:9;4097:22;4078:47;:::i;:::-;4071:4;4064:5;4060:16;4053:73;3992:145;4193:2;4234:49;4279:3;4270:6;4259:9;4255:22;4234:49;:::i;:::-;4227:4;4220:5;4216:16;4209:75;4147:148;4351:2;4392:49;4437:3;4428:6;4417:9;4413:22;4392:49;:::i;:::-;4385:4;4378:5;4374:16;4367:75;4305:148;3729:731;;;;:::o;4466:139::-;4512:5;4550:6;4537:20;4528:29;;4566:33;4593:5;4566:33;:::i;:::-;4466:139;;;;:::o;4611:143::-;4668:5;4699:6;4693:13;4684:22;;4715:33;4742:5;4715:33;:::i;:::-;4611:143;;;;:::o;4760:135::-;4804:5;4842:6;4829:20;4820:29;;4858:31;4883:5;4858:31;:::i;:::-;4760:135;;;;:::o;4901:329::-;4960:6;5009:2;4997:9;4988:7;4984:23;4980:32;4977:119;;;5015:79;;:::i;:::-;4977:119;5135:1;5160:53;5205:7;5196:6;5185:9;5181:22;5160:53;:::i;:::-;5150:63;;5106:117;4901:329;;;;:::o;5236:345::-;5303:6;5352:2;5340:9;5331:7;5327:23;5323:32;5320:119;;;5358:79;;:::i;:::-;5320:119;5478:1;5503:61;5556:7;5547:6;5536:9;5532:22;5503:61;:::i;:::-;5493:71;;5449:125;5236:345;;;;:::o;5587:474::-;5655:6;5663;5712:2;5700:9;5691:7;5687:23;5683:32;5680:119;;;5718:79;;:::i;:::-;5680:119;5838:1;5863:53;5908:7;5899:6;5888:9;5884:22;5863:53;:::i;:::-;5853:63;;5809:117;5965:2;5991:53;6036:7;6027:6;6016:9;6012:22;5991:53;:::i;:::-;5981:63;;5936:118;5587:474;;;;;:::o;6067:619::-;6144:6;6152;6160;6209:2;6197:9;6188:7;6184:23;6180:32;6177:119;;;6215:79;;:::i;:::-;6177:119;6335:1;6360:53;6405:7;6396:6;6385:9;6381:22;6360:53;:::i;:::-;6350:63;;6306:117;6462:2;6488:53;6533:7;6524:6;6513:9;6509:22;6488:53;:::i;:::-;6478:63;;6433:118;6590:2;6616:53;6661:7;6652:6;6641:9;6637:22;6616:53;:::i;:::-;6606:63;;6561:118;6067:619;;;;;:::o;6692:943::-;6787:6;6795;6803;6811;6860:3;6848:9;6839:7;6835:23;6831:33;6828:120;;;6867:79;;:::i;:::-;6828:120;6987:1;7012:53;7057:7;7048:6;7037:9;7033:22;7012:53;:::i;:::-;7002:63;;6958:117;7114:2;7140:53;7185:7;7176:6;7165:9;7161:22;7140:53;:::i;:::-;7130:63;;7085:118;7242:2;7268:53;7313:7;7304:6;7293:9;7289:22;7268:53;:::i;:::-;7258:63;;7213:118;7398:2;7387:9;7383:18;7370:32;7429:18;7421:6;7418:30;7415:117;;;7451:79;;:::i;:::-;7415:117;7556:62;7610:7;7601:6;7590:9;7586:22;7556:62;:::i;:::-;7546:72;;7341:287;6692:943;;;;;;;:::o;7641:468::-;7706:6;7714;7763:2;7751:9;7742:7;7738:23;7734:32;7731:119;;;7769:79;;:::i;:::-;7731:119;7889:1;7914:53;7959:7;7950:6;7939:9;7935:22;7914:53;:::i;:::-;7904:63;;7860:117;8016:2;8042:50;8084:7;8075:6;8064:9;8060:22;8042:50;:::i;:::-;8032:60;;7987:115;7641:468;;;;;:::o;8115:474::-;8183:6;8191;8240:2;8228:9;8219:7;8215:23;8211:32;8208:119;;;8246:79;;:::i;:::-;8208:119;8366:1;8391:53;8436:7;8427:6;8416:9;8412:22;8391:53;:::i;:::-;8381:63;;8337:117;8493:2;8519:53;8564:7;8555:6;8544:9;8540:22;8519:53;:::i;:::-;8509:63;;8464:118;8115:474;;;;;:::o;8595:539::-;8679:6;8728:2;8716:9;8707:7;8703:23;8699:32;8696:119;;;8734:79;;:::i;:::-;8696:119;8882:1;8871:9;8867:17;8854:31;8912:18;8904:6;8901:30;8898:117;;;8934:79;;:::i;:::-;8898:117;9039:78;9109:7;9100:6;9089:9;9085:22;9039:78;:::i;:::-;9029:88;;8825:302;8595:539;;;;:::o;9140:345::-;9207:6;9256:2;9244:9;9235:7;9231:23;9227:32;9224:119;;;9262:79;;:::i;:::-;9224:119;9382:1;9407:61;9460:7;9451:6;9440:9;9436:22;9407:61;:::i;:::-;9397:71;;9353:125;9140:345;;;;:::o;9491:327::-;9549:6;9598:2;9586:9;9577:7;9573:23;9569:32;9566:119;;;9604:79;;:::i;:::-;9566:119;9724:1;9749:52;9793:7;9784:6;9773:9;9769:22;9749:52;:::i;:::-;9739:62;;9695:116;9491:327;;;;:::o;9824:349::-;9893:6;9942:2;9930:9;9921:7;9917:23;9913:32;9910:119;;;9948:79;;:::i;:::-;9910:119;10068:1;10093:63;10148:7;10139:6;10128:9;10124:22;10093:63;:::i;:::-;10083:73;;10039:127;9824:349;;;;:::o;10179:357::-;10252:6;10301:2;10289:9;10280:7;10276:23;10272:32;10269:119;;;10307:79;;:::i;:::-;10269:119;10427:1;10452:67;10511:7;10502:6;10491:9;10487:22;10452:67;:::i;:::-;10442:77;;10398:131;10179:357;;;;:::o;10542:502::-;10624:6;10632;10681:2;10669:9;10660:7;10656:23;10652:32;10649:119;;;10687:79;;:::i;:::-;10649:119;10807:1;10832:67;10891:7;10882:6;10871:9;10867:22;10832:67;:::i;:::-;10822:77;;10778:131;10948:2;10974:53;11019:7;11010:6;10999:9;10995:22;10974:53;:::i;:::-;10964:63;;10919:118;10542:502;;;;;:::o;11050:529::-;11121:6;11129;11178:2;11166:9;11157:7;11153:23;11149:32;11146:119;;;11184:79;;:::i;:::-;11146:119;11332:1;11321:9;11317:17;11304:31;11362:18;11354:6;11351:30;11348:117;;;11384:79;;:::i;:::-;11348:117;11497:65;11554:7;11545:6;11534:9;11530:22;11497:65;:::i;:::-;11479:83;;;;11275:297;11050:529;;;;;:::o;11585:329::-;11644:6;11693:2;11681:9;11672:7;11668:23;11664:32;11661:119;;;11699:79;;:::i;:::-;11661:119;11819:1;11844:53;11889:7;11880:6;11869:9;11865:22;11844:53;:::i;:::-;11834:63;;11790:117;11585:329;;;;:::o;11920:351::-;11990:6;12039:2;12027:9;12018:7;12014:23;12010:32;12007:119;;;12045:79;;:::i;:::-;12007:119;12165:1;12190:64;12246:7;12237:6;12226:9;12222:22;12190:64;:::i;:::-;12180:74;;12136:128;11920:351;;;;:::o;12277:829::-;12395:6;12403;12411;12419;12468:3;12456:9;12447:7;12443:23;12439:33;12436:120;;;12475:79;;:::i;:::-;12436:120;12595:1;12620:53;12665:7;12656:6;12645:9;12641:22;12620:53;:::i;:::-;12610:63;;12566:117;12722:2;12748:53;12793:7;12784:6;12773:9;12769:22;12748:53;:::i;:::-;12738:63;;12693:118;12850:2;12876:53;12921:7;12912:6;12901:9;12897:22;12876:53;:::i;:::-;12866:63;;12821:118;12978:2;13004:85;13081:7;13072:6;13061:9;13057:22;13004:85;:::i;:::-;12994:95;;12949:150;12277:829;;;;;;;:::o;13112:147::-;13207:45;13246:5;13207:45;:::i;:::-;13202:3;13195:58;13112:147;;:::o;13265:118::-;13352:24;13370:5;13352:24;:::i;:::-;13347:3;13340:37;13265:118;;:::o;13389:157::-;13494:45;13514:24;13532:5;13514:24;:::i;:::-;13494:45;:::i;:::-;13489:3;13482:58;13389:157;;:::o;13552:109::-;13633:21;13648:5;13633:21;:::i;:::-;13628:3;13621:34;13552:109;;:::o;13667:118::-;13754:24;13772:5;13754:24;:::i;:::-;13749:3;13742:37;13667:118;;:::o;13791:157::-;13896:45;13916:24;13934:5;13916:24;:::i;:::-;13896:45;:::i;:::-;13891:3;13884:58;13791:157;;:::o;13954:360::-;14040:3;14068:38;14100:5;14068:38;:::i;:::-;14122:70;14185:6;14180:3;14122:70;:::i;:::-;14115:77;;14201:52;14246:6;14241:3;14234:4;14227:5;14223:16;14201:52;:::i;:::-;14278:29;14300:6;14278:29;:::i;:::-;14273:3;14269:39;14262:46;;14044:270;13954:360;;;;:::o;14320:373::-;14424:3;14452:38;14484:5;14452:38;:::i;:::-;14506:88;14587:6;14582:3;14506:88;:::i;:::-;14499:95;;14603:52;14648:6;14643:3;14636:4;14629:5;14625:16;14603:52;:::i;:::-;14680:6;14675:3;14671:16;14664:23;;14428:265;14320:373;;;;:::o;14699:364::-;14787:3;14815:39;14848:5;14815:39;:::i;:::-;14870:71;14934:6;14929:3;14870:71;:::i;:::-;14863:78;;14950:52;14995:6;14990:3;14983:4;14976:5;14972:16;14950:52;:::i;:::-;15027:29;15049:6;15027:29;:::i;:::-;15022:3;15018:39;15011:46;;14791:272;14699:364;;;;:::o;15069:377::-;15175:3;15203:39;15236:5;15203:39;:::i;:::-;15258:89;15340:6;15335:3;15258:89;:::i;:::-;15251:96;;15356:52;15401:6;15396:3;15389:4;15382:5;15378:16;15356:52;:::i;:::-;15433:6;15428:3;15424:16;15417:23;;15179:267;15069:377;;;;:::o;15452:366::-;15594:3;15615:67;15679:2;15674:3;15615:67;:::i;:::-;15608:74;;15691:93;15780:3;15691:93;:::i;:::-;15809:2;15804:3;15800:12;15793:19;;15452:366;;;:::o;15824:::-;15966:3;15987:67;16051:2;16046:3;15987:67;:::i;:::-;15980:74;;16063:93;16152:3;16063:93;:::i;:::-;16181:2;16176:3;16172:12;16165:19;;15824:366;;;:::o;16196:::-;16338:3;16359:67;16423:2;16418:3;16359:67;:::i;:::-;16352:74;;16435:93;16524:3;16435:93;:::i;:::-;16553:2;16548:3;16544:12;16537:19;;16196:366;;;:::o;16568:::-;16710:3;16731:67;16795:2;16790:3;16731:67;:::i;:::-;16724:74;;16807:93;16896:3;16807:93;:::i;:::-;16925:2;16920:3;16916:12;16909:19;;16568:366;;;:::o;16940:::-;17082:3;17103:67;17167:2;17162:3;17103:67;:::i;:::-;17096:74;;17179:93;17268:3;17179:93;:::i;:::-;17297:2;17292:3;17288:12;17281:19;;16940:366;;;:::o;17312:::-;17454:3;17475:67;17539:2;17534:3;17475:67;:::i;:::-;17468:74;;17551:93;17640:3;17551:93;:::i;:::-;17669:2;17664:3;17660:12;17653:19;;17312:366;;;:::o;17684:::-;17826:3;17847:67;17911:2;17906:3;17847:67;:::i;:::-;17840:74;;17923:93;18012:3;17923:93;:::i;:::-;18041:2;18036:3;18032:12;18025:19;;17684:366;;;:::o;18056:::-;18198:3;18219:67;18283:2;18278:3;18219:67;:::i;:::-;18212:74;;18295:93;18384:3;18295:93;:::i;:::-;18413:2;18408:3;18404:12;18397:19;;18056:366;;;:::o;18428:::-;18570:3;18591:67;18655:2;18650:3;18591:67;:::i;:::-;18584:74;;18667:93;18756:3;18667:93;:::i;:::-;18785:2;18780:3;18776:12;18769:19;;18428:366;;;:::o;18800:::-;18942:3;18963:67;19027:2;19022:3;18963:67;:::i;:::-;18956:74;;19039:93;19128:3;19039:93;:::i;:::-;19157:2;19152:3;19148:12;19141:19;;18800:366;;;:::o;19172:::-;19314:3;19335:67;19399:2;19394:3;19335:67;:::i;:::-;19328:74;;19411:93;19500:3;19411:93;:::i;:::-;19529:2;19524:3;19520:12;19513:19;;19172:366;;;:::o;19544:::-;19686:3;19707:67;19771:2;19766:3;19707:67;:::i;:::-;19700:74;;19783:93;19872:3;19783:93;:::i;:::-;19901:2;19896:3;19892:12;19885:19;;19544:366;;;:::o;19916:::-;20058:3;20079:67;20143:2;20138:3;20079:67;:::i;:::-;20072:74;;20155:93;20244:3;20155:93;:::i;:::-;20273:2;20268:3;20264:12;20257:19;;19916:366;;;:::o;20288:::-;20430:3;20451:67;20515:2;20510:3;20451:67;:::i;:::-;20444:74;;20527:93;20616:3;20527:93;:::i;:::-;20645:2;20640:3;20636:12;20629:19;;20288:366;;;:::o;20660:::-;20802:3;20823:67;20887:2;20882:3;20823:67;:::i;:::-;20816:74;;20899:93;20988:3;20899:93;:::i;:::-;21017:2;21012:3;21008:12;21001:19;;20660:366;;;:::o;21032:::-;21174:3;21195:67;21259:2;21254:3;21195:67;:::i;:::-;21188:74;;21271:93;21360:3;21271:93;:::i;:::-;21389:2;21384:3;21380:12;21373:19;;21032:366;;;:::o;21404:398::-;21563:3;21584:83;21665:1;21660:3;21584:83;:::i;:::-;21577:90;;21676:93;21765:3;21676:93;:::i;:::-;21794:1;21789:3;21785:11;21778:18;;21404:398;;;:::o;21808:366::-;21950:3;21971:67;22035:2;22030:3;21971:67;:::i;:::-;21964:74;;22047:93;22136:3;22047:93;:::i;:::-;22165:2;22160:3;22156:12;22149:19;;21808:366;;;:::o;22180:::-;22322:3;22343:67;22407:2;22402:3;22343:67;:::i;:::-;22336:74;;22419:93;22508:3;22419:93;:::i;:::-;22537:2;22532:3;22528:12;22521:19;;22180:366;;;:::o;22552:::-;22694:3;22715:67;22779:2;22774:3;22715:67;:::i;:::-;22708:74;;22791:93;22880:3;22791:93;:::i;:::-;22909:2;22904:3;22900:12;22893:19;;22552:366;;;:::o;22924:::-;23066:3;23087:67;23151:2;23146:3;23087:67;:::i;:::-;23080:74;;23163:93;23252:3;23163:93;:::i;:::-;23281:2;23276:3;23272:12;23265:19;;22924:366;;;:::o;23296:::-;23438:3;23459:67;23523:2;23518:3;23459:67;:::i;:::-;23452:74;;23535:93;23624:3;23535:93;:::i;:::-;23653:2;23648:3;23644:12;23637:19;;23296:366;;;:::o;23668:::-;23810:3;23831:67;23895:2;23890:3;23831:67;:::i;:::-;23824:74;;23907:93;23996:3;23907:93;:::i;:::-;24025:2;24020:3;24016:12;24009:19;;23668:366;;;:::o;24040:118::-;24127:24;24145:5;24127:24;:::i;:::-;24122:3;24115:37;24040:118;;:::o;24164:157::-;24269:45;24289:24;24307:5;24289:24;:::i;:::-;24269:45;:::i;:::-;24264:3;24257:58;24164:157;;:::o;24327:112::-;24410:22;24426:5;24410:22;:::i;:::-;24405:3;24398:35;24327:112;;:::o;24445:538::-;24613:3;24628:75;24699:3;24690:6;24628:75;:::i;:::-;24728:2;24723:3;24719:12;24712:19;;24741:75;24812:3;24803:6;24741:75;:::i;:::-;24841:2;24836:3;24832:12;24825:19;;24854:75;24925:3;24916:6;24854:75;:::i;:::-;24954:2;24949:3;24945:12;24938:19;;24974:3;24967:10;;24445:538;;;;;;:::o;24989:271::-;25119:3;25141:93;25230:3;25221:6;25141:93;:::i;:::-;25134:100;;25251:3;25244:10;;24989:271;;;;:::o;25266:416::-;25426:3;25448:95;25539:3;25530:6;25448:95;:::i;:::-;25441:102;;25553:75;25624:3;25615:6;25553:75;:::i;:::-;25653:2;25648:3;25644:12;25637:19;;25673:3;25666:10;;25266:416;;;;;:::o;25688:435::-;25868:3;25890:95;25981:3;25972:6;25890:95;:::i;:::-;25883:102;;26002:95;26093:3;26084:6;26002:95;:::i;:::-;25995:102;;26114:3;26107:10;;25688:435;;;;;:::o;26129:379::-;26313:3;26335:147;26478:3;26335:147;:::i;:::-;26328:154;;26499:3;26492:10;;26129:379;;;:::o;26514:222::-;26607:4;26645:2;26634:9;26630:18;26622:26;;26658:71;26726:1;26715:9;26711:17;26702:6;26658:71;:::i;:::-;26514:222;;;;:::o;26742:348::-;26871:4;26909:2;26898:9;26894:18;26886:26;;26922:79;26998:1;26987:9;26983:17;26974:6;26922:79;:::i;:::-;27011:72;27079:2;27068:9;27064:18;27055:6;27011:72;:::i;:::-;26742:348;;;;;:::o;27096:640::-;27291:4;27329:3;27318:9;27314:19;27306:27;;27343:71;27411:1;27400:9;27396:17;27387:6;27343:71;:::i;:::-;27424:72;27492:2;27481:9;27477:18;27468:6;27424:72;:::i;:::-;27506;27574:2;27563:9;27559:18;27550:6;27506:72;:::i;:::-;27625:9;27619:4;27615:20;27610:2;27599:9;27595:18;27588:48;27653:76;27724:4;27715:6;27653:76;:::i;:::-;27645:84;;27096:640;;;;;;;:::o;27742:332::-;27863:4;27901:2;27890:9;27886:18;27878:26;;27914:71;27982:1;27971:9;27967:17;27958:6;27914:71;:::i;:::-;27995:72;28063:2;28052:9;28048:18;28039:6;27995:72;:::i;:::-;27742:332;;;;;:::o;28080:210::-;28167:4;28205:2;28194:9;28190:18;28182:26;;28218:65;28280:1;28269:9;28265:17;28256:6;28218:65;:::i;:::-;28080:210;;;;:::o;28296:545::-;28469:4;28507:3;28496:9;28492:19;28484:27;;28521:71;28589:1;28578:9;28574:17;28565:6;28521:71;:::i;:::-;28602:68;28666:2;28655:9;28651:18;28642:6;28602:68;:::i;:::-;28680:72;28748:2;28737:9;28733:18;28724:6;28680:72;:::i;:::-;28762;28830:2;28819:9;28815:18;28806:6;28762:72;:::i;:::-;28296:545;;;;;;;:::o;28847:313::-;28960:4;28998:2;28987:9;28983:18;28975:26;;29047:9;29041:4;29037:20;29033:1;29022:9;29018:17;29011:47;29075:78;29148:4;29139:6;29075:78;:::i;:::-;29067:86;;28847:313;;;;:::o;29166:419::-;29332:4;29370:2;29359:9;29355:18;29347:26;;29419:9;29413:4;29409:20;29405:1;29394:9;29390:17;29383:47;29447:131;29573:4;29447:131;:::i;:::-;29439:139;;29166:419;;;:::o;29591:::-;29757:4;29795:2;29784:9;29780:18;29772:26;;29844:9;29838:4;29834:20;29830:1;29819:9;29815:17;29808:47;29872:131;29998:4;29872:131;:::i;:::-;29864:139;;29591:419;;;:::o;30016:::-;30182:4;30220:2;30209:9;30205:18;30197:26;;30269:9;30263:4;30259:20;30255:1;30244:9;30240:17;30233:47;30297:131;30423:4;30297:131;:::i;:::-;30289:139;;30016:419;;;:::o;30441:::-;30607:4;30645:2;30634:9;30630:18;30622:26;;30694:9;30688:4;30684:20;30680:1;30669:9;30665:17;30658:47;30722:131;30848:4;30722:131;:::i;:::-;30714:139;;30441:419;;;:::o;30866:::-;31032:4;31070:2;31059:9;31055:18;31047:26;;31119:9;31113:4;31109:20;31105:1;31094:9;31090:17;31083:47;31147:131;31273:4;31147:131;:::i;:::-;31139:139;;30866:419;;;:::o;31291:::-;31457:4;31495:2;31484:9;31480:18;31472:26;;31544:9;31538:4;31534:20;31530:1;31519:9;31515:17;31508:47;31572:131;31698:4;31572:131;:::i;:::-;31564:139;;31291:419;;;:::o;31716:::-;31882:4;31920:2;31909:9;31905:18;31897:26;;31969:9;31963:4;31959:20;31955:1;31944:9;31940:17;31933:47;31997:131;32123:4;31997:131;:::i;:::-;31989:139;;31716:419;;;:::o;32141:::-;32307:4;32345:2;32334:9;32330:18;32322:26;;32394:9;32388:4;32384:20;32380:1;32369:9;32365:17;32358:47;32422:131;32548:4;32422:131;:::i;:::-;32414:139;;32141:419;;;:::o;32566:::-;32732:4;32770:2;32759:9;32755:18;32747:26;;32819:9;32813:4;32809:20;32805:1;32794:9;32790:17;32783:47;32847:131;32973:4;32847:131;:::i;:::-;32839:139;;32566:419;;;:::o;32991:::-;33157:4;33195:2;33184:9;33180:18;33172:26;;33244:9;33238:4;33234:20;33230:1;33219:9;33215:17;33208:47;33272:131;33398:4;33272:131;:::i;:::-;33264:139;;32991:419;;;:::o;33416:::-;33582:4;33620:2;33609:9;33605:18;33597:26;;33669:9;33663:4;33659:20;33655:1;33644:9;33640:17;33633:47;33697:131;33823:4;33697:131;:::i;:::-;33689:139;;33416:419;;;:::o;33841:::-;34007:4;34045:2;34034:9;34030:18;34022:26;;34094:9;34088:4;34084:20;34080:1;34069:9;34065:17;34058:47;34122:131;34248:4;34122:131;:::i;:::-;34114:139;;33841:419;;;:::o;34266:::-;34432:4;34470:2;34459:9;34455:18;34447:26;;34519:9;34513:4;34509:20;34505:1;34494:9;34490:17;34483:47;34547:131;34673:4;34547:131;:::i;:::-;34539:139;;34266:419;;;:::o;34691:::-;34857:4;34895:2;34884:9;34880:18;34872:26;;34944:9;34938:4;34934:20;34930:1;34919:9;34915:17;34908:47;34972:131;35098:4;34972:131;:::i;:::-;34964:139;;34691:419;;;:::o;35116:::-;35282:4;35320:2;35309:9;35305:18;35297:26;;35369:9;35363:4;35359:20;35355:1;35344:9;35340:17;35333:47;35397:131;35523:4;35397:131;:::i;:::-;35389:139;;35116:419;;;:::o;35541:::-;35707:4;35745:2;35734:9;35730:18;35722:26;;35794:9;35788:4;35784:20;35780:1;35769:9;35765:17;35758:47;35822:131;35948:4;35822:131;:::i;:::-;35814:139;;35541:419;;;:::o;35966:::-;36132:4;36170:2;36159:9;36155:18;36147:26;;36219:9;36213:4;36209:20;36205:1;36194:9;36190:17;36183:47;36247:131;36373:4;36247:131;:::i;:::-;36239:139;;35966:419;;;:::o;36391:::-;36557:4;36595:2;36584:9;36580:18;36572:26;;36644:9;36638:4;36634:20;36630:1;36619:9;36615:17;36608:47;36672:131;36798:4;36672:131;:::i;:::-;36664:139;;36391:419;;;:::o;36816:::-;36982:4;37020:2;37009:9;37005:18;36997:26;;37069:9;37063:4;37059:20;37055:1;37044:9;37040:17;37033:47;37097:131;37223:4;37097:131;:::i;:::-;37089:139;;36816:419;;;:::o;37241:::-;37407:4;37445:2;37434:9;37430:18;37422:26;;37494:9;37488:4;37484:20;37480:1;37469:9;37465:17;37458:47;37522:131;37648:4;37522:131;:::i;:::-;37514:139;;37241:419;;;:::o;37666:::-;37832:4;37870:2;37859:9;37855:18;37847:26;;37919:9;37913:4;37909:20;37905:1;37894:9;37890:17;37883:47;37947:131;38073:4;37947:131;:::i;:::-;37939:139;;37666:419;;;:::o;38091:::-;38257:4;38295:2;38284:9;38280:18;38272:26;;38344:9;38338:4;38334:20;38330:1;38319:9;38315:17;38308:47;38372:131;38498:4;38372:131;:::i;:::-;38364:139;;38091:419;;;:::o;38516:222::-;38609:4;38647:2;38636:9;38632:18;38624:26;;38660:71;38728:1;38717:9;38713:17;38704:6;38660:71;:::i;:::-;38516:222;;;;:::o;38744:129::-;38778:6;38805:20;;:::i;:::-;38795:30;;38834:33;38862:4;38854:6;38834:33;:::i;:::-;38744:129;;;:::o;38879:75::-;38912:6;38945:2;38939:9;38929:19;;38879:75;:::o;38960:311::-;39037:4;39127:18;39119:6;39116:30;39113:56;;;39149:18;;:::i;:::-;39113:56;39199:4;39191:6;39187:17;39179:25;;39259:4;39253;39249:15;39241:23;;38960:311;;;:::o;39277:307::-;39338:4;39428:18;39420:6;39417:30;39414:56;;;39450:18;;:::i;:::-;39414:56;39488:29;39510:6;39488:29;:::i;:::-;39480:37;;39572:4;39566;39562:15;39554:23;;39277:307;;;:::o;39590:98::-;39641:6;39675:5;39669:12;39659:22;;39590:98;;;:::o;39694:99::-;39746:6;39780:5;39774:12;39764:22;;39694:99;;;:::o;39799:168::-;39882:11;39916:6;39911:3;39904:19;39956:4;39951:3;39947:14;39932:29;;39799:168;;;;:::o;39973:147::-;40074:11;40111:3;40096:18;;39973:147;;;;:::o;40126:169::-;40210:11;40244:6;40239:3;40232:19;40284:4;40279:3;40275:14;40260:29;;40126:169;;;;:::o;40301:148::-;40403:11;40440:3;40425:18;;40301:148;;;;:::o;40455:305::-;40495:3;40514:20;40532:1;40514:20;:::i;:::-;40509:25;;40548:20;40566:1;40548:20;:::i;:::-;40543:25;;40702:1;40634:66;40630:74;40627:1;40624:81;40621:107;;;40708:18;;:::i;:::-;40621:107;40752:1;40749;40745:9;40738:16;;40455:305;;;;:::o;40766:185::-;40806:1;40823:20;40841:1;40823:20;:::i;:::-;40818:25;;40857:20;40875:1;40857:20;:::i;:::-;40852:25;;40896:1;40886:35;;40901:18;;:::i;:::-;40886:35;40943:1;40940;40936:9;40931:14;;40766:185;;;;:::o;40957:348::-;40997:7;41020:20;41038:1;41020:20;:::i;:::-;41015:25;;41054:20;41072:1;41054:20;:::i;:::-;41049:25;;41242:1;41174:66;41170:74;41167:1;41164:81;41159:1;41152:9;41145:17;41141:105;41138:131;;;41249:18;;:::i;:::-;41138:131;41297:1;41294;41290:9;41279:20;;40957:348;;;;:::o;41311:191::-;41351:4;41371:20;41389:1;41371:20;:::i;:::-;41366:25;;41405:20;41423:1;41405:20;:::i;:::-;41400:25;;41444:1;41441;41438:8;41435:34;;;41449:18;;:::i;:::-;41435:34;41494:1;41491;41487:9;41479:17;;41311:191;;;;:::o;41508:96::-;41545:7;41574:24;41592:5;41574:24;:::i;:::-;41563:35;;41508:96;;;:::o;41610:104::-;41655:7;41684:24;41702:5;41684:24;:::i;:::-;41673:35;;41610:104;;;:::o;41720:90::-;41754:7;41797:5;41790:13;41783:21;41772:32;;41720:90;;;:::o;41816:77::-;41853:7;41882:5;41871:16;;41816:77;;;:::o;41899:149::-;41935:7;41975:66;41968:5;41964:78;41953:89;;41899:149;;;:::o;42054:110::-;42105:7;42134:24;42152:5;42134:24;:::i;:::-;42123:35;;42054:110;;;:::o;42170:126::-;42207:7;42247:42;42240:5;42236:54;42225:65;;42170:126;;;:::o;42302:77::-;42339:7;42368:5;42357:16;;42302:77;;;:::o;42385:86::-;42420:7;42460:4;42453:5;42449:16;42438:27;;42385:86;;;:::o;42477:134::-;42535:9;42568:37;42599:5;42568:37;:::i;:::-;42555:50;;42477:134;;;:::o;42617:126::-;42667:9;42700:37;42731:5;42700:37;:::i;:::-;42687:50;;42617:126;;;:::o;42749:113::-;42799:9;42832:24;42850:5;42832:24;:::i;:::-;42819:37;;42749:113;;;:::o;42868:154::-;42952:6;42947:3;42942;42929:30;43014:1;43005:6;43000:3;42996:16;42989:27;42868:154;;;:::o;43028:307::-;43096:1;43106:113;43120:6;43117:1;43114:13;43106:113;;;43205:1;43200:3;43196:11;43190:18;43186:1;43181:3;43177:11;43170:39;43142:2;43139:1;43135:10;43130:15;;43106:113;;;43237:6;43234:1;43231:13;43228:101;;;43317:1;43308:6;43303:3;43299:16;43292:27;43228:101;43077:258;43028:307;;;:::o;43341:320::-;43385:6;43422:1;43416:4;43412:12;43402:22;;43469:1;43463:4;43459:12;43490:18;43480:81;;43546:4;43538:6;43534:17;43524:27;;43480:81;43608:2;43600:6;43597:14;43577:18;43574:38;43571:84;;;43627:18;;:::i;:::-;43571:84;43392:269;43341:320;;;:::o;43667:281::-;43750:27;43772:4;43750:27;:::i;:::-;43742:6;43738:40;43880:6;43868:10;43865:22;43844:18;43832:10;43829:34;43826:62;43823:88;;;43891:18;;:::i;:::-;43823:88;43931:10;43927:2;43920:22;43710:238;43667:281;;:::o;43954:233::-;43993:3;44016:24;44034:5;44016:24;:::i;:::-;44007:33;;44062:66;44055:5;44052:77;44049:103;;;44132:18;;:::i;:::-;44049:103;44179:1;44172:5;44168:13;44161:20;;43954:233;;;:::o;44193:100::-;44232:7;44261:26;44281:5;44261:26;:::i;:::-;44250:37;;44193:100;;;:::o;44299:79::-;44338:7;44367:5;44356:16;;44299:79;;;:::o;44384:94::-;44423:7;44452:20;44466:5;44452:20;:::i;:::-;44441:31;;44384:94;;;:::o;44484:79::-;44523:7;44552:5;44541:16;;44484:79;;;:::o;44569:176::-;44601:1;44618:20;44636:1;44618:20;:::i;:::-;44613:25;;44652:20;44670:1;44652:20;:::i;:::-;44647:25;;44691:1;44681:35;;44696:18;;:::i;:::-;44681:35;44737:1;44734;44730:9;44725:14;;44569:176;;;;:::o;44751:180::-;44799:77;44796:1;44789:88;44896:4;44893:1;44886:15;44920:4;44917:1;44910:15;44937:180;44985:77;44982:1;44975:88;45082:4;45079:1;45072:15;45106:4;45103:1;45096:15;45123:180;45171:77;45168:1;45161:88;45268:4;45265:1;45258:15;45292:4;45289:1;45282:15;45309:180;45357:77;45354:1;45347:88;45454:4;45451:1;45444:15;45478:4;45475:1;45468:15;45495:180;45543:77;45540:1;45533:88;45640:4;45637:1;45630:15;45664:4;45661:1;45654:15;45681:117;45790:1;45787;45780:12;45804:117;45913:1;45910;45903:12;45927:117;46036:1;46033;46026:12;46173:117;46282:1;46279;46272:12;46296:117;46405:1;46402;46395:12;46419:117;46528:1;46525;46518:12;46542:117;46651:1;46648;46641:12;46665:102;46706:6;46757:2;46753:7;46748:2;46741:5;46737:14;46733:28;46723:38;;46665:102;;;:::o;46773:94::-;46806:8;46854:5;46850:2;46846:14;46825:35;;46773:94;;;:::o;46873:167::-;47013:19;47009:1;47001:6;46997:14;46990:43;46873:167;:::o;47046:225::-;47186:34;47182:1;47174:6;47170:14;47163:58;47255:8;47250:2;47242:6;47238:15;47231:33;47046:225;:::o;47277:224::-;47417:34;47413:1;47405:6;47401:14;47394:58;47486:7;47481:2;47473:6;47469:15;47462:32;47277:224;:::o;47507:175::-;47647:27;47643:1;47635:6;47631:14;47624:51;47507:175;:::o;47688:225::-;47828:34;47824:1;47816:6;47812:14;47805:58;47897:8;47892:2;47884:6;47880:15;47873:33;47688:225;:::o;47919:223::-;48059:34;48055:1;48047:6;48043:14;48036:58;48128:6;48123:2;48115:6;48111:15;48104:31;47919:223;:::o;48148:245::-;48288:34;48284:1;48276:6;48272:14;48265:58;48357:28;48352:2;48344:6;48340:15;48333:53;48148:245;:::o;48399:179::-;48539:31;48535:1;48527:6;48523:14;48516:55;48399:179;:::o;48584:225::-;48724:34;48720:1;48712:6;48708:14;48701:58;48793:8;48788:2;48780:6;48776:15;48769:33;48584:225;:::o;48815:230::-;48955:34;48951:1;48943:6;48939:14;48932:58;49024:13;49019:2;49011:6;49007:15;49000:38;48815:230;:::o;49051:166::-;49191:18;49187:1;49179:6;49175:14;49168:42;49051:166;:::o;49223:174::-;49363:26;49359:1;49351:6;49347:14;49340:50;49223:174;:::o;49403:167::-;49543:19;49539:1;49531:6;49527:14;49520:43;49403:167;:::o;49576:182::-;49716:34;49712:1;49704:6;49700:14;49693:58;49576:182;:::o;49764:233::-;49904:34;49900:1;49892:6;49888:14;49881:58;49973:16;49968:2;49960:6;49956:15;49949:41;49764:233;:::o;50003:163::-;50143:15;50139:1;50131:6;50127:14;50120:39;50003:163;:::o;50172:114::-;;:::o;50292:179::-;50432:31;50428:1;50420:6;50416:14;50409:55;50292:179;:::o;50477:177::-;50617:29;50613:1;50605:6;50601:14;50594:53;50477:177;:::o;50660:229::-;50800:34;50796:1;50788:6;50784:14;50777:58;50869:12;50864:2;50856:6;50852:15;50845:37;50660:229;:::o;50895:171::-;51035:23;51031:1;51023:6;51019:14;51012:47;50895:171;:::o;51072:173::-;51212:25;51208:1;51200:6;51196:14;51189:49;51072:173;:::o;51251:167::-;51391:19;51387:1;51379:6;51375:14;51368:43;51251:167;:::o;51424:122::-;51497:24;51515:5;51497:24;:::i;:::-;51490:5;51487:35;51477:63;;51536:1;51533;51526:12;51477:63;51424:122;:::o;51552:138::-;51633:32;51659:5;51633:32;:::i;:::-;51626:5;51623:43;51613:71;;51680:1;51677;51670:12;51613:71;51552:138;:::o;51696:116::-;51766:21;51781:5;51766:21;:::i;:::-;51759:5;51756:32;51746:60;;51802:1;51799;51792:12;51746:60;51696:116;:::o;51818:122::-;51891:24;51909:5;51891:24;:::i;:::-;51884:5;51881:35;51871:63;;51930:1;51927;51920:12;51871:63;51818:122;:::o;51946:120::-;52018:23;52035:5;52018:23;:::i;:::-;52011:5;52008:34;51998:62;;52056:1;52053;52046:12;51998:62;51946:120;:::o;52072:150::-;52159:38;52191:5;52159:38;:::i;:::-;52152:5;52149:49;52139:77;;52212:1;52209;52202:12;52139:77;52072:150;:::o;52228:122::-;52301:24;52319:5;52301:24;:::i;:::-;52294:5;52291:35;52281:63;;52340:1;52337;52330:12;52281:63;52228:122;:::o;52356:118::-;52427:22;52443:5;52427:22;:::i;:::-;52420:5;52417:33;52407:61;;52464:1;52461;52454:12;52407:61;52356:118;:::o
Swarm Source
ipfs://ffc8bb45d24fa8d44c9571ec27a3ebe58db9e14cb46089c27fbf96e544fff4f4
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.