ERC-721
Overview
Max Total Supply
525 MC
Holders
279
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MYTHICAL
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-12 */ // SPDX-License-Identifier: MIT // Creator: Mai of Tessera Labs // Special Thanks to Diversity from Divine Anarchy for all his help reviewing pragma solidity ^0.8.12; /** * @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); } } /** * @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); } } } } /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } } interface ERC721TokenReceiver { function onERC721Received(address operator,address from, uint256 id, bytes calldata data) external returns (bytes4); } interface IInhibitor { function mintHelper(address _user, uint256 quantity) external; } interface IStakingHelper { function startSeason(uint256 _dailyYield) external; function endSeason() external; function needsRewardsUpdate(address _user) external view returns (bool); function aggregateRewards(address _user) external; } error OwnerOfNullValue(); error BalanceOfZeroAddress(); error MintZeroAddress(); error MintZeroQuantity(); error SafeMintZeroQuantity(); error SafeMintZeroAddress(); error SafeMintUnsafeDestination(); error TokensLocked(); error CallerLacksTransferPermissions(); error TransferFromNotOwner(); error TransferZeroAddress(); error SafeTransferUnsafeDestination(); error TokensNotBatchable(); error BatchQuantityTooSmall(); error ApprovalToOwner(); error CallerLacksApprovalPermissions(); error getApprovedNonexistentToken(); error stakingNotActive(); error TokensStaked(); error TokensUnstaked(); error StakedTokensTimeLocked(); error StakingActive(); error beginStakingZeroAddress(); error StakingInactive(); error UnsupportedCooldownDuration(); error CooldownTooSmall(); error TokensUnlocked(); error NewOwnerAddressZero(); error TokenURINonexistentToken(); error TokensZeroBalance(); error TokensOfOwnerNullValue(); error CallerNotStakingHelper(); error CallerNotOwner(); /** * Built to optimize for lower gas during batch mints and transfers. * A new locking mechanism has been added to protect users from all attempted scams. * New "Phantom Staking" is supported allowing for users to participate in token staking without large gas overhead or transferring tokens. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * */ abstract contract ERC721LPhantomStakeable { using Address for address; using Strings for uint256; event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); event Locked(address indexed owner, uint256 unlockCooldown); event Unlocked(address indexed owner, uint256 unlockTimestamp); event Staked(address indexed owner, uint256 stakedTimestamp); event Unstaked(address indexed owner, uint256 unstakedTimestamp); event StakingEventStarted(address indexed stakingContract, uint256 dailyYield, uint256 timestamp); event StakingEventEnded(uint256 timestamp); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); struct addressData { uint64 balance; bool staked; bool locked; uint64 lockedUnlockCooldown; uint64 lockedUnlockTimestamp; } struct collectionData { string name; string symbol; address owner; uint256 index; uint256 burned; } struct stakingData { IStakingHelper stakingContract; bool stakingStatus; } collectionData internal _collectionData; stakingData internal _stakingData; mapping(uint256 => address) internal _ownerships; mapping(address => addressData) internal _addressData; mapping(uint256 => address) internal _tokenApprovals; mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory _name, string memory _symbol) { _collectionData.name = _name; _collectionData.symbol = _symbol; _transferOwnership(_msgSender()); } function _msgSender() internal view returns (address) { return msg.sender; } /** * @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` or `_safeMint`), */ function _exists(uint256 tokenId) public view virtual returns (bool) { return tokenId < _collectionData.index; } /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual returns (address) { unchecked { if (tokenId < _collectionData.index) { address ownership = _ownerships[tokenId]; if (ownership != address(0)) { return ownership; } while (true) { tokenId--; ownership = _ownerships[tokenId]; if (ownership != address(0)) { return ownership; } } } } revert OwnerOfNullValue(); } /** * @dev Returns the number of tokens in `_owner`'s account. */ function balanceOf(address _address) public view returns (uint256) { if (_address == address(0)) revert BalanceOfZeroAddress(); return uint256(_addressData[_address].balance); } /** * @dev Returns whether `_owner`'s tokens are currently unlocked. */ function isUnlocked(address _owner) public view returns (bool) { return !_addressData[_owner].locked && _addressData[_owner].lockedUnlockTimestamp < block.timestamp && (_stakingData.stakingStatus ? !_addressData[_owner].staked : true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { if (to == address(0)) revert MintZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (_stakingData.stakingStatus && _addressData[to].staked && _stakingData.stakingContract.needsRewardsUpdate(to)){ _stakingData.stakingContract.aggregateRewards(to); } unchecked { uint256 updatedIndex = _collectionData.index; _addressData[to].balance += uint64(quantity); _ownerships[updatedIndex] = to; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex++); } _collectionData.index = updatedIndex; } } /** * @dev See Below {ERC721L-_safeMint}. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {onERC721Received}, which is called for each safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 quantity, bytes memory _data) internal { if (to == address(0)) revert SafeMintZeroAddress(); if (quantity == 0) revert SafeMintZeroQuantity(); if (_stakingData.stakingStatus && _addressData[to].staked && _stakingData.stakingContract.needsRewardsUpdate(to)){ _stakingData.stakingContract.aggregateRewards(to); } unchecked { uint256 updatedIndex = _collectionData.index; _addressData[to].balance += uint64(quantity); _ownerships[updatedIndex] = to; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if(to.code.length > 0 && ERC721TokenReceiver(to).onERC721Received(_msgSender(), address(0), updatedIndex, _data) != ERC721TokenReceiver.onERC721Received.selector) revert SafeMintUnsafeDestination(); updatedIndex++; } _collectionData.index = updatedIndex; } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - `from` must not have tokens locked. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) public { address currentOwner = ownerOf(tokenId); if (!isUnlocked(from)) revert TokensLocked(); if (_msgSender() != currentOwner && getApproved(tokenId) != _msgSender() && !isApprovedForAll(currentOwner,_msgSender())) revert CallerLacksTransferPermissions(); if (currentOwner != from) revert TransferFromNotOwner(); if (to == address(0)) revert TransferZeroAddress(); if (_stakingData.stakingStatus && _addressData[to].staked && _stakingData.stakingContract.needsRewardsUpdate(to)){ _stakingData.stakingContract.aggregateRewards(to); } delete _tokenApprovals[tokenId]; unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = to; uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId] == address(0) && nextTokenId < _collectionData.index) { _ownerships[nextTokenId] = currentOwner; } } emit Transfer(from, to, tokenId); } /** * @dev See Below {ERC721L-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual { safeTransferFrom(from, to, tokenId, ''); } /** * @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 {ERC721TokenReceiver}, which is called upon a safe transfer. * - `from` must not have tokens locked. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual { transferFrom(from, to, tokenId); if (to.code.length > 0 && ERC721TokenReceiver(to).onERC721Received(_msgSender(), address(0), tokenId, _data) != ERC721TokenReceiver.onERC721Received.selector) revert SafeTransferUnsafeDestination(); } /** * @dev Batch transfers `quantity` tokens sequentially starting at `startID` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `startID` token and all sequential tokens must exist and be owned by `from`. * - `from` must not have tokens locked. * * Emits `quantity` number of {Transfer} events. */ function batchTransferFrom(address from, address to, uint256 startID, uint256 quantity) public virtual { _batchTransferFrom(from, to, startID, quantity, false, ''); } /** * @dev See Below {ERC721L-batchSafeTransferFrom}. */ function batchSafeTransferFrom(address from, address to, uint256 startID, uint256 quantity) public virtual { batchSafeTransferFrom(from, to, startID, quantity, ''); } /** * @dev Safely batch transfers `quantity` tokens sequentially starting at `startID` 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. * - `startID` token and all sequential tokens 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 {ERC721TokenReceiver}, which is called upon a safe transfer. * - `from` must not have tokens locked. * * Emits `quantity` number of {Transfer} events. */ function batchSafeTransferFrom(address from, address to, uint256 startID, uint256 quantity, bytes memory _data) public virtual { _batchTransferFrom(from, to, startID, quantity, true, _data); } function _batchTransferFrom (address from, address to, uint256 startID, uint256 quantity, bool safeTransferCheck, bytes memory _data) internal { if (!isUnlocked(from)) revert TokensLocked(); if (_msgSender() != from && !isApprovedForAll(from,_msgSender())) revert CallerLacksTransferPermissions(); if (!multiOwnerCheck(from, startID, quantity)) revert TokensNotBatchable(); if (to == address(0)) revert TransferZeroAddress(); if (_stakingData.stakingStatus && _addressData[to].staked && _stakingData.stakingContract.needsRewardsUpdate(to)){ _stakingData.stakingContract.aggregateRewards(to); } unchecked { for (uint256 i; i < quantity; i++) { uint256 currentToken = startID + i; delete _tokenApprovals[currentToken]; if (i == 0){ _ownerships[currentToken] = to; } else { delete _ownerships[currentToken]; } emit Transfer(from, to, currentToken); if (safeTransferCheck){ if(to.code.length > 0 && ERC721TokenReceiver(to).onERC721Received(_msgSender(), address(0), currentToken, _data) != ERC721TokenReceiver.onERC721Received.selector) revert SafeTransferUnsafeDestination(); } } _addressData[from].balance -= uint64(quantity); _addressData[to].balance += uint64(quantity); uint256 nextTokenId = startID + quantity; if (_ownerships[nextTokenId] == address(0) && nextTokenId < _collectionData.index) { _ownerships[nextTokenId] = from; } } } /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() public view returns (uint256) { unchecked { return _collectionData.index - _collectionData.burned; } } /** * @dev Returns whether `_addressToCheck` is the owner of `quantity` tokens sequentially starting from `startID`. * * Requirements: * * - `startID` token and all sequential tokens must exist. */ function multiOwnerCheck(address _addressToCheck, uint256 startID, uint256 quantity) internal view returns (bool) { if (quantity < 2) revert BatchQuantityTooSmall(); unchecked { for (uint256 i; i < quantity; i++) { if (ownerOf(startID + i) != _addressToCheck){ return false; } } } return true; } /** * @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. * - Owner must not have tokens locked. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public { if (operator == _msgSender()) revert ApprovalToOwner(); if (!isUnlocked(_msgSender())) revert TokensLocked(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `_owner` and tokens are unlocked for `_owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address _owner, address operator) public view returns (bool) { return !isUnlocked(_owner) ? false : _operatorApprovals[_owner][operator]; } /** * @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) public { address tokenOwner = ownerOf(tokenId); if (to == tokenOwner) revert ApprovalToOwner(); if (_msgSender() != tokenOwner && !isApprovedForAll(tokenOwner, _msgSender())) revert CallerLacksApprovalPermissions(); _tokenApprovals[tokenId] = to; emit Approval(tokenOwner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view returns (address) { if (!_exists(tokenId)) revert getApprovedNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev Stakes `_owner`'s tokens, if optionallock is enabled cannot be unstaked for optionalStakingLockPeriod days. * Requirements: * * - The `caller` cannot have their tokens staked currently. * * Emits an {Staked} event. */ function stake(address _owner) public stakingHelper { if (!_stakingData.stakingStatus) revert stakingNotActive(); if (_addressData[_owner].staked) revert TokensStaked(); _addressData[_owner].staked = true; emit Staked(_msgSender(), block.timestamp); } /** * @dev Unstakes `_owner`'s tokens if they arent in a locked staking cycle. * Requirements: * * - The `_owner` cannot have their tokens unstaked currently. * - The `_owner` cannot have their tokens optionally locked currently. * * Emits an {Unstaked} event. */ function unstake(address _owner) public stakingHelper { if (!_addressData[_owner].staked) revert TokensUnstaked(); delete _addressData[_owner].staked; emit Unstaked(_owner, block.timestamp); } /** * @dev Begins Staking Event. * Requirements: * * - Staking must be inactive. * - `_stakingContract` cannot be null address. * * Emits a {StakingEventStarted} event. */ function beginStaking(address _stakingContract, uint256 _dailyYield) public onlyOwner { if (_stakingData.stakingStatus) revert StakingActive(); if (_stakingContract == address(0)) revert beginStakingZeroAddress(); _stakingData.stakingContract = IStakingHelper(_stakingContract); _stakingData.stakingStatus = true; _stakingData.stakingContract.startSeason(_dailyYield); emit StakingEventStarted(_stakingContract, _dailyYield, block.timestamp); } /** * @dev Ends Staking Event. * Requirements: * * - Staking must be active. * * Emits a {StakingEnded} event. */ function endStaking() public onlyOwner { if (!_stakingData.stakingStatus) revert StakingInactive(); _stakingData.stakingContract.endSeason(); delete _stakingData; emit StakingEventEnded(block.timestamp); } /** * @dev Locks `_owner`'s tokens from any form of transferring. * Requirements: * * - The `caller` cannot have their tokens locked currently. * * Emits a {Locked} event. */ function lock(uint256 _cooldown) public { if (_addressData[_msgSender()].locked) revert TokensLocked(); if (_cooldown < 1 || _cooldown > 30) revert UnsupportedCooldownDuration(); unchecked { uint256 proposedCooldown = _cooldown * 1 days; if (block.timestamp + proposedCooldown < _addressData[_msgSender()].lockedUnlockTimestamp) revert CooldownTooSmall(); _addressData[_msgSender()].locked = true; _addressData[_msgSender()].lockedUnlockCooldown = uint64(proposedCooldown); } emit Locked(_msgSender(), _cooldown); } /** * @dev Begins unlocking process for `_owner`'s tokens. * Requirements: * * - The `caller` cannot have their tokens unlocked currently. * * Emits an {Unlocked} event. */ function unlock() public { if (!_addressData[_msgSender()].locked) revert TokensUnlocked(); delete _addressData[_msgSender()].locked; unchecked { _addressData[_msgSender()].lockedUnlockTimestamp = uint64(block.timestamp + _addressData[_msgSender()].lockedUnlockCooldown); } emit Unlocked(_msgSender(), block.timestamp); } /** * @dev Returns the address of the current collection owner. */ function owner() public view returns (address) { return _collectionData.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 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 onlyOwner { if (newOwner == address(0)) revert NewOwnerAddressZero(); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal { address oldOwner = _collectionData.owner; _collectionData.owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } function name() public view returns (string memory) { return _collectionData.name; } /** * @dev Returns the token collection symbol. */ function symbol() public view returns (string memory) { return _collectionData.symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual returns (string memory) { if (!_exists(tokenId)) revert TokenURINonexistentToken(); 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() public view virtual returns (string memory) { return ''; } /** * @dev Returns tokenIDs owned by `_owner`. */ function tokensOfOwner(address _owner) public view returns (uint256[] memory) { uint256 totalOwned = _addressData[_owner].balance; if (totalOwned == 0) revert TokensZeroBalance(); uint256 supply = _collectionData.index; uint256[] memory tokenIDs = new uint256[](totalOwned); uint256 ownedIndex; address currentOwner; unchecked { for (uint256 i; i < supply; i++) { address currentAddress = _ownerships[i]; if (currentAddress != address(0)) { currentOwner = currentAddress; } if (currentOwner == _owner) { tokenIDs[ownedIndex++] = i; if (ownedIndex == totalOwned){ return tokenIDs; } } } } revert TokensOfOwnerNullValue(); } /** * @dev Returns `_owner`'s lock status and unlock timestamp in unix time, and personal lock cooldown in days. */ function getLockData(address _owner) public view returns (bool, uint256, uint256) { return (_addressData[_owner].locked, _addressData[_owner].lockedUnlockTimestamp, _addressData[_owner].lockedUnlockCooldown); } /** * @dev Returns `_address`'s staking status. */ function getStakingStatus(address _address) public view returns (bool) { return (_addressData[_address].staked); } /** * @dev Returns the token collection information. */ function collectionInformation() public view returns (collectionData memory) { return _collectionData; } /** * @dev Returns the token collection information. */ function stakingInformation() public view returns (address, bool) { return (address(_stakingData.stakingContract), _stakingData.stakingStatus); } function supportsInterface(bytes4 interfaceId) public pure returns (bool) { return interfaceId == 0x01ffc9a7 || interfaceId == 0x80ac58cd || interfaceId == 0x5b5e139f; } modifier stakingHelper() { if (address(_stakingData.stakingContract) != _msgSender()) revert CallerNotStakingHelper(); _; } modifier onlyOwner() { if (owner() != _msgSender()) revert CallerNotOwner(); _; } } error CallerIsSmartContract(); error ProofFailure(); error QuantityFailure(); error SupplyFailure(); error PriceFailure(); error AmountFailure(); error MintNotActive(); error InputError(); error WithdrawFailure(); contract MYTHICAL is ERC721LPhantomStakeable { struct addressMintData { uint128 genesisMinted; uint128 inhibitorMinted; } address public royaltyAddress; uint256 public royaltySize = 750; uint256 public royaltyDenominator = 10000; mapping(uint256 => address) private _royaltyReceivers; uint256 public maxSupply = 7777; string private _baseURI = "ipfs://QmVdZQvv66kvfCkZ4Lwen8bM7KJX5JgtZEmWRaGL8hy54X/"; uint256 public allowListMaxMint = 1; uint256 public publicMaxMint = 5; uint256 public priceGenesis = .1 ether; uint256 public priceInhibitor = .02 ether; mapping(address => addressMintData) internal _addressMintData; bytes32 public allowlistRoot = 0x8977b92ce0adeb8244cbc3b448b4332c7d78cd253f33e5e5d80924caf270375d; uint256 public presaleActive; uint256 public publicActive; bool public teamAllocationMinted; IInhibitor public INHIB; constructor() ERC721LPhantomStakeable("MYTHICAL", "MC") { royaltyAddress = owner(); } modifier callerIsUser() { if (tx.origin != _msgSender() || _msgSender().code.length != 0) revert CallerIsSmartContract(); _; } function presaleMint(uint256 _quantityGenesis, uint256 _quantityInhibitor, bytes32[] calldata _proof) public payable callerIsUser { if (presaleActive < 1) revert MintNotActive(); if (!MerkleProof.verify(_proof, allowlistRoot, keccak256(abi.encodePacked(_msgSender())))) revert ProofFailure(); unchecked { if (_quantityGenesis + _quantityInhibitor < 1) revert QuantityFailure(); if (totalSupply() + _quantityGenesis > maxSupply) revert SupplyFailure(); if (msg.value < (_quantityGenesis * priceGenesis) + (_quantityInhibitor * priceInhibitor)) revert PriceFailure(); } if(_quantityInhibitor > 0){ unchecked { if (_quantityInhibitor + _addressMintData[_msgSender()].inhibitorMinted > allowListMaxMint) revert AmountFailure(); _addressMintData[_msgSender()].inhibitorMinted += uint128(_quantityInhibitor); } INHIB.mintHelper(_msgSender(), _quantityInhibitor); } if(_quantityGenesis > 0){ unchecked { if (_quantityGenesis + _addressMintData[_msgSender()].genesisMinted > allowListMaxMint) revert AmountFailure(); _addressMintData[_msgSender()].genesisMinted += uint128(_quantityGenesis); } _mint(_msgSender(), _quantityGenesis); } } function publicMint(uint256 _quantityGenesis, uint256 _quantityInhibitor) public payable callerIsUser { if (publicActive < 1) revert MintNotActive(); unchecked { if (_quantityGenesis + _quantityInhibitor < 1) revert QuantityFailure(); if (totalSupply() + _quantityGenesis > maxSupply) revert SupplyFailure(); if (msg.value < (_quantityGenesis * priceGenesis) + (_quantityInhibitor * priceInhibitor)) revert PriceFailure(); } if(_quantityInhibitor > 0){ unchecked { if (_quantityInhibitor > publicMaxMint) revert AmountFailure(); } INHIB.mintHelper(_msgSender(), _quantityInhibitor); } if(_quantityGenesis > 0){ unchecked { if (_quantityGenesis > publicMaxMint) revert AmountFailure(); } _mint(_msgSender(), _quantityGenesis); } } function baseURI() public view override returns (string memory) { return _baseURI; } function setBaseURI(string calldata newBaseURI) external onlyOwner { _baseURI = newBaseURI; } function setState(uint256 group, uint256 category, uint256 _value) external onlyOwner { bool adjusted; if (group == 0){ if (category == 0){ presaleActive = _value; adjusted = true; } if (category == 1){ publicActive = _value; adjusted = true; } } if (group == 1){ if (category == 0){ allowListMaxMint = _value; adjusted = true; } if (category == 1){ publicMaxMint = _value; adjusted = true; } } if (group == 2){ if (category == 0){ priceGenesis = _value; adjusted = true; } if (category == 1){ priceInhibitor = _value; adjusted = true; } } if (!adjusted) revert InputError(); } function setInhibitorAddress(IInhibitor _address) external onlyOwner { INHIB = _address; } function setRoot(bytes32 _root) external onlyOwner { allowlistRoot = _root; } function checkRemainingMints(address _address, bytes32[] calldata _proof) external view returns (uint256, uint256) { if (!MerkleProof.verify(_proof, allowlistRoot, keccak256(abi.encodePacked(_address)))) return (0, 0); return(allowListMaxMint - _addressMintData[_address].genesisMinted, allowListMaxMint - _addressMintData[_address].inhibitorMinted); } function mintTeamAllocation() external onlyOwner callerIsUser { require(!teamAllocationMinted, "Team Allocation already minted"); INHIB.mintHelper(_msgSender(), 120); _mint(_msgSender(), 120); teamAllocationMinted = true; } function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount) { uint256 amount = (_salePrice * royaltySize)/(royaltyDenominator); address royaltyReceiver = _royaltyReceivers[_tokenId] != address(0) ? _royaltyReceivers[_tokenId] : royaltyAddress; return (royaltyReceiver, amount); } function addRoyaltyReceiverForTokenId(address receiver, uint256 tokenId) public onlyOwner { _royaltyReceivers[tokenId] = receiver; } function withdraw() external onlyOwner { uint256 currentBalance = address(this).balance; (bool sent, ) = address(msg.sender).call{value: currentBalance}(''); if (!sent) revert WithdrawFailure(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmountFailure","type":"error"},{"inputs":[],"name":"ApprovalToOwner","type":"error"},{"inputs":[],"name":"BalanceOfZeroAddress","type":"error"},{"inputs":[],"name":"BatchQuantityTooSmall","type":"error"},{"inputs":[],"name":"CallerIsSmartContract","type":"error"},{"inputs":[],"name":"CallerLacksApprovalPermissions","type":"error"},{"inputs":[],"name":"CallerLacksTransferPermissions","type":"error"},{"inputs":[],"name":"CallerNotOwner","type":"error"},{"inputs":[],"name":"CallerNotStakingHelper","type":"error"},{"inputs":[],"name":"CooldownTooSmall","type":"error"},{"inputs":[],"name":"InputError","type":"error"},{"inputs":[],"name":"MintNotActive","type":"error"},{"inputs":[],"name":"MintZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NewOwnerAddressZero","type":"error"},{"inputs":[],"name":"OwnerOfNullValue","type":"error"},{"inputs":[],"name":"PriceFailure","type":"error"},{"inputs":[],"name":"ProofFailure","type":"error"},{"inputs":[],"name":"QuantityFailure","type":"error"},{"inputs":[],"name":"SafeTransferUnsafeDestination","type":"error"},{"inputs":[],"name":"StakingActive","type":"error"},{"inputs":[],"name":"StakingInactive","type":"error"},{"inputs":[],"name":"SupplyFailure","type":"error"},{"inputs":[],"name":"TokenURINonexistentToken","type":"error"},{"inputs":[],"name":"TokensLocked","type":"error"},{"inputs":[],"name":"TokensNotBatchable","type":"error"},{"inputs":[],"name":"TokensOfOwnerNullValue","type":"error"},{"inputs":[],"name":"TokensStaked","type":"error"},{"inputs":[],"name":"TokensUnlocked","type":"error"},{"inputs":[],"name":"TokensUnstaked","type":"error"},{"inputs":[],"name":"TokensZeroBalance","type":"error"},{"inputs":[],"name":"TransferFromNotOwner","type":"error"},{"inputs":[],"name":"TransferZeroAddress","type":"error"},{"inputs":[],"name":"UnsupportedCooldownDuration","type":"error"},{"inputs":[],"name":"WithdrawFailure","type":"error"},{"inputs":[],"name":"beginStakingZeroAddress","type":"error"},{"inputs":[],"name":"getApprovedNonexistentToken","type":"error"},{"inputs":[],"name":"stakingNotActive","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":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"unlockCooldown","type":"uint256"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakedTimestamp","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"StakingEventEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakingContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"dailyYield","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"StakingEventStarted","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"unlockTimestamp","type":"uint256"}],"name":"Unlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"unstakedTimestamp","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"INHIB","outputs":[{"internalType":"contract IInhibitor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"_exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"addRoyaltyReceiverForTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowListMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"startID","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"batchSafeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"startID","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"batchSafeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"startID","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingContract","type":"address"},{"internalType":"uint256","name":"_dailyYield","type":"uint256"}],"name":"beginStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"checkRemainingMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionInformation","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"burned","type":"uint256"}],"internalType":"struct ERC721LPhantomStakeable.collectionData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getLockData","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getStakingStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"isUnlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cooldown","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintTeamAllocation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleActive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantityGenesis","type":"uint256"},{"internalType":"uint256","name":"_quantityInhibitor","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"priceGenesis","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceInhibitor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicActive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantityGenesis","type":"uint256"},{"internalType":"uint256","name":"_quantityInhibitor","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltySize","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":"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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IInhibitor","name":"_address","type":"address"}],"name":"setInhibitorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"group","type":"uint256"},{"internalType":"uint256","name":"category","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingInformation","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamAllocationMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","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"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6102ee600b55612710600c55611e61600e5560e0604052603660808181529062004e0060a03980516200003b91600f9160209091019062000177565b506001601055600560115567016345785d8a000060125566470de4df8200006013557f8977b92ce0adeb8244cbc3b448b4332c7d78cd253f33e5e5d80924caf270375d6015553480156200008e57600080fd5b506040805180820182526008815267135655121250d05360c21b6020808301918252835180850190945260028452614d4360f01b908401528151919291620000d99160009162000177565b508051620000ef90600190602084019062000177565b50620000fb3362000125565b5050600254600a80546001600160a01b0319166001600160a01b039092169190911790556200025a565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000185906200021d565b90600052602060002090601f016020900481019282620001a95760008555620001f4565b82601f10620001c457805160ff1916838001178555620001f4565b82800160010185558215620001f4579182015b82811115620001f4578251825591602001919060010190620001d7565b506200020292915062000206565b5090565b5b8082111562000202576000815560010162000207565b600181811c908216806200023257607f821691505b602082108114156200025457634e487b7160e01b600052602260045260246000fd5b50919050565b614b96806200026a6000396000f3fe6080604052600436106103815760003560e01c8063715018a6116101d1578063ad2f852a11610102578063d9b3c801116100a0578063f2888dbb1161006f578063f2888dbb14610b24578063f2fde38b14610b44578063f8e76cc014610b64578063fd8d7ed314610b8657600080fd5b8063d9b3c80114610aa4578063dab5f34014610ac4578063dd46706414610ae4578063e985e9c514610b0457600080fd5b8063c6222331116100dc578063c6222331146109ac578063c87b56dd14610a4e578063cd6a3ea514610a6e578063d5abeb0114610a8e57600080fd5b8063ad2f852a1461092d578063b88d4fde1461095a578063bd576a591461097a57600080fd5b8063947d58761161016f57806398ae99a81161014957806398ae99a8146108cf5780639c9c6669146108e2578063a22cb465146108f8578063a69df4b51461091857600080fd5b8063947d58761461084e57806395d89b41146108a457806397309a5b146108b957600080fd5b8063830ef099116101ab578063830ef099146107b65780638462151c146107d657806387d381cf146108035780638da5cb5b1461082357600080fd5b8063715018a61461077557806379b2f57f1461078a5780637f44ab2f146107a057600080fd5b80632bbf532a116102b657806353135ca0116102545780636352211e116102235780636352211e146107005780636b5dd991146107205780636c0360eb1461074057806370a082311461075557600080fd5b806353135ca01461066357806355f804b3146106795780635a5d3742146106995780635d49c133146106ae57600080fd5b80633f2981cf116102905780633f2981cf146105eb5780633ffea8c81461060157806342842e0e146106235780634c9047301461064357600080fd5b80632bbf532a146105a0578063305c7d4a146105c05780633ccfd60b146105d657600080fd5b80631d7d5ae4116103235780632507190a116102fd5780632507190a146104ff578063264762041461051457806329dc1102146105345780632a55205a1461055457600080fd5b80631d7d5ae41461049457806323b872dd146104aa578063243a190c146104ca57600080fd5b8063095ea7b31161035f578063095ea7b3146104225780630f8223be1461044457806318160ddd1461045e5780631b59169d1461048157600080fd5b806301ffc9a71461038657806306fdde03146103bb578063081812fc146103dd575b600080fd5b34801561039257600080fd5b506103a66103a1366004614295565b610b9c565b60405190151581526020015b60405180910390f35b3480156103c757600080fd5b506103d0610c81565b6040516103b29190614328565b3480156103e957600080fd5b506103fd6103f836600461433b565b610d15565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103b2565b34801561042e57600080fd5b5061044261043d366004614376565b610d81565b005b34801561045057600080fd5b506018546103a69060ff1681565b34801561046a57600080fd5b50600454600354035b6040519081526020016103b2565b61044261048f3660046143e7565b610ed9565b3480156104a057600080fd5b5061047360135481565b3480156104b657600080fd5b506104426104c536600461443a565b6112fc565b3480156104d657600080fd5b506104ea6104e536600461447b565b6117be565b604080519283526020830191909152016103b2565b34801561050b57600080fd5b506104426118ee565b34801561052057600080fd5b5061044261052f3660046144d0565b611a74565b34801561054057600080fd5b5061044261054f3660046144ed565b611c34565b34801561056057600080fd5b5061057461056f366004614533565b611c50565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016103b2565b3480156105ac57600080fd5b506103a66105bb3660046144d0565b611cef565b3480156105cc57600080fd5b5061047360115481565b3480156105e257600080fd5b50610442611de0565b3480156105f757600080fd5b5061047360175481565b34801561060d57600080fd5b50610616611eb9565b6040516103b29190614555565b34801561062f57600080fd5b5061044261063e36600461443a565b61206c565b34801561064f57600080fd5b5061044261065e3660046145ed565b61208c565b34801561066f57600080fd5b5061047360165481565b34801561068557600080fd5b50610442610694366004614619565b61218d565b3480156106a557600080fd5b506104426121ea565b3480156106ba57600080fd5b506103a66106c93660046144d0565b73ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205468010000000000000000900460ff1690565b34801561070c57600080fd5b506103fd61071b36600461433b565b6123d9565b34801561072c57600080fd5b5061044261073b3660046144d0565b6124a7565b34801561074c57600080fd5b506103d0612544565b34801561076157600080fd5b506104736107703660046144d0565b612553565b34801561078157600080fd5b506104426125d5565b34801561079657600080fd5b5061047360125481565b3480156107ac57600080fd5b5061047360105481565b3480156107c257600080fd5b506104426107d1366004614376565b612632565b3480156107e257600080fd5b506107f66107f13660046144d0565b612841565b6040516103b2919061468b565b34801561080f57600080fd5b5061044261081e3660046147a9565b6129dc565b34801561082f57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166103fd565b34801561085a57600080fd5b506005546040805173ffffffffffffffffffffffffffffffffffffffff831681527401000000000000000000000000000000000000000090920460ff1615156020830152016103b2565b3480156108b057600080fd5b506103d06129f2565b3480156108c557600080fd5b50610473600b5481565b6104426108dd366004614533565b612a04565b3480156108ee57600080fd5b5061047360155481565b34801561090457600080fd5b5061044261091336600461482d565b612c8a565b34801561092457600080fd5b50610442612db0565b34801561093957600080fd5b50600a546103fd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561096657600080fd5b50610442610975366004614866565b612ee3565b34801561098657600080fd5b506018546103fd90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156109b857600080fd5b50610a316109c73660046144d0565b73ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205460ff69010000000000000000008204169167ffffffffffffffff720100000000000000000000000000000000000083048116926a010000000000000000000090041690565b6040805193151584526020840192909252908201526060016103b2565b348015610a5a57600080fd5b506103d0610a6936600461433b565b61300a565b348015610a7a57600080fd5b50610442610a89366004614376565b6130a9565b348015610a9a57600080fd5b50610473600e5481565b348015610ab057600080fd5b50610442610abf3660046144ed565b61314d565b348015610ad057600080fd5b50610442610adf36600461433b565b61316b565b348015610af057600080fd5b50610442610aff36600461433b565b6131c1565b348015610b1057600080fd5b506103a6610b1f3660046148d2565b613379565b348015610b3057600080fd5b50610442610b3f3660046144d0565b6133cd565b348015610b5057600080fd5b50610442610b5f3660046144d0565b613506565b348015610b7057600080fd5b506103a6610b7f36600461433b565b6003541190565b348015610b9257600080fd5b50610473600c5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161480610c2f57507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b80610c7b57507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060600080018054610c9290614900565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbe90614900565b8015610d0b5780601f10610ce057610100808354040283529160200191610d0b565b820191906000526020600020905b815481529060010190602001808311610cee57829003601f168201915b5050505050905090565b6000610d22826003541190565b610d58576040517f1e3d0dec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060009081526008602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610d8c826123d9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610df4576040517f93f5178600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821614801590610e215750610e1f8133613379565b155b15610e58576040517f302318df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526008602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3233141580610ee85750333b15155b15610f1f576040517fe08e16c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016016541015610f5c576040517f914edb0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fe5828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506015546040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16602082015290925060340190505b604051602081830303815290604052805190602001206135b0565b61101b576040517f9ba1ff2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018385011015611058576040517f82af4ff400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54846110696004546003540390565b0111156110a2576040517f2605101300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60135483026012548502013410156110e6576040517f7b9b085b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8215611238576010543360009081526014602052604090205470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff168401111561115f576040517fdeee748a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526014602052604080822080547001000000000000000000000000000000008082046fffffffffffffffffffffffffffffffff9081168a018116909102911617905560185481517f1b5462e8000000000000000000000000000000000000000000000000000000008152600481019490945260248401879052905161010090910473ffffffffffffffffffffffffffffffffffffffff1692631b5462e892604480830193919282900301818387803b15801561121f57600080fd5b505af1158015611233573d6000803e3d6000fd5b505050505b83156112f657601054336000908152601460205260409020546fffffffffffffffffffffffffffffffff168501111561129d576040517fdeee748a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260146020526040902080546fffffffffffffffffffffffffffffffff8082168801167fffffffffffffffffffffffffffffffff000000000000000000000000000000009091161790556112f6908561365f565b50505050565b6000611307826123d9565b905061131284611cef565b611348576040517fde1af48d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff82161480159061138c57503361137383610d15565b73ffffffffffffffffffffffffffffffffffffffff1614155b801561139f575061139d8133613379565b155b156113d6576040517fde3abed200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461143b576040517f3441f6c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316611488576040517f90171a1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff1680156114e3575073ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090205468010000000000000000900460ff165b801561157e57506005546040517f91a2748900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152909116906391a2748990602401602060405180830381865afa15801561155a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157e9190614954565b15611609576005546040517f0622fd5d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015290911690630622fd5d90602401600060405180830381600087803b1580156115f057600080fd5b505af1158015611604573d6000803e3d6000fd5b505050505b600082815260086020908152604080832080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915573ffffffffffffffffffffffffffffffffffffffff88811685526007845282852080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000080821667ffffffffffffffff9283167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01831617909255898316808852858820805493841693831660019081019093169390931790925588875260069095528386208054909316179091559185018084529220541615801561170a575060035481105b1561175c57600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790555b50818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b600080611834848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506015546040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608c901b1660208201529092506034019050610fca565b611843575060009050806118e6565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260146020526040902054601054611888916fffffffffffffffffffffffffffffffff16906149a0565b73ffffffffffffffffffffffffffffffffffffffff86166000908152601460205260409020546010546118e19170010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906149a0565b915091505b935093915050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461193f576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff16611993576040517f7bf6f57300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600554604080517f3dcdb672000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691633dcdb6729160048082019260009290919082900301818387803b1580156119ff57600080fd5b505af1158015611a13573d6000803e3d6000fd5b5050600580547fffffffffffffffffffffff00000000000000000000000000000000000000000016905550506040514281527f0fbfe41594a440a7d2b4ca090193b23cfd3f135b34c7ae9111e52e6d9f363d629060200160405180910390a1565b60055473ffffffffffffffffffffffffffffffffffffffff163314611ac5576040517fd57b231500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff16611b19576040517fccbfc30700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604090205468010000000000000000900460ff1615611b85576040517fd68e98c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260076020526040902080547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff1668010000000000000000179055611be23390565b73ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d42604051611c2991815260200190565b60405180910390a250565b6112f684848484604051806020016040528060008152506129dc565b6000806000600c54600b5485611c6691906149b7565b611c709190614a23565b6000868152600d60205260408120549192509073ffffffffffffffffffffffffffffffffffffffff16611cbb57600a5473ffffffffffffffffffffffffffffffffffffffff16611ce1565b6000868152600d602052604090205473ffffffffffffffffffffffffffffffffffffffff165b9350909150505b9250929050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600760205260408120546901000000000000000000900460ff16158015611d77575073ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604090205442720100000000000000000000000000000000000090910467ffffffffffffffff16105b8015610c7b575060055474010000000000000000000000000000000000000000900460ff16611da7576001610c7b565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205468010000000000000000900460ff161590565b60025473ffffffffffffffffffffffffffffffffffffffff163314611e31576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040514790600090339083908381818185875af1925050503d8060008114611e75576040519150601f19603f3d011682016040523d82523d6000602084013e611e7a565b606091505b5050905080611eb5576040517f1a0263ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b611f016040518060a001604052806060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b60006040518060a0016040529081600082018054611f1e90614900565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4a90614900565b8015611f975780601f10611f6c57610100808354040283529160200191611f97565b820191906000526020600020905b815481529060010190602001808311611f7a57829003601f168201915b50505050508152602001600182018054611fb090614900565b80601f0160208091040260200160405190810160405280929190818152602001828054611fdc90614900565b80156120295780601f10611ffe57610100808354040283529160200191612029565b820191906000526020600020905b81548152906001019060200180831161200c57829003601f168201915b5050509183525050600282015473ffffffffffffffffffffffffffffffffffffffff16602082015260038201546040820152600490910154606090910152919050565b61208783838360405180602001604052806000815250612ee3565b505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146120dd576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008361210457826120f25750601681905560015b82600114156121045750601781905560015b836001141561212d578261211b5750601081905560015b826001141561212d5750601181905560015b836002141561215657826121445750601281905560015b82600114156121565750601381905560015b806112f6576040517fb092b44200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff1633146121de576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612087600f83836141b0565b60025473ffffffffffffffffffffffffffffffffffffffff16331461223b576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b323314158061224a5750333b15155b15612281576040517fe08e16c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60185460ff16156122f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f5465616d20416c6c6f636174696f6e20616c7265616479206d696e7465640000604482015260640160405180910390fd5b601854610100900473ffffffffffffffffffffffffffffffffffffffff16631b5462e8336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260786024820152604401600060405180830381600087803b15801561238357600080fd5b505af1158015612397573d6000803e3d6000fd5b505050506123ac6123a53390565b607861365f565b601880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6003546000908210156124755760008281526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1680156124175792915050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90910160008181526006602052604090205490919073ffffffffffffffffffffffffffffffffffffffff1680156124705792915050565b612417565b6040517fad820bd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff1633146124f8576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6018805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b6060600f8054610c9290614900565b600073ffffffffffffffffffffffffffffffffffffffff82166125a2576040517f4a63b0d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205467ffffffffffffffff1690565b60025473ffffffffffffffffffffffffffffffffffffffff163314612626576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612630600061395d565b565b60025473ffffffffffffffffffffffffffffffffffffffff163314612683576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff16156126d8576040517fd9e399d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216612725576040517fdb649fbb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600580547fffffffffffffffffffffff0000000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff848116919091177401000000000000000000000000000000000000000017918290556040517f703dbfe40000000000000000000000000000000000000000000000000000000081526004810184905291169063703dbfe490602401600060405180830381600087803b1580156127d557600080fd5b505af11580156127e9573d6000803e3d6000fd5b50506040805184815242602082015273ffffffffffffffffffffffffffffffffffffffff861693507fbd322cf26f75962cc059b75e120b5b386dfb217b4874d0a20e31106b3dbf52b792500160405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604090205460609067ffffffffffffffff16806128ab576040517f49dc2df800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035460008267ffffffffffffffff8111156128c9576128c96146cf565b6040519080825280602002602001820160405280156128f2578160200160208202803683370190505b50905060008060005b848110156129a95760008181526006602052604090205473ffffffffffffffffffffffffffffffffffffffff168015612932578092505b8873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129a0578185858060010196508151811061297f5761297f614a37565b602002602001018181525050868414156129a0575092979650505050505050565b506001016128fb565b506040517f2625890700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129eb858585856001866139d4565b5050505050565b606060006001018054610c9290614900565b3233141580612a135750333b15155b15612a4a576040517fe08e16c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016017541015612a87576040517f914edb0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018183011015612ac4576040517f82af4ff400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e5482612ad56004546003540390565b011115612b0e576040517f2605101300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6013548102601254830201341015612b52576040517f7b9b085b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015612c3e57601154811115612b94576040517fdeee748a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601854610100900473ffffffffffffffffffffffffffffffffffffffff16631b5462e8336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101849052604401600060405180830381600087803b158015612c2557600080fd5b505af1158015612c39573d6000803e3d6000fd5b505050505b8115611eb557601154821115612c80576040517fdeee748a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611eb5338361365f565b73ffffffffffffffffffffffffffffffffffffffff8216331415612cda576040517f93f5178600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ce333611cef565b612d19576040517fde1af48d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b336000908152600760205260409020546901000000000000000000900460ff16612e06576040517f27591bac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260076020526040902080546a01000000000000000000007fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff82160467ffffffffffffffff9081164201167201000000000000000000000000000000000000027fffffffffffff0000000000000000ffffffffffffffff00ffffffffffffffffff90911617905573ffffffffffffffffffffffffffffffffffffffff167f0f0bc5b519ddefdd8e5f9e6423433aa2b869738de2ae34d58ebc796fc749fa0d42604051612ed991815260200190565b60405180910390a2565b612eee8484846112fc565b60008373ffffffffffffffffffffffffffffffffffffffff163b118015612fd357506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612f6b90339060009088908890600401614a66565b6020604051808303816000875af1158015612f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fae9190614aaf565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b156112f6576040517f49549fca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060613017826003541190565b61304d576040517f5d39406100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613057612544565b9050600081511161307757604051806020016040528060008152506130a2565b8061308184613fd4565b604051602001613092929190614acc565b6040516020818303038152906040525b9392505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146130fa576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000908152600d6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6112f6848484846000604051806020016040528060008152506139d4565b60025473ffffffffffffffffffffffffffffffffffffffff1633146131bc576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601555565b336000908152600760205260409020546901000000000000000000900460ff1615613218576040517fde1af48d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018110806132275750601e81115b1561325e576040517fb66ed3bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260076020526040902054620151808202907201000000000000000000000000000000000000900467ffffffffffffffff1642820110156132d0576040517f5df8edee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260076020526040902080547fffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff166a010000000000000000000067ffffffffffffffff909416939093029290921769010000000000000000001790915573ffffffffffffffffffffffffffffffffffffffff167f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd6000882604051611c2991815260200190565b600061338483611cef565b156133c45773ffffffffffffffffffffffffffffffffffffffff80841660009081526009602090815260408083209386168352929052205460ff166130a2565b60009392505050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461341e576040517fd57b231500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604090205468010000000000000000900460ff16613489576040517f31307b2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000818152600760205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff169055517f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f7590611c299042815260200190565b60025473ffffffffffffffffffffffffffffffffffffffff163314613557576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166135a4576040517f6843268c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135ad8161395d565b50565b600081815b85518110156136545760008682815181106135d2576135d2614a37565b60200260200101519050808311613614576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250613641565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061364c81614afb565b9150506135b5565b509092149392505050565b73ffffffffffffffffffffffffffffffffffffffff82166136ac576040517f0474812a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806136e3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff16801561373e575073ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604090205468010000000000000000900460ff165b80156137d957506005546040517f91a2748900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152909116906391a2748990602401602060405180830381865afa1580156137b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137d99190614954565b15613864576005546040517f0622fd5d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015290911690630622fd5d90602401600060405180830381600087803b15801561384b57600080fd5b505af115801561385f573d6000803e3d6000fd5b505050505b60035473ffffffffffffffffffffffffffffffffffffffff83166000818152600760209081526040808320805467ffffffffffffffff8082168901167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009091161790558483526006909152812080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169092179091555b828110156139555760405160018301929073ffffffffffffffffffffffffffffffffffffffff8616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46001016138fc565b506003555050565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6139dd86611cef565b613a13576040517fde1af48d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff871614801590613a405750613a3e8633613379565b155b15613a77576040517fde3abed200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613a8286858561410e565b613ab8576040517f83b8038500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516613b05576040517f90171a1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff168015613b60575073ffffffffffffffffffffffffffffffffffffffff851660009081526007602052604090205468010000000000000000900460ff165b8015613bfb57506005546040517f91a2748900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152909116906391a2748990602401602060405180830381865afa158015613bd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bfb9190614954565b15613c86576005546040517f0622fd5d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015290911690630622fd5d90602401600060405180830381600087803b158015613c6d57600080fd5b505af1158015613c81573d6000803e3d6000fd5b505050505b60005b83811015613ed957848101600081815260086020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905581613d1e57600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8916179055613d53565b600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b808773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315613ed05760008773ffffffffffffffffffffffffffffffffffffffff163b118015613e9957506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff89169063150b7a0290613e3190339060009087908a90600401614a66565b6020604051808303816000875af1158015613e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e749190614aaf565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b15613ed0576040517f49549fca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101613c89565b5073ffffffffffffffffffffffffffffffffffffffff868116600090815260076020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000080821667ffffffffffffffff9283168b90038316179092558a8616855282852080549283169282168a01909116919091179055878701808452600690925290912054909116158015613f79575060035481105b15613fcb57600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505050505050565b60608161401457505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561403e578061402881614afb565b91506140379050600a83614a23565b9150614018565b60008167ffffffffffffffff811115614059576140596146cf565b6040519080825280601f01601f191660200182016040528015614083576020820181803683370190505b5090505b8415614106576140986001836149a0565b91506140a5600a86614b34565b6140b0906030614b48565b60f81b8183815181106140c5576140c5614a37565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506140ff600a86614a23565b9450614087565b949350505050565b6000600282101561414b576040517fa9ca8b7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b828110156141a5578473ffffffffffffffffffffffffffffffffffffffff166141788286016123d9565b73ffffffffffffffffffffffffffffffffffffffff161461419d5760009150506130a2565b60010161414e565b506001949350505050565b8280546141bc90614900565b90600052602060002090601f0160209004810192826141de5760008555614242565b82601f10614215578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555614242565b82800160010185558215614242579182015b82811115614242578235825591602001919060010190614227565b5061424e929150614252565b5090565b5b8082111561424e5760008155600101614253565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146135ad57600080fd5b6000602082840312156142a757600080fd5b81356130a281614267565b60005b838110156142cd5781810151838201526020016142b5565b838111156112f65750506000910152565b600081518084526142f68160208601602086016142b2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006130a260208301846142de565b60006020828403121561434d57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146135ad57600080fd5b6000806040838503121561438957600080fd5b823561439481614354565b946020939093013593505050565b60008083601f8401126143b457600080fd5b50813567ffffffffffffffff8111156143cc57600080fd5b6020830191508360208260051b8501011115611ce857600080fd5b600080600080606085870312156143fd57600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561442257600080fd5b61442e878288016143a2565b95989497509550505050565b60008060006060848603121561444f57600080fd5b833561445a81614354565b9250602084013561446a81614354565b929592945050506040919091013590565b60008060006040848603121561449057600080fd5b833561449b81614354565b9250602084013567ffffffffffffffff8111156144b757600080fd5b6144c3868287016143a2565b9497909650939450505050565b6000602082840312156144e257600080fd5b81356130a281614354565b6000806000806080858703121561450357600080fd5b843561450e81614354565b9350602085013561451e81614354565b93969395505050506040820135916060013590565b6000806040838503121561454657600080fd5b50508035926020909101359150565b602081526000825160a0602084015261457160c08401826142de565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160408501526145ac82826142de565b91505073ffffffffffffffffffffffffffffffffffffffff604085015116606084015260608401516080840152608084015160a08401528091505092915050565b60008060006060848603121561460257600080fd5b505081359360208301359350604090920135919050565b6000806020838503121561462c57600080fd5b823567ffffffffffffffff8082111561464457600080fd5b818501915085601f83011261465857600080fd5b81358181111561466757600080fd5b86602082850101111561467957600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b818110156146c3578351835292840192918401916001016146a7565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261470f57600080fd5b813567ffffffffffffffff8082111561472a5761472a6146cf565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715614770576147706146cf565b8160405283815286602085880101111561478957600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a086880312156147c157600080fd5b85356147cc81614354565b945060208601356147dc81614354565b93506040860135925060608601359150608086013567ffffffffffffffff81111561480657600080fd5b614812888289016146fe565b9150509295509295909350565b80151581146135ad57600080fd5b6000806040838503121561484057600080fd5b823561484b81614354565b9150602083013561485b8161481f565b809150509250929050565b6000806000806080858703121561487c57600080fd5b843561488781614354565b9350602085013561489781614354565b925060408501359150606085013567ffffffffffffffff8111156148ba57600080fd5b6148c6878288016146fe565b91505092959194509250565b600080604083850312156148e557600080fd5b82356148f081614354565b9150602083013561485b81614354565b600181811c9082168061491457607f821691505b6020821081141561494e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561496657600080fd5b81516130a28161481f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156149b2576149b2614971565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149ef576149ef614971565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614a3257614a326149f4565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152614aa560808301846142de565b9695505050505050565b600060208284031215614ac157600080fd5b81516130a281614267565b60008351614ade8184602088016142b2565b835190830190614af28183602088016142b2565b01949350505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b2d57614b2d614971565b5060010190565b600082614b4357614b436149f4565b500690565b60008219821115614b5b57614b5b614971565b50019056fea26469706673582212201fb992136021118512c28be65a8c6c3390dead01e1e8df55ab537f85ed1817fe64736f6c634300080c0033697066733a2f2f516d56645a51767636366b7666436b5a344c77656e38624d374b4a58354a67745a456d575261474c3868793534582f
Deployed Bytecode
0x6080604052600436106103815760003560e01c8063715018a6116101d1578063ad2f852a11610102578063d9b3c801116100a0578063f2888dbb1161006f578063f2888dbb14610b24578063f2fde38b14610b44578063f8e76cc014610b64578063fd8d7ed314610b8657600080fd5b8063d9b3c80114610aa4578063dab5f34014610ac4578063dd46706414610ae4578063e985e9c514610b0457600080fd5b8063c6222331116100dc578063c6222331146109ac578063c87b56dd14610a4e578063cd6a3ea514610a6e578063d5abeb0114610a8e57600080fd5b8063ad2f852a1461092d578063b88d4fde1461095a578063bd576a591461097a57600080fd5b8063947d58761161016f57806398ae99a81161014957806398ae99a8146108cf5780639c9c6669146108e2578063a22cb465146108f8578063a69df4b51461091857600080fd5b8063947d58761461084e57806395d89b41146108a457806397309a5b146108b957600080fd5b8063830ef099116101ab578063830ef099146107b65780638462151c146107d657806387d381cf146108035780638da5cb5b1461082357600080fd5b8063715018a61461077557806379b2f57f1461078a5780637f44ab2f146107a057600080fd5b80632bbf532a116102b657806353135ca0116102545780636352211e116102235780636352211e146107005780636b5dd991146107205780636c0360eb1461074057806370a082311461075557600080fd5b806353135ca01461066357806355f804b3146106795780635a5d3742146106995780635d49c133146106ae57600080fd5b80633f2981cf116102905780633f2981cf146105eb5780633ffea8c81461060157806342842e0e146106235780634c9047301461064357600080fd5b80632bbf532a146105a0578063305c7d4a146105c05780633ccfd60b146105d657600080fd5b80631d7d5ae4116103235780632507190a116102fd5780632507190a146104ff578063264762041461051457806329dc1102146105345780632a55205a1461055457600080fd5b80631d7d5ae41461049457806323b872dd146104aa578063243a190c146104ca57600080fd5b8063095ea7b31161035f578063095ea7b3146104225780630f8223be1461044457806318160ddd1461045e5780631b59169d1461048157600080fd5b806301ffc9a71461038657806306fdde03146103bb578063081812fc146103dd575b600080fd5b34801561039257600080fd5b506103a66103a1366004614295565b610b9c565b60405190151581526020015b60405180910390f35b3480156103c757600080fd5b506103d0610c81565b6040516103b29190614328565b3480156103e957600080fd5b506103fd6103f836600461433b565b610d15565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103b2565b34801561042e57600080fd5b5061044261043d366004614376565b610d81565b005b34801561045057600080fd5b506018546103a69060ff1681565b34801561046a57600080fd5b50600454600354035b6040519081526020016103b2565b61044261048f3660046143e7565b610ed9565b3480156104a057600080fd5b5061047360135481565b3480156104b657600080fd5b506104426104c536600461443a565b6112fc565b3480156104d657600080fd5b506104ea6104e536600461447b565b6117be565b604080519283526020830191909152016103b2565b34801561050b57600080fd5b506104426118ee565b34801561052057600080fd5b5061044261052f3660046144d0565b611a74565b34801561054057600080fd5b5061044261054f3660046144ed565b611c34565b34801561056057600080fd5b5061057461056f366004614533565b611c50565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016103b2565b3480156105ac57600080fd5b506103a66105bb3660046144d0565b611cef565b3480156105cc57600080fd5b5061047360115481565b3480156105e257600080fd5b50610442611de0565b3480156105f757600080fd5b5061047360175481565b34801561060d57600080fd5b50610616611eb9565b6040516103b29190614555565b34801561062f57600080fd5b5061044261063e36600461443a565b61206c565b34801561064f57600080fd5b5061044261065e3660046145ed565b61208c565b34801561066f57600080fd5b5061047360165481565b34801561068557600080fd5b50610442610694366004614619565b61218d565b3480156106a557600080fd5b506104426121ea565b3480156106ba57600080fd5b506103a66106c93660046144d0565b73ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205468010000000000000000900460ff1690565b34801561070c57600080fd5b506103fd61071b36600461433b565b6123d9565b34801561072c57600080fd5b5061044261073b3660046144d0565b6124a7565b34801561074c57600080fd5b506103d0612544565b34801561076157600080fd5b506104736107703660046144d0565b612553565b34801561078157600080fd5b506104426125d5565b34801561079657600080fd5b5061047360125481565b3480156107ac57600080fd5b5061047360105481565b3480156107c257600080fd5b506104426107d1366004614376565b612632565b3480156107e257600080fd5b506107f66107f13660046144d0565b612841565b6040516103b2919061468b565b34801561080f57600080fd5b5061044261081e3660046147a9565b6129dc565b34801561082f57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166103fd565b34801561085a57600080fd5b506005546040805173ffffffffffffffffffffffffffffffffffffffff831681527401000000000000000000000000000000000000000090920460ff1615156020830152016103b2565b3480156108b057600080fd5b506103d06129f2565b3480156108c557600080fd5b50610473600b5481565b6104426108dd366004614533565b612a04565b3480156108ee57600080fd5b5061047360155481565b34801561090457600080fd5b5061044261091336600461482d565b612c8a565b34801561092457600080fd5b50610442612db0565b34801561093957600080fd5b50600a546103fd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561096657600080fd5b50610442610975366004614866565b612ee3565b34801561098657600080fd5b506018546103fd90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156109b857600080fd5b50610a316109c73660046144d0565b73ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205460ff69010000000000000000008204169167ffffffffffffffff720100000000000000000000000000000000000083048116926a010000000000000000000090041690565b6040805193151584526020840192909252908201526060016103b2565b348015610a5a57600080fd5b506103d0610a6936600461433b565b61300a565b348015610a7a57600080fd5b50610442610a89366004614376565b6130a9565b348015610a9a57600080fd5b50610473600e5481565b348015610ab057600080fd5b50610442610abf3660046144ed565b61314d565b348015610ad057600080fd5b50610442610adf36600461433b565b61316b565b348015610af057600080fd5b50610442610aff36600461433b565b6131c1565b348015610b1057600080fd5b506103a6610b1f3660046148d2565b613379565b348015610b3057600080fd5b50610442610b3f3660046144d0565b6133cd565b348015610b5057600080fd5b50610442610b5f3660046144d0565b613506565b348015610b7057600080fd5b506103a6610b7f36600461433b565b6003541190565b348015610b9257600080fd5b50610473600c5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161480610c2f57507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b80610c7b57507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060600080018054610c9290614900565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbe90614900565b8015610d0b5780601f10610ce057610100808354040283529160200191610d0b565b820191906000526020600020905b815481529060010190602001808311610cee57829003601f168201915b5050505050905090565b6000610d22826003541190565b610d58576040517f1e3d0dec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060009081526008602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610d8c826123d9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610df4576040517f93f5178600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821614801590610e215750610e1f8133613379565b155b15610e58576040517f302318df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526008602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3233141580610ee85750333b15155b15610f1f576040517fe08e16c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016016541015610f5c576040517f914edb0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fe5828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506015546040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16602082015290925060340190505b604051602081830303815290604052805190602001206135b0565b61101b576040517f9ba1ff2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018385011015611058576040517f82af4ff400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54846110696004546003540390565b0111156110a2576040517f2605101300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60135483026012548502013410156110e6576040517f7b9b085b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8215611238576010543360009081526014602052604090205470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff168401111561115f576040517fdeee748a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526014602052604080822080547001000000000000000000000000000000008082046fffffffffffffffffffffffffffffffff9081168a018116909102911617905560185481517f1b5462e8000000000000000000000000000000000000000000000000000000008152600481019490945260248401879052905161010090910473ffffffffffffffffffffffffffffffffffffffff1692631b5462e892604480830193919282900301818387803b15801561121f57600080fd5b505af1158015611233573d6000803e3d6000fd5b505050505b83156112f657601054336000908152601460205260409020546fffffffffffffffffffffffffffffffff168501111561129d576040517fdeee748a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260146020526040902080546fffffffffffffffffffffffffffffffff8082168801167fffffffffffffffffffffffffffffffff000000000000000000000000000000009091161790556112f6908561365f565b50505050565b6000611307826123d9565b905061131284611cef565b611348576040517fde1af48d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff82161480159061138c57503361137383610d15565b73ffffffffffffffffffffffffffffffffffffffff1614155b801561139f575061139d8133613379565b155b156113d6576040517fde3abed200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461143b576040517f3441f6c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316611488576040517f90171a1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff1680156114e3575073ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090205468010000000000000000900460ff165b801561157e57506005546040517f91a2748900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152909116906391a2748990602401602060405180830381865afa15801561155a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157e9190614954565b15611609576005546040517f0622fd5d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015290911690630622fd5d90602401600060405180830381600087803b1580156115f057600080fd5b505af1158015611604573d6000803e3d6000fd5b505050505b600082815260086020908152604080832080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915573ffffffffffffffffffffffffffffffffffffffff88811685526007845282852080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000080821667ffffffffffffffff9283167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01831617909255898316808852858820805493841693831660019081019093169390931790925588875260069095528386208054909316179091559185018084529220541615801561170a575060035481105b1561175c57600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790555b50818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b600080611834848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506015546040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608c901b1660208201529092506034019050610fca565b611843575060009050806118e6565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260146020526040902054601054611888916fffffffffffffffffffffffffffffffff16906149a0565b73ffffffffffffffffffffffffffffffffffffffff86166000908152601460205260409020546010546118e19170010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906149a0565b915091505b935093915050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461193f576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff16611993576040517f7bf6f57300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600554604080517f3dcdb672000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691633dcdb6729160048082019260009290919082900301818387803b1580156119ff57600080fd5b505af1158015611a13573d6000803e3d6000fd5b5050600580547fffffffffffffffffffffff00000000000000000000000000000000000000000016905550506040514281527f0fbfe41594a440a7d2b4ca090193b23cfd3f135b34c7ae9111e52e6d9f363d629060200160405180910390a1565b60055473ffffffffffffffffffffffffffffffffffffffff163314611ac5576040517fd57b231500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff16611b19576040517fccbfc30700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604090205468010000000000000000900460ff1615611b85576040517fd68e98c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260076020526040902080547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff1668010000000000000000179055611be23390565b73ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d42604051611c2991815260200190565b60405180910390a250565b6112f684848484604051806020016040528060008152506129dc565b6000806000600c54600b5485611c6691906149b7565b611c709190614a23565b6000868152600d60205260408120549192509073ffffffffffffffffffffffffffffffffffffffff16611cbb57600a5473ffffffffffffffffffffffffffffffffffffffff16611ce1565b6000868152600d602052604090205473ffffffffffffffffffffffffffffffffffffffff165b9350909150505b9250929050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600760205260408120546901000000000000000000900460ff16158015611d77575073ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604090205442720100000000000000000000000000000000000090910467ffffffffffffffff16105b8015610c7b575060055474010000000000000000000000000000000000000000900460ff16611da7576001610c7b565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205468010000000000000000900460ff161590565b60025473ffffffffffffffffffffffffffffffffffffffff163314611e31576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040514790600090339083908381818185875af1925050503d8060008114611e75576040519150601f19603f3d011682016040523d82523d6000602084013e611e7a565b606091505b5050905080611eb5576040517f1a0263ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b611f016040518060a001604052806060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b60006040518060a0016040529081600082018054611f1e90614900565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4a90614900565b8015611f975780601f10611f6c57610100808354040283529160200191611f97565b820191906000526020600020905b815481529060010190602001808311611f7a57829003601f168201915b50505050508152602001600182018054611fb090614900565b80601f0160208091040260200160405190810160405280929190818152602001828054611fdc90614900565b80156120295780601f10611ffe57610100808354040283529160200191612029565b820191906000526020600020905b81548152906001019060200180831161200c57829003601f168201915b5050509183525050600282015473ffffffffffffffffffffffffffffffffffffffff16602082015260038201546040820152600490910154606090910152919050565b61208783838360405180602001604052806000815250612ee3565b505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146120dd576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008361210457826120f25750601681905560015b82600114156121045750601781905560015b836001141561212d578261211b5750601081905560015b826001141561212d5750601181905560015b836002141561215657826121445750601281905560015b82600114156121565750601381905560015b806112f6576040517fb092b44200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff1633146121de576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612087600f83836141b0565b60025473ffffffffffffffffffffffffffffffffffffffff16331461223b576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b323314158061224a5750333b15155b15612281576040517fe08e16c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60185460ff16156122f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f5465616d20416c6c6f636174696f6e20616c7265616479206d696e7465640000604482015260640160405180910390fd5b601854610100900473ffffffffffffffffffffffffffffffffffffffff16631b5462e8336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260786024820152604401600060405180830381600087803b15801561238357600080fd5b505af1158015612397573d6000803e3d6000fd5b505050506123ac6123a53390565b607861365f565b601880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6003546000908210156124755760008281526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1680156124175792915050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90910160008181526006602052604090205490919073ffffffffffffffffffffffffffffffffffffffff1680156124705792915050565b612417565b6040517fad820bd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff1633146124f8576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6018805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b6060600f8054610c9290614900565b600073ffffffffffffffffffffffffffffffffffffffff82166125a2576040517f4a63b0d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205467ffffffffffffffff1690565b60025473ffffffffffffffffffffffffffffffffffffffff163314612626576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612630600061395d565b565b60025473ffffffffffffffffffffffffffffffffffffffff163314612683576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff16156126d8576040517fd9e399d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216612725576040517fdb649fbb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600580547fffffffffffffffffffffff0000000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff848116919091177401000000000000000000000000000000000000000017918290556040517f703dbfe40000000000000000000000000000000000000000000000000000000081526004810184905291169063703dbfe490602401600060405180830381600087803b1580156127d557600080fd5b505af11580156127e9573d6000803e3d6000fd5b50506040805184815242602082015273ffffffffffffffffffffffffffffffffffffffff861693507fbd322cf26f75962cc059b75e120b5b386dfb217b4874d0a20e31106b3dbf52b792500160405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604090205460609067ffffffffffffffff16806128ab576040517f49dc2df800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035460008267ffffffffffffffff8111156128c9576128c96146cf565b6040519080825280602002602001820160405280156128f2578160200160208202803683370190505b50905060008060005b848110156129a95760008181526006602052604090205473ffffffffffffffffffffffffffffffffffffffff168015612932578092505b8873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129a0578185858060010196508151811061297f5761297f614a37565b602002602001018181525050868414156129a0575092979650505050505050565b506001016128fb565b506040517f2625890700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129eb858585856001866139d4565b5050505050565b606060006001018054610c9290614900565b3233141580612a135750333b15155b15612a4a576040517fe08e16c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016017541015612a87576040517f914edb0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018183011015612ac4576040517f82af4ff400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e5482612ad56004546003540390565b011115612b0e576040517f2605101300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6013548102601254830201341015612b52576040517f7b9b085b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015612c3e57601154811115612b94576040517fdeee748a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601854610100900473ffffffffffffffffffffffffffffffffffffffff16631b5462e8336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101849052604401600060405180830381600087803b158015612c2557600080fd5b505af1158015612c39573d6000803e3d6000fd5b505050505b8115611eb557601154821115612c80576040517fdeee748a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611eb5338361365f565b73ffffffffffffffffffffffffffffffffffffffff8216331415612cda576040517f93f5178600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ce333611cef565b612d19576040517fde1af48d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b336000908152600760205260409020546901000000000000000000900460ff16612e06576040517f27591bac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260076020526040902080546a01000000000000000000007fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff82160467ffffffffffffffff9081164201167201000000000000000000000000000000000000027fffffffffffff0000000000000000ffffffffffffffff00ffffffffffffffffff90911617905573ffffffffffffffffffffffffffffffffffffffff167f0f0bc5b519ddefdd8e5f9e6423433aa2b869738de2ae34d58ebc796fc749fa0d42604051612ed991815260200190565b60405180910390a2565b612eee8484846112fc565b60008373ffffffffffffffffffffffffffffffffffffffff163b118015612fd357506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612f6b90339060009088908890600401614a66565b6020604051808303816000875af1158015612f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fae9190614aaf565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b156112f6576040517f49549fca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060613017826003541190565b61304d576040517f5d39406100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613057612544565b9050600081511161307757604051806020016040528060008152506130a2565b8061308184613fd4565b604051602001613092929190614acc565b6040516020818303038152906040525b9392505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146130fa576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000908152600d6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6112f6848484846000604051806020016040528060008152506139d4565b60025473ffffffffffffffffffffffffffffffffffffffff1633146131bc576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601555565b336000908152600760205260409020546901000000000000000000900460ff1615613218576040517fde1af48d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018110806132275750601e81115b1561325e576040517fb66ed3bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260076020526040902054620151808202907201000000000000000000000000000000000000900467ffffffffffffffff1642820110156132d0576040517f5df8edee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260076020526040902080547fffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff166a010000000000000000000067ffffffffffffffff909416939093029290921769010000000000000000001790915573ffffffffffffffffffffffffffffffffffffffff167f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd6000882604051611c2991815260200190565b600061338483611cef565b156133c45773ffffffffffffffffffffffffffffffffffffffff80841660009081526009602090815260408083209386168352929052205460ff166130a2565b60009392505050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461341e576040517fd57b231500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604090205468010000000000000000900460ff16613489576040517f31307b2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000818152600760205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff169055517f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f7590611c299042815260200190565b60025473ffffffffffffffffffffffffffffffffffffffff163314613557576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166135a4576040517f6843268c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135ad8161395d565b50565b600081815b85518110156136545760008682815181106135d2576135d2614a37565b60200260200101519050808311613614576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250613641565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061364c81614afb565b9150506135b5565b509092149392505050565b73ffffffffffffffffffffffffffffffffffffffff82166136ac576040517f0474812a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806136e3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff16801561373e575073ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604090205468010000000000000000900460ff165b80156137d957506005546040517f91a2748900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152909116906391a2748990602401602060405180830381865afa1580156137b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137d99190614954565b15613864576005546040517f0622fd5d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015290911690630622fd5d90602401600060405180830381600087803b15801561384b57600080fd5b505af115801561385f573d6000803e3d6000fd5b505050505b60035473ffffffffffffffffffffffffffffffffffffffff83166000818152600760209081526040808320805467ffffffffffffffff8082168901167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009091161790558483526006909152812080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169092179091555b828110156139555760405160018301929073ffffffffffffffffffffffffffffffffffffffff8616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46001016138fc565b506003555050565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6139dd86611cef565b613a13576040517fde1af48d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff871614801590613a405750613a3e8633613379565b155b15613a77576040517fde3abed200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613a8286858561410e565b613ab8576040517f83b8038500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516613b05576040517f90171a1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff168015613b60575073ffffffffffffffffffffffffffffffffffffffff851660009081526007602052604090205468010000000000000000900460ff165b8015613bfb57506005546040517f91a2748900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152909116906391a2748990602401602060405180830381865afa158015613bd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bfb9190614954565b15613c86576005546040517f0622fd5d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015290911690630622fd5d90602401600060405180830381600087803b158015613c6d57600080fd5b505af1158015613c81573d6000803e3d6000fd5b505050505b60005b83811015613ed957848101600081815260086020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905581613d1e57600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8916179055613d53565b600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b808773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315613ed05760008773ffffffffffffffffffffffffffffffffffffffff163b118015613e9957506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff89169063150b7a0290613e3190339060009087908a90600401614a66565b6020604051808303816000875af1158015613e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e749190614aaf565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b15613ed0576040517f49549fca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101613c89565b5073ffffffffffffffffffffffffffffffffffffffff868116600090815260076020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000080821667ffffffffffffffff9283168b90038316179092558a8616855282852080549283169282168a01909116919091179055878701808452600690925290912054909116158015613f79575060035481105b15613fcb57600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505050505050565b60608161401457505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561403e578061402881614afb565b91506140379050600a83614a23565b9150614018565b60008167ffffffffffffffff811115614059576140596146cf565b6040519080825280601f01601f191660200182016040528015614083576020820181803683370190505b5090505b8415614106576140986001836149a0565b91506140a5600a86614b34565b6140b0906030614b48565b60f81b8183815181106140c5576140c5614a37565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506140ff600a86614a23565b9450614087565b949350505050565b6000600282101561414b576040517fa9ca8b7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b828110156141a5578473ffffffffffffffffffffffffffffffffffffffff166141788286016123d9565b73ffffffffffffffffffffffffffffffffffffffff161461419d5760009150506130a2565b60010161414e565b506001949350505050565b8280546141bc90614900565b90600052602060002090601f0160209004810192826141de5760008555614242565b82601f10614215578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555614242565b82800160010185558215614242579182015b82811115614242578235825591602001919060010190614227565b5061424e929150614252565b5090565b5b8082111561424e5760008155600101614253565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146135ad57600080fd5b6000602082840312156142a757600080fd5b81356130a281614267565b60005b838110156142cd5781810151838201526020016142b5565b838111156112f65750506000910152565b600081518084526142f68160208601602086016142b2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006130a260208301846142de565b60006020828403121561434d57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146135ad57600080fd5b6000806040838503121561438957600080fd5b823561439481614354565b946020939093013593505050565b60008083601f8401126143b457600080fd5b50813567ffffffffffffffff8111156143cc57600080fd5b6020830191508360208260051b8501011115611ce857600080fd5b600080600080606085870312156143fd57600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561442257600080fd5b61442e878288016143a2565b95989497509550505050565b60008060006060848603121561444f57600080fd5b833561445a81614354565b9250602084013561446a81614354565b929592945050506040919091013590565b60008060006040848603121561449057600080fd5b833561449b81614354565b9250602084013567ffffffffffffffff8111156144b757600080fd5b6144c3868287016143a2565b9497909650939450505050565b6000602082840312156144e257600080fd5b81356130a281614354565b6000806000806080858703121561450357600080fd5b843561450e81614354565b9350602085013561451e81614354565b93969395505050506040820135916060013590565b6000806040838503121561454657600080fd5b50508035926020909101359150565b602081526000825160a0602084015261457160c08401826142de565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160408501526145ac82826142de565b91505073ffffffffffffffffffffffffffffffffffffffff604085015116606084015260608401516080840152608084015160a08401528091505092915050565b60008060006060848603121561460257600080fd5b505081359360208301359350604090920135919050565b6000806020838503121561462c57600080fd5b823567ffffffffffffffff8082111561464457600080fd5b818501915085601f83011261465857600080fd5b81358181111561466757600080fd5b86602082850101111561467957600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b818110156146c3578351835292840192918401916001016146a7565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261470f57600080fd5b813567ffffffffffffffff8082111561472a5761472a6146cf565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715614770576147706146cf565b8160405283815286602085880101111561478957600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a086880312156147c157600080fd5b85356147cc81614354565b945060208601356147dc81614354565b93506040860135925060608601359150608086013567ffffffffffffffff81111561480657600080fd5b614812888289016146fe565b9150509295509295909350565b80151581146135ad57600080fd5b6000806040838503121561484057600080fd5b823561484b81614354565b9150602083013561485b8161481f565b809150509250929050565b6000806000806080858703121561487c57600080fd5b843561488781614354565b9350602085013561489781614354565b925060408501359150606085013567ffffffffffffffff8111156148ba57600080fd5b6148c6878288016146fe565b91505092959194509250565b600080604083850312156148e557600080fd5b82356148f081614354565b9150602083013561485b81614354565b600181811c9082168061491457607f821691505b6020821081141561494e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561496657600080fd5b81516130a28161481f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156149b2576149b2614971565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149ef576149ef614971565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614a3257614a326149f4565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152614aa560808301846142de565b9695505050505050565b600060208284031215614ac157600080fd5b81516130a281614267565b60008351614ade8184602088016142b2565b835190830190614af28183602088016142b2565b01949350505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b2d57614b2d614971565b5060010190565b600082614b4357614b436149f4565b500690565b60008219821115614b5b57614b5b614971565b50019056fea26469706673582212201fb992136021118512c28be65a8c6c3390dead01e1e8df55ab537f85ed1817fe64736f6c634300080c0033
Deployed Bytecode Sourcemap
39139:6088:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38458:183;;;;;;;;;;-1:-1:-1;38458:183:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;38458:183:0;;;;;;;;35389:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30079:188::-;;;;;;;;;;-1:-1:-1;30079:188:0;;;;;:::i;:::-;;:::i;:::-;;;1809:42:1;1797:55;;;1779:74;;1767:2;1752:18;30079:188:0;1633:226:1;29536:384:0;;;;;;;;;;-1:-1:-1;29536:384:0;;;;;:::i;:::-;;:::i;:::-;;40026:32;;;;;;;;;;-1:-1:-1;40026:32:0;;;;;;;;27150:161;;;;;;;;;;-1:-1:-1;27270:22:0;;27246:21;;:46;27150:161;;;2489:25:1;;;2477:2;2462:18;27150:161:0;2343:177:1;40341:1311:0;;;;;;:::i;:::-;;:::i;39737:41::-;;;;;;;;;;;;;;;;20813:1182;;;;;;;;;;-1:-1:-1;20813:1182:0;;;;;:::i;:::-;;:::i;43846:369::-;;;;;;;;;;-1:-1:-1;43846:369:0;;;;;:::i;:::-;;:::i;:::-;;;;4687:25:1;;;4743:2;4728:18;;4721:34;;;;4660:18;43846:369:0;4513:248:1;32314:258:0;;;;;;;;;;;;;:::i;30551:294::-;;;;;;;;;;-1:-1:-1;30551:294:0;;;;;:::i;:::-;;:::i;24027:180::-;;;;;;;;;;-1:-1:-1;24027:180:0;;;;;:::i;:::-;;:::i;44481:367::-;;;;;;;;;;-1:-1:-1;44481:367:0;;;;;:::i;:::-;;:::i;:::-;;;;6005:42:1;5993:55;;;5975:74;;6080:2;6065:18;;6058:34;;;;5948:18;44481:367:0;5801:297:1;17622:293:0;;;;;;;;;;-1:-1:-1;17622:293:0;;;;;:::i;:::-;;:::i;39653:32::-;;;;;;;;;;;;;;;;45005:217;;;;;;;;;;;;;:::i;39992:27::-;;;;;;;;;;;;;;;;38092:118;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22072:142::-;;;;;;;;;;-1:-1:-1;22072:142:0;;;;;:::i;:::-;;:::i;42747:898::-;;;;;;;;;;-1:-1:-1;42747:898:0;;;;;:::i;:::-;;:::i;39957:28::-;;;;;;;;;;;;;;;;42640:101;;;;;;;;;;-1:-1:-1;42640:101:0;;;;;:::i;:::-;;:::i;44221:254::-;;;;;;;;;;;;;:::i;37883:128::-;;;;;;;;;;-1:-1:-1;37883:128:0;;;;;:::i;:::-;37973:22;;37948:4;37973:22;;;:12;:22;;;;;:29;;;;;;;37883:128;16531:703;;;;;;;;;;-1:-1:-1;16531:703:0;;;;;:::i;:::-;;:::i;43651:98::-;;;;;;;;;;-1:-1:-1;43651:98:0;;;;;:::i;:::-;;:::i;42542:92::-;;;;;;;;;;;;;:::i;17325:200::-;;;;;;;;;;-1:-1:-1;17325:200:0;;;;;:::i;:::-;;:::i;34582:95::-;;;;;;;;;;;;;:::i;39692:38::-;;;;;;;;;;;;;;;;39611:35;;;;;;;;;;;;;;;;31630:515;;;;;;;;;;-1:-1:-1;31630:515:0;;;;;:::i;:::-;;:::i;36490:932::-;;;;;;;;;;-1:-1:-1;36490:932:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25047:206::-;;;;;;;;;;-1:-1:-1;25047:206:0;;;;;:::i;:::-;;:::i;34137:94::-;;;;;;;;;;-1:-1:-1;34202:21:0;;;;34137:94;;38291:159;;;;;;;;;;-1:-1:-1;38384:12:0;:28;38291:159;;;38384:28;;;10671:74:1;;38415:26:0;;;;;;10788:14:1;10781:22;10776:2;10761:18;;10754:50;10644:18;38291:159:0;10503:307:1;35563:102:0;;;;;;;;;;;;;:::i;39335:32::-;;;;;;;;;;;;;;;;41658:878;;;;;;:::i;:::-;;:::i;39853:97::-;;;;;;;;;;;;;;;;28352:333;;;;;;;;;;-1:-1:-1;28352:333:0;;;;;:::i;:::-;;:::i;33659:386::-;;;;;;;;;;;;;:::i;39299:29::-;;;;;;;;;;-1:-1:-1;39299:29:0;;;;;;;;22964:396;;;;;;;;;;-1:-1:-1;22964:396:0;;;;;:::i;:::-;;:::i;40065:23::-;;;;;;;;;;-1:-1:-1;40065:23:0;;;;;;;;;;;37563:244;;;;;;;;;;-1:-1:-1;37563:244:0;;;;;:::i;:::-;37664:20;;37621:4;37664:20;;;:12;:20;;;;;:27;;;;;;;37703:42;;;;;;;37757:41;;;;;37563:244;;;;;12647:14:1;;12640:22;12622:41;;12694:2;12679:18;;12672:34;;;;12722:18;;;12715:34;12610:2;12595:18;37563:244:0;12426:329:1;35771:305:0;;;;;;;;;;-1:-1:-1;35771:305:0;;;;;:::i;:::-;;:::i;44856:143::-;;;;;;;;;;-1:-1:-1;44856:143:0;;;;;:::i;:::-;;:::i;39484:31::-;;;;;;;;;;;;;;;;23765:180;;;;;;;;;;-1:-1:-1;23765:180:0;;;;;:::i;:::-;;:::i;43755:85::-;;;;;;;;;;-1:-1:-1;43755:85:0;;;;;:::i;:::-;;:::i;32802:629::-;;;;;;;;;;-1:-1:-1;32802:629:0;;;;;:::i;:::-;;:::i;28879:179::-;;;;;;;;;;-1:-1:-1;28879:179:0;;;;;:::i;:::-;;:::i;31170:226::-;;;;;;;;;;-1:-1:-1;31170:226:0;;;;;:::i;:::-;;:::i;34832:176::-;;;;;;;;;;-1:-1:-1;34832:176:0;;;;;:::i;:::-;;:::i;16254:126::-;;;;;;;;;;-1:-1:-1;16254:126:0;;;;;:::i;:::-;16351:21;;-1:-1:-1;16341:31:0;16254:126;39374:41;;;;;;;;;;;;;;;;38458:183;38526:4;38550:25;;;;;;:54;;-1:-1:-1;38579:25:0;;;;;38550:54;:83;;;-1:-1:-1;38608:25:0;;;;;38550:83;38543:90;38458:183;-1:-1:-1;;38458:183:0:o;35389:98::-;35426:13;35459:15;:20;;35452:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35389:98;:::o;30079:188::-;30138:7;30163:16;30171:7;16351:21;;-1:-1:-1;16341:31:0;16254:126;30163:16;30158:59;;30188:29;;;;;;;;;;;;;;30158:59;-1:-1:-1;30235:24:0;;;;:15;:24;;;;;;;;;30079:188::o;29536:384::-;29600:18;29621:16;29629:7;29621;:16::i;:::-;29600:37;;29658:10;29652:16;;:2;:16;;;29648:46;;;29677:17;;;;;;;;;;;;;;29648:46;15966:10;29709:26;;;;;;;:73;;-1:-1:-1;29740:42:0;29757:10;15966;28879:179;:::i;29740:42::-;29739:43;29709:73;29705:118;;;29791:32;;;;;;;;;;;;;;29705:118;29834:24;;;;:15;:24;;;;;;:29;;;;;;;;;;;;;;29879:33;;29834:24;;29879:33;;;;;;;29589:331;29536:384;;:::o;40341:1311::-;40231:9;15966:10;40231:25;;;:58;;-1:-1:-1;15966:10:0;40260:24;:29;;40231:58;40227:94;;;40298:23;;;;;;;;;;;;;;40227:94;40498:1:::1;40482:13;;:17;40478:45;;;40508:15;;;;;;;;;;;;;;40478:45;40535:84;40554:6;;40535:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;40562:13:0::1;::::0;40587:30:::1;::::0;13942:66:1;15966:10:0;13929:2:1;13925:15;13921:88;40587:30:0::1;::::0;::::1;13909:101:1::0;40562:13:0;;-1:-1:-1;14026:12:1;;;-1:-1:-1;40587:30:0::1;;;;;;;;;;;;;40577:41;;;;;;40535:18;:84::i;:::-;40530:112;;40628:14;;;;;;;;;;;;;;40530:112;40714:1;40693:18;40674:16;:37;:41;40670:71;;;40724:17;;;;;;;;;;;;;;40670:71;40791:9;;40772:16;40756:13;27270:22:::0;;27246:21;;:46;;27150:161;40756:13:::1;:32;:44;40752:72;;;40809:15;;;;;;;;;;;;;;40752:72;40909:14;;40888:18;:35;40871:12;;40852:16;:31;40851:73;40839:9;:85;40835:112;;;40933:14;;;;;;;;;;;;;;40835:112;40966:22:::0;;40963:348:::1;;41099:16;::::0;15966:10;41050:30:::1;::::0;;;:16:::1;:30;::::0;;;;:46;;;::::1;;;41029:67:::0;::::1;:86;41025:114;;;41124:15;;;;;;;;;;;;;;41025:114;15966:10:::0;41154:30:::1;::::0;;;:16:::1;:30;::::0;;;;;:77;;;;;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;;41253:5:::1;::::0;:50;;;;;::::1;::::0;::::1;5975:74:1::0;;;;6065:18;;;6058:34;;;41253:50:0;;41154:77:::1;41253:5:::0;;::::1;41154:30;41253:5;::::0;:16:::1;::::0;5948:18:1;;;;;41154:30:0;;41253:50;;;;;41154:30;41253:5;:50;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40963:348;41322:20:::0;;41319:325:::1;;41449:16;::::0;15966:10;41402:30:::1;::::0;;;:16:::1;:30;::::0;;;;:44;::::1;;41383:63:::0;::::1;:82;41379:110;;;41474:15;;;;;;;;;;;;;;41379:110;15966:10:::0;41504:30:::1;::::0;;;:16:::1;:30;::::0;;;;:73;;::::1;::::0;;::::1;::::0;::::1;;::::0;;;::::1;;::::0;;41599:37:::1;::::0;41560:16;41599:5:::1;:37::i;:::-;40341:1311:::0;;;;:::o;20813:1182::-;20896:20;20919:16;20927:7;20919;:16::i;:::-;20896:39;;20951:16;20962:4;20951:10;:16::i;:::-;20946:44;;20976:14;;;;;;;;;;;;;;20946:44;15966:10;21005:28;;;;;;;:81;;-1:-1:-1;15966:10:0;21050:20;21062:7;21050:11;:20::i;:::-;:36;;;;21005:81;:142;;;;-1:-1:-1;21104:43:0;21121:12;15966:10;28879:179;:::i;21104:43::-;21103:44;21005:142;21001:187;;;21156:32;;;;;;;;;;;;;;21001:187;21219:4;21203:20;;:12;:20;;;21199:55;;21232:22;;;;;;;;;;;;;;21199:55;21269:16;;;21265:50;;21294:21;;;;;;;;;;;;;;21265:50;21332:12;:26;;;;;;:53;;;;-1:-1:-1;21362:16:0;;;;;;;:12;:16;;;;;:23;;;;;;21332:53;:108;;;;-1:-1:-1;21389:12:0;:28;:51;;;;;:28;1797:55:1;;;21389:51:0;;;1779:74:1;21389:28:0;;;;:47;;1752:18:1;;21389:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21328:189;;;21456:12;:28;:49;;;;;:28;1797:55:1;;;21456:49:0;;;1779:74:1;21456:28:0;;;;:45;;1752:18:1;;21456:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21328:189;21536:24;;;;:15;:24;;;;;;;;21529:31;;;;;;;;;;21597:18;;;;;:12;:18;;;;;:31;;;;;;;;;;;;;;;;;;21643:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;21643:29:0;;;;;;;;;;;;;21687:20;;;:11;:20;;;;;;:25;;;;;;;;;21749:11;;;21779:24;;;;;;;:38;:77;;;;-1:-1:-1;21835:21:0;;21821:35;;21779:77;21775:157;;;21877:24;;;;:11;:24;;;;;:39;;;;;;;;;;21775:157;21572:371;21979:7;21975:2;21960:27;;21969:4;21960:27;;;;;;;;;;;;20885:1110;20813:1182;;;:::o;43846:369::-;43943:7;43952;43975:80;43994:6;;43975:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44002:13:0;;44027:26;;13942:66:1;13929:2;13925:15;;;13921:88;44027:26:0;;;13909:101:1;44002:13:0;;-1:-1:-1;14026:12:1;;;-1:-1:-1;44027:26:0;13780:264:1;43975:80:0;43970:100;;-1:-1:-1;44065:1:0;;-1:-1:-1;44065:1:0;44057:13;;43970:100;44105:26;;;;;;;:16;:26;;;;;:40;44086:16;;:59;;44105:40;;;44086:59;:::i;:::-;44166:26;;;;;;;:16;:26;;;;;:42;;44147:16;:61;;44166:42;;;;;;44147:61;:::i;:::-;44079:130;;;;43846:369;;;;;;;:::o;32314:258::-;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;32369:12:::1;:26:::0;;;::::1;;;32364:57;;32404:17;;;;;;;;;;;;;;32364:57;32434:12;:28:::0;:40:::1;::::0;;;;;;;:28:::1;::::0;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;:28:::1;::::0;:40;;;;;;;;:28;;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;32492:12:0::1;32485:19:::0;;;;;;-1:-1:-1;;32530:34:0::1;::::0;32548:15:::1;2489:25:1::0;;32530:34:0::1;::::0;2477:2:1;2462:18;32530:34:0::1;;;;;;;32314:258::o:0;30551:294::-;38695:12;:28;38687:53;38695:28;15966:10;38687:53;38683:90;;38749:24;;;;;;;;;;;;;;38683:90;30619:12:::1;:26:::0;;;::::1;;;30614:58;;30654:18;;;;;;;;;;;;;;30614:58;30687:20;::::0;::::1;;::::0;;;:12:::1;:20;::::0;;;;:27;;;::::1;;;30683:54;;;30723:14;;;;;;;;;;;;;;30683:54;30750:20;::::0;::::1;;::::0;;;:12:::1;:20;::::0;;;;:34;;;::::1;::::0;::::1;::::0;;30807:12:::1;15966:10:::0;;15894:90;30807:12:::1;30800:37;;;30821:15;30800:37;;;;2489:25:1::0;;2477:2;2462:18;;2343:177;30800:37:0::1;;;;;;;;30551:294:::0;:::o;24027:180::-;24145:54;24167:4;24173:2;24177:7;24186:8;24145:54;;;;;;;;;;;;:21;:54::i;44481:367::-;44563:16;44581:21;44613:14;44658:18;;44644:11;;44631:10;:24;;;;:::i;:::-;44630:47;;;;:::i;:::-;44686:23;44712:27;;;:17;:27;;;;;;44613:64;;-1:-1:-1;44686:23:0;44712:41;:27;:88;;44786:14;;;;44712:88;;;44756:27;;;;:17;:27;;;;;;;;44712:88;44686:114;-1:-1:-1;44834:6:0;;-1:-1:-1;;44481:367:0;;;;;;:::o;17622:293::-;17718:20;;;17679:4;17718:20;;;:12;:20;;;;;:27;;;;;;17717:28;:106;;;;-1:-1:-1;17763:20:0;;;;;;;:12;:20;;;;;:42;17808:15;17763:42;;;;;;:60;17717:106;:190;;;;-1:-1:-1;17842:12:0;:26;;;;;;:64;;17902:4;17842:64;;;-1:-1:-1;17872:20:0;;;;;;:12;:20;;;;;:27;;;;;;17871:28;;17622:293::o;45005:217::-;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;45120:51:::1;::::0;45076:21:::1;::::0;45051:22:::1;::::0;45128:10:::1;::::0;45076:21;;45051:22;45120:51;45051:22;45120:51;45076:21;45128:10;45120:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45104:67;;;45183:4;45178:35;;45196:17;;;;;;;;;;;;;;45178:35;45044:178;;45005:217::o:0;38092:118::-;38146:21;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38146:21:0;38187:15;38180:22;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38180:22:0;;;-1:-1:-1;;38180:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38092:118;-1:-1:-1;38092:118:0:o;22072:142::-;22167:39;22184:4;22190:2;22194:7;22167:39;;;;;;;;;;;;:16;:39::i;:::-;22072:142;;;:::o;42747:898::-;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;42840:13:::1;42864:10:::0;42860:238:::1;;42890:13:::0;42886:97:::1;;-1:-1:-1::0;42919:13:0::1;:22:::0;;;42967:4:::1;42886:97;42999:8;43011:1;42999:13;42995:96;;;-1:-1:-1::0;43028:12:0::1;:21:::0;;;43075:4:::1;42995:96;43110:5;43119:1;43110:10;43106:242;;;43136:13:::0;43132:100:::1;;-1:-1:-1::0;43165:16:0::1;:25:::0;;;43216:4:::1;43132:100;43248:8;43260:1;43248:13;43244:97;;;-1:-1:-1::0;43277:13:0::1;:22:::0;;;43325:4:::1;43244:97;43360:5;43369:1;43360:10;43356:241;;;43388:13:::0;43384:96:::1;;-1:-1:-1::0;43417:12:0::1;:21:::0;;;43464:4:::1;43384:96;43496:8;43508:1;43496:13;43492:98;;;-1:-1:-1::0;43525:14:0::1;:23:::0;;;43574:4:::1;43492:98;43610:8;43605:34;;43627:12;;;;;;;;;;;;;;42640:101:::0;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;42714:21:::1;:8;42725:10:::0;;42714:21:::1;:::i;44221:254::-:0;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;40231:9:::1;15966:10:::0;40231:25:::1;;::::0;:58:::1;;-1:-1:-1::0;15966:10:0;40260:24:::1;:29:::0;::::1;40231:58;40227:94;;;40298:23;;;;;;;;;;;;;;40227:94;44301:20:::2;::::0;::::2;;44300:21;44292:64;;;::::0;::::2;::::0;;15577:2:1;44292:64:0::2;::::0;::::2;15559:21:1::0;15616:2;15596:18;;;15589:30;15655:32;15635:18;;;15628:60;15705:18;;44292:64:0::2;;;;;;;;44365:5;::::0;::::2;::::0;::::2;;;:16;15966:10:::0;44365:35:::2;::::0;;::::2;::::0;;;;;;6005:42:1;5993:55;;;44365:35:0::2;::::0;::::2;5975:74:1::0;44396:3:0::2;6065:18:1::0;;;6058:34;5948:18;;44365:35:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;44409:24;44415:12;15966:10:::0;;15894:90;44415:12:::2;44429:3;44409:5;:24::i;:::-;44442:20;:27:::0;;;::::2;44465:4;44442:27;::::0;;44221:254::o;16531:703::-;16653:21;;16594:7;;16643:31;;16639:535;;;16695:17;16715:20;;;:11;:20;;;;;;;;16758:23;;16754:88;;16813:9;16531:703;-1:-1:-1;;16531:703:0:o;16754:88::-;-1:-1:-1;16904:9:0;;;;16952:20;;;;:11;:20;;;;;;16904:9;;-1:-1:-1;16952:20:0;;17005:23;;17001:104;;17068:9;16531:703;-1:-1:-1;;16531:703:0:o;17001:104::-;16864:291;;16639:535;17208:18;;;;;;;;;;;;;;43651:98;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;43727:5:::1;:16:::0;;::::1;::::0;;::::1;;;::::0;;;::::1;::::0;;;::::1;::::0;;43651:98::o;42542:92::-;42591:13;42620:8;42613:15;;;;;:::i;17325:200::-;17383:7;17407:22;;;17403:57;;17438:22;;;;;;;;;;;;;;17403:57;-1:-1:-1;17486:22:0;;;;;;:12;:22;;;;;:30;;;;17325:200::o;34582:95::-;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;34639:30:::1;34666:1;34639:18;:30::i;:::-;34582:95::o:0;31630:515::-;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;31731:12:::1;:26:::0;;;::::1;;;31727:54;;;31766:15;;;;;;;;;;;;;;31727:54;31796:30;::::0;::::1;31792:68;;31835:25;;;;;;;;;;;;;;31792:68;31873:12;:63:::0;;31947:33;;31873:63:::1;::::0;;::::1;31947:33:::0;;;;;::::1;::::0;;;;31991:53:::1;::::0;;;;::::1;::::0;::::1;2489:25:1::0;;;31991:28:0;::::1;::::0;:40:::1;::::0;2462:18:1;;31991:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;32070:67:0::1;::::0;;4687:25:1;;;32121:15:0::1;4743:2:1::0;4728:18;;4721:34;32070:67:0::1;::::0;::::1;::::0;-1:-1:-1;32070:67:0::1;::::0;-1:-1:-1;4660:18:1;32070:67:0::1;;;;;;;31630:515:::0;;:::o;36490:932::-;36600:20;;;36579:18;36600:20;;;:12;:20;;;;;:28;36550:16;;36600:28;;36643:15;36639:47;;36667:19;;;;;;;;;;;;;;36639:47;36714:21;;36697:14;36788:10;36774:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36774:25:0;;36746:53;;36810:18;36839:20;36902:9;36897:463;36917:6;36913:1;:10;36897:463;;;36949:22;36974:14;;;:11;:14;;;;;;;;37011:28;;37007:106;;37079:14;37064:29;;37007:106;37151:6;37135:22;;:12;:22;;;37131:214;;;37207:1;37182:8;37191:12;;;;;;37182:22;;;;;;;;:::i;:::-;;;;;;:26;;;;;37249:10;37235;:24;37231:95;;;-1:-1:-1;37294:8:0;;36490:932;-1:-1:-1;;;;;;;36490:932:0:o;37231:95::-;-1:-1:-1;36925:3:0;;36897:463;;;;37390:24;;;;;;;;;;;;;;25047:206;25185:60;25204:4;25210:2;25214:7;25223:8;25233:4;25239:5;25185:18;:60::i;:::-;25047:206;;;;;:::o;35563:102::-;35602:13;35635:15;:22;;35628:29;;;;;:::i;41658:878::-;40231:9;15966:10;40231:25;;;:58;;-1:-1:-1;15966:10:0;40260:24;:29;;40231:58;40227:94;;;40298:23;;;;;;;;;;;;;;40227:94;41786:1:::1;41771:12;;:16;41767:44;;;41796:15;;;;;;;;;;;;;;41767:44;41883:1;41862:18;41843:16;:37;:41;41839:71;;;41893:17;;;;;;;;;;;;;;41839:71;41960:9;;41941:16;41925:13;27270:22:::0;;27246:21;;:46;;27150:161;41925:13:::1;:32;:44;41921:72;;;41978:15;;;;;;;;;;;;;;41921:72;42078:14;;42057:18;:35;42040:12;;42021:16;:31;42020:73;42008:9;:85;42004:112;;;42102:14;;;;;;;;;;;;;;42004:112;42135:22:::0;;42132:204:::1;;42219:13;;42198:18;:34;42194:62;;;42241:15;;;;;;;;;;;;;;42194:62;42278:5;::::0;::::1;::::0;::::1;;;:16;15966:10:::0;42278:50:::1;::::0;;::::1;::::0;;;;;;6005:42:1;5993:55;;;42278:50:0::1;::::0;::::1;5975:74:1::0;6065:18;;;6058:34;;;5948:18;;42278:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42132:204;42347:20:::0;;42344:187:::1;;42427:13;;42408:16;:32;42404:60;;;42449:15;;;;;;;;;;;;;;42404:60;42486:37;15966:10:::0;42506:16:::1;42486:5;:37::i;28352:333::-:0;28434:24;;;15966:10;28434:24;28430:54;;;28467:17;;;;;;;;;;;;;;28430:54;28500:24;15966:10;17622:293;:::i;28500:24::-;28495:52;;28533:14;;;;;;;;;;;;;;28495:52;15966:10;28560:32;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;28629:48;;586:41:1;;;28560:42:0;;15966:10;28629:48;;559:18:1;28629:48:0;;;;;;;28352:333;;:::o;33659:386::-;15966:10;33700:26;;;;:12;:26;;;;;:33;;;;;;33695:63;;33742:16;;;;;;;;;;;;;;33695:63;15966:10;33778:26;;;;:12;:26;;;;;33771:40;;33923:47;33771:40;;;33923:47;;;;;33905:15;:65;33847:124;;;;;;;;;;33998:39;;;34021:15;33998:39;;;;2489:25:1;;2477:2;2462:18;;2343:177;33998:39:0;;;;;;;;33659:386::o;22964:396::-;23079:31;23092:4;23098:2;23102:7;23079:12;:31::i;:::-;23142:1;23125:2;:14;;;:18;:187;;;;-1:-1:-1;23164:82:0;;23267:45;23164:82;;;23267:45;23164:40;;;;23267:45;;23164:82;;15966:10;;23227:1;;23231:7;;23240:5;;23164:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:148;;;;23125:187;23121:231;;;23321:31;;;;;;;;;;;;;;35771:305;35835:13;35866:16;35874:7;16351:21;;-1:-1:-1;16341:31:0;16254:126;35866:16;35861:56;;35891:26;;;;;;;;;;;;;;35861:56;35928:22;35953:9;:7;:9::i;:::-;35928:34;;36005:1;35986:8;35980:22;:26;:88;;;;;;;;;;;;;;;;;36033:8;36043:18;:7;:16;:18::i;:::-;36016:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35980:88;35973:95;35771:305;-1:-1:-1;;;35771:305:0:o;44856:143::-;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;44955:26:::1;::::0;;;:17:::1;:26;::::0;;;;:37;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;44856:143::o;23765:180::-;23879:58;23898:4;23904:2;23908:7;23917:8;23927:5;23879:58;;;;;;;;;;;;:18;:58::i;43755:85::-;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;43813:13:::1;:21:::0;43755:85::o;32802:629::-;15966:10;32857:26;;;;:12;:26;;;;;:33;;;;;;32853:60;;;32899:14;;;;;;;;;;;;;;32853:60;32940:1;32928:9;:13;:31;;;;32957:2;32945:9;:14;32928:31;32924:73;;;32968:29;;;;;;;;;;;;;;32924:73;15966:10;33035:24;33136:26;;;:12;:26;;;;;:48;33074:6;33062:18;;;33136:48;;;;;33099:15;:34;;:85;33095:116;;;33193:18;;;;;;;;;;;;;;33095:116;15966:10;33226:26;;;;:12;:26;;;;;:40;;33281:74;;;;;;;;;;;;;;;33226:40;33281:74;;;;33392:31;;;33413:9;33392:31;;;;2489:25:1;;2477:2;2462:18;;2343:177;28879:179:0;28960:4;28985:18;28996:6;28985:10;:18::i;:::-;28984:19;:66;;29014:26;;;;;;;;:18;:26;;;;;;;;:36;;;;;;;;;;;;28984:66;;;29006:5;28977:73;28879:179;-1:-1:-1;;;28879:179:0:o;31170:226::-;38695:12;:28;38687:53;38695:28;15966:10;38687:53;38683:90;;38749:24;;;;;;;;;;;;;;38683:90;31240:20:::1;::::0;::::1;;::::0;;;:12:::1;:20;::::0;;;;:27;;;::::1;;;31235:57;;31276:16;;;;;;;;;;;;;;31235:57;31312:20;::::0;::::1;;::::0;;;:12:::1;:20;::::0;;;;;;31305:34;;;::::1;::::0;;31355:33;::::1;::::0;::::1;::::0;31372:15:::1;2489:25:1::0;;2477:2;2462:18;;2343:177;34832:176:0;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;34909:22:::1;::::0;::::1;34905:56;;34940:21;;;;;;;;;;;;;;34905:56;34972:28;34991:8;34972:18;:28::i;:::-;34832:176:::0;:::o;11246:830::-;11371:4;11411;11371;11428:525;11452:5;:12;11448:1;:16;11428:525;;;11486:20;11509:5;11515:1;11509:8;;;;;;;;:::i;:::-;;;;;;;11486:31;;11554:12;11538;:28;11534:408;;11691:44;;;;;;17638:19:1;;;17673:12;;;17666:28;;;17710:12;;11691:44:0;;;;;;;;;;;;11681:55;;;;;;11666:70;;11534:408;;;11881:44;;;;;;17638:19:1;;;17673:12;;;17666:28;;;17710:12;;11881:44:0;;;;;;;;;;;;11871:55;;;;;;11856:70;;11534:408;-1:-1:-1;11466:3:0;;;;:::i;:::-;;;;11428:525;;;-1:-1:-1;12048:20:0;;;;11246:830;-1:-1:-1;;;11246:830:0:o;18129:768::-;18198:16;;;18194:46;;18223:17;;;;;;;;;;;;;;18194:46;18255:13;18251:44;;18277:18;;;;;;;;;;;;;;18251:44;18312:12;:26;;;;;;:53;;;;-1:-1:-1;18342:16:0;;;;;;;:12;:16;;;;;:23;;;;;;18312:53;:108;;;;-1:-1:-1;18369:12:0;:28;:51;;;;;:28;1797:55:1;;;18369:51:0;;;1779:74:1;18369:28:0;;;;:47;;1752:18:1;;18369:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18308:189;;;18436:12;:28;:49;;;;;:28;1797:55:1;;;18436:49:0;;;1779:74:1;18436:28:0;;;;:45;;1752:18:1;;18436:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18308:189;18557:21;;18593:16;;;18534:20;18593:16;;;:12;:16;;;;;;;;:44;;;;;;;;;;;;;;;;18652:25;;;:11;:25;;;;;:30;;;;;;;;;;18711:115;18731:8;18727:1;:12;18711:115;;;18770:40;;18795:14;;;;;18770:40;;;;18787:1;;18770:40;;18787:1;;18770:40;18741:3;;18711:115;;;-1:-1:-1;18842:21:0;:36;-1:-1:-1;;18129:768:0:o;35168:213::-;35253:21;;;;35285:32;;;;;;;;;;;35333:40;;35253:21;;;35285:32;35253:21;;35333:40;;35234:16;;35333:40;35223:158;35168:213;:::o;25261:1791::-;25420:16;25431:4;25420:10;:16::i;:::-;25415:44;;25445:14;;;;;;;;;;;;;;25415:44;15966:10;25474:20;;;;;;;:60;;-1:-1:-1;25499:35:0;25516:4;15966:10;28879:179;:::i;25499:35::-;25498:36;25474:60;25470:105;;;25543:32;;;;;;;;;;;;;;25470:105;25591:40;25607:4;25613:7;25622:8;25591:15;:40::i;:::-;25586:74;;25640:20;;;;;;;;;;;;;;25586:74;25675:16;;;25671:50;;25700:21;;;;;;;;;;;;;;25671:50;25738:12;:26;;;;;;:53;;;;-1:-1:-1;25768:16:0;;;;;;;:12;:16;;;;;:23;;;;;;25738:53;:108;;;;-1:-1:-1;25795:12:0;:28;:51;;;;;:28;1797:55:1;;;25795:51:0;;;1779:74:1;25795:28:0;;;;:47;;1752:18:1;;25795:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25734:189;;;25862:12;:28;:49;;;;;:28;1797:55:1;;;25862:49:0;;;1779:74:1;25862:28:0;;;;:45;;1752:18:1;;25862:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25734:189;25965:9;25960:734;25980:8;25976:1;:12;25960:734;;;26037:11;;;26014:20;26074:29;;;:15;:29;;;;;26067:36;;;;;;26128:6;26124:165;;26158:25;;;;:11;:25;;;;;:30;;;;;;;;;;26124:165;;;26244:25;;;;:11;:25;;;;;26237:32;;;;;;26124:165;26331:12;26327:2;26312:32;;26321:4;26312:32;;;;;;;;;;;;26367:17;26363:316;;;26428:1;26411:2;:14;;;:18;:208;;;;-1:-1:-1;26458:87:0;;26574:45;26458:87;;;26574:45;26458:40;;;;26574:45;;26458:87;;15966:10;;26521:1;;26525:12;;26539:5;;26458:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:161;;;;26411:208;26408:251;;;26628:31;;;;;;;;;;;;;;26408:251;-1:-1:-1;25990:3:0;;25960:734;;;-1:-1:-1;26710:18:0;;;;;;;;:12;:18;;;;;;;;:46;;;;;;;;;;;;;;;;;;;26771:16;;;;;;;;:44;;;;;;;;;;;;;;;;;;;26852:18;;;26889:24;;;:11;:24;;;;;;;26852:18;;26889:24;:38;:77;;;;-1:-1:-1;26945:21:0;;26931:35;;26889:77;26885:149;;;26987:24;;;;:11;:24;;;;;:31;;;;;;;;;;26885:149;25935:1110;25261:1791;;;;;;:::o;401:723::-;457:13;678:10;674:53;;-1:-1:-1;;705:10:0;;;;;;;;;;;;;;;;;;401:723::o;674:53::-;752:5;737:12;793:78;800:9;;793:78;;826:8;;;;:::i;:::-;;-1:-1:-1;849:10:0;;-1:-1:-1;857:2:0;849:10;;:::i;:::-;;;793:78;;;881:19;913:6;903:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;903:17:0;;881:39;;931:154;938:10;;931:154;;965:11;975:1;965:11;;:::i;:::-;;-1:-1:-1;1034:10:0;1042:2;1034:5;:10;:::i;:::-;1021:24;;:2;:24;:::i;:::-;1008:39;;991:6;998;991:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1062:11:0;1071:2;1062:11;;:::i;:::-;;;931:154;;;1109:6;401:723;-1:-1:-1;;;;401:723:0:o;27558:417::-;27666:4;27698:1;27687:8;:12;27683:48;;;27708:23;;;;;;;;;;;;;;27683:48;27772:9;27767:168;27787:8;27783:1;:12;27767:168;;;27849:15;27825:39;;:20;27843:1;27833:7;:11;27825:7;:20::i;:::-;:39;;;27821:99;;27895:5;27888:12;;;;;27821:99;27797:3;;27767:168;;;-1:-1:-1;27963:4:0;;27558:417;-1:-1:-1;;;;27558:417:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:1;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:1;868:16;;861:27;638:258::o;901:317::-;943:3;981:5;975:12;1008:6;1003:3;996:19;1024:63;1080:6;1073:4;1068:3;1064:14;1057:4;1050:5;1046:16;1024:63;:::i;:::-;1132:2;1120:15;1137:66;1116:88;1107:98;;;;1207:4;1103:109;;901:317;-1:-1:-1;;901:317:1:o;1223:220::-;1372:2;1361:9;1354:21;1335:4;1392:45;1433:2;1422:9;1418:18;1410:6;1392:45;:::i;1448:180::-;1507:6;1560:2;1548:9;1539:7;1535:23;1531:32;1528:52;;;1576:1;1573;1566:12;1528:52;-1:-1:-1;1599:23:1;;1448:180;-1:-1:-1;1448:180:1:o;1864:154::-;1950:42;1943:5;1939:54;1932:5;1929:65;1919:93;;2008:1;2005;1998:12;2023:315;2091:6;2099;2152:2;2140:9;2131:7;2127:23;2123:32;2120:52;;;2168:1;2165;2158:12;2120:52;2207:9;2194:23;2226:31;2251:5;2226:31;:::i;:::-;2276:5;2328:2;2313:18;;;;2300:32;;-1:-1:-1;;;2023:315:1:o;2525:367::-;2588:8;2598:6;2652:3;2645:4;2637:6;2633:17;2629:27;2619:55;;2670:1;2667;2660:12;2619:55;-1:-1:-1;2693:20:1;;2736:18;2725:30;;2722:50;;;2768:1;2765;2758:12;2722:50;2805:4;2797:6;2793:17;2781:29;;2865:3;2858:4;2848:6;2845:1;2841:14;2833:6;2829:27;2825:38;2822:47;2819:67;;;2882:1;2879;2872:12;2897:573;3001:6;3009;3017;3025;3078:2;3066:9;3057:7;3053:23;3049:32;3046:52;;;3094:1;3091;3084:12;3046:52;3130:9;3117:23;3107:33;;3187:2;3176:9;3172:18;3159:32;3149:42;;3242:2;3231:9;3227:18;3214:32;3269:18;3261:6;3258:30;3255:50;;;3301:1;3298;3291:12;3255:50;3340:70;3402:7;3393:6;3382:9;3378:22;3340:70;:::i;:::-;2897:573;;;;-1:-1:-1;3429:8:1;-1:-1:-1;;;;2897:573:1:o;3475:456::-;3552:6;3560;3568;3621:2;3609:9;3600:7;3596:23;3592:32;3589:52;;;3637:1;3634;3627:12;3589:52;3676:9;3663:23;3695:31;3720:5;3695:31;:::i;:::-;3745:5;-1:-1:-1;3802:2:1;3787:18;;3774:32;3815:33;3774:32;3815:33;:::i;:::-;3475:456;;3867:7;;-1:-1:-1;;;3921:2:1;3906:18;;;;3893:32;;3475:456::o;3936:572::-;4031:6;4039;4047;4100:2;4088:9;4079:7;4075:23;4071:32;4068:52;;;4116:1;4113;4106:12;4068:52;4155:9;4142:23;4174:31;4199:5;4174:31;:::i;:::-;4224:5;-1:-1:-1;4280:2:1;4265:18;;4252:32;4307:18;4296:30;;4293:50;;;4339:1;4336;4329:12;4293:50;4378:70;4440:7;4431:6;4420:9;4416:22;4378:70;:::i;:::-;3936:572;;4467:8;;-1:-1:-1;4352:96:1;;-1:-1:-1;;;;3936:572:1:o;4766:247::-;4825:6;4878:2;4866:9;4857:7;4853:23;4849:32;4846:52;;;4894:1;4891;4884:12;4846:52;4933:9;4920:23;4952:31;4977:5;4952:31;:::i;5018:525::-;5104:6;5112;5120;5128;5181:3;5169:9;5160:7;5156:23;5152:33;5149:53;;;5198:1;5195;5188:12;5149:53;5237:9;5224:23;5256:31;5281:5;5256:31;:::i;:::-;5306:5;-1:-1:-1;5363:2:1;5348:18;;5335:32;5376:33;5335:32;5376:33;:::i;:::-;5018:525;;5428:7;;-1:-1:-1;;;;5482:2:1;5467:18;;5454:32;;5533:2;5518:18;5505:32;;5018:525::o;5548:248::-;5616:6;5624;5677:2;5665:9;5656:7;5652:23;5648:32;5645:52;;;5693:1;5690;5683:12;5645:52;-1:-1:-1;;5716:23:1;;;5786:2;5771:18;;;5758:32;;-1:-1:-1;5548:248:1:o;6103:860::-;6294:2;6283:9;6276:21;6257:4;6332:6;6326:13;6375:4;6370:2;6359:9;6355:18;6348:32;6403:52;6450:3;6439:9;6435:19;6421:12;6403:52;:::i;:::-;6389:66;;6504:2;6496:6;6492:15;6486:22;6572:66;6560:9;6552:6;6548:22;6544:95;6539:2;6528:9;6524:18;6517:123;6663:41;6697:6;6681:14;6663:41;:::i;:::-;6649:55;;;6768:42;6762:2;6754:6;6750:15;6744:22;6740:71;6735:2;6724:9;6720:18;6713:99;6867:2;6859:6;6855:15;6849:22;6843:3;6832:9;6828:19;6821:51;6928:3;6920:6;6916:16;6910:23;6903:4;6892:9;6888:20;6881:53;6951:6;6943:14;;;6103:860;;;;:::o;6968:316::-;7045:6;7053;7061;7114:2;7102:9;7093:7;7089:23;7085:32;7082:52;;;7130:1;7127;7120:12;7082:52;-1:-1:-1;;7153:23:1;;;7223:2;7208:18;;7195:32;;-1:-1:-1;7274:2:1;7259:18;;;7246:32;;6968:316;-1:-1:-1;6968:316:1:o;7289:592::-;7360:6;7368;7421:2;7409:9;7400:7;7396:23;7392:32;7389:52;;;7437:1;7434;7427:12;7389:52;7477:9;7464:23;7506:18;7547:2;7539:6;7536:14;7533:34;;;7563:1;7560;7553:12;7533:34;7601:6;7590:9;7586:22;7576:32;;7646:7;7639:4;7635:2;7631:13;7627:27;7617:55;;7668:1;7665;7658:12;7617:55;7708:2;7695:16;7734:2;7726:6;7723:14;7720:34;;;7750:1;7747;7740:12;7720:34;7795:7;7790:2;7781:6;7777:2;7773:15;7769:24;7766:37;7763:57;;;7816:1;7813;7806:12;7763:57;7847:2;7839:11;;;;;7869:6;;-1:-1:-1;7289:592:1;;-1:-1:-1;;;;7289:592:1:o;8156:632::-;8327:2;8379:21;;;8449:13;;8352:18;;;8471:22;;;8298:4;;8327:2;8550:15;;;;8524:2;8509:18;;;8298:4;8593:169;8607:6;8604:1;8601:13;8593:169;;;8668:13;;8656:26;;8737:15;;;;8702:12;;;;8629:1;8622:9;8593:169;;;-1:-1:-1;8779:3:1;;8156:632;-1:-1:-1;;;;;;8156:632:1:o;8793:184::-;8845:77;8842:1;8835:88;8942:4;8939:1;8932:15;8966:4;8963:1;8956:15;8982:777;9024:5;9077:3;9070:4;9062:6;9058:17;9054:27;9044:55;;9095:1;9092;9085:12;9044:55;9131:6;9118:20;9157:18;9194:2;9190;9187:10;9184:36;;;9200:18;;:::i;:::-;9334:2;9328:9;9396:4;9388:13;;9239:66;9384:22;;;9408:2;9380:31;9376:40;9364:53;;;9432:18;;;9452:22;;;9429:46;9426:72;;;9478:18;;:::i;:::-;9518:10;9514:2;9507:22;9553:2;9545:6;9538:18;9599:3;9592:4;9587:2;9579:6;9575:15;9571:26;9568:35;9565:55;;;9616:1;9613;9606:12;9565:55;9680:2;9673:4;9665:6;9661:17;9654:4;9646:6;9642:17;9629:54;9727:1;9720:4;9715:2;9707:6;9703:15;9699:26;9692:37;9747:6;9738:15;;;;;;8982:777;;;;:::o;9764:734::-;9868:6;9876;9884;9892;9900;9953:3;9941:9;9932:7;9928:23;9924:33;9921:53;;;9970:1;9967;9960:12;9921:53;10009:9;9996:23;10028:31;10053:5;10028:31;:::i;:::-;10078:5;-1:-1:-1;10135:2:1;10120:18;;10107:32;10148:33;10107:32;10148:33;:::i;:::-;10200:7;-1:-1:-1;10254:2:1;10239:18;;10226:32;;-1:-1:-1;10305:2:1;10290:18;;10277:32;;-1:-1:-1;10360:3:1;10345:19;;10332:33;10388:18;10377:30;;10374:50;;;10420:1;10417;10410:12;10374:50;10443:49;10484:7;10475:6;10464:9;10460:22;10443:49;:::i;:::-;10433:59;;;9764:734;;;;;;;;:::o;10997:118::-;11083:5;11076:13;11069:21;11062:5;11059:32;11049:60;;11105:1;11102;11095:12;11120:382;11185:6;11193;11246:2;11234:9;11225:7;11221:23;11217:32;11214:52;;;11262:1;11259;11252:12;11214:52;11301:9;11288:23;11320:31;11345:5;11320:31;:::i;:::-;11370:5;-1:-1:-1;11427:2:1;11412:18;;11399:32;11440:30;11399:32;11440:30;:::i;:::-;11489:7;11479:17;;;11120:382;;;;;:::o;11507:665::-;11602:6;11610;11618;11626;11679:3;11667:9;11658:7;11654:23;11650:33;11647:53;;;11696:1;11693;11686:12;11647:53;11735:9;11722:23;11754:31;11779:5;11754:31;:::i;:::-;11804:5;-1:-1:-1;11861:2:1;11846:18;;11833:32;11874:33;11833:32;11874:33;:::i;:::-;11926:7;-1:-1:-1;11980:2:1;11965:18;;11952:32;;-1:-1:-1;12035:2:1;12020:18;;12007:32;12062:18;12051:30;;12048:50;;;12094:1;12091;12084:12;12048:50;12117:49;12158:7;12149:6;12138:9;12134:22;12117:49;:::i;:::-;12107:59;;;11507:665;;;;;;;:::o;12945:388::-;13013:6;13021;13074:2;13062:9;13053:7;13049:23;13045:32;13042:52;;;13090:1;13087;13080:12;13042:52;13129:9;13116:23;13148:31;13173:5;13148:31;:::i;:::-;13198:5;-1:-1:-1;13255:2:1;13240:18;;13227:32;13268:33;13227:32;13268:33;:::i;13338:437::-;13417:1;13413:12;;;;13460;;;13481:61;;13535:4;13527:6;13523:17;13513:27;;13481:61;13588:2;13580:6;13577:14;13557:18;13554:38;13551:218;;;13625:77;13622:1;13615:88;13726:4;13723:1;13716:15;13754:4;13751:1;13744:15;13551:218;;13338:437;;;:::o;14049:245::-;14116:6;14169:2;14157:9;14148:7;14144:23;14140:32;14137:52;;;14185:1;14182;14175:12;14137:52;14217:9;14211:16;14236:28;14258:5;14236:28;:::i;14299:184::-;14351:77;14348:1;14341:88;14448:4;14445:1;14438:15;14472:4;14469:1;14462:15;14488:125;14528:4;14556:1;14553;14550:8;14547:34;;;14561:18;;:::i;:::-;-1:-1:-1;14598:9:1;;14488:125::o;14618:228::-;14658:7;14784:1;14716:66;14712:74;14709:1;14706:81;14701:1;14694:9;14687:17;14683:105;14680:131;;;14791:18;;:::i;:::-;-1:-1:-1;14831:9:1;;14618:228::o;14851:184::-;14903:77;14900:1;14893:88;15000:4;14997:1;14990:15;15024:4;15021:1;15014:15;15040:120;15080:1;15106;15096:35;;15111:18;;:::i;:::-;-1:-1:-1;15145:9:1;;15040:120::o;16046:184::-;16098:77;16095:1;16088:88;16195:4;16192:1;16185:15;16219:4;16216:1;16209:15;16235:512;16429:4;16458:42;16539:2;16531:6;16527:15;16516:9;16509:34;16591:2;16583:6;16579:15;16574:2;16563:9;16559:18;16552:43;;16631:6;16626:2;16615:9;16611:18;16604:34;16674:3;16669:2;16658:9;16654:18;16647:31;16695:46;16736:3;16725:9;16721:19;16713:6;16695:46;:::i;:::-;16687:54;16235:512;-1:-1:-1;;;;;;16235:512:1:o;16752:249::-;16821:6;16874:2;16862:9;16853:7;16849:23;16845:32;16842:52;;;16890:1;16887;16880:12;16842:52;16922:9;16916:16;16941:30;16965:5;16941:30;:::i;17006:470::-;17185:3;17223:6;17217:13;17239:53;17285:6;17280:3;17273:4;17265:6;17261:17;17239:53;:::i;:::-;17355:13;;17314:16;;;;17377:57;17355:13;17314:16;17411:4;17399:17;;17377:57;:::i;:::-;17450:20;;17006:470;-1:-1:-1;;;;17006:470:1:o;17733:195::-;17772:3;17803:66;17796:5;17793:77;17790:103;;;17873:18;;:::i;:::-;-1:-1:-1;17920:1:1;17909:13;;17733:195::o;17933:112::-;17965:1;17991;17981:35;;17996:18;;:::i;:::-;-1:-1:-1;18030:9:1;;17933:112::o;18050:128::-;18090:3;18121:1;18117:6;18114:1;18111:13;18108:39;;;18127:18;;:::i;:::-;-1:-1:-1;18163:9:1;;18050:128::o
Swarm Source
ipfs://1fb992136021118512c28be65a8c6c3390dead01e1e8df55ab537f85ed1817fe
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.