ERC-721
Overview
Max Total Supply
6,043 FFX
Holders
2,461
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
4 FFXLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FluffyFucksV3
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-05 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @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. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ 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) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { 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 = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: erc721a/contracts/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721AQueryable compliant contract. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: erc721a/contracts/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721A Queryable * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } // File: contracts/FluffyFucksV3.sol /** * SPDX-License-Identifier: UNLICENSED */ pragma solidity >=0.8.0 <0.9.0; enum MintType { Guaranteed, Luckiest, FreeList, Public } struct MintTimer { uint64 from; uint64 to; uint8 canMint; } struct Staker { uint256 cashmoney; address stakerAddress; uint16[] staked; } struct LeaderboardEnum { address staker; uint16[] staked; } contract FluffyFucksV3 is ERC721AQueryable, Ownable, ReentrancyGuard { uint16 public constant SUPPLY = 5555; uint16 public constant SUPPLY_TEAM = 100; uint16 public stakedTokens = 0; uint8 internal teamMinted = 0; uint8 public constant PERCENTAGE_OF_STAKED_REWARDED = 25; uint8 public constant PERCENTAGE_CHARITY = 20; uint8 public constant PERCENTAGE_STAKING = 10; uint8 public constant PERCENTAGE_GAMES = 5; // date and timers uint64 private constant DATE_NULL = 0; uint64 private constant DATE_WILDCARD = 1; mapping(MintType => MintTimer) internal mintTimes; // constants address public constant ADDRESS_GAMES = 0xA1b4812985AA003bd2ADf5818a4772FDD6eEb364; address public constant ADDRESS_CHARITY = 0xA88363F441c3D70B55A18fa6802ec3c08de07D00; address public constant ADDRESS_TEAM = 0x1e045D70D1ECaF1C526a22A8E7a260FfbC051BE1; bytes32 internal merkleGuaranteedList = "0"; bytes32 internal merkleLuckiest = "0"; bytes32 internal merkleRaffle = "0"; uint256 internal mintDonations = 0; // staking uint256 internal stakedMoney = 0; Staker[] internal stakers; mapping(address => uint256) internal stakerIndices; // administrator list mapping(address => bool) internal administrators; string internal contractMetadataURI = ""; string internal tokenURIpart = ""; constructor() ERC721A("Fluffy Fucks", "FFX") { MintTimer memory tmp = MintTimer({ from: 1654412400, //1654412400, to: 1654437600, //1654437600, canMint: 2 }); // guaranteed mintTimes[MintType.Guaranteed] = tmp; // influencer, luckiest mintTimes[MintType.Luckiest] = tmp; mintTimes[MintType.Luckiest].canMint = 4; // raffle/freelist list mintTimes[MintType.FreeList] = tmp; mintTimes[MintType.FreeList].from = 1654437600;//1654437600; mintTimes[MintType.FreeList].to = 1654455600; // public mint mintTimes[MintType.Public] = tmp; mintTimes[MintType.Public].from = 1654455600; mintTimes[MintType.Public].to = DATE_WILDCARD; } function _startTokenId() internal pure override returns(uint256) { return 1; } function setContractMetadataURI(string calldata _uri) public onlyOwnerOrAdmin { contractMetadataURI = _uri; } function setTokenRootURI(string calldata _uri) public onlyOwnerOrAdmin { tokenURIpart = _uri; } // Metadata stuff function contractURI() public view returns(string memory) { return contractMetadataURI; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override(ERC721A, IERC721A) returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId), ".json")) : ""; } function _baseURI() internal view override returns (string memory) { return tokenURIpart; } // so we can receive payments fallback() external payable nonReentrant {} receive() external payable nonReentrant {} /** * Minting */ function mint(bytes32[] calldata _merkleProof, uint8 _quantity, uint8 _stake) public payable nonReentrant { MintType mintType = MintType.Public; // check if is luckiest or influencer if (mintType == MintType.Public && merkleVerify(_merkleProof, merkleLuckiest, msg.sender)) { mintType = MintType.Luckiest; } // check if is guaranteed merkleGuaranteedList if (mintType == MintType.Public && merkleVerify(_merkleProof, merkleGuaranteedList, msg.sender)) { mintType = MintType.Guaranteed; } // check if is freelisted/raffled if (merkleVerify(_merkleProof, merkleRaffle, msg.sender)) { mintType = MintType.FreeList; } // check mint time require(checkMintTime(mintType), "Cannot mint at this time."); // check if can mint _quantity require(_numberMinted(msg.sender) + _quantity <= mintTimes[mintType].canMint, "Can not mint this many."); // check if doesn't stake more than mints require(_stake <= _quantity, "Can not stake this many."); _safeMint(msg.sender, _quantity); mintDonations += msg.value; if (_stake > 0) { uint16 currentTokenId = uint16(_nextTokenId()) - 1; uint16[] memory stakeIds = new uint16[](_stake); for (uint8 i = 0; i < _stake; i++) { stakeIds[i] = currentTokenId - i; } stakeTokens(stakeIds); } } function teamMint(uint8 _quantity) public nonReentrant onlyOwnerOrAdmin { require(teamMinted + _quantity <= SUPPLY_TEAM, "Cannot mint over 100."); _safeMint(msg.sender, _quantity); teamMinted += _quantity; } /** * Stake and unstake */ function stakeTokens(uint16[] memory tokens) ownsTokens(tokens) public { bool a = true; uint256 i; uint256 index; // check if we need a new staker (index, a) = stakerIndex(msg.sender); if (!a) { Staker memory newStaker; newStaker.stakerAddress = msg.sender; index = stakers.length; stakers.push(newStaker); stakerIndices[msg.sender] = stakers.length; } uint16[] storage tmpTokens = stakers[index].staked; // stake tokens for (i = 0; i < tokens.length; ++i) { if (!isStakingToken(msg.sender, tokens[i])) { tmpTokens.push(tokens[i]); } else { require(false, "You are already staking this token"); } } stakers[index].staked = tmpTokens; stakedTokens += uint16(tokens.length); } function unstakeTokens(uint16[] calldata tokens) ownsTokens(tokens) public { bool a = true; uint i; uint256 index; (index, a) = stakerIndex(msg.sender); require(a, "You are not a staker."); uint256 j; uint256 len; uint16[] storage tmpTokens = stakers[index].staked; for (i = 0; i < tokens.length; i++) { len = tmpTokens.length; for (j = 0; j < len; j++) { if (tokens[i] == tmpTokens[j]) { tmpTokens[j] = tmpTokens[len - 1]; tmpTokens.pop(); --stakedTokens; break; } } } stakers[index].staked = tmpTokens; } function isStakingToken(address user, uint16 token) private view returns(bool) { (uint256 index, ) = stakerIndex(user); for(uint256 i = 0; i < stakers[index].staked.length; ++i) { if (stakers[index].staked[i] == token) { return true; } } return false; } modifier ownsTokens(uint16[] memory _tokens) { bool owns = true; for(uint256 i = 0; i < _tokens.length; i++) { if (ownerOf(uint256(_tokens[i])) != msg.sender) { owns = false; break; } } require(owns, "Tokens aren't yours."); _; } /** * Transfer checks */ function _beforeTokenTransfers( address from, address /*to*/, uint256 startTokenId, uint256 quantity ) internal override view { (uint256 _stakerIndex, bool success) = stakerIndex(from); uint256 i; uint256 j; bool isNotStaked; if (success) { for (i = 0; i < quantity; ++i) { isNotStaked = true; for (j = 0; j < stakers[_stakerIndex].staked.length; ++j) { if (stakers[_stakerIndex].staked[j] == startTokenId + quantity) { isNotStaked = false; break; } } require(isNotStaked, "Token is staked."); } } } /** * Timers */ function checkMintTime(MintType mt) internal view returns(bool) { MintTimer memory timer = mintTimes[mt]; if (timer.from == DATE_WILDCARD && timer.to == DATE_WILDCARD) { return true; } else if (timer.from == DATE_WILDCARD && block.timestamp <= timer.to) { return true; } else if (timer.from <= block.timestamp && timer.to == DATE_WILDCARD) { return true; } else if (timer.from <= block.timestamp && block.timestamp <= timer.to) { return true; } return false; } /** * Merkles */ function setMerkleGuaranteedList(bytes32 _merkle) external onlyOwnerOrAdmin { merkleGuaranteedList = _merkle; } function setMerkleLuckiest(bytes32 _merkle) external onlyOwnerOrAdmin { merkleLuckiest = _merkle; } function setMerkleRaffle(bytes32 _merkle) external onlyOwnerOrAdmin { merkleRaffle = _merkle; } function merkleVerify(bytes32[] memory proof, bytes32 root, address sender) pure internal returns (bool) { return MerkleProof.verify(proof, root, keccak256(abi.encodePacked(sender))); } /** * Withdrawal */ function withdrawMintDonations() external nonReentrant onlyOwnerOrAdmin { bool success; require(mintDonations > 0, "No funds left."); (success, ) = (ADDRESS_TEAM).call{value: mintDonations}(""); require(success, "Withdrawal failed."); mintDonations = 0; } function withdrawStakedMoney() public nonReentrant hasStakedMoney returns(uint256 withdrawed) { (uint256 index, ) = stakerIndex(msg.sender); Staker memory _staker = stakers[index]; (bool success, ) = (msg.sender).call{value: _staker.cashmoney}(""); require(success, "Could not send staked money"); withdrawed = _staker.cashmoney; stakers[index].cashmoney = 0; return withdrawed; } function withdraw() external onlyOwnerOrAdmin nonReentrant returns (uint256 _fullMoney, uint256 _charityShare, uint256 _stakingShare, uint256 _gamesShare) { uint256 fullMoney = address(this).balance - mintDonations - stakedMoney; uint256 charityShare = fullMoney * PERCENTAGE_CHARITY / 100; uint256 stakingShare = fullMoney * PERCENTAGE_STAKING / 100; uint256 gamesShare = fullMoney * PERCENTAGE_GAMES / 100; bool success = false; (success, ) = (ADDRESS_TEAM).call{value: fullMoney - charityShare - stakingShare - gamesShare}(""); require(success, "Games withdrawal failed."); (success, ) = (ADDRESS_CHARITY).call{value: charityShare}(""); require(success, "Charity withdrawal failed."); (success, ) = (ADDRESS_GAMES).call{value: gamesShare}(""); require(success, "Games withdrawal failed."); divideMoneyToStakers(stakingShare); return (fullMoney, charityShare, stakingShare, gamesShare); } function balance() external view onlyOwnerOrAdmin returns (uint256 _balance, uint256 _stakedMoney, uint256 _donations) { return (address(this).balance, stakedMoney, mintDonations); } function stakingLeaderBoard() external view returns(LeaderboardEnum[] memory _leaderboard) { uint256 i; uint256 a = 0; for (i = 0; i < stakers.length; i++) { if (stakers[i].staked.length > 0) { ++a; } } _leaderboard = new LeaderboardEnum[](a); LeaderboardEnum memory tmp; for (i = 0; i < stakers.length; i++) { if (stakers[i].staked.length > 0) { tmp = LeaderboardEnum({ staked: stakers[i].staked, staker: stakers[i].stakerAddress }); _leaderboard[--a] = tmp; } } } function findTopStakers() internal view returns ( uint256[] memory _stakerIndices, uint256 _topStakedTokensAmmount ) { // let's create an array of active stakers uint256 a = 0; uint256 i; uint256 j; for (i = 0; i < stakers.length; ++i) { if (stakers[i].staked.length != 0) { a++; } } uint16[] memory stakedValues = new uint16[](a); if (stakedValues.length == 0) { return (_stakerIndices, 0); } j = 0; for (i = 0; i < stakers.length; ++i) { if (stakers[i].staked.length != 0) { stakedValues[j] = uint16(stakers[i].staked.length); ++j; } } // sort this shit if (stakedValues.length > 1) { quickSort(stakedValues, 0, stakedValues.length - 1); } // find what's top x% i = stakedTokens * PERCENTAGE_OF_STAKED_REWARDED / 100; if (i == 0 && stakedTokens > 0) { i = 1; } // loop through stakers and get all that stake more than top x% _topStakedTokensAmmount = 0; a = 0; for (a = 0; a < stakedValues.length; ++a) { _topStakedTokensAmmount += stakedValues[a]; if (_topStakedTokensAmmount >= i) { break; } } _stakerIndices = new uint256[](a + 1); uint16 stakedLimit = stakedValues[a] - 1; // get relevant staker indices ++a; j = 0; for (i = 0; i < stakers.length; ++i) { if (j == a) { break; } if (stakers[i].staked.length > stakedLimit) { _stakerIndices[j] = i; ++j; } } } function divideMoneyToStakers(uint256 _money) internal returns(uint256[] memory _dividedMoney) { (uint256[] memory _stakerIndices, uint256 _topStakedTokensAmmount) = findTopStakers(); _dividedMoney = new uint256[](_stakerIndices.length); uint256 partialMoney; for(uint256 i = 0; i < _stakerIndices.length; ++i) { partialMoney = _money * stakers[_stakerIndices[i]].staked.length / _topStakedTokensAmmount; _dividedMoney[i] = partialMoney; stakers[_stakerIndices[i]].cashmoney += partialMoney; stakedMoney += partialMoney; } } /** * staker check */ modifier hasStakedMoney() { (uint index, bool success) = stakerIndex(msg.sender); require(success, "Not a staker"); require(stakers[index].cashmoney != 0, "No staked money."); _; } function stakerIndex(address _staker) private view returns(uint256 index, bool success) { success = stakerIndices[_staker] != 0; if (success) { index = stakerIndices[_staker] - 1; } } /** * Administrators */ modifier onlyOwnerOrAdmin() { require( msg.sender == owner() || administrators[msg.sender] == true, "Denied." ); _; } function addAdmin(address _add) external onlyOwnerOrAdmin { administrators[_add] = true; } function removeAdmin(address _remove) external onlyOwnerOrAdmin { administrators[_remove] = false; } /** * Staker views */ function stakingInfo() public view returns(uint256 _cashMoney, uint16[] memory _stakedTokens) { (uint256 index, bool success) = stakerIndex(msg.sender); require(success, "Not a staker."); return (stakers[index].cashmoney, stakers[index].staked); } function checkStaker(address[] calldata _stakers) public view onlyOwnerOrAdmin returns(Staker[] memory _res) { _res = new Staker[](_stakers.length); uint256 index; bool success; for(uint256 i = 0; i < _stakers.length; ++i) { (index, success) = stakerIndex(_stakers[i]); if (success) { _res[i] = stakers[index]; } } } /** * Descending quicksort algo */ function quickSort(uint16[] memory arr, uint256 left, uint256 right) internal pure { uint256 i = left; uint256 j = right; if(i == j) { return; } uint256 pivot = arr[uint256(left + (right - left) / 2)]; while (i <= j) { while (arr[uint256(i)] > pivot) { ++i; } while (arr[uint256(j)] < pivot) { --j; } if (i <= j) { (arr[uint256(i)], arr[uint256(j)]) = (arr[uint256(j)], arr[uint256(i)]); ++i; --j; } } if (left > j) { quickSort(arr, left, j); } if (i > right) { quickSort(arr, i, right); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"ADDRESS_CHARITY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADDRESS_GAMES","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADDRESS_TEAM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENTAGE_CHARITY","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENTAGE_GAMES","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENTAGE_OF_STAKED_REWARDED","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENTAGE_STAKING","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPPLY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPPLY_TEAM","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"_balance","type":"uint256"},{"internalType":"uint256","name":"_stakedMoney","type":"uint256"},{"internalType":"uint256","name":"_donations","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_stakers","type":"address[]"}],"name":"checkStaker","outputs":[{"components":[{"internalType":"uint256","name":"cashmoney","type":"uint256"},{"internalType":"address","name":"stakerAddress","type":"address"},{"internalType":"uint16[]","name":"staked","type":"uint16[]"}],"internalType":"struct Staker[]","name":"_res","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","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"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint8","name":"_quantity","type":"uint8"},{"internalType":"uint8","name":"_stake","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","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":[{"internalType":"address","name":"_remove","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setContractMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkle","type":"bytes32"}],"name":"setMerkleGuaranteedList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkle","type":"bytes32"}],"name":"setMerkleLuckiest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkle","type":"bytes32"}],"name":"setMerkleRaffle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setTokenRootURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokens","type":"uint16[]"}],"name":"stakeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedTokens","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingInfo","outputs":[{"internalType":"uint256","name":"_cashMoney","type":"uint256"},{"internalType":"uint16[]","name":"_stakedTokens","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingLeaderBoard","outputs":[{"components":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint16[]","name":"staked","type":"uint16[]"}],"internalType":"struct LeaderboardEnum[]","name":"_leaderboard","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_quantity","type":"uint8"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","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":[{"internalType":"uint16[]","name":"tokens","type":"uint16[]"}],"name":"unstakeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[{"internalType":"uint256","name":"_fullMoney","type":"uint256"},{"internalType":"uint256","name":"_charityShare","type":"uint256"},{"internalType":"uint256","name":"_stakingShare","type":"uint256"},{"internalType":"uint256","name":"_gamesShare","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMintDonations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStakedMoney","outputs":[{"internalType":"uint256","name":"withdrawed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
600a805462ffffff191690557f3000000000000000000000000000000000000000000000000000000000000000600c819055600d819055600e556000600f819055601081905560a060408190526080829052620000609160149190620004f0565b506040805160208101918290526000908190526200008191601591620004f0565b503480156200008f57600080fd5b50604080518082018252600c81527f466c75666679204675636b73000000000000000000000000000000000000000060208083019182528351808501909452600384527f46465800000000000000000000000000000000000000000000000000000000009084015281519192916200010a91600291620004f0565b50805162000120906003906020840190620004f0565b505060016000555062000133336200049e565b600160098190556040805160608101825263629c5470815263629cb6e0602080830191825260029383018481526000808052600b9283905284517fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f768054865185516001600160401b039485166001600160801b0319938416176801000000000000000092861683021760ff60801b1990811670010000000000000000000000000000000060ff9384168102919091179095559b865289517f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf80549a5198519187169a9094169990991796909416029490941789169590911602909616929092177004000000000000000000000000000000001790915590928392600381111562000261576200026162000596565b8152602080820192909252604090810160009081208451815494860151959093015160ff167001000000000000000000000000000000000260ff60801b196001600160401b0396871668010000000000000000026001600160801b03199096169690941695909517939093179190911692909217905563629cb6e090600b9060026003811115620002f657620002f662000596565b8152602080820192909252604001600090812080546001600160401b0319166001600160401b03949094169390931790925560028252600b908190527fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba916348054600160401b600160801b0319166b629cfd300000000000000000179055829160038081111562000389576200038962000596565b8152602080820192909252604090810160009081208451815494860151959093015160ff167001000000000000000000000000000000000260ff60801b196001600160401b0396871668010000000000000000026001600160801b03199096169690941695909517939093179190911692909217905563629cfd3090600b906003808111156200041d576200041d62000596565b8152602080820192909252604001600090812080546001600160401b03949094166001600160401b0319909416939093179092556003909152600b9052507f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e8054600160401b600160801b031916680100000000000000001790556200061a565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620004fe90620005c5565b90600052602060002090601f0160209004810192826200052257600085556200056d565b82601f106200053d57805160ff19168380011785556200056d565b828001600101855582156200056d579182015b828111156200056d57825182559160200191906001019062000550565b506200057b9291506200057f565b5090565b5b808211156200057b576000815560010162000580565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600181811c90821680620005da57607f821691505b60208210810362000614577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b614b14806200062a6000396000f3fe6080604052600436106102cd5760003560e01c80637b67178011610175578063b69ef8a8116100dc578063cb62900911610095578063e8a3d4851161006f578063e8a3d4851461093a578063e985e9c51461094f578063f2fde38b1461096f578063fd01ddfd1461098f57610306565b8063cb629009146108df578063de23a52a146108fa578063e133fba71461091a57610306565b8063b69ef8a814610819578063b88d4fde14610849578063c23dc68f14610869578063c50497ae14610896578063c788bd98146108ac578063c87b56dd146108bf57610306565b806395d89b411161012e57806395d89b411461075c57806399a2557a14610771578063a201fc5014610791578063a22cb465146107b1578063aa3bccc6146107d1578063af92d4ff146107f157610306565b80637b671780146106875780637ec7b32b146106a75780638188d621146106d45780638462151c146106e95780638612bbbc146107165780638da5cb5b1461073e57610306565b80633ccfd60b116102345780636d3a570c116101ed57806370480275116101c7578063704802751461061257806370a0823114610632578063715018a61461065257806378266a7b1461066757610306565b80636d3a570c146105a55780636fcccc76146105c7578063703ec8c4146105ef57610306565b80633ccfd60b146104bb57806340b836d2146104f057806342842e0e146105185780635914983e146105385780635bbb2177146105585780636352211e1461058557610306565b806318160ddd1161028657806318160ddd14610420578063184464d614610447578063208196ac1461045c57806320f0760b1461047157806323b872dd146104865780632b055f9e146104a657610306565b806301ffc9a71461032857806306fdde031461035d578063081812fc1461037f578063095ea7b3146103b757806310b4dedb146103d95780631785f53c1461040057610306565b36610306576002600954036102fd5760405162461bcd60e51b81526004016102f490613f9e565b60405180910390fd5b60016009819055005b6002600954036102fd5760405162461bcd60e51b81526004016102f490613f9e565b34801561033457600080fd5b50610348610343366004613feb565b6109af565b60405190151581526020015b60405180910390f35b34801561036957600080fd5b50610372610a01565b6040516103549190614060565b34801561038b57600080fd5b5061039f61039a366004614073565b610a93565b6040516001600160a01b039091168152602001610354565b3480156103c357600080fd5b506103d76103d23660046140a8565b610ad7565b005b3480156103e557600080fd5b506103ee600a81565b60405160ff9091168152602001610354565b34801561040c57600080fd5b506103d761041b3660046140d2565b610ba9565b34801561042c57600080fd5b5060015460005403600019015b604051908152602001610354565b34801561045357600080fd5b506103d7610c13565b34801561046857600080fd5b50610439610d77565b34801561047d57600080fd5b506103ee601481565b34801561049257600080fd5b506103d76104a13660046140ed565b610ffc565b3480156104b257600080fd5b506103ee600581565b3480156104c757600080fd5b506104d061100c565b604080519485526020850193909352918301526060820152608001610354565b3480156104fc57600080fd5b5061039f73a1b4812985aa003bd2adf5818a4772fdd6eeb36481565b34801561052457600080fd5b506103d76105333660046140ed565b611343565b34801561054457600080fd5b506103d7610553366004614129565b61135e565b34801561056457600080fd5b50610578610573366004614203565b6113b3565b6040516103549190614298565b34801561059157600080fd5b5061039f6105a0366004614073565b611479565b3480156105b157600080fd5b506105ba611484565b6040516103549190614341565b3480156105d357600080fd5b506105dc606481565b60405161ffff9091168152602001610354565b3480156105fb57600080fd5b506106046116bf565b6040516103549291906143be565b34801561061e57600080fd5b506103d761062d3660046140d2565b6117dd565b34801561063e57600080fd5b5061043961064d3660046140d2565b61184a565b34801561065e57600080fd5b506103d7611898565b34801561067357600080fd5b506103d7610682366004614073565b6118fe565b34801561069357600080fd5b506103d76106a23660046143e8565b61194c565b3480156106b357600080fd5b506106c76106c236600461444e565b611a6d565b604051610354919061448f565b3480156106e057600080fd5b506103ee601981565b3480156106f557600080fd5b506107096107043660046140d2565b611c7a565b6040516103549190614509565b34801561072257600080fd5b5061039f731e045d70d1ecaf1c526a22a8e7a260ffbc051be181565b34801561074a57600080fd5b506008546001600160a01b031661039f565b34801561076857600080fd5b50610372611d7b565b34801561077d57600080fd5b5061070961078c366004614541565b611d8a565b34801561079d57600080fd5b506103d76107ac366004614129565b611f11565b3480156107bd57600080fd5b506103d76107cc366004614574565b611f66565b3480156107dd57600080fd5b506103d76107ec3660046145c2565b611ffb565b3480156107fd57600080fd5b5061039f73a88363f441c3d70b55a18fa6802ec3c08de07d0081565b34801561082557600080fd5b5061082e61233f565b60408051938452602084019290925290820152606001610354565b34801561085557600080fd5b506103d761086436600461464e565b6123b6565b34801561087557600080fd5b50610889610884366004614073565b612400565b604051610354919061470d565b3480156108a257600080fd5b506105dc6115b381565b6103d76108ba366004614742565b612475565b3480156108cb57600080fd5b506103726108da366004614073565b61280e565b3480156108eb57600080fd5b50600a546105dc9061ffff1681565b34801561090657600080fd5b506103d761091536600461444e565b612891565b34801561092657600080fd5b506103d7610935366004614073565b612bb9565b34801561094657600080fd5b50610372612c07565b34801561095b57600080fd5b5061034861096a3660046147a6565b612c16565b34801561097b57600080fd5b506103d761098a3660046140d2565b612c44565b34801561099b57600080fd5b506103d76109aa366004614073565b612d0f565b60006301ffc9a760e01b6001600160e01b0319831614806109e057506380ac58cd60e01b6001600160e01b03198316145b806109fb5750635b5e139f60e01b6001600160e01b03198316145b92915050565b606060028054610a10906147d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3c906147d9565b8015610a895780601f10610a5e57610100808354040283529160200191610a89565b820191906000526020600020905b815481529060010190602001808311610a6c57829003601f168201915b5050505050905090565b6000610a9e82612d5d565b610abb576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610ae282612d92565b9050806001600160a01b0316836001600160a01b031603610b165760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610b4d57610b308133612c16565b610b4d576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b0316331480610bd657503360009081526013602052604090205460ff1615156001145b610bf25760405162461bcd60e51b81526004016102f490614813565b6001600160a01b03166000908152601360205260409020805460ff19169055565b600260095403610c355760405162461bcd60e51b81526004016102f490613f9e565b60026009556008546001600160a01b0316331480610c6757503360009081526013602052604090205460ff1615156001145b610c835760405162461bcd60e51b81526004016102f490614813565b600080600f5411610cc75760405162461bcd60e51b815260206004820152600e60248201526d273790333ab73239903632b33a1760911b60448201526064016102f4565b600f54604051731e045d70d1ecaf1c526a22a8e7a260ffbc051be19190600081818185875af1925050503d8060008114610d1d576040519150601f19603f3d011682016040523d82523d6000602084013e610d22565b606091505b50508091505080610d6a5760405162461bcd60e51b81526020600482015260126024820152712bb4ba34323930bbb0b6103330b4b632b21760711b60448201526064016102f4565b506000600f556001600955565b6000600260095403610d9b5760405162461bcd60e51b81526004016102f490613f9e565b6002600955600080610dac33612e01565b9150915080610dec5760405162461bcd60e51b815260206004820152600c60248201526b2737ba10309039ba30b5b2b960a11b60448201526064016102f4565b60118281548110610dff57610dff614834565b906000526020600020906003020160000154600003610e535760405162461bcd60e51b815260206004820152601060248201526f27379039ba30b5b2b21036b7b732bc9760811b60448201526064016102f4565b6000610e5e33612e01565b509050600060118281548110610e7657610e76614834565b60009182526020918290206040805160608101825260039093029091018054835260018101546001600160a01b0316838501526002810180548351818702810187018552818152949592949386019392830182828015610f1d57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411610ee45790505b50505091909252505081516040519293506000923392508381818185875af1925050503d8060008114610f6c576040519150601f19603f3d011682016040523d82523d6000602084013e610f71565b606091505b5050905080610fc25760405162461bcd60e51b815260206004820152601b60248201527f436f756c64206e6f742073656e64207374616b6564206d6f6e6579000000000060448201526064016102f4565b81600001519550600060118481548110610fde57610fde614834565b60009182526020909120600390910201555050505050600160095590565b611007838383612e4f565b505050565b6000806000806110246008546001600160a01b031690565b6001600160a01b0316336001600160a01b0316148061105757503360009081526013602052604090205460ff1615156001145b6110735760405162461bcd60e51b81526004016102f490614813565b6002600954036110955760405162461bcd60e51b81526004016102f490613f9e565b6002600955601054600f54600091906110af903031614860565b6110b99190614860565b9050600060646110ca601484614877565b6110d491906148ac565b9050600060646110e5600a85614877565b6110ef91906148ac565b905060006064611100600586614877565b61110a91906148ac565b90506000731e045d70d1ecaf1c526a22a8e7a260ffbc051be1828461112f8789614860565b6111399190614860565b6111439190614860565b604051600081818185875af1925050503d806000811461117f576040519150601f19603f3d011682016040523d82523d6000602084013e611184565b606091505b505080915050806111d25760405162461bcd60e51b815260206004820152601860248201527723b0b6b2b9903bb4ba34323930bbb0b6103330b4b632b21760411b60448201526064016102f4565b60405173a88363f441c3d70b55a18fa6802ec3c08de07d00908590600081818185875af1925050503d8060008114611226576040519150601f19603f3d011682016040523d82523d6000602084013e61122b565b606091505b5050809150508061127e5760405162461bcd60e51b815260206004820152601a60248201527f43686172697479207769746864726177616c206661696c65642e00000000000060448201526064016102f4565b60405173a1b4812985aa003bd2adf5818a4772fdd6eeb364908390600081818185875af1925050503d80600081146112d2576040519150601f19603f3d011682016040523d82523d6000602084013e6112d7565b606091505b505080915050806113255760405162461bcd60e51b815260206004820152601860248201527723b0b6b2b9903bb4ba34323930bbb0b6103330b4b632b21760411b60448201526064016102f4565b61132e83613003565b50506001600955929791965094509092509050565b611007838383604051806020016040528060008152506123b6565b6008546001600160a01b031633148061138b57503360009081526013602052604090205460ff1615156001145b6113a75760405162461bcd60e51b81526004016102f490614813565b61100760158383613e13565b80516060906000816001600160401b038111156113d2576113d261419a565b60405190808252806020026020018201604052801561141d57816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816113f05790505b50905060005b8281146114715761144c85828151811061143f5761143f614834565b6020026020010151612400565b82828151811061145e5761145e614834565b6020908102919091010152600101611423565b509392505050565b60006109fb82612d92565b60606000805b6011548210156114e2576000601183815481106114a9576114a9614834565b90600052602060002090600302016002018054905011156114d0576114cd816148c0565b90505b816114da816148c0565b92505061148a565b806001600160401b038111156114fa576114fa61419a565b60405190808252806020026020018201604052801561154057816020015b6040805180820190915260008152606060208201528152602001906001900390816115185790505b50604080518082019091526000815260606020820152909350600092505b6011548310156116b95760006011848154811061157d5761157d614834565b90600052602060002090600302016002018054905011156116a7576040518060400160405280601185815481106115b6576115b6614834565b6000918252602091829020600160039092020101546001600160a01b03168252601180549290910191869081106115ef576115ef614834565b906000526020600020906003020160020180548060200260200160405190810160405280929190818152602001828054801561167257602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116116395790505b50505050508152509050808483611688906148d9565b9350838151811061169b5761169b614834565b60200260200101819052505b826116b1816148c0565b93505061155e565b50505090565b600060606000806116cf33612e01565b91509150806117105760405162461bcd60e51b815260206004820152600d60248201526c2737ba10309039ba30b5b2b91760991b60448201526064016102f4565b6011828154811061172357611723614834565b9060005260206000209060030201600001546011838154811061174857611748614834565b9060005260206000209060030201600201808054806020026020016040519081016040528092919081815260200182805480156117cc57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116117935790505b505050505090509350935050509091565b6008546001600160a01b031633148061180a57503360009081526013602052604090205460ff1615156001145b6118265760405162461bcd60e51b81526004016102f490614813565b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b60006001600160a01b038216611873576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146118f25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102f4565b6118fc6000613161565b565b6008546001600160a01b031633148061192b57503360009081526013602052604090205460ff1615156001145b6119475760405162461bcd60e51b81526004016102f490614813565b600e55565b60026009540361196e5760405162461bcd60e51b81526004016102f490613f9e565b60026009556008546001600160a01b03163314806119a057503360009081526013602052604090205460ff1615156001145b6119bc5760405162461bcd60e51b81526004016102f490614813565b600a546064906119d690839062010000900460ff166148f0565b60ff161115611a1f5760405162461bcd60e51b815260206004820152601560248201527421b0b73737ba1036b4b73a1037bb32b9101898181760591b60448201526064016102f4565b611a2c338260ff166131b3565b80600a60028282829054906101000a900460ff16611a4a91906148f0565b92506101000a81548160ff021916908360ff160217905550600160098190555050565b6060611a816008546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480611ab457503360009081526013602052604090205460ff1615156001145b611ad05760405162461bcd60e51b81526004016102f490614813565b816001600160401b03811115611ae857611ae861419a565b604051908082528060200260200182016040528015611b3557816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611b065790505b50905060008060005b84811015611c7157611b75868683818110611b5b57611b5b614834565b9050602002016020810190611b7091906140d2565b612e01565b90935091508115611c615760118381548110611b9357611b93614834565b60009182526020918290206040805160608101825260039093029091018054835260018101546001600160a01b0316838501526002810180548351818702810187018552818152949592949386019392830182828015611c3a57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611c015790505b505050505081525050848281518110611c5557611c55614834565b60200260200101819052505b611c6a816148c0565b9050611b3e565b50505092915050565b60606000806000611c8a8561184a565b90506000816001600160401b03811115611ca657611ca661419a565b604051908082528060200260200182016040528015611ccf578160200160208202803683370190505b509050611cf5604080516060810182526000808252602082018190529181019190915290565b60015b838614611d6f57611d08816131d1565b91508160400151611d675781516001600160a01b031615611d2857815194505b876001600160a01b0316856001600160a01b031603611d675780838780600101985081518110611d5a57611d5a614834565b6020026020010181815250505b600101611cf8565b50909695505050505050565b606060038054610a10906147d9565b6060818310611dac57604051631960ccad60e11b815260040160405180910390fd5b600080611db860005490565b90506001851015611dc857600194505b80841115611dd4578093505b6000611ddf8761184a565b905084861015611dfe5785850381811015611df8578091505b50611e02565b5060005b6000816001600160401b03811115611e1c57611e1c61419a565b604051908082528060200260200182016040528015611e45578160200160208202803683370190505b50905081600003611e5b579350611f0a92505050565b6000611e6688612400565b905060008160400151611e77575080515b885b888114158015611e895750848714155b15611efe57611e97816131d1565b92508260400151611ef65782516001600160a01b031615611eb757825191505b8a6001600160a01b0316826001600160a01b031603611ef65780848880600101995081518110611ee957611ee9614834565b6020026020010181815250505b600101611e79565b50505092835250909150505b9392505050565b6008546001600160a01b0316331480611f3e57503360009081526013602052604090205460ff1615156001145b611f5a5760405162461bcd60e51b81526004016102f490614813565b61100760148383613e13565b336001600160a01b03831603611f8f5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b80600160005b825181101561206357336001600160a01b031661203a84838151811061202957612029614834565b602002602001015161ffff16611479565b6001600160a01b0316146120515760009150612063565b8061205b816148c0565b915050612001565b50806120a85760405162461bcd60e51b81526020600482015260146024820152732a37b5b2b7399030b932b713ba103cb7bab9399760611b60448201526064016102f4565b60016000806120b633612e01565b93509050826121a957506040805160608082018352600080835292820190815233602080840191825260118054600181018255955283517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c686003870290810191825592517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c69840180546001600160a01b0319166001600160a01b0390921691909117905592518051859493612191937f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6a909101920190613e97565b50506011543360009081526012602052604090205550505b6000601182815481106121be576121be614834565b90600052602060002090600302016002019050600092505b86518310156122d057612202338885815181106121f5576121f5614834565b6020026020010151613206565b61226d578087848151811061221957612219614834565b602002602001015190806001815401808255809150506001900390600052602060002090601091828204019190066002029091909190916101000a81548161ffff021916908361ffff1602179055506122c0565b60405162461bcd60e51b815260206004820152602260248201527f596f752061726520616c7265616479207374616b696e67207468697320746f6b60448201526132b760f11b60648201526084016102f4565b6122c9836148c0565b92506121d6565b80601183815481106122e4576122e4614834565b9060005260206000209060030201600201908054612303929190613f3b565b508651600a805460009061231c90849061ffff16614915565b92506101000a81548161ffff021916908361ffff16021790555050505050505050565b60008060006123566008546001600160a01b031690565b6001600160a01b0316336001600160a01b0316148061238957503360009081526013602052604090205460ff1615156001145b6123a55760405162461bcd60e51b81526004016102f490614813565b5050601054600f5430319250909192565b6123c1848484612e4f565b6001600160a01b0383163b156123fa576123dd848484846132ce565b6123fa576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6040805160608082018352600080835260208084018290528385018290528451928301855281835282018190529281019290925290600183108061244657506000548310155b156124515792915050565b61245a836131d1565b905080604001511561246c5792915050565b611f0a836133b9565b6002600954036124975760405162461bcd60e51b81526004016102f490613f9e565b600260095560036124df85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d5491503390506133e7565b156124e8575060015b60038160038111156124fc576124fc61493b565b148015612545575061254585858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c5491503390506133e7565b1561254e575060005b61258f85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e5491503390506133e7565b15612598575060025b6125a181613434565b6125ed5760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f74206d696e7420617420746869732074696d652e0000000000000060448201526064016102f4565b600b60008260038111156126035761260361493b565b60038111156126145761261461493b565b815260208101919091526040016000205460ff600160801b9091048116908416612660336001600160a01b03166000908152600560205260409081902054901c6001600160401b031690565b61266a9190614951565b11156126b85760405162461bcd60e51b815260206004820152601760248201527f43616e206e6f74206d696e742074686973206d616e792e00000000000000000060448201526064016102f4565b8260ff168260ff16111561270e5760405162461bcd60e51b815260206004820152601860248201527f43616e206e6f74207374616b652074686973206d616e792e000000000000000060448201526064016102f4565b61271b338460ff166131b3565b34600f600082825461272d9190614951565b909155505060ff821615612802576000600161274860005490565b6127529190614969565b905060008360ff166001600160401b038111156127715761277161419a565b60405190808252806020026020018201604052801561279a578160200160208202803683370190505b50905060005b8460ff168160ff1610156127f5576127bb60ff821684614969565b828260ff16815181106127d0576127d0614834565b61ffff90921660209283029190910190910152806127ed8161498c565b9150506127a0565b506127ff81611ffb565b50505b50506001600955505050565b606061281982612d5d565b61283657604051630a14c4b560e41b815260040160405180910390fd5b600061284061358a565b905080516000036128605760405180602001604052806000815250611f0a565b8061286a84613599565b60405160200161287b9291906149ab565b6040516020818303038152906040529392505050565b8181808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250600193509150505b825181101561291957336001600160a01b03166128f084838151811061202957612029614834565b6001600160a01b0316146129075760009150612919565b80612911816148c0565b9150506128c8565b508061295e5760405162461bcd60e51b81526020600482015260146024820152732a37b5b2b7399030b932b713ba103cb7bab9399760611b60448201526064016102f4565b600160008061296c33612e01565b93509050826129b55760405162461bcd60e51b81526020600482015260156024820152742cb7ba9030b932903737ba10309039ba30b5b2b91760591b60448201526064016102f4565b6000806000601184815481106129cd576129cd614834565b90600052602060002090600302016002019050600094505b88851015612b795780546000935091505b81831015612b6757808381548110612a1057612a10614834565b60009182526020909120601082040154600f9091166002026101000a900461ffff168a8a87818110612a4457612a44614834565b9050602002016020810190612a5991906149ea565b61ffff1603612b555780612a6e600184614860565b81548110612a7e57612a7e614834565b90600052602060002090601091828204019190066002029054906101000a900461ffff16818481548110612ab457612ab4614834565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff16021790555080805480612af357612af3614a05565b600082815260208120601060001990930192830401805461ffff6002600f8616026101000a81021990911690915591909255600a8054909291612b369116614a1b565b91906101000a81548161ffff021916908361ffff160217905550612b67565b82612b5f816148c0565b9350506129f6565b84612b71816148c0565b9550506129e5565b8060118581548110612b8d57612b8d614834565b9060005260206000209060030201600201908054612bac929190613f3b565b5050505050505050505050565b6008546001600160a01b0316331480612be657503360009081526013602052604090205460ff1615156001145b612c025760405162461bcd60e51b81526004016102f490614813565b600c55565b606060148054610a10906147d9565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b03163314612c9e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102f4565b6001600160a01b038116612d035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102f4565b612d0c81613161565b50565b6008546001600160a01b0316331480612d3c57503360009081526013602052604090205460ff1615156001145b612d585760405162461bcd60e51b81526004016102f490614813565b600d55565b600081600111158015612d71575060005482105b80156109fb575050600090815260046020526040902054600160e01b161590565b60008180600111612de857600054811015612de85760008181526004602052604081205490600160e01b82169003612de6575b80600003611f0a575060001901600081815260046020526040902054612dc5565b505b604051636f96cda160e11b815260040160405180910390fd5b6001600160a01b03811660009081526012602052604081205415801590612e4a576001600160a01b038316600090815260126020526040902054612e4790600190614860565b91505b915091565b6000612e5a82612d92565b9050836001600160a01b0316816001600160a01b031614612e8d5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612eab5750612eab8533612c16565b80612ec6575033612ebb84610a93565b6001600160a01b0316145b905080612ee657604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612f0d57604051633a954ecd60e21b815260040160405180910390fd5b612f1a85858560016135e8565b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091528120600160e11b4260a01b8717811790915583169003612fbb57600183016000818152600460205260408120549003612fb9576000548114612fb95760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6060600080613010613720565b9150915081516001600160401b0381111561302d5761302d61419a565b604051908082528060200260200182016040528015613056578160200160208202803683370190505b5092506000805b83518110156131585782601185838151811061307b5761307b614834565b60200260200101518154811061309357613093614834565b60009182526020909120600260039092020101546130b19088614877565b6130bb91906148ac565b9150818582815181106130d0576130d0614834565b6020026020010181815250508160118583815181106130f1576130f1614834565b60200260200101518154811061310957613109614834565b906000526020600020906003020160000160008282546131299190614951565b9250508190555081601060008282546131429190614951565b909155506131519050816148c0565b905061305d565b50505050919050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6131cd828260405180602001604052806000815250613a4d565b5050565b60408051606081018252600080825260208201819052918101919091526000828152600460205260409020546109fb90613bce565b60008061321284612e01565b50905060005b6011828154811061322b5761322b614834565b9060005260206000209060030201600201805490508110156132c3578361ffff166011838154811061325f5761325f614834565b9060005260206000209060030201600201828154811061328157613281614834565b60009182526020909120601082040154600f9091166002026101000a900461ffff16036132b3576001925050506109fb565b6132bc816148c0565b9050613218565b506000949350505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290613303903390899088908890600401614a39565b6020604051808303816000875af192505050801561333e575060408051601f3d908101601f1916820190925261333b91810190614a76565b60015b61339c573d80801561336c576040519150601f19603f3d011682016040523d82523d6000602084013e613371565b606091505b508051600003613394576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60408051606081018252600080825260208201819052918101919091526109fb6133e283612d92565b613bce565b6040516bffffffffffffffffffffffff19606083901b16602082015260009061342c908590859060340160405160208183030381529060405280519060200120613c08565b949350505050565b600080600b600084600381111561344d5761344d61493b565b600381111561345e5761345e61493b565b81526020808201929092526040908101600020815160608101835290546001600160401b0380821680845268010000000000000000830490911694830194909452600160801b900460ff1691810191909152915060011480156134ce575060208101516001600160401b03166001145b156134dc5750600192915050565b80516001600160401b03166001148015613503575080602001516001600160401b03164211155b156135115750600192915050565b4281600001516001600160401b03161115801561353b575060208101516001600160401b03166001145b156135495750600192915050565b4281600001516001600160401b031611158015613573575080602001516001600160401b03164211155b156135815750600192915050565b50600092915050565b606060158054610a10906147d9565b604080516080810191829052607f0190826030600a8206018353600a90045b80156135d657600183039250600a81066030018353600a90046135b8565b50819003601f19909101908152919050565b6000806135f486612e01565b915091506000806000831561371557600092505b8583101561371557506000905060015b6011858154811061362b5761362b614834565b9060005260206000209060030201600201805490508210156136c5576136518688614951565b6011868154811061366457613664614834565b9060005260206000209060030201600201838154811061368657613686614834565b60009182526020909120601082040154600f9091166002026101000a900461ffff16036136b5575060006136c5565b6136be826148c0565b9150613618565b806137055760405162461bcd60e51b815260206004820152601060248201526f2a37b5b2b71034b99039ba30b5b2b21760811b60448201526064016102f4565b61370e836148c0565b9250613608565b505050505050505050565b606060008080805b60115482101561377c576011828154811061374557613745614834565b60009182526020909120600260039092020101541561376c5782613768816148c0565b9350505b613775826148c0565b9150613728565b6000836001600160401b038111156137965761379661419a565b6040519080825280602002602001820160405280156137bf578160200160208202803683370190505b50905080516000036137d8575093946000945092505050565b60009150600092505b60115483101561388057601183815481106137fe576137fe614834565b600091825260209091206002600390920201015415613870576011838154811061382a5761382a614834565b90600052602060002090600302016002018054905081838151811061385157613851614834565b61ffff9092166020928302919091019091015261386d826148c0565b91505b613879836148c0565b92506137e1565b6001815111156138a3576138a38160006001845161389e9190614860565b613c1e565b600a546064906138b99060199061ffff16614a93565b6138c39190614abd565b61ffff169250821580156138dc5750600a5461ffff1615155b156138e657600192505b600094508493505b805184101561393a5780848151811061390957613909614834565b602002602001015161ffff16856139209190614951565b94508285101561393a57613933846148c0565b93506138ee565b613945846001614951565b6001600160401b0381111561395c5761395c61419a565b604051908082528060200260200182016040528015613985578160200160208202803683370190505b5095506000600182868151811061399e5761399e614834565b60200260200101516139b09190614969565b90506139bb856148c0565b945060009250600093505b601154841015613a4457828514613a44578061ffff16601185815481106139ef576139ef614834565b9060005260206000209060030201600201805490501115613a345783878481518110613a1d57613a1d614834565b6020908102919091010152613a31836148c0565b92505b613a3d846148c0565b93506139c6565b50505050509091565b6000546001600160a01b038416613a7657604051622e076360e81b815260040160405180910390fd5b82600003613a975760405163b562e8dd60e01b815260040160405180910390fd5b613aa460008583866135e8565b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15613b79575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4613b4260008784806001019550876132ce565b613b5f576040516368d2bf6b60e11b815260040160405180910390fd5b808210613af7578260005414613b7457600080fd5b613bbe565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210613b7a575b5060009081556123fa9085838684565b604080516060810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b90921615159082015290565b600082613c158584613da7565b14949350505050565b8181808203613c2e575050505050565b6000856002613c3d8787614860565b613c4791906148ac565b613c519087614951565b81518110613c6157613c61614834565b602002602001015161ffff1690505b818311613d79575b80868481518110613c8b57613c8b614834565b602002602001015161ffff161115613cad57613ca6836148c0565b9250613c78565b80868381518110613cc057613cc0614834565b602002602001015161ffff161015613ce257613cdb826148d9565b9150613cad565b818311613d7457858281518110613cfb57613cfb614834565b6020026020010151868481518110613d1557613d15614834565b6020026020010151878581518110613d2f57613d2f614834565b60200260200101888581518110613d4857613d48614834565b61ffff938416602091820292909201015291169052613d66836148c0565b9250613d71826148d9565b91505b613c70565b81851115613d8c57613d8c868684613c1e565b83831115613d9f57613d9f868486613c1e565b505050505050565b600081815b8451811015611471576000858281518110613dc957613dc9614834565b60200260200101519050808311613def5760008381526020829052604090209250613e00565b600081815260208490526040902092505b5080613e0b816148c0565b915050613dac565b828054613e1f906147d9565b90600052602060002090601f016020900481019282613e415760008555613e87565b82601f10613e5a5782800160ff19823516178555613e87565b82800160010185558215613e87579182015b82811115613e87578235825591602001919060010190613e6c565b50613e93929150613f89565b5090565b82805482825590600052602060002090600f01601090048101928215613e875791602002820160005b83821115613f0057835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302613ec0565b8015613f2e5782816101000a81549061ffff0219169055600201602081600101049283019260010302613f00565b5050613e93929150613f89565b82805482825590600052602060002090600f01601090048101928215613e8757600052602060002091600f016010900482015b82811115613e87578254825591600101919060010190613f6e565b5b80821115613e935760008155600101613f8a565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6001600160e01b031981168114612d0c57600080fd5b600060208284031215613ffd57600080fd5b8135611f0a81613fd5565b60005b8381101561402357818101518382015260200161400b565b838111156123fa5750506000910152565b6000815180845261404c816020860160208601614008565b601f01601f19169290920160200192915050565b602081526000611f0a6020830184614034565b60006020828403121561408557600080fd5b5035919050565b80356001600160a01b03811681146140a357600080fd5b919050565b600080604083850312156140bb57600080fd5b6140c48361408c565b946020939093013593505050565b6000602082840312156140e457600080fd5b611f0a8261408c565b60008060006060848603121561410257600080fd5b61410b8461408c565b92506141196020850161408c565b9150604084013590509250925092565b6000806020838503121561413c57600080fd5b82356001600160401b038082111561415357600080fd5b818501915085601f83011261416757600080fd5b81358181111561417657600080fd5b86602082850101111561418857600080fd5b60209290920196919550909350505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156141d8576141d861419a565b604052919050565b60006001600160401b038211156141f9576141f961419a565b5060051b60200190565b6000602080838503121561421657600080fd5b82356001600160401b0381111561422c57600080fd5b8301601f8101851361423d57600080fd5b803561425061424b826141e0565b6141b0565b81815260059190911b8201830190838101908783111561426f57600080fd5b928401925b8284101561428d57833582529284019290840190614274565b979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611d6f576142ef83855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b92840192606092909201916001016142b4565b600081518084526020808501945080840160005b8381101561433657815161ffff1687529582019590820190600101614316565b509495945050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156143b057888303603f19018552815180516001600160a01b0316845287015187840187905261439d87850182614302565b9588019593505090860190600101614368565b509098975050505050505050565b82815260406020820152600061342c6040830184614302565b803560ff811681146140a357600080fd5b6000602082840312156143fa57600080fd5b611f0a826143d7565b60008083601f84011261441557600080fd5b5081356001600160401b0381111561442c57600080fd5b6020830191508360208260051b850101111561444757600080fd5b9250929050565b6000806020838503121561446157600080fd5b82356001600160401b0381111561447757600080fd5b61448385828601614403565b90969095509350505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156143b057888303603f19018552815180518452878101516001600160a01b03168885015286015160608785018190526144f581860183614302565b9689019694505050908601906001016144b6565b6020808252825182820181905260009190848201906040850190845b81811015611d6f57835183529284019291840191600101614525565b60008060006060848603121561455657600080fd5b61455f8461408c565b95602085013595506040909401359392505050565b6000806040838503121561458757600080fd5b6145908361408c565b9150602083013580151581146145a557600080fd5b809150509250929050565b803561ffff811681146140a357600080fd5b600060208083850312156145d557600080fd5b82356001600160401b038111156145eb57600080fd5b8301601f810185136145fc57600080fd5b803561460a61424b826141e0565b81815260059190911b8201830190838101908783111561462957600080fd5b928401925b8284101561428d5761463f846145b0565b8252928401929084019061462e565b6000806000806080858703121561466457600080fd5b61466d8561408c565b9350602061467c81870161408c565b93506040860135925060608601356001600160401b038082111561469f57600080fd5b818801915088601f8301126146b357600080fd5b8135818111156146c5576146c561419a565b6146d7601f8201601f191685016141b0565b915080825289848285010111156146ed57600080fd5b808484018584013760008482840101525080935050505092959194509250565b81516001600160a01b031681526020808301516001600160401b031690820152604080830151151590820152606081016109fb565b6000806000806060858703121561475857600080fd5b84356001600160401b0381111561476e57600080fd5b61477a87828801614403565b909550935061478d9050602086016143d7565b915061479b604086016143d7565b905092959194509250565b600080604083850312156147b957600080fd5b6147c28361408c565b91506147d06020840161408c565b90509250929050565b600181811c908216806147ed57607f821691505b60208210810361480d57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600790820152662232b734b2b21760c91b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156148725761487261484a565b500390565b60008160001904831182151516156148915761489161484a565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826148bb576148bb614896565b500490565b6000600182016148d2576148d261484a565b5060010190565b6000816148e8576148e861484a565b506000190190565b600060ff821660ff84168060ff0382111561490d5761490d61484a565b019392505050565b600061ffff8083168185168083038211156149325761493261484a565b01949350505050565b634e487b7160e01b600052602160045260246000fd5b600082198211156149645761496461484a565b500190565b600061ffff838116908316818110156149845761498461484a565b039392505050565b600060ff821660ff81036149a2576149a261484a565b60010192915050565b600083516149bd818460208801614008565b8351908301906149d1818360208801614008565b64173539b7b760d91b9101908152600501949350505050565b6000602082840312156149fc57600080fd5b611f0a826145b0565b634e487b7160e01b600052603160045260246000fd5b600061ffff821680614a2f57614a2f61484a565b6000190192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614a6c90830184614034565b9695505050505050565b600060208284031215614a8857600080fd5b8151611f0a81613fd5565b600061ffff80831681851681830481118215151615614ab457614ab461484a565b02949350505050565b600061ffff80841680614ad257614ad2614896565b9216919091049291505056fea26469706673582212202eddc70254bc663d3c41fcc6993ea43f507e184e308f6662aa693e467d6d864c64736f6c634300080d0033
Deployed Bytecode
0x6080604052600436106102cd5760003560e01c80637b67178011610175578063b69ef8a8116100dc578063cb62900911610095578063e8a3d4851161006f578063e8a3d4851461093a578063e985e9c51461094f578063f2fde38b1461096f578063fd01ddfd1461098f57610306565b8063cb629009146108df578063de23a52a146108fa578063e133fba71461091a57610306565b8063b69ef8a814610819578063b88d4fde14610849578063c23dc68f14610869578063c50497ae14610896578063c788bd98146108ac578063c87b56dd146108bf57610306565b806395d89b411161012e57806395d89b411461075c57806399a2557a14610771578063a201fc5014610791578063a22cb465146107b1578063aa3bccc6146107d1578063af92d4ff146107f157610306565b80637b671780146106875780637ec7b32b146106a75780638188d621146106d45780638462151c146106e95780638612bbbc146107165780638da5cb5b1461073e57610306565b80633ccfd60b116102345780636d3a570c116101ed57806370480275116101c7578063704802751461061257806370a0823114610632578063715018a61461065257806378266a7b1461066757610306565b80636d3a570c146105a55780636fcccc76146105c7578063703ec8c4146105ef57610306565b80633ccfd60b146104bb57806340b836d2146104f057806342842e0e146105185780635914983e146105385780635bbb2177146105585780636352211e1461058557610306565b806318160ddd1161028657806318160ddd14610420578063184464d614610447578063208196ac1461045c57806320f0760b1461047157806323b872dd146104865780632b055f9e146104a657610306565b806301ffc9a71461032857806306fdde031461035d578063081812fc1461037f578063095ea7b3146103b757806310b4dedb146103d95780631785f53c1461040057610306565b36610306576002600954036102fd5760405162461bcd60e51b81526004016102f490613f9e565b60405180910390fd5b60016009819055005b6002600954036102fd5760405162461bcd60e51b81526004016102f490613f9e565b34801561033457600080fd5b50610348610343366004613feb565b6109af565b60405190151581526020015b60405180910390f35b34801561036957600080fd5b50610372610a01565b6040516103549190614060565b34801561038b57600080fd5b5061039f61039a366004614073565b610a93565b6040516001600160a01b039091168152602001610354565b3480156103c357600080fd5b506103d76103d23660046140a8565b610ad7565b005b3480156103e557600080fd5b506103ee600a81565b60405160ff9091168152602001610354565b34801561040c57600080fd5b506103d761041b3660046140d2565b610ba9565b34801561042c57600080fd5b5060015460005403600019015b604051908152602001610354565b34801561045357600080fd5b506103d7610c13565b34801561046857600080fd5b50610439610d77565b34801561047d57600080fd5b506103ee601481565b34801561049257600080fd5b506103d76104a13660046140ed565b610ffc565b3480156104b257600080fd5b506103ee600581565b3480156104c757600080fd5b506104d061100c565b604080519485526020850193909352918301526060820152608001610354565b3480156104fc57600080fd5b5061039f73a1b4812985aa003bd2adf5818a4772fdd6eeb36481565b34801561052457600080fd5b506103d76105333660046140ed565b611343565b34801561054457600080fd5b506103d7610553366004614129565b61135e565b34801561056457600080fd5b50610578610573366004614203565b6113b3565b6040516103549190614298565b34801561059157600080fd5b5061039f6105a0366004614073565b611479565b3480156105b157600080fd5b506105ba611484565b6040516103549190614341565b3480156105d357600080fd5b506105dc606481565b60405161ffff9091168152602001610354565b3480156105fb57600080fd5b506106046116bf565b6040516103549291906143be565b34801561061e57600080fd5b506103d761062d3660046140d2565b6117dd565b34801561063e57600080fd5b5061043961064d3660046140d2565b61184a565b34801561065e57600080fd5b506103d7611898565b34801561067357600080fd5b506103d7610682366004614073565b6118fe565b34801561069357600080fd5b506103d76106a23660046143e8565b61194c565b3480156106b357600080fd5b506106c76106c236600461444e565b611a6d565b604051610354919061448f565b3480156106e057600080fd5b506103ee601981565b3480156106f557600080fd5b506107096107043660046140d2565b611c7a565b6040516103549190614509565b34801561072257600080fd5b5061039f731e045d70d1ecaf1c526a22a8e7a260ffbc051be181565b34801561074a57600080fd5b506008546001600160a01b031661039f565b34801561076857600080fd5b50610372611d7b565b34801561077d57600080fd5b5061070961078c366004614541565b611d8a565b34801561079d57600080fd5b506103d76107ac366004614129565b611f11565b3480156107bd57600080fd5b506103d76107cc366004614574565b611f66565b3480156107dd57600080fd5b506103d76107ec3660046145c2565b611ffb565b3480156107fd57600080fd5b5061039f73a88363f441c3d70b55a18fa6802ec3c08de07d0081565b34801561082557600080fd5b5061082e61233f565b60408051938452602084019290925290820152606001610354565b34801561085557600080fd5b506103d761086436600461464e565b6123b6565b34801561087557600080fd5b50610889610884366004614073565b612400565b604051610354919061470d565b3480156108a257600080fd5b506105dc6115b381565b6103d76108ba366004614742565b612475565b3480156108cb57600080fd5b506103726108da366004614073565b61280e565b3480156108eb57600080fd5b50600a546105dc9061ffff1681565b34801561090657600080fd5b506103d761091536600461444e565b612891565b34801561092657600080fd5b506103d7610935366004614073565b612bb9565b34801561094657600080fd5b50610372612c07565b34801561095b57600080fd5b5061034861096a3660046147a6565b612c16565b34801561097b57600080fd5b506103d761098a3660046140d2565b612c44565b34801561099b57600080fd5b506103d76109aa366004614073565b612d0f565b60006301ffc9a760e01b6001600160e01b0319831614806109e057506380ac58cd60e01b6001600160e01b03198316145b806109fb5750635b5e139f60e01b6001600160e01b03198316145b92915050565b606060028054610a10906147d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3c906147d9565b8015610a895780601f10610a5e57610100808354040283529160200191610a89565b820191906000526020600020905b815481529060010190602001808311610a6c57829003601f168201915b5050505050905090565b6000610a9e82612d5d565b610abb576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610ae282612d92565b9050806001600160a01b0316836001600160a01b031603610b165760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610b4d57610b308133612c16565b610b4d576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b0316331480610bd657503360009081526013602052604090205460ff1615156001145b610bf25760405162461bcd60e51b81526004016102f490614813565b6001600160a01b03166000908152601360205260409020805460ff19169055565b600260095403610c355760405162461bcd60e51b81526004016102f490613f9e565b60026009556008546001600160a01b0316331480610c6757503360009081526013602052604090205460ff1615156001145b610c835760405162461bcd60e51b81526004016102f490614813565b600080600f5411610cc75760405162461bcd60e51b815260206004820152600e60248201526d273790333ab73239903632b33a1760911b60448201526064016102f4565b600f54604051731e045d70d1ecaf1c526a22a8e7a260ffbc051be19190600081818185875af1925050503d8060008114610d1d576040519150601f19603f3d011682016040523d82523d6000602084013e610d22565b606091505b50508091505080610d6a5760405162461bcd60e51b81526020600482015260126024820152712bb4ba34323930bbb0b6103330b4b632b21760711b60448201526064016102f4565b506000600f556001600955565b6000600260095403610d9b5760405162461bcd60e51b81526004016102f490613f9e565b6002600955600080610dac33612e01565b9150915080610dec5760405162461bcd60e51b815260206004820152600c60248201526b2737ba10309039ba30b5b2b960a11b60448201526064016102f4565b60118281548110610dff57610dff614834565b906000526020600020906003020160000154600003610e535760405162461bcd60e51b815260206004820152601060248201526f27379039ba30b5b2b21036b7b732bc9760811b60448201526064016102f4565b6000610e5e33612e01565b509050600060118281548110610e7657610e76614834565b60009182526020918290206040805160608101825260039093029091018054835260018101546001600160a01b0316838501526002810180548351818702810187018552818152949592949386019392830182828015610f1d57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411610ee45790505b50505091909252505081516040519293506000923392508381818185875af1925050503d8060008114610f6c576040519150601f19603f3d011682016040523d82523d6000602084013e610f71565b606091505b5050905080610fc25760405162461bcd60e51b815260206004820152601b60248201527f436f756c64206e6f742073656e64207374616b6564206d6f6e6579000000000060448201526064016102f4565b81600001519550600060118481548110610fde57610fde614834565b60009182526020909120600390910201555050505050600160095590565b611007838383612e4f565b505050565b6000806000806110246008546001600160a01b031690565b6001600160a01b0316336001600160a01b0316148061105757503360009081526013602052604090205460ff1615156001145b6110735760405162461bcd60e51b81526004016102f490614813565b6002600954036110955760405162461bcd60e51b81526004016102f490613f9e565b6002600955601054600f54600091906110af903031614860565b6110b99190614860565b9050600060646110ca601484614877565b6110d491906148ac565b9050600060646110e5600a85614877565b6110ef91906148ac565b905060006064611100600586614877565b61110a91906148ac565b90506000731e045d70d1ecaf1c526a22a8e7a260ffbc051be1828461112f8789614860565b6111399190614860565b6111439190614860565b604051600081818185875af1925050503d806000811461117f576040519150601f19603f3d011682016040523d82523d6000602084013e611184565b606091505b505080915050806111d25760405162461bcd60e51b815260206004820152601860248201527723b0b6b2b9903bb4ba34323930bbb0b6103330b4b632b21760411b60448201526064016102f4565b60405173a88363f441c3d70b55a18fa6802ec3c08de07d00908590600081818185875af1925050503d8060008114611226576040519150601f19603f3d011682016040523d82523d6000602084013e61122b565b606091505b5050809150508061127e5760405162461bcd60e51b815260206004820152601a60248201527f43686172697479207769746864726177616c206661696c65642e00000000000060448201526064016102f4565b60405173a1b4812985aa003bd2adf5818a4772fdd6eeb364908390600081818185875af1925050503d80600081146112d2576040519150601f19603f3d011682016040523d82523d6000602084013e6112d7565b606091505b505080915050806113255760405162461bcd60e51b815260206004820152601860248201527723b0b6b2b9903bb4ba34323930bbb0b6103330b4b632b21760411b60448201526064016102f4565b61132e83613003565b50506001600955929791965094509092509050565b611007838383604051806020016040528060008152506123b6565b6008546001600160a01b031633148061138b57503360009081526013602052604090205460ff1615156001145b6113a75760405162461bcd60e51b81526004016102f490614813565b61100760158383613e13565b80516060906000816001600160401b038111156113d2576113d261419a565b60405190808252806020026020018201604052801561141d57816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816113f05790505b50905060005b8281146114715761144c85828151811061143f5761143f614834565b6020026020010151612400565b82828151811061145e5761145e614834565b6020908102919091010152600101611423565b509392505050565b60006109fb82612d92565b60606000805b6011548210156114e2576000601183815481106114a9576114a9614834565b90600052602060002090600302016002018054905011156114d0576114cd816148c0565b90505b816114da816148c0565b92505061148a565b806001600160401b038111156114fa576114fa61419a565b60405190808252806020026020018201604052801561154057816020015b6040805180820190915260008152606060208201528152602001906001900390816115185790505b50604080518082019091526000815260606020820152909350600092505b6011548310156116b95760006011848154811061157d5761157d614834565b90600052602060002090600302016002018054905011156116a7576040518060400160405280601185815481106115b6576115b6614834565b6000918252602091829020600160039092020101546001600160a01b03168252601180549290910191869081106115ef576115ef614834565b906000526020600020906003020160020180548060200260200160405190810160405280929190818152602001828054801561167257602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116116395790505b50505050508152509050808483611688906148d9565b9350838151811061169b5761169b614834565b60200260200101819052505b826116b1816148c0565b93505061155e565b50505090565b600060606000806116cf33612e01565b91509150806117105760405162461bcd60e51b815260206004820152600d60248201526c2737ba10309039ba30b5b2b91760991b60448201526064016102f4565b6011828154811061172357611723614834565b9060005260206000209060030201600001546011838154811061174857611748614834565b9060005260206000209060030201600201808054806020026020016040519081016040528092919081815260200182805480156117cc57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116117935790505b505050505090509350935050509091565b6008546001600160a01b031633148061180a57503360009081526013602052604090205460ff1615156001145b6118265760405162461bcd60e51b81526004016102f490614813565b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b60006001600160a01b038216611873576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146118f25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102f4565b6118fc6000613161565b565b6008546001600160a01b031633148061192b57503360009081526013602052604090205460ff1615156001145b6119475760405162461bcd60e51b81526004016102f490614813565b600e55565b60026009540361196e5760405162461bcd60e51b81526004016102f490613f9e565b60026009556008546001600160a01b03163314806119a057503360009081526013602052604090205460ff1615156001145b6119bc5760405162461bcd60e51b81526004016102f490614813565b600a546064906119d690839062010000900460ff166148f0565b60ff161115611a1f5760405162461bcd60e51b815260206004820152601560248201527421b0b73737ba1036b4b73a1037bb32b9101898181760591b60448201526064016102f4565b611a2c338260ff166131b3565b80600a60028282829054906101000a900460ff16611a4a91906148f0565b92506101000a81548160ff021916908360ff160217905550600160098190555050565b6060611a816008546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480611ab457503360009081526013602052604090205460ff1615156001145b611ad05760405162461bcd60e51b81526004016102f490614813565b816001600160401b03811115611ae857611ae861419a565b604051908082528060200260200182016040528015611b3557816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611b065790505b50905060008060005b84811015611c7157611b75868683818110611b5b57611b5b614834565b9050602002016020810190611b7091906140d2565b612e01565b90935091508115611c615760118381548110611b9357611b93614834565b60009182526020918290206040805160608101825260039093029091018054835260018101546001600160a01b0316838501526002810180548351818702810187018552818152949592949386019392830182828015611c3a57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611c015790505b505050505081525050848281518110611c5557611c55614834565b60200260200101819052505b611c6a816148c0565b9050611b3e565b50505092915050565b60606000806000611c8a8561184a565b90506000816001600160401b03811115611ca657611ca661419a565b604051908082528060200260200182016040528015611ccf578160200160208202803683370190505b509050611cf5604080516060810182526000808252602082018190529181019190915290565b60015b838614611d6f57611d08816131d1565b91508160400151611d675781516001600160a01b031615611d2857815194505b876001600160a01b0316856001600160a01b031603611d675780838780600101985081518110611d5a57611d5a614834565b6020026020010181815250505b600101611cf8565b50909695505050505050565b606060038054610a10906147d9565b6060818310611dac57604051631960ccad60e11b815260040160405180910390fd5b600080611db860005490565b90506001851015611dc857600194505b80841115611dd4578093505b6000611ddf8761184a565b905084861015611dfe5785850381811015611df8578091505b50611e02565b5060005b6000816001600160401b03811115611e1c57611e1c61419a565b604051908082528060200260200182016040528015611e45578160200160208202803683370190505b50905081600003611e5b579350611f0a92505050565b6000611e6688612400565b905060008160400151611e77575080515b885b888114158015611e895750848714155b15611efe57611e97816131d1565b92508260400151611ef65782516001600160a01b031615611eb757825191505b8a6001600160a01b0316826001600160a01b031603611ef65780848880600101995081518110611ee957611ee9614834565b6020026020010181815250505b600101611e79565b50505092835250909150505b9392505050565b6008546001600160a01b0316331480611f3e57503360009081526013602052604090205460ff1615156001145b611f5a5760405162461bcd60e51b81526004016102f490614813565b61100760148383613e13565b336001600160a01b03831603611f8f5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b80600160005b825181101561206357336001600160a01b031661203a84838151811061202957612029614834565b602002602001015161ffff16611479565b6001600160a01b0316146120515760009150612063565b8061205b816148c0565b915050612001565b50806120a85760405162461bcd60e51b81526020600482015260146024820152732a37b5b2b7399030b932b713ba103cb7bab9399760611b60448201526064016102f4565b60016000806120b633612e01565b93509050826121a957506040805160608082018352600080835292820190815233602080840191825260118054600181018255955283517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c686003870290810191825592517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c69840180546001600160a01b0319166001600160a01b0390921691909117905592518051859493612191937f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6a909101920190613e97565b50506011543360009081526012602052604090205550505b6000601182815481106121be576121be614834565b90600052602060002090600302016002019050600092505b86518310156122d057612202338885815181106121f5576121f5614834565b6020026020010151613206565b61226d578087848151811061221957612219614834565b602002602001015190806001815401808255809150506001900390600052602060002090601091828204019190066002029091909190916101000a81548161ffff021916908361ffff1602179055506122c0565b60405162461bcd60e51b815260206004820152602260248201527f596f752061726520616c7265616479207374616b696e67207468697320746f6b60448201526132b760f11b60648201526084016102f4565b6122c9836148c0565b92506121d6565b80601183815481106122e4576122e4614834565b9060005260206000209060030201600201908054612303929190613f3b565b508651600a805460009061231c90849061ffff16614915565b92506101000a81548161ffff021916908361ffff16021790555050505050505050565b60008060006123566008546001600160a01b031690565b6001600160a01b0316336001600160a01b0316148061238957503360009081526013602052604090205460ff1615156001145b6123a55760405162461bcd60e51b81526004016102f490614813565b5050601054600f5430319250909192565b6123c1848484612e4f565b6001600160a01b0383163b156123fa576123dd848484846132ce565b6123fa576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6040805160608082018352600080835260208084018290528385018290528451928301855281835282018190529281019290925290600183108061244657506000548310155b156124515792915050565b61245a836131d1565b905080604001511561246c5792915050565b611f0a836133b9565b6002600954036124975760405162461bcd60e51b81526004016102f490613f9e565b600260095560036124df85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d5491503390506133e7565b156124e8575060015b60038160038111156124fc576124fc61493b565b148015612545575061254585858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c5491503390506133e7565b1561254e575060005b61258f85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e5491503390506133e7565b15612598575060025b6125a181613434565b6125ed5760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f74206d696e7420617420746869732074696d652e0000000000000060448201526064016102f4565b600b60008260038111156126035761260361493b565b60038111156126145761261461493b565b815260208101919091526040016000205460ff600160801b9091048116908416612660336001600160a01b03166000908152600560205260409081902054901c6001600160401b031690565b61266a9190614951565b11156126b85760405162461bcd60e51b815260206004820152601760248201527f43616e206e6f74206d696e742074686973206d616e792e00000000000000000060448201526064016102f4565b8260ff168260ff16111561270e5760405162461bcd60e51b815260206004820152601860248201527f43616e206e6f74207374616b652074686973206d616e792e000000000000000060448201526064016102f4565b61271b338460ff166131b3565b34600f600082825461272d9190614951565b909155505060ff821615612802576000600161274860005490565b6127529190614969565b905060008360ff166001600160401b038111156127715761277161419a565b60405190808252806020026020018201604052801561279a578160200160208202803683370190505b50905060005b8460ff168160ff1610156127f5576127bb60ff821684614969565b828260ff16815181106127d0576127d0614834565b61ffff90921660209283029190910190910152806127ed8161498c565b9150506127a0565b506127ff81611ffb565b50505b50506001600955505050565b606061281982612d5d565b61283657604051630a14c4b560e41b815260040160405180910390fd5b600061284061358a565b905080516000036128605760405180602001604052806000815250611f0a565b8061286a84613599565b60405160200161287b9291906149ab565b6040516020818303038152906040529392505050565b8181808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250600193509150505b825181101561291957336001600160a01b03166128f084838151811061202957612029614834565b6001600160a01b0316146129075760009150612919565b80612911816148c0565b9150506128c8565b508061295e5760405162461bcd60e51b81526020600482015260146024820152732a37b5b2b7399030b932b713ba103cb7bab9399760611b60448201526064016102f4565b600160008061296c33612e01565b93509050826129b55760405162461bcd60e51b81526020600482015260156024820152742cb7ba9030b932903737ba10309039ba30b5b2b91760591b60448201526064016102f4565b6000806000601184815481106129cd576129cd614834565b90600052602060002090600302016002019050600094505b88851015612b795780546000935091505b81831015612b6757808381548110612a1057612a10614834565b60009182526020909120601082040154600f9091166002026101000a900461ffff168a8a87818110612a4457612a44614834565b9050602002016020810190612a5991906149ea565b61ffff1603612b555780612a6e600184614860565b81548110612a7e57612a7e614834565b90600052602060002090601091828204019190066002029054906101000a900461ffff16818481548110612ab457612ab4614834565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff16021790555080805480612af357612af3614a05565b600082815260208120601060001990930192830401805461ffff6002600f8616026101000a81021990911690915591909255600a8054909291612b369116614a1b565b91906101000a81548161ffff021916908361ffff160217905550612b67565b82612b5f816148c0565b9350506129f6565b84612b71816148c0565b9550506129e5565b8060118581548110612b8d57612b8d614834565b9060005260206000209060030201600201908054612bac929190613f3b565b5050505050505050505050565b6008546001600160a01b0316331480612be657503360009081526013602052604090205460ff1615156001145b612c025760405162461bcd60e51b81526004016102f490614813565b600c55565b606060148054610a10906147d9565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b03163314612c9e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102f4565b6001600160a01b038116612d035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102f4565b612d0c81613161565b50565b6008546001600160a01b0316331480612d3c57503360009081526013602052604090205460ff1615156001145b612d585760405162461bcd60e51b81526004016102f490614813565b600d55565b600081600111158015612d71575060005482105b80156109fb575050600090815260046020526040902054600160e01b161590565b60008180600111612de857600054811015612de85760008181526004602052604081205490600160e01b82169003612de6575b80600003611f0a575060001901600081815260046020526040902054612dc5565b505b604051636f96cda160e11b815260040160405180910390fd5b6001600160a01b03811660009081526012602052604081205415801590612e4a576001600160a01b038316600090815260126020526040902054612e4790600190614860565b91505b915091565b6000612e5a82612d92565b9050836001600160a01b0316816001600160a01b031614612e8d5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612eab5750612eab8533612c16565b80612ec6575033612ebb84610a93565b6001600160a01b0316145b905080612ee657604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612f0d57604051633a954ecd60e21b815260040160405180910390fd5b612f1a85858560016135e8565b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091528120600160e11b4260a01b8717811790915583169003612fbb57600183016000818152600460205260408120549003612fb9576000548114612fb95760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6060600080613010613720565b9150915081516001600160401b0381111561302d5761302d61419a565b604051908082528060200260200182016040528015613056578160200160208202803683370190505b5092506000805b83518110156131585782601185838151811061307b5761307b614834565b60200260200101518154811061309357613093614834565b60009182526020909120600260039092020101546130b19088614877565b6130bb91906148ac565b9150818582815181106130d0576130d0614834565b6020026020010181815250508160118583815181106130f1576130f1614834565b60200260200101518154811061310957613109614834565b906000526020600020906003020160000160008282546131299190614951565b9250508190555081601060008282546131429190614951565b909155506131519050816148c0565b905061305d565b50505050919050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6131cd828260405180602001604052806000815250613a4d565b5050565b60408051606081018252600080825260208201819052918101919091526000828152600460205260409020546109fb90613bce565b60008061321284612e01565b50905060005b6011828154811061322b5761322b614834565b9060005260206000209060030201600201805490508110156132c3578361ffff166011838154811061325f5761325f614834565b9060005260206000209060030201600201828154811061328157613281614834565b60009182526020909120601082040154600f9091166002026101000a900461ffff16036132b3576001925050506109fb565b6132bc816148c0565b9050613218565b506000949350505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290613303903390899088908890600401614a39565b6020604051808303816000875af192505050801561333e575060408051601f3d908101601f1916820190925261333b91810190614a76565b60015b61339c573d80801561336c576040519150601f19603f3d011682016040523d82523d6000602084013e613371565b606091505b508051600003613394576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60408051606081018252600080825260208201819052918101919091526109fb6133e283612d92565b613bce565b6040516bffffffffffffffffffffffff19606083901b16602082015260009061342c908590859060340160405160208183030381529060405280519060200120613c08565b949350505050565b600080600b600084600381111561344d5761344d61493b565b600381111561345e5761345e61493b565b81526020808201929092526040908101600020815160608101835290546001600160401b0380821680845268010000000000000000830490911694830194909452600160801b900460ff1691810191909152915060011480156134ce575060208101516001600160401b03166001145b156134dc5750600192915050565b80516001600160401b03166001148015613503575080602001516001600160401b03164211155b156135115750600192915050565b4281600001516001600160401b03161115801561353b575060208101516001600160401b03166001145b156135495750600192915050565b4281600001516001600160401b031611158015613573575080602001516001600160401b03164211155b156135815750600192915050565b50600092915050565b606060158054610a10906147d9565b604080516080810191829052607f0190826030600a8206018353600a90045b80156135d657600183039250600a81066030018353600a90046135b8565b50819003601f19909101908152919050565b6000806135f486612e01565b915091506000806000831561371557600092505b8583101561371557506000905060015b6011858154811061362b5761362b614834565b9060005260206000209060030201600201805490508210156136c5576136518688614951565b6011868154811061366457613664614834565b9060005260206000209060030201600201838154811061368657613686614834565b60009182526020909120601082040154600f9091166002026101000a900461ffff16036136b5575060006136c5565b6136be826148c0565b9150613618565b806137055760405162461bcd60e51b815260206004820152601060248201526f2a37b5b2b71034b99039ba30b5b2b21760811b60448201526064016102f4565b61370e836148c0565b9250613608565b505050505050505050565b606060008080805b60115482101561377c576011828154811061374557613745614834565b60009182526020909120600260039092020101541561376c5782613768816148c0565b9350505b613775826148c0565b9150613728565b6000836001600160401b038111156137965761379661419a565b6040519080825280602002602001820160405280156137bf578160200160208202803683370190505b50905080516000036137d8575093946000945092505050565b60009150600092505b60115483101561388057601183815481106137fe576137fe614834565b600091825260209091206002600390920201015415613870576011838154811061382a5761382a614834565b90600052602060002090600302016002018054905081838151811061385157613851614834565b61ffff9092166020928302919091019091015261386d826148c0565b91505b613879836148c0565b92506137e1565b6001815111156138a3576138a38160006001845161389e9190614860565b613c1e565b600a546064906138b99060199061ffff16614a93565b6138c39190614abd565b61ffff169250821580156138dc5750600a5461ffff1615155b156138e657600192505b600094508493505b805184101561393a5780848151811061390957613909614834565b602002602001015161ffff16856139209190614951565b94508285101561393a57613933846148c0565b93506138ee565b613945846001614951565b6001600160401b0381111561395c5761395c61419a565b604051908082528060200260200182016040528015613985578160200160208202803683370190505b5095506000600182868151811061399e5761399e614834565b60200260200101516139b09190614969565b90506139bb856148c0565b945060009250600093505b601154841015613a4457828514613a44578061ffff16601185815481106139ef576139ef614834565b9060005260206000209060030201600201805490501115613a345783878481518110613a1d57613a1d614834565b6020908102919091010152613a31836148c0565b92505b613a3d846148c0565b93506139c6565b50505050509091565b6000546001600160a01b038416613a7657604051622e076360e81b815260040160405180910390fd5b82600003613a975760405163b562e8dd60e01b815260040160405180910390fd5b613aa460008583866135e8565b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15613b79575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4613b4260008784806001019550876132ce565b613b5f576040516368d2bf6b60e11b815260040160405180910390fd5b808210613af7578260005414613b7457600080fd5b613bbe565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210613b7a575b5060009081556123fa9085838684565b604080516060810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b90921615159082015290565b600082613c158584613da7565b14949350505050565b8181808203613c2e575050505050565b6000856002613c3d8787614860565b613c4791906148ac565b613c519087614951565b81518110613c6157613c61614834565b602002602001015161ffff1690505b818311613d79575b80868481518110613c8b57613c8b614834565b602002602001015161ffff161115613cad57613ca6836148c0565b9250613c78565b80868381518110613cc057613cc0614834565b602002602001015161ffff161015613ce257613cdb826148d9565b9150613cad565b818311613d7457858281518110613cfb57613cfb614834565b6020026020010151868481518110613d1557613d15614834565b6020026020010151878581518110613d2f57613d2f614834565b60200260200101888581518110613d4857613d48614834565b61ffff938416602091820292909201015291169052613d66836148c0565b9250613d71826148d9565b91505b613c70565b81851115613d8c57613d8c868684613c1e565b83831115613d9f57613d9f868486613c1e565b505050505050565b600081815b8451811015611471576000858281518110613dc957613dc9614834565b60200260200101519050808311613def5760008381526020829052604090209250613e00565b600081815260208490526040902092505b5080613e0b816148c0565b915050613dac565b828054613e1f906147d9565b90600052602060002090601f016020900481019282613e415760008555613e87565b82601f10613e5a5782800160ff19823516178555613e87565b82800160010185558215613e87579182015b82811115613e87578235825591602001919060010190613e6c565b50613e93929150613f89565b5090565b82805482825590600052602060002090600f01601090048101928215613e875791602002820160005b83821115613f0057835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302613ec0565b8015613f2e5782816101000a81549061ffff0219169055600201602081600101049283019260010302613f00565b5050613e93929150613f89565b82805482825590600052602060002090600f01601090048101928215613e8757600052602060002091600f016010900482015b82811115613e87578254825591600101919060010190613f6e565b5b80821115613e935760008155600101613f8a565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6001600160e01b031981168114612d0c57600080fd5b600060208284031215613ffd57600080fd5b8135611f0a81613fd5565b60005b8381101561402357818101518382015260200161400b565b838111156123fa5750506000910152565b6000815180845261404c816020860160208601614008565b601f01601f19169290920160200192915050565b602081526000611f0a6020830184614034565b60006020828403121561408557600080fd5b5035919050565b80356001600160a01b03811681146140a357600080fd5b919050565b600080604083850312156140bb57600080fd5b6140c48361408c565b946020939093013593505050565b6000602082840312156140e457600080fd5b611f0a8261408c565b60008060006060848603121561410257600080fd5b61410b8461408c565b92506141196020850161408c565b9150604084013590509250925092565b6000806020838503121561413c57600080fd5b82356001600160401b038082111561415357600080fd5b818501915085601f83011261416757600080fd5b81358181111561417657600080fd5b86602082850101111561418857600080fd5b60209290920196919550909350505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156141d8576141d861419a565b604052919050565b60006001600160401b038211156141f9576141f961419a565b5060051b60200190565b6000602080838503121561421657600080fd5b82356001600160401b0381111561422c57600080fd5b8301601f8101851361423d57600080fd5b803561425061424b826141e0565b6141b0565b81815260059190911b8201830190838101908783111561426f57600080fd5b928401925b8284101561428d57833582529284019290840190614274565b979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611d6f576142ef83855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b92840192606092909201916001016142b4565b600081518084526020808501945080840160005b8381101561433657815161ffff1687529582019590820190600101614316565b509495945050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156143b057888303603f19018552815180516001600160a01b0316845287015187840187905261439d87850182614302565b9588019593505090860190600101614368565b509098975050505050505050565b82815260406020820152600061342c6040830184614302565b803560ff811681146140a357600080fd5b6000602082840312156143fa57600080fd5b611f0a826143d7565b60008083601f84011261441557600080fd5b5081356001600160401b0381111561442c57600080fd5b6020830191508360208260051b850101111561444757600080fd5b9250929050565b6000806020838503121561446157600080fd5b82356001600160401b0381111561447757600080fd5b61448385828601614403565b90969095509350505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156143b057888303603f19018552815180518452878101516001600160a01b03168885015286015160608785018190526144f581860183614302565b9689019694505050908601906001016144b6565b6020808252825182820181905260009190848201906040850190845b81811015611d6f57835183529284019291840191600101614525565b60008060006060848603121561455657600080fd5b61455f8461408c565b95602085013595506040909401359392505050565b6000806040838503121561458757600080fd5b6145908361408c565b9150602083013580151581146145a557600080fd5b809150509250929050565b803561ffff811681146140a357600080fd5b600060208083850312156145d557600080fd5b82356001600160401b038111156145eb57600080fd5b8301601f810185136145fc57600080fd5b803561460a61424b826141e0565b81815260059190911b8201830190838101908783111561462957600080fd5b928401925b8284101561428d5761463f846145b0565b8252928401929084019061462e565b6000806000806080858703121561466457600080fd5b61466d8561408c565b9350602061467c81870161408c565b93506040860135925060608601356001600160401b038082111561469f57600080fd5b818801915088601f8301126146b357600080fd5b8135818111156146c5576146c561419a565b6146d7601f8201601f191685016141b0565b915080825289848285010111156146ed57600080fd5b808484018584013760008482840101525080935050505092959194509250565b81516001600160a01b031681526020808301516001600160401b031690820152604080830151151590820152606081016109fb565b6000806000806060858703121561475857600080fd5b84356001600160401b0381111561476e57600080fd5b61477a87828801614403565b909550935061478d9050602086016143d7565b915061479b604086016143d7565b905092959194509250565b600080604083850312156147b957600080fd5b6147c28361408c565b91506147d06020840161408c565b90509250929050565b600181811c908216806147ed57607f821691505b60208210810361480d57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600790820152662232b734b2b21760c91b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156148725761487261484a565b500390565b60008160001904831182151516156148915761489161484a565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826148bb576148bb614896565b500490565b6000600182016148d2576148d261484a565b5060010190565b6000816148e8576148e861484a565b506000190190565b600060ff821660ff84168060ff0382111561490d5761490d61484a565b019392505050565b600061ffff8083168185168083038211156149325761493261484a565b01949350505050565b634e487b7160e01b600052602160045260246000fd5b600082198211156149645761496461484a565b500190565b600061ffff838116908316818110156149845761498461484a565b039392505050565b600060ff821660ff81036149a2576149a261484a565b60010192915050565b600083516149bd818460208801614008565b8351908301906149d1818360208801614008565b64173539b7b760d91b9101908152600501949350505050565b6000602082840312156149fc57600080fd5b611f0a826145b0565b634e487b7160e01b600052603160045260246000fd5b600061ffff821680614a2f57614a2f61484a565b6000190192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614a6c90830184614034565b9695505050505050565b600060208284031215614a8857600080fd5b8151611f0a81613fd5565b600061ffff80831681851681830481118215151615614ab457614ab461484a565b02949350505050565b600061ffff80841680614ad257614ad2614896565b9216919091049291505056fea26469706673582212202eddc70254bc663d3c41fcc6993ea43f507e184e308f6662aa693e467d6d864c64736f6c634300080d0033
Deployed Bytecode Sourcemap
58456:18602:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6621:1;7219:7;;:19;7211:63;;;;-1:-1:-1;;;7211:63:0;;;;;;;:::i;:::-;;;;;;;;;6577:1;7352:7;7531:22;;;;58456:18602;6621:1;7219:7;;:19;7211:63;;;;-1:-1:-1;;;7211:63:0;;;;;;;:::i;26480:615::-;;;;;;;;;;-1:-1:-1;26480:615:0;;;;;:::i;:::-;;:::i;:::-;;;925:14:1;;918:22;900:41;;888:2;873:18;26480:615:0;;;;;;;;31493:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33561:204::-;;;;;;;;;;-1:-1:-1;33561:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2052:32:1;;;2034:51;;2022:2;2007:18;33561:204:0;1888:203:1;33021:474:0;;;;;;;;;;-1:-1:-1;33021:474:0;;;;;:::i;:::-;;:::i;:::-;;58826:45;;;;;;;;;;;;58869:2;58826:45;;;;;2705:4:1;2693:17;;;2675:36;;2663:2;2648:18;58826:45:0;2533:184:1;75201:137:0;;;;;;;;;;-1:-1:-1;75201:137:0;;;;;:::i;:::-;;:::i;25534:315::-;;;;;;;;;;-1:-1:-1;60839:1:0;25800:12;25587:7;25784:13;:28;-1:-1:-1;;25784:46:0;25534:315;;;3059:25:1;;;3047:2;3032:18;25534:315:0;2913:177:1;68789:337:0;;;;;;;;;;;;;:::i;69134:491::-;;;;;;;;;;;;;:::i;58774:45::-;;;;;;;;;;;;58817:2;58774:45;;34447:170;;;;;;;;;;-1:-1:-1;34447:170:0;;;;;:::i;:::-;;:::i;58878:42::-;;;;;;;;;;;;58919:1;58878:42;;69633:1063;;;;;;;;;;;;;:::i;:::-;;;;3659:25:1;;;3715:2;3700:18;;3693:34;;;;3743:18;;;3736:34;3801:2;3786:18;;3779:34;3646:3;3631:19;69633:1063:0;3428:391:1;59121:82:0;;;;;;;;;;;;59161:42;59121:82;;34688:185;;;;;;;;;;-1:-1:-1;34688:185:0;;;;;:::i;:::-;;:::i;61010:132::-;;;;;;;;;;-1:-1:-1;61010:132:0;;;;;:::i;:::-;;:::i;53276:468::-;;;;;;;;;;-1:-1:-1;53276:468:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31282:144::-;;;;;;;;;;-1:-1:-1;31282:144:0;;;;;:::i;:::-;;:::i;70949:738::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;58591:40::-;;;;;;;;;;;;58628:3;58591:40;;;;;8637:6:1;8625:19;;;8607:38;;8595:2;8580:18;58591:40:0;8463:188:1;75385:311:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;75066:127::-;;;;;;;;;;-1:-1:-1;75066:127:0;;;;;:::i;:::-;;:::i;27159:224::-;;;;;;;;;;-1:-1:-1;27159:224:0;;;;;:::i;:::-;;:::i;10174:103::-;;;;;;;;;;;;;:::i;68373:132::-;;;;;;;;;;-1:-1:-1;68373:132:0;;;;;:::i;:::-;;:::i;63682:271::-;;;;;;;;;;-1:-1:-1;63682:271:0;;;;;:::i;:::-;;:::i;75704:463::-;;;;;;;;;;-1:-1:-1;75704:463:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;58711:56::-;;;;;;;;;;;;58765:2;58711:56;;57088:892;;;;;;;;;;-1:-1:-1;57088:892:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;59301:81::-;;;;;;;;;;;;59340:42;59301:81;;9523:87;;;;;;;;;;-1:-1:-1;9596:6:0;;-1:-1:-1;;;;;9596:6:0;9523:87;;31662:104;;;;;;;;;;;;;:::i;54134:2505::-;;;;;;;;;;-1:-1:-1;54134:2505:0;;;;;:::i;:::-;;:::i;60856:146::-;;;;;;;;;;-1:-1:-1;60856:146:0;;;;;:::i;:::-;;:::i;33837:308::-;;;;;;;;;;-1:-1:-1;33837:308:0;;;;;:::i;:::-;;:::i;64005:965::-;;;;;;;;;;-1:-1:-1;64005:965:0;;;;;:::i;:::-;;:::i;59210:84::-;;;;;;;;;;;;59252:42;59210:84;;70704:237;;;;;;;;;;;;;:::i;:::-;;;;14068:25:1;;;14124:2;14109:18;;14102:34;;;;14152:18;;;14145:34;14056:2;14041:18;70704:237:0;13866:319:1;34944:396:0;;;;;;;;;;-1:-1:-1;34944:396:0;;;;;:::i;:::-;;:::i;52697:420::-;;;;;;;;;;-1:-1:-1;52697:420:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;58548:36::-;;;;;;;;;;;;58580:4;58548:36;;62103:1571;;;;;;:::i;:::-;;:::i;61377:396::-;;;;;;;;;;-1:-1:-1;61377:396:0;;;;;:::i;:::-;;:::i;58638:30::-;;;;;;;;;;-1:-1:-1;58638:30:0;;;;;;;;64978:798;;;;;;;;;;-1:-1:-1;64978:798:0;;;;;:::i;:::-;;:::i;68073:148::-;;;;;;;;;;-1:-1:-1;68073:148:0;;;;;:::i;:::-;;:::i;61173:135::-;;;;;;;;;;;;;:::i;34216:164::-;;;;;;;;;;-1:-1:-1;34216:164:0;;;;;:::i;:::-;;:::i;10432:201::-;;;;;;;;;;-1:-1:-1;10432:201:0;;;;;:::i;:::-;;:::i;68229:136::-;;;;;;;;;;-1:-1:-1;68229:136:0;;;;;:::i;:::-;;:::i;26480:615::-;26565:4;-1:-1:-1;;;;;;;;;26865:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;26942:25:0;;;26865:102;:179;;;-1:-1:-1;;;;;;;;;;27019:25:0;;;26865:179;26845:199;26480:615;-1:-1:-1;;26480:615:0:o;31493:100::-;31547:13;31580:5;31573:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31493:100;:::o;33561:204::-;33629:7;33654:16;33662:7;33654;:16::i;:::-;33649:64;;33679:34;;-1:-1:-1;;;33679:34:0;;;;;;;;;;;33649:64;-1:-1:-1;33733:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33733:24:0;;33561:204::o;33021:474::-;33094:13;33126:27;33145:7;33126:18;:27::i;:::-;33094:61;;33176:5;-1:-1:-1;;;;;33170:11:0;:2;-1:-1:-1;;;;;33170:11:0;;33166:48;;33190:24;;-1:-1:-1;;;33190:24:0;;;;;;;;;;;33166:48;49664:10;-1:-1:-1;;;;;33231:28:0;;;33227:175;;33279:44;33296:5;49664:10;34216:164;:::i;33279:44::-;33274:128;;33351:35;;-1:-1:-1;;;33351:35:0;;;;;;;;;;;33274:128;33414:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;33414:29:0;-1:-1:-1;;;;;33414:29:0;;;;;;;;;33459:28;;33414:24;;33459:28;;;;;;;33083:412;33021:474;;:::o;75201:137::-;9596:6;;-1:-1:-1;;;;;9596:6:0;74944:10;:21;;:59;;-1:-1:-1;74984:10:0;74969:26;;;;:14;:26;;;;;;;;:34;;:26;:34;74944:59;74922:116;;;;-1:-1:-1;;;74922:116:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;75299:23:0::1;75325:5;75299:23:::0;;;:14:::1;:23;::::0;;;;:31;;-1:-1:-1;;75299:31:0::1;::::0;;75201:137::o;68789:337::-;6621:1;7219:7;;:19;7211:63;;;;-1:-1:-1;;;7211:63:0;;;;;;;:::i;:::-;6621:1;7352:7;:18;9596:6;;-1:-1:-1;;;;;9596:6:0;74944:10:::1;:21;::::0;:59:::1;;-1:-1:-1::0;74984:10:0::1;74969:26;::::0;;;:14:::1;:26;::::0;;;;;::::1;;:34;;:26:::0;:34:::1;74944:59;74922:116;;;;-1:-1:-1::0;;;74922:116:0::1;;;;;;;:::i;:::-;68904:12:::2;68951:1:::0;68935:13:::2;;:17;68927:44;;;::::0;-1:-1:-1;;;68927:44:0;;17655:2:1;68927:44:0::2;::::0;::::2;17637:21:1::0;17694:2;17674:18;;;17667:30;-1:-1:-1;;;17713:18:1;;;17706:44;17767:18;;68927:44:0::2;17453:338:1::0;68927:44:0::2;69023:13;::::0;68996:45:::2;::::0;59340:42:::2;::::0;69023:13;68996:45:::2;::::0;;;69023:13;59340:42;68996:45:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68982:59;;;;;69060:7;69052:38;;;::::0;-1:-1:-1;;;69052:38:0;;18208:2:1;69052:38:0::2;::::0;::::2;18190:21:1::0;18247:2;18227:18;;;18220:30;-1:-1:-1;;;18266:18:1;;;18259:48;18324:18;;69052:38:0::2;18006:342:1::0;69052:38:0::2;-1:-1:-1::0;69117:1:0::2;69101:13;:17:::0;6577:1;7531:7;:22;68789:337::o;69134:491::-;69244:18;6621:1;7219:7;;:19;7211:63;;;;-1:-1:-1;;;7211:63:0;;;;;;;:::i;:::-;6621:1;7352:7;:18;74383:10:::1;::::0;74411:23:::1;74423:10;74411:11;:23::i;:::-;74382:52;;;;74453:7;74445:32;;;::::0;-1:-1:-1;;;74445:32:0;;18555:2:1;74445:32:0::1;::::0;::::1;18537:21:1::0;18594:2;18574:18;;;18567:30;-1:-1:-1;;;18613:18:1;;;18606:42;18665:18;;74445:32:0::1;18353:336:1::0;74445:32:0::1;74496:7;74504:5;74496:14;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;74524:1;74496:29:::0;74488:58:::1;;;::::0;-1:-1:-1;;;74488:58:0;;19028:2:1;74488:58:0::1;::::0;::::1;19010:21:1::0;19067:2;19047:18;;;19040:30;-1:-1:-1;;;19086:18:1;;;19079:46;19142:18;;74488:58:0::1;18826:340:1::0;74488:58:0::1;69281:13:::2;69300:23;69312:10;69300:11;:23::i;:::-;69280:43;;;69334:21;69358:7;69366:5;69358:14;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;69334:38:::2;::::0;;::::2;::::0;::::2;::::0;;69358:14:::2;::::0;;::::2;::::0;;::::2;69334:38:::0;;;;::::2;::::0;::::2;::::0;-1:-1:-1;;;;;69334:38:0::2;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;;;;;;::::2;::::0;;;;;;;;;;;69358:14;;69334:38;;;;;;::::2;::::0;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;69334:38:0;;;;-1:-1:-1;;69427:17:0;;69402:47:::2;::::0;69334:38;;-1:-1:-1;69384:12:0::2;::::0;69403:10:::2;::::0;-1:-1:-1;69384:12:0;69402:47;69384:12;69402:47;69427:17;69403:10;69402:47:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69383:66;;;69468:7;69460:47;;;::::0;-1:-1:-1;;;69460:47:0;;19373:2:1;69460:47:0::2;::::0;::::2;19355:21:1::0;19412:2;19392:18;;;19385:30;19451:29;19431:18;;;19424:57;19498:18;;69460:47:0::2;19171:351:1::0;69460:47:0::2;69531:7;:17;;;69518:30;;69586:1;69559:7;69567:5;69559:14;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:28:::0;-1:-1:-1;;;;;6577:1:0;7531:7;:22;69134:491;:::o;34447:170::-;34581:28;34591:4;34597:2;34601:7;34581:9;:28::i;:::-;34447:170;;;:::o;69633:1063::-;69737:18;69757:21;69780;69803:19;74958:7;9596:6;;-1:-1:-1;;;;;9596:6:0;;9523:87;74958:7;-1:-1:-1;;;;;74944:21:0;:10;-1:-1:-1;;;;;74944:21:0;;:59;;;-1:-1:-1;74984:10:0;74969:26;;;;:14;:26;;;;;;;;:34;;:26;:34;74944:59;74922:116;;;;-1:-1:-1;;;74922:116:0;;;;;;;:::i;:::-;6621:1:::1;7219:7;;:19:::0;7211:63:::1;;;;-1:-1:-1::0;;;7211:63:0::1;;;;;;;:::i;:::-;6621:1;7352:7;:18:::0;69900:11:::2;::::0;69884:13:::2;::::0;69840:17:::2;::::0;69900:11;69860:37:::2;::::0;69868:4:::2;69860:21;:37;:::i;:::-;:51;;;;:::i;:::-;69840:71:::0;-1:-1:-1;69922:20:0::2;69978:3;69945:30;58817:2;69840:71:::0;69945:30:::2;:::i;:::-;:36;;;;:::i;:::-;69922:59:::0;-1:-1:-1;69992:20:0::2;70048:3;70015:30;58869:2;70015:9:::0;:30:::2;:::i;:::-;:36;;;;:::i;:::-;69992:59:::0;-1:-1:-1;70062:18:0::2;70114:3;70083:28;58919:1;70083:9:::0;:28:::2;:::i;:::-;:34;;;;:::i;:::-;70062:55:::0;-1:-1:-1;70130:12:0::2;59340:42;70062:55:::0;70229:12;70202:24:::2;70214:12:::0;70202:9;:24:::2;:::i;:::-;:39;;;;:::i;:::-;:52;;;;:::i;:::-;70175:84;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70161:98;;;;;70278:7;70270:44;;;::::0;-1:-1:-1;;;70270:44:0;;20421:2:1;70270:44:0::2;::::0;::::2;20403:21:1::0;20460:2;20440:18;;;20433:30;-1:-1:-1;;;20479:18:1;;;20472:54;20543:18;;70270:44:0::2;20219:348:1::0;70270:44:0::2;70341:47;::::0;59252:42:::2;::::0;70371:12;;70341:47:::2;::::0;;;70371:12;59252:42;70341:47:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70327:61;;;;;70407:7;70399:46;;;::::0;-1:-1:-1;;;70399:46:0;;20774:2:1;70399:46:0::2;::::0;::::2;20756:21:1::0;20813:2;20793:18;;;20786:30;20852:28;20832:18;;;20825:56;20898:18;;70399:46:0::2;20572:350:1::0;70399:46:0::2;70472:43;::::0;59161:42:::2;::::0;70500:10;;70472:43:::2;::::0;;;70500:10;59161:42;70472:43:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70458:57;;;;;70534:7;70526:44;;;::::0;-1:-1:-1;;;70526:44:0;;20421:2:1;70526:44:0::2;::::0;::::2;20403:21:1::0;20460:2;20440:18;;;20433:30;-1:-1:-1;;;20479:18:1;;;20472:54;20543:18;;70526:44:0::2;20219:348:1::0;70526:44:0::2;70583:34;70604:12;70583:20;:34::i;:::-;-1:-1:-1::0;;6577:1:0::1;7531:7;:22:::0;70638:9;;70649:12;;-1:-1:-1;70663:12:0;-1:-1:-1;70649:12:0;;-1:-1:-1;69633:1063:0;-1:-1:-1;69633:1063:0:o;34688:185::-;34826:39;34843:4;34849:2;34853:7;34826:39;;;;;;;;;;;;:16;:39::i;61010:132::-;9596:6;;-1:-1:-1;;;;;9596:6:0;74944:10;:21;;:59;;-1:-1:-1;74984:10:0;74969:26;;;;:14;:26;;;;;;;;:34;;:26;:34;74944:59;74922:116;;;;-1:-1:-1;;;74922:116:0;;;;;;;:::i;:::-;61115:19:::1;:12;61130:4:::0;;61115:19:::1;:::i;53276:468::-:0;53451:15;;53365:23;;53426:22;53451:15;-1:-1:-1;;;;;53518:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;53518:36:0;;-1:-1:-1;;53518:36:0;;;;;;;;;;;;53481:73;;53574:9;53569:125;53590:14;53585:1;:19;53569:125;;53646:32;53666:8;53675:1;53666:11;;;;;;;;:::i;:::-;;;;;;;53646:19;:32::i;:::-;53630:10;53641:1;53630:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;53606:3;;53569:125;;;-1:-1:-1;53715:10:0;53276:468;-1:-1:-1;;;53276:468:0:o;31282:144::-;31346:7;31389:27;31408:7;31389:18;:27::i;70949:738::-;71028:37;71083:9;;71127:135;71143:7;:14;71139:18;;71127:135;;;71210:1;71183:7;71191:1;71183:10;;;;;;;;:::i;:::-;;;;;;;;;;;:17;;:24;;;;:28;71179:72;;;71232:3;;;:::i;:::-;;;71179:72;71159:3;;;;:::i;:::-;;;;71127:135;;;71311:1;-1:-1:-1;;;;;71289:24:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;71289:24:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;71274:39:0;;-1:-1:-1;71370:1:0;71366:5;;71361:319;71377:7;:14;71373:18;;71361:319;;;71444:1;71417:7;71425:1;71417:10;;;;;;;;:::i;:::-;;;;;;;;;;;:17;;:24;;;;:28;71413:256;;;71472:139;;;;;;;;71567:7;71575:1;71567:10;;;;;;;;:::i;:::-;;;;;;;;;;:24;:10;;;;;:24;;-1:-1:-1;;;;;71567:24:0;71472:139;;71519:7;:10;;71472:139;;;;;71527:1;;71519:10;;;;;;:::i;:::-;;;;;;;;;;;:17;;71472:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71466:145;;71650:3;71630:12;71643:3;;;;:::i;:::-;;;;71630:17;;;;;;;;:::i;:::-;;;;;;:23;;;;71413:256;71393:3;;;;:::i;:::-;;;;71361:319;;;71072:615;;;70949:738;:::o;75385:311::-;75455:18;75475:29;75523:13;75538:12;75554:23;75566:10;75554:11;:23::i;:::-;75522:55;;;;75596:7;75588:33;;;;-1:-1:-1;;;75588:33:0;;21410:2:1;75588:33:0;;;21392:21:1;21449:2;21429:18;;;21422:30;-1:-1:-1;;;21468:18:1;;;21461:43;21521:18;;75588:33:0;21208:337:1;75588:33:0;75640:7;75648:5;75640:14;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;75666:7;75674:5;75666:14;;;;;;;;:::i;:::-;;;;;;;;;;;:21;;75632:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75385:311;;:::o;75066:127::-;9596:6;;-1:-1:-1;;;;;9596:6:0;74944:10;:21;;:59;;-1:-1:-1;74984:10:0;74969:26;;;;:14;:26;;;;;;;;:34;;:26;:34;74944:59;74922:116;;;;-1:-1:-1;;;74922:116:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;75158:20:0::1;;::::0;;;:14:::1;:20;::::0;;;;:27;;-1:-1:-1;;75158:27:0::1;75181:4;75158:27;::::0;;75066:127::o;27159:224::-;27223:7;-1:-1:-1;;;;;27247:19:0;;27243:60;;27275:28;;-1:-1:-1;;;27275:28:0;;;;;;;;;;;27243:60;-1:-1:-1;;;;;;27321:25:0;;;;;:18;:25;;;;;;-1:-1:-1;;;;;27321:54:0;;27159:224::o;10174:103::-;9596:6;;-1:-1:-1;;;;;9596:6:0;49664:10;9743:23;9735:68;;;;-1:-1:-1;;;9735:68:0;;21752:2:1;9735:68:0;;;21734:21:1;;;21771:18;;;21764:30;21830:34;21810:18;;;21803:62;21882:18;;9735:68:0;21550:356:1;9735:68:0;10239:30:::1;10266:1;10239:18;:30::i;:::-;10174:103::o:0;68373:132::-;9596:6;;-1:-1:-1;;;;;9596:6:0;74944:10;:21;;:59;;-1:-1:-1;74984:10:0;74969:26;;;;:14;:26;;;;;;;;:34;;:26;:34;74944:59;74922:116;;;;-1:-1:-1;;;74922:116:0;;;;;;;:::i;:::-;68475:12:::1;:22:::0;68373:132::o;63682:271::-;6621:1;7219:7;;:19;7211:63;;;;-1:-1:-1;;;7211:63:0;;;;;;;:::i;:::-;6621:1;7352:7;:18;9596:6;;-1:-1:-1;;;;;9596:6:0;74944:10:::1;:21;::::0;:59:::1;;-1:-1:-1::0;74984:10:0::1;74969:26;::::0;;;:14:::1;:26;::::0;;;;;::::1;;:34;;:26:::0;:34:::1;74944:59;74922:116;;;;-1:-1:-1::0;;;74922:116:0::1;;;;;;;:::i;:::-;63805:10:::2;::::0;58628:3:::2;::::0;63805:22:::2;::::0;63818:9;;63805:10;;::::2;;;:22;:::i;:::-;:37;;;;63797:71;;;::::0;-1:-1:-1;;;63797:71:0;;22322:2:1;63797:71:0::2;::::0;::::2;22304:21:1::0;22361:2;22341:18;;;22334:30;-1:-1:-1;;;22380:18:1;;;22373:51;22441:18;;63797:71:0::2;22120:345:1::0;63797:71:0::2;63879:32;63889:10;63901:9;63879:32;;:9;:32::i;:::-;63936:9;63922:10;;:23;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;6577:1:::0;7531:7;:22;;;;63682:271;:::o;75704:463::-;75827:20;74958:7;9596:6;;-1:-1:-1;;;;;9596:6:0;;9523:87;74958:7;-1:-1:-1;;;;;74944:21:0;:10;-1:-1:-1;;;;;74944:21:0;;:59;;;-1:-1:-1;74984:10:0;74969:26;;;;:14;:26;;;;;;;;:34;;:26;:34;74944:59;74922:116;;;;-1:-1:-1;;;74922:116:0;;;;;;;:::i;:::-;75885:8;-1:-1:-1;;;;;75872:29:0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;75872:29:0::1;;;;;;;;;;;;;;;;75865:36;;75912:13;75936:12:::0;75963:9:::1;75959:201;75978:19:::0;;::::1;75959:201;;;76038:24;76050:8;;76059:1;76050:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;76038;:24::i;:::-;76019:43:::0;;-1:-1:-1;76019:43:0;-1:-1:-1;76077:72:0;::::1;;;76119:7;76127:5;76119:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;76109:24:::1;::::0;;::::1;::::0;::::1;::::0;;76119:14:::1;::::0;;::::1;::::0;;::::1;76109:24:::0;;;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;76109:24:0::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;;76119:14;;76109:24;;;;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;:4;76114:1;76109:7;;;;;;;;:::i;:::-;;;;;;:24;;;;76077:72;75999:3;::::0;::::1;:::i;:::-;;;75959:201;;;;75854:313;;75704:463:::0;;;;:::o;57088:892::-;57158:16;57212:19;57246:25;57286:22;57311:16;57321:5;57311:9;:16::i;:::-;57286:41;;57342:25;57384:14;-1:-1:-1;;;;;57370:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57370:29:0;;57342:57;;57414:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;57414:31:0;60839:1;57460:472;57509:14;57494:11;:29;57460:472;;57561:15;57574:1;57561:12;:15::i;:::-;57549:27;;57599:9;:16;;;57640:8;57595:73;57690:14;;-1:-1:-1;;;;;57690:28:0;;57686:111;;57763:14;;;-1:-1:-1;57686:111:0;57840:5;-1:-1:-1;;;;;57819:26:0;:17;-1:-1:-1;;;;;57819:26:0;;57815:102;;57896:1;57870:8;57879:13;;;;;;57870:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;57815:102;57525:3;;57460:472;;;-1:-1:-1;57953:8:0;;57088:892;-1:-1:-1;;;;;;57088:892:0:o;31662:104::-;31718:13;31751:7;31744:14;;;;;:::i;54134:2505::-;54269:16;54336:4;54327:5;:13;54323:45;;54349:19;;-1:-1:-1;;;54349:19:0;;;;;;;;;;;54323:45;54383:19;54417:17;54437:14;25275:7;25302:13;;25228:95;54437:14;54417:34;-1:-1:-1;60839:1:0;54529:5;:23;54525:87;;;60839:1;54573:23;;54525:87;54688:9;54681:4;:16;54677:73;;;54725:9;54718:16;;54677:73;54764:25;54792:16;54802:5;54792:9;:16::i;:::-;54764:44;;54986:4;54978:5;:12;54974:278;;;55033:12;;;55068:31;;;55064:111;;;55144:11;55124:31;;55064:111;54992:198;54974:278;;;-1:-1:-1;55235:1:0;54974:278;55266:25;55308:17;-1:-1:-1;;;;;55294:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55294:32:0;;55266:60;;55345:17;55366:1;55345:22;55341:78;;55395:8;-1:-1:-1;55388:15:0;;-1:-1:-1;;;55388:15:0;55341:78;55563:31;55597:26;55617:5;55597:19;:26::i;:::-;55563:60;;55638:25;55883:9;:16;;;55878:92;;-1:-1:-1;55940:14:0;;55878:92;56001:5;55984:478;56013:4;56008:1;:9;;:45;;;;;56036:17;56021:11;:32;;56008:45;55984:478;;;56091:15;56104:1;56091:12;:15::i;:::-;56079:27;;56129:9;:16;;;56170:8;56125:73;56220:14;;-1:-1:-1;;;;;56220:28:0;;56216:111;;56293:14;;;-1:-1:-1;56216:111:0;56370:5;-1:-1:-1;;;;;56349:26:0;:17;-1:-1:-1;;;;;56349:26:0;;56345:102;;56426:1;56400:8;56409:13;;;;;;56400:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;56345:102;56055:3;;55984:478;;;-1:-1:-1;;;56547:29:0;;;-1:-1:-1;56554:8:0;;-1:-1:-1;;54134:2505:0;;;;;;:::o;60856:146::-;9596:6;;-1:-1:-1;;;;;9596:6:0;74944:10;:21;;:59;;-1:-1:-1;74984:10:0;74969:26;;;;:14;:26;;;;;;;;:34;;:26;:34;74944:59;74922:116;;;;-1:-1:-1;;;74922:116:0;;;;;;;:::i;:::-;60968:26:::1;:19;60990:4:::0;;60968:26:::1;:::i;33837:308::-:0;49664:10;-1:-1:-1;;;;;33936:31:0;;;33932:61;;33976:17;;-1:-1:-1;;;33976:17:0;;;;;;;;;;;33932:61;49664:10;34006:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;34006:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;34006:60:0;;;;;;;;;;34082:55;;900:41:1;;;34006:49:0;;49664:10;34082:55;;873:18:1;34082:55:0;;;;;;;33837:308;;:::o;64005:965::-;64070:6;66236:4;66224:9;66251:189;66274:7;:14;66270:1;:18;66251:189;;;66346:10;-1:-1:-1;;;;;66314:42:0;:28;66330:7;66338:1;66330:10;;;;;;;;:::i;:::-;;;;;;;66322:19;;66314:7;:28::i;:::-;-1:-1:-1;;;;;66314:42:0;;66310:119;;66384:5;66377:12;;66408:5;;66310:119;66290:3;;;;:::i;:::-;;;;66251:189;;;;66458:4;66450:37;;;;-1:-1:-1;;;66450:37:0;;22672:2:1;66450:37:0;;;22654:21:1;22711:2;22691:18;;;22684:30;-1:-1:-1;;;22730:18:1;;;22723:50;22790:18;;66450:37:0;22470:344:1;66450:37:0;64119:4:::1;64110:6;::::0;64233:23:::1;64245:10;64233:11;:23::i;:::-;64220:36:::0;-1:-1:-1;64220:36:0;-1:-1:-1;64220:36:0;64269:243:::1;;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;64356:10:0::1;-1:-1:-1::0;;;;64330:36:0;;;64391:7:::1;:14:::0;;64420:23:::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;;;;;-1:-1:-1;;;;;;64420:23:0::1;-1:-1:-1::0;;;;;64420:23:0;;::::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;;64420:23:0;::::1;::::0;;;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;64486:7:0::1;:14:::0;64472:10:::1;64458:25;::::0;;;:13:::1;:25;::::0;;;;:42;-1:-1:-1;;64269:243:0::1;64524:26;64553:7;64561:5;64553:14;;;;;;;;:::i;:::-;;;;;;;;;;;:21;;64524:50;;64621:1;64617:5;;64612:259;64628:6;:13;64624:1;:17;64612:259;;;64668:37;64683:10;64695:6;64702:1;64695:9;;;;;;;;:::i;:::-;;;;;;;64668:14;:37::i;:::-;64663:197;;64726:9;64741:6;64748:1;64741:9;;;;;;;;:::i;:::-;;;;;;;64726:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64663:197;;;64792:52;::::0;-1:-1:-1;;;64792:52:0;;23021:2:1;64792:52:0::1;::::0;::::1;23003:21:1::0;23060:2;23040:18;;;23033:30;23099:34;23079:18;;;23072:62;-1:-1:-1;;;23150:18:1;;;23143:32;23192:19;;64792:52:0::1;22819:398:1::0;64792:52:0::1;64643:3;::::0;::::1;:::i;:::-;;;64612:259;;;64905:9;64881:7;64889:5;64881:14;;;;;;;;:::i;:::-;;;;;;;;;;;:21;;:33;;;;;;;;:::i;:::-;-1:-1:-1::0;64948:13:0;;64925:12:::1;:37:::0;;:12:::1;::::0;:37:::1;::::0;64948:13;;64925:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;64099:871;;;;66213:294:::0;64005:965;;:::o;70704:237::-;70799:16;70817:20;70839:18;74958:7;9596:6;;-1:-1:-1;;;;;9596:6:0;;9523:87;74958:7;-1:-1:-1;;;;;74944:21:0;:10;-1:-1:-1;;;;;74944:21:0;;:59;;;-1:-1:-1;74984:10:0;74969:26;;;;:14;:26;;;;;;;;:34;;:26;:34;74944:59;74922:116;;;;-1:-1:-1;;;74922:116:0;;;;;;;:::i;:::-;-1:-1:-1;;70906:11:0::1;::::0;70919:13:::1;::::0;70891:4:::1;70883:21;::::0;-1:-1:-1;70704:237:0;;;:::o;34944:396::-;35111:28;35121:4;35127:2;35131:7;35111:9;:28::i;:::-;-1:-1:-1;;;;;35154:14:0;;;:19;35150:183;;35193:56;35224:4;35230:2;35234:7;35243:5;35193:30;:56::i;:::-;35188:145;;35277:40;;-1:-1:-1;;;35277:40:0;;;;;;;;;;;35188:145;34944:396;;;;:::o;52697:420::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60839:1:0;52853:25;;;:54;;-1:-1:-1;25275:7:0;25302:13;52882:7;:25;;52853:54;52849:103;;;52931:9;52697:420;-1:-1:-1;;52697:420:0:o;52849:103::-;52974:21;52987:7;52974:12;:21::i;:::-;52962:33;;53010:9;:16;;;53006:65;;;53050:9;52697:420;-1:-1:-1;;52697:420:0:o;53006:65::-;53088:21;53101:7;53088:12;:21::i;62103:1571::-;6621:1;7219:7;;:19;7211:63;;;;-1:-1:-1;;;7211:63:0;;;;;;;:::i;:::-;6621:1;7352:7;:18;62274:15:::1;62384:54;62397:12;;62384:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;62411:14:0::1;::::0;;-1:-1:-1;62427:10:0::1;::::0;-1:-1:-1;62384:12:0::1;:54::i;:::-;62349:146;;;-1:-1:-1::0;62466:17:0::1;62349:146;62579:15;62567:8;:27;;;;;;;;:::i;:::-;;:91;;;;;62598:60;62611:12;;62598:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;62625:20:0::1;::::0;;-1:-1:-1;62647:10:0::1;::::0;-1:-1:-1;62598:12:0::1;:60::i;:::-;62563:154;;;-1:-1:-1::0;62686:19:0::1;62563:154;62776:52;62789:12;;62776:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;62803:12:0::1;::::0;;-1:-1:-1;62817:10:0::1;::::0;-1:-1:-1;62776:12:0::1;:52::i;:::-;62772:113;;;-1:-1:-1::0;62856:17:0::1;62772:113;62933:23;62947:8;62933:13;:23::i;:::-;62925:61;;;::::0;-1:-1:-1;;;62925:61:0;;23785:2:1;62925:61:0::1;::::0;::::1;23767:21:1::0;23824:2;23804:18;;;23797:30;23863:27;23843:18;;;23836:55;23908:18;;62925:61:0::1;23583:349:1::0;62925:61:0::1;63088:9;:19;63098:8;63088:19;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;63088:19:0;:27;::::1;-1:-1:-1::0;;;63088:27:0;;::::1;::::0;::::1;::::0;63047:37;::::1;:25;63061:10;-1:-1:-1::0;;;;;27554:25:0;27526:7;27554:25;;;:18;:25;;22635:2;27554:25;;;;;:49;;-1:-1:-1;;;;;27553:80:0;;27465:176;63047:25:::1;:37;;;;:::i;:::-;:68;;63039:104;;;::::0;-1:-1:-1;;;63039:104:0;;24272:2:1;63039:104:0::1;::::0;::::1;24254:21:1::0;24311:2;24291:18;;;24284:30;24350:25;24330:18;;;24323:53;24393:18;;63039:104:0::1;24070:347:1::0;63039:104:0::1;63225:9;63215:19;;:6;:19;;;;63207:56;;;::::0;-1:-1:-1;;;63207:56:0;;24624:2:1;63207:56:0::1;::::0;::::1;24606:21:1::0;24663:2;24643:18;;;24636:30;24702:26;24682:18;;;24675:54;24746:18;;63207:56:0::1;24422:348:1::0;63207:56:0::1;63276:32;63286:10;63298:9;63276:32;;:9;:32::i;:::-;63338:9;63321:13;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;63364:10:0::1;::::0;::::1;::::0;63360:307:::1;;63391:21;63440:1;63422:14;25275:7:::0;25302:13;;25228:95;63422:14:::1;63415:26;;;;:::i;:::-;63391:50;;63456:24;63496:6;63483:20;;-1:-1:-1::0;;;;;63483:20:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;63483:20:0::1;;63456:47;;63523:7;63518:102;63540:6;63536:10;;:1;:10;;;63518:102;;;63586:18;;::::0;::::1;:14:::0;:18:::1;:::i;:::-;63572:8;63581:1;63572:11;;;;;;;;;;:::i;:::-;:32;::::0;;::::1;:11;::::0;;::::1;::::0;;;;;;;:32;63548:3;::::1;::::0;::::1;:::i;:::-;;;;63518:102;;;;63634:21;63646:8;63634:11;:21::i;:::-;63376:291;;63360:307;-1:-1:-1::0;;6577:1:0;7531:7;:22;-1:-1:-1;;;62103:1571:0:o;61377:396::-;61514:13;61550:16;61558:7;61550;:16::i;:::-;61545:59;;61575:29;;-1:-1:-1;;;61575:29:0;;;;;;;;;;;61545:59;61617:21;61641:10;:8;:10::i;:::-;61617:34;;61675:7;61669:21;61694:1;61669:26;:96;;;;;;;;;;;;;;;;;61722:7;61731:18;61741:7;61731:9;:18::i;:::-;61705:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61662:103;61377:396;-1:-1:-1;;;61377:396:0:o;64978:798::-;65047:6;;66163:344;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66236:4:0;;-1:-1:-1;66163:344:0;-1:-1:-1;;66251:189:0;66274:7;:14;66270:1;:18;66251:189;;;66346:10;-1:-1:-1;;;;;66314:42:0;:28;66330:7;66338:1;66330:10;;;;;;;;:::i;66314:28::-;-1:-1:-1;;;;;66314:42:0;;66310:119;;66384:5;66377:12;;66408:5;;66310:119;66290:3;;;;:::i;:::-;;;;66251:189;;;;66458:4;66450:37;;;;-1:-1:-1;;;66450:37:0;;22672:2:1;66450:37:0;;;22654:21:1;22711:2;22691:18;;;22684:30;-1:-1:-1;;;22730:18:1;;;22723:50;22790:18;;66450:37:0;22470:344:1;66450:37:0;65096:4:::1;65087:6;::::0;65165:23:::1;65177:10;65165:11;:23::i;:::-;65152:36:::0;-1:-1:-1;65152:36:0;-1:-1:-1;65152:36:0;65199:35:::1;;;::::0;-1:-1:-1;;;65199:35:0;;26021:2:1;65199:35:0::1;::::0;::::1;26003:21:1::0;26060:2;26040:18;;;26033:30;-1:-1:-1;;;26079:18:1;;;26072:51;26140:18;;65199:35:0::1;25819:345:1::0;65199:35:0::1;65247:9;65267:11:::0;65291:26:::1;65320:7;65328:5;65320:14;;;;;;;;:::i;:::-;;;;;;;;;;;:21;;65291:50;;65363:1;65359:5;;65354:369;65366:17:::0;;::::1;65354:369;;;65411:16:::0;;65451:1:::1;::::0;-1:-1:-1;65411:16:0;-1:-1:-1;65442:270:0::1;65458:3;65454:1;:7;65442:270;;;65504:9;65514:1;65504:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;;;;;::::1;;;;::::0;::::1;;;65491:6:::0;;65498:1;65491:9;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:25;;::::0;65487:210:::1;;65556:9:::0;65566:7:::1;65572:1;65566:3:::0;:7:::1;:::i;:::-;65556:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;65541:9;65551:1;65541:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;65597:9;:15;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;65597:15:0;;;;;::::1;;::::0;;::::1;;::::0;;;::::1;;;::::0;::::1;;::::0;;::::1;::::0;;;;;;;65637:12:::1;65635:14:::0;;65637:12;;65597:15;65635:14:::1;::::0;::::1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;65672:5;;65487:210;65463:3:::0;::::1;::::0;::::1;:::i;:::-;;;;65442:270;;;65385:3:::0;::::1;::::0;::::1;:::i;:::-;;;;65354:369;;;65759:9;65735:7;65743:5;65735:14;;;;;;;;:::i;:::-;;;;;;;;;;;:21;;:33;;;;;;;;:::i;:::-;;65076:700;;;;;;66213:294:::0;64978:798;;;:::o;68073:148::-;9596:6;;-1:-1:-1;;;;;9596:6:0;74944:10;:21;;:59;;-1:-1:-1;74984:10:0;74969:26;;;;:14;:26;;;;;;;;:34;;:26;:34;74944:59;74922:116;;;;-1:-1:-1;;;74922:116:0;;;;;;;:::i;:::-;68183:20:::1;:30:::0;68073:148::o;61173:135::-;61243:13;61281:19;61274:26;;;;;:::i;34216:164::-;-1:-1:-1;;;;;34337:25:0;;;34313:4;34337:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34216:164::o;10432:201::-;9596:6;;-1:-1:-1;;;;;9596:6:0;49664:10;9743:23;9735:68;;;;-1:-1:-1;;;9735:68:0;;21752:2:1;9735:68:0;;;21734:21:1;;;21771:18;;;21764:30;21830:34;21810:18;;;21803:62;21882:18;;9735:68:0;21550:356:1;9735:68:0;-1:-1:-1;;;;;10521:22:0;::::1;10513:73;;;::::0;-1:-1:-1;;;10513:73:0;;26878:2:1;10513:73:0::1;::::0;::::1;26860:21:1::0;26917:2;26897:18;;;26890:30;26956:34;26936:18;;;26929:62;-1:-1:-1;;;27007:18:1;;;27000:36;27053:19;;10513:73:0::1;26676:402:1::0;10513:73:0::1;10597:28;10616:8;10597:18;:28::i;:::-;10432:201:::0;:::o;68229:136::-;9596:6;;-1:-1:-1;;;;;9596:6:0;74944:10;:21;;:59;;-1:-1:-1;74984:10:0;74969:26;;;;:14;:26;;;;;;;;:34;;:26;:34;74944:59;74922:116;;;;-1:-1:-1;;;74922:116:0;;;;;;;:::i;:::-;68333:14:::1;:24:::0;68229:136::o;35595:273::-;35652:4;35708:7;60839:1;35689:26;;:66;;;;;35742:13;;35732:7;:23;35689:66;:152;;;;-1:-1:-1;;35793:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;35793:43:0;:48;;35595:273::o;28797:1129::-;28864:7;28899;;60839:1;28948:23;28944:915;;29001:13;;28994:4;:20;28990:869;;;29039:14;29056:23;;;:17;:23;;;;;;;-1:-1:-1;;;29145:23:0;;:28;;29141:699;;29664:113;29671:6;29681:1;29671:11;29664:113;;-1:-1:-1;;;29742:6:0;29724:25;;;;:17;:25;;;;;;29664:113;;29141:699;29016:843;28990:869;29887:31;;-1:-1:-1;;;29887:31:0;;;;;;;;;;;74574:260;-1:-1:-1;;;;;74715:22:0;;74660:13;74715:22;;;:13;:22;;;;;;:27;;;;74753:74;;-1:-1:-1;;;;;74789:22:0;;;;;;:13;:22;;;;;;:26;;74814:1;;74789:26;:::i;:::-;74781:34;;74753:74;74574:260;;;:::o;40834:2515::-;40949:27;40979;40998:7;40979:18;:27::i;:::-;40949:57;;41064:4;-1:-1:-1;;;;;41023:45:0;41039:19;-1:-1:-1;;;;;41023:45:0;;41019:86;;41077:28;;-1:-1:-1;;;41077:28:0;;;;;;;;;;;41019:86;41118:22;49664:10;-1:-1:-1;;;;;41144:27:0;;;;:87;;-1:-1:-1;41188:43:0;41205:4;49664:10;34216:164;:::i;41188:43::-;41144:147;;;-1:-1:-1;49664:10:0;41248:20;41260:7;41248:11;:20::i;:::-;-1:-1:-1;;;;;41248:43:0;;41144:147;41118:174;;41310:17;41305:66;;41336:35;;-1:-1:-1;;;41336:35:0;;;;;;;;;;;41305:66;-1:-1:-1;;;;;41386:16:0;;41382:52;;41411:23;;-1:-1:-1;;;41411:23:0;;;;;;;;;;;41382:52;41447:43;41469:4;41475:2;41479:7;41488:1;41447:21;:43::i;:::-;41563:24;;;;:15;:24;;;;;;;;41556:31;;-1:-1:-1;;;;;;41556:31:0;;;-1:-1:-1;;;;;41955:24:0;;;;;:18;:24;;;;;41953:26;;-1:-1:-1;;41953:26:0;;;42024:22;;;;;;;42022:24;;-1:-1:-1;42022:24:0;;;42317:26;;;:17;:26;;;;;-1:-1:-1;;;42405:15:0;23152:3;42405:41;42363:84;;:128;;42317:174;;;42611:46;;:51;;42607:626;;42715:1;42705:11;;42683:19;42838:30;;;:17;:30;;;;;;:35;;42834:384;;42976:13;;42961:11;:28;42957:242;;43123:30;;;;:17;:30;;;;;:52;;;42957:242;42664:569;42607:626;43280:7;43276:2;-1:-1:-1;;;;;43261:27:0;43270:4;-1:-1:-1;;;;;43261:27:0;;;;;;;;;;;40938:2411;;40834:2515;;;:::o;73647:651::-;73728:30;73777:31;73810;73845:16;:14;:16::i;:::-;73776:85;;;;73902:14;:21;-1:-1:-1;;;;;73888:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73888:36:0;-1:-1:-1;73872:52:0;-1:-1:-1;73937:20:0;;73968:323;73991:14;:21;73987:1;:25;73968:323;;;74101:23;74058:7;74066:14;74081:1;74066:17;;;;;;;;:::i;:::-;;;;;;;74058:26;;;;;;;;:::i;:::-;;;;;;;;;:33;:26;;;;;:33;:40;74049:49;;:6;:49;:::i;:::-;:75;;;;:::i;:::-;74034:90;;74158:12;74139:13;74153:1;74139:16;;;;;;;;:::i;:::-;;;;;;:31;;;;;74225:12;74185:7;74193:14;74208:1;74193:17;;;;;;;;:::i;:::-;;;;;;;74185:26;;;;;;;;:::i;:::-;;;;;;;;;;;:36;;;:52;;;;;;;:::i;:::-;;;;;;;;74267:12;74252:11;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;74014:3:0;;-1:-1:-1;74014:3:0;;:::i;:::-;;;73968:323;;;;73765:533;;;73647:651;;;:::o;10793:191::-;10886:6;;;-1:-1:-1;;;;;10903:17:0;;;-1:-1:-1;;;;;;10903:17:0;;;;;;;10936:40;;10886:6;;;10903:17;10886:6;;10936:40;;10867:16;;10936:40;10856:128;10793:191;:::o;35952:104::-;36021:27;36031:2;36035:8;36021:27;;;;;;;;;;;;:9;:27::i;:::-;35952:104;;:::o;30406:153::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;30526:24:0;;;;:17;:24;;;;;;30507:44;;:18;:44::i;65784:369::-;65884:4;65907:13;65926:17;65938:4;65926:11;:17::i;:::-;65906:37;;;65958:9;65954:169;65977:7;65985:5;65977:14;;;;;;;;:::i;:::-;;;;;;;;;;;:21;;:28;;;;65973:1;:32;65954:169;;;66059:5;66031:33;;:7;66039:5;66031:14;;;;;;;;:::i;:::-;;;;;;;;;;;:21;;66053:1;66031:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:33;66027:85;;66092:4;66085:11;;;;;;66027:85;66007:3;;;:::i;:::-;;;65954:169;;;-1:-1:-1;66140:5:0;;65784:369;-1:-1:-1;;;;65784:369:0:o;47046:716::-;47230:88;;-1:-1:-1;;;47230:88:0;;47209:4;;-1:-1:-1;;;;;47230:45:0;;;;;:88;;49664:10;;47297:4;;47303:7;;47312:5;;47230:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47230:88:0;;;;;;;;-1:-1:-1;;47230:88:0;;;;;;;;;;;;:::i;:::-;;;47226:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47513:6;:13;47530:1;47513:18;47509:235;;47559:40;;-1:-1:-1;;;47559:40:0;;;;;;;;;;;47509:235;47702:6;47696:13;47687:6;47683:2;47679:15;47672:38;47226:529;-1:-1:-1;;;;;;47389:64:0;-1:-1:-1;;;47389:64:0;;-1:-1:-1;47046:716:0;;;;;;:::o;31062:158::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;31165:47:0;31184:27;31203:7;31184:18;:27::i;:::-;31165:18;:47::i;68513:231::-;68710:24;;-1:-1:-1;;27980:2:1;27976:15;;;27972:53;68710:24:0;;;27960:66:1;68639:4:0;;68668:68;;68687:5;;68694:4;;28042:12:1;;68710:24:0;;;;;;;;;;;;68700:35;;;;;;68668:18;:68::i;:::-;68661:75;68513:231;-1:-1:-1;;;;68513:231:0:o;67415:616::-;67500:4;67522:22;67547:9;:13;67557:2;67547:13;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;67547:13:0;67522:38;;;;;;;;;-1:-1:-1;;;;;67522:38:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67522:38:0;;;;;;;;;;;;-1:-1:-1;67522:38:0;67577:27;:56;;;;-1:-1:-1;67608:8:0;;;;-1:-1:-1;;;;;67608:25:0;59037:1;67608:25;67577:56;67573:426;;;-1:-1:-1;67657:4:0;;67415:616;-1:-1:-1;;67415:616:0:o;67573:426::-;67683:10;;-1:-1:-1;;;;;67683:27:0;59037:1;67683:27;:58;;;;;67733:5;:8;;;-1:-1:-1;;;;;67714:27:0;:15;:27;;67683:58;67679:320;;;-1:-1:-1;67765:4:0;;67415:616;-1:-1:-1;;67415:616:0:o;67679:320::-;67805:15;67791:5;:10;;;-1:-1:-1;;;;;67791:29:0;;;:58;;;;-1:-1:-1;67824:8:0;;;;-1:-1:-1;;;;;67824:25:0;59037:1;67824:25;67791:58;67787:212;;;-1:-1:-1;67873:4:0;;67415:616;-1:-1:-1;;67415:616:0:o;67787:212::-;67913:15;67899:5;:10;;;-1:-1:-1;;;;;67899:29:0;;;:60;;;;;67951:5;:8;;;-1:-1:-1;;;;;67932:27:0;:15;:27;;67899:60;67895:104;;;-1:-1:-1;67983:4:0;;67415:616;-1:-1:-1;;67415:616:0:o;67895:104::-;-1:-1:-1;68018:5:0;;67415:616;-1:-1:-1;;67415:616:0:o;61781:146::-;61869:13;61907:12;61900:19;;;;;:::i;49788:1959::-;50259:4;50253:11;;50266:3;50249:21;;50344:17;;;;51041:11;;;50920:5;51173:2;51187;51177:13;;51169:22;51041:11;51156:36;51228:2;51218:13;;50811:682;51247:4;50811:682;;;51422:1;51417:3;51413:11;51406:18;;51473:2;51467:4;51463:13;51459:2;51455:22;51450:3;51442:36;51343:2;51333:13;;50811:682;;;-1:-1:-1;51535:13:0;;;-1:-1:-1;;51650:12:0;;;51710:19;;;51650:12;49788:1959;-1:-1:-1;49788:1959:0:o;66557:817::-;66768:20;66790:12;66806:17;66818:4;66806:11;:17::i;:::-;66767:56;;;;66834:9;66854;66874:16;66905:7;66901:466;;;66938:1;66934:5;;66929:427;66945:8;66941:1;:12;66929:427;;;-1:-1:-1;67025:1:0;;-1:-1:-1;66993:4:0;67016:266;67032:7;67040:12;67032:21;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;:35;;;;67028:1;:39;67016:266;;;67136:23;67151:8;67136:12;:23;:::i;:::-;67101:7;67109:12;67101:21;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;67130:1;67101:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:58;67097:166;;-1:-1:-1;67202:5:0;67234;;67097:166;67069:3;;;:::i;:::-;;;67016:266;;;67308:11;67300:40;;;;-1:-1:-1;;;67300:40:0;;28267:2:1;67300:40:0;;;28249:21:1;28306:2;28286:18;;;28279:30;-1:-1:-1;;;28325:18:1;;;28318:46;28381:18;;67300:40:0;28065:340:1;67300:40:0;66955:3;;;:::i;:::-;;;66929:427;;;66756:618;;;;;66557:817;;;;:::o;71695:1944::-;71794:31;71840;;;;72015:136;72031:7;:14;72027:18;;72015:136;;;72071:7;72079:1;72071:10;;;;;;;;:::i;:::-;;;;;;;;;:17;:10;;;;;:17;:24;:29;72067:73;;72121:3;;;;:::i;:::-;;;;72067:73;72047:3;;;:::i;:::-;;;72015:136;;;72163:28;72207:1;-1:-1:-1;;;;;72194:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72194:15:0;;72163:46;;72226:12;:19;72249:1;72226:24;72222:83;;-1:-1:-1;72275:14:0;;72291:1;;-1:-1:-1;71695:1944:0;-1:-1:-1;;;71695:1944:0:o;72222:83::-;72321:1;72317:5;;72342:1;72338:5;;72333:205;72349:7;:14;72345:18;;72333:205;;;72389:7;72397:1;72389:10;;;;;;;;:::i;:::-;;;;;;;;;:17;:10;;;;;:17;:24;:29;72385:142;;72464:7;72472:1;72464:10;;;;;;;;:::i;:::-;;;;;;;;;;;:17;;:24;;;;72439:12;72452:1;72439:15;;;;;;;;:::i;:::-;:50;;;;:15;;;;;;;;;;;:50;72508:3;;;:::i;:::-;;;72385:142;72365:3;;;:::i;:::-;;;72333:205;;;72603:1;72581:12;:19;:23;72577:107;;;72621:51;72631:12;72645:1;72670;72648:12;:19;:23;;;;:::i;:::-;72621:9;:51::i;:::-;72731:12;;72778:3;;72731:44;;58765:2;;72731:12;;:44;:::i;:::-;:50;;;;:::i;:::-;72727:54;;;-1:-1:-1;72796:6:0;;:26;;;;-1:-1:-1;72806:12:0;;;;:16;;72796:26;72792:64;;;72843:1;72839:5;;72792:64;72969:1;;-1:-1:-1;72969:1:0;;-1:-1:-1;72997:199:0;73013:12;:19;73009:1;:23;72997:199;;;73081:12;73094:1;73081:15;;;;;;;;:::i;:::-;;;;;;;73054:42;;;;;;;:::i;:::-;;;73142:1;73115:23;:28;73111:74;73164:5;73111:74;73034:3;;;:::i;:::-;;;72997:199;;;73239:5;:1;73243;73239:5;:::i;:::-;-1:-1:-1;;;;;73225:20:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73225:20:0;;73208:37;;73256:18;73295:1;73277:12;73290:1;73277:15;;;;;;;;:::i;:::-;;;;;;;:19;;;;:::i;:::-;73256:40;-1:-1:-1;73351:3:0;;;:::i;:::-;;;73369:1;73365:5;;73390:1;73386:5;;73381:251;73397:7;:14;73393:18;;73381:251;;;73433:52;;;73464:5;73433:52;73530:11;73503:38;;:7;73511:1;73503:10;;;;;;;;:::i;:::-;;;;;;;;;;;:17;;:24;;;;:38;73499:122;;;73582:1;73562:14;73577:1;73562:17;;;;;;;;:::i;:::-;;;;;;;;;;:21;73602:3;;;:::i;:::-;;;73499:122;73413:3;;;:::i;:::-;;;73381:251;;;71888:1751;;;;;71695:1944;;:::o;36429:2236::-;36552:20;36575:13;-1:-1:-1;;;;;36603:16:0;;36599:48;;36628:19;;-1:-1:-1;;;36628:19:0;;;;;;;;;;;36599:48;36662:8;36674:1;36662:13;36658:44;;36684:18;;-1:-1:-1;;;36684:18:0;;;;;;;;;;;36658:44;36715:61;36745:1;36749:2;36753:12;36767:8;36715:21;:61::i;:::-;-1:-1:-1;;;;;37251:22:0;;;;;;:18;:22;;;;22635:2;37251:22;;;:70;;37289:31;37277:44;;37251:70;;;37564:31;;;:17;:31;;;;;37657:15;23152:3;37657:41;37615:84;;-1:-1:-1;37735:13:0;;23415:3;37720:56;37615:162;37564:213;;:31;;37858:23;;;;37902:14;:19;37898:635;;37942:313;37973:38;;37998:12;;-1:-1:-1;;;;;37973:38:0;;;37990:1;;37973:38;;37990:1;;37973:38;38039:69;38078:1;38082:2;38086:14;;;;;;38102:5;38039:30;:69::i;:::-;38034:174;;38144:40;;-1:-1:-1;;;38144:40:0;;;;;;;;;;;38034:174;38250:3;38235:12;:18;37942:313;;38336:12;38319:13;;:29;38315:43;;38350:8;;;38315:43;37898:635;;;38399:119;38430:40;;38455:14;;;;;-1:-1:-1;;;;;38430:40:0;;;38447:1;;38430:40;;38447:1;;38430:40;38513:3;38498:12;:18;38399:119;;37898:635;-1:-1:-1;38547:13:0;:28;;;38597:60;;38630:2;38634:12;38648:8;38597:60;:::i;30020:295::-;-1:-1:-1;;;;;;;;;;;;;30130:41:0;;;;23152:3;30216:32;;;-1:-1:-1;;;;;30182:67:0;-1:-1:-1;;;30182:67:0;-1:-1:-1;;;30279:23:0;;;:28;;-1:-1:-1;;;30260:47:0;-1:-1:-1;30020:295:0:o;3344:190::-;3469:4;3522;3493:25;3506:5;3513:4;3493:12;:25::i;:::-;:33;;3344:190;-1:-1:-1;;;;3344:190:0:o;76227:828::-;76356:4;76383:5;76402:6;;;76399:44;;76425:7;;76227:828;;;:::o;76399:44::-;76455:13;76471:3;76507:1;76491:12;76499:4;76491:5;:12;:::i;:::-;76490:18;;;;:::i;:::-;76483:25;;:4;:25;:::i;:::-;76471:39;;;;;;;;:::i;:::-;;;;;;;76455:55;;;;76521:375;76533:1;76528;:6;76521:375;;76551:70;76576:5;76558:3;76570:1;76558:15;;;;;;;;:::i;:::-;;;;;;;:23;;;76551:70;;;76602:3;;;:::i;:::-;;;76551:70;;;76662:5;76644:3;76656:1;76644:15;;;;;;;;:::i;:::-;;;;;;;:23;;;76637:70;;;76688:3;;;:::i;:::-;;;76637:70;;;76732:1;76727;:6;76723:162;;76792:3;76804:1;76792:15;;;;;;;;:::i;:::-;;;;;;;76809:3;76821:1;76809:15;;;;;;;;:::i;:::-;;;;;;;76755:3;76767:1;76755:15;;;;;;;;:::i;:::-;;;;;;76772:3;76784:1;76772:15;;;;;;;;:::i;:::-;76754:71;;;;76772:15;;;;;;;;;76754:71;;;;;76844:3;;;:::i;:::-;;-1:-1:-1;76866:3:0;;;:::i;:::-;;;76723:162;76521:375;;;76917:1;76910:4;:8;76906:64;;;76935:23;76945:3;76950:4;76956:1;76935:9;:23::i;:::-;76990:5;76986:1;:9;76982:66;;;77012:24;77022:3;77027:1;77030:5;77012:9;:24::i;:::-;76333:722;;;76227:828;;;:::o;3895:675::-;3978:7;4021:4;3978:7;4036:497;4060:5;:12;4056:1;:16;4036:497;;;4094:20;4117:5;4123:1;4117:8;;;;;;;;:::i;:::-;;;;;;;4094:31;;4160:12;4144;:28;4140:382;;4646:13;4696:15;;;4732:4;4725:15;;;4779:4;4763:21;;4272:57;;4140:382;;;4646:13;4696:15;;;4732:4;4725:15;;;4779:4;4763:21;;4449:57;;4140:382;-1:-1:-1;4074:3:0;;;;:::i;:::-;;;;4036:497;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:355:1;216:2;198:21;;;255:2;235:18;;;228:30;294:33;289:2;274:18;;267:61;360:2;345:18;;14:355::o;374:131::-;-1:-1:-1;;;;;;448:32:1;;438:43;;428:71;;495:1;492;485:12;510:245;568:6;621:2;609:9;600:7;596:23;592:32;589:52;;;637:1;634;627:12;589:52;676:9;663:23;695:30;719:5;695:30;:::i;952:258::-;1024:1;1034:113;1048:6;1045:1;1042:13;1034:113;;;1124:11;;;1118:18;1105:11;;;1098:39;1070:2;1063:10;1034:113;;;1165:6;1162:1;1159:13;1156:48;;;-1:-1:-1;;1200:1:1;1182:16;;1175:27;952:258::o;1215:::-;1257:3;1295:5;1289:12;1322:6;1317:3;1310:19;1338:63;1394:6;1387:4;1382:3;1378:14;1371:4;1364:5;1360:16;1338:63;:::i;:::-;1455:2;1434:15;-1:-1:-1;;1430:29:1;1421:39;;;;1462:4;1417:50;;1215:258;-1:-1:-1;;1215:258:1:o;1478:220::-;1627:2;1616:9;1609:21;1590:4;1647:45;1688:2;1677:9;1673:18;1665:6;1647:45;:::i;1703:180::-;1762:6;1815:2;1803:9;1794:7;1790:23;1786:32;1783:52;;;1831:1;1828;1821:12;1783:52;-1:-1:-1;1854:23:1;;1703:180;-1:-1:-1;1703:180:1:o;2096:173::-;2164:20;;-1:-1:-1;;;;;2213:31:1;;2203:42;;2193:70;;2259:1;2256;2249:12;2193:70;2096:173;;;:::o;2274:254::-;2342:6;2350;2403:2;2391:9;2382:7;2378:23;2374:32;2371:52;;;2419:1;2416;2409:12;2371:52;2442:29;2461:9;2442:29;:::i;:::-;2432:39;2518:2;2503:18;;;;2490:32;;-1:-1:-1;;;2274:254:1:o;2722:186::-;2781:6;2834:2;2822:9;2813:7;2809:23;2805:32;2802:52;;;2850:1;2847;2840:12;2802:52;2873:29;2892:9;2873:29;:::i;3095:328::-;3172:6;3180;3188;3241:2;3229:9;3220:7;3216:23;3212:32;3209:52;;;3257:1;3254;3247:12;3209:52;3280:29;3299:9;3280:29;:::i;:::-;3270:39;;3328:38;3362:2;3351:9;3347:18;3328:38;:::i;:::-;3318:48;;3413:2;3402:9;3398:18;3385:32;3375:42;;3095:328;;;;;:::o;3824:592::-;3895:6;3903;3956:2;3944:9;3935:7;3931:23;3927:32;3924:52;;;3972:1;3969;3962:12;3924:52;4012:9;3999:23;-1:-1:-1;;;;;4082:2:1;4074:6;4071:14;4068:34;;;4098:1;4095;4088:12;4068:34;4136:6;4125:9;4121:22;4111:32;;4181:7;4174:4;4170:2;4166:13;4162:27;4152:55;;4203:1;4200;4193:12;4152:55;4243:2;4230:16;4269:2;4261:6;4258:14;4255:34;;;4285:1;4282;4275:12;4255:34;4330:7;4325:2;4316:6;4312:2;4308:15;4304:24;4301:37;4298:57;;;4351:1;4348;4341:12;4298:57;4382:2;4374:11;;;;;4404:6;;-1:-1:-1;3824:592:1;;-1:-1:-1;;;;3824:592:1:o;4421:127::-;4482:10;4477:3;4473:20;4470:1;4463:31;4513:4;4510:1;4503:15;4537:4;4534:1;4527:15;4553:275;4624:2;4618:9;4689:2;4670:13;;-1:-1:-1;;4666:27:1;4654:40;;-1:-1:-1;;;;;4709:34:1;;4745:22;;;4706:62;4703:88;;;4771:18;;:::i;:::-;4807:2;4800:22;4553:275;;-1:-1:-1;4553:275:1:o;4833:183::-;4893:4;-1:-1:-1;;;;;4918:6:1;4915:30;4912:56;;;4948:18;;:::i;:::-;-1:-1:-1;4993:1:1;4989:14;5005:4;4985:25;;4833:183::o;5021:891::-;5105:6;5136:2;5179;5167:9;5158:7;5154:23;5150:32;5147:52;;;5195:1;5192;5185:12;5147:52;5235:9;5222:23;-1:-1:-1;;;;;5260:6:1;5257:30;5254:50;;;5300:1;5297;5290:12;5254:50;5323:22;;5376:4;5368:13;;5364:27;-1:-1:-1;5354:55:1;;5405:1;5402;5395:12;5354:55;5441:2;5428:16;5464:60;5480:43;5520:2;5480:43;:::i;:::-;5464:60;:::i;:::-;5558:15;;;5640:1;5636:10;;;;5628:19;;5624:28;;;5589:12;;;;5664:19;;;5661:39;;;5696:1;5693;5686:12;5661:39;5720:11;;;;5740:142;5756:6;5751:3;5748:15;5740:142;;;5822:17;;5810:30;;5773:12;;;;5860;;;;5740:142;;;5901:5;5021:891;-1:-1:-1;;;;;;;5021:891:1:o;6200:722::-;6433:2;6485:21;;;6555:13;;6458:18;;;6577:22;;;6404:4;;6433:2;6656:15;;;;6630:2;6615:18;;;6404:4;6699:197;6713:6;6710:1;6707:13;6699:197;;;6762:52;6810:3;6801:6;6795:13;6001:12;;-1:-1:-1;;;;;5997:38:1;5985:51;;6089:4;6078:16;;;6072:23;-1:-1:-1;;;;;6068:48:1;6052:14;;;6045:72;6180:4;6169:16;;;6163:23;6156:31;6149:39;6133:14;;6126:63;5917:278;6762:52;6871:15;;;;6843:4;6834:14;;;;;6735:1;6728:9;6699:197;;6927:447;6979:3;7017:5;7011:12;7044:6;7039:3;7032:19;7070:4;7099:2;7094:3;7090:12;7083:19;;7136:2;7129:5;7125:14;7157:1;7167:182;7181:6;7178:1;7175:13;7167:182;;;7246:13;;7261:6;7242:26;7230:39;;7289:12;;;;7324:15;;;;7203:1;7196:9;7167:182;;;-1:-1:-1;7365:3:1;;6927:447;-1:-1:-1;;;;;6927:447:1:o;7379:1079::-;7587:4;7616:2;7656;7645:9;7641:18;7686:2;7675:9;7668:21;7709:6;7744;7738:13;7775:6;7767;7760:22;7801:2;7791:12;;7834:2;7823:9;7819:18;7812:25;;7896:2;7886:6;7883:1;7879:14;7868:9;7864:30;7860:39;7934:2;7926:6;7922:15;7955:1;7965:464;7979:6;7976:1;7973:13;7965:464;;;8044:22;;;-1:-1:-1;;8040:36:1;8028:49;;8100:13;;8145:9;;-1:-1:-1;;;;;8141:35:1;8126:51;;8216:11;;8210:18;8248:15;;;8241:27;;;8291:58;8333:15;;;8210:18;8291:58;:::i;:::-;8407:12;;;;8281:68;-1:-1:-1;;8372:15:1;;;;8001:1;7994:9;7965:464;;;-1:-1:-1;8446:6:1;;7379:1079;-1:-1:-1;;;;;;;;7379:1079:1:o;8656:329::-;8861:6;8850:9;8843:25;8904:2;8899;8888:9;8884:18;8877:30;8824:4;8924:55;8975:2;8964:9;8960:18;8952:6;8924:55;:::i;9175:156::-;9241:20;;9301:4;9290:16;;9280:27;;9270:55;;9321:1;9318;9311:12;9336:182;9393:6;9446:2;9434:9;9425:7;9421:23;9417:32;9414:52;;;9462:1;9459;9452:12;9414:52;9485:27;9502:9;9485:27;:::i;9523:367::-;9586:8;9596:6;9650:3;9643:4;9635:6;9631:17;9627:27;9617:55;;9668:1;9665;9658:12;9617:55;-1:-1:-1;9691:20:1;;-1:-1:-1;;;;;9723:30:1;;9720:50;;;9766:1;9763;9756:12;9720:50;9803:4;9795:6;9791:17;9779:29;;9863:3;9856:4;9846:6;9843:1;9839:14;9831:6;9827:27;9823:38;9820:47;9817:67;;;9880:1;9877;9870:12;9817:67;9523:367;;;;;:::o;9895:437::-;9981:6;9989;10042:2;10030:9;10021:7;10017:23;10013:32;10010:52;;;10058:1;10055;10048:12;10010:52;10098:9;10085:23;-1:-1:-1;;;;;10123:6:1;10120:30;10117:50;;;10163:1;10160;10153:12;10117:50;10202:70;10264:7;10255:6;10244:9;10240:22;10202:70;:::i;:::-;10291:8;;10176:96;;-1:-1:-1;9895:437:1;-1:-1:-1;;;;9895:437:1:o;10337:1144::-;10527:4;10556:2;10596;10585:9;10581:18;10626:2;10615:9;10608:21;10649:6;10684;10678:13;10715:6;10707;10700:22;10741:2;10731:12;;10774:2;10763:9;10759:18;10752:25;;10836:2;10826:6;10823:1;10819:14;10808:9;10804:30;10800:39;10874:2;10866:6;10862:15;10895:1;10905:547;10919:6;10916:1;10913:13;10905:547;;;10984:22;;;-1:-1:-1;;10980:36:1;10968:49;;11040:13;;11108:9;;11093:25;;11165:11;;;11159:18;-1:-1:-1;;;;;11155:44:1;11138:15;;;11131:69;11239:11;;11233:18;11076:4;11271:15;;;11264:27;;;11314:58;11356:15;;;11233:18;11314:58;:::i;:::-;11430:12;;;;11304:68;-1:-1:-1;;;11395:15:1;;;;10941:1;10934:9;10905:547;;11486:632;11657:2;11709:21;;;11779:13;;11682:18;;;11801:22;;;11628:4;;11657:2;11880:15;;;;11854:2;11839:18;;;11628:4;11923:169;11937:6;11934:1;11931:13;11923:169;;;11998:13;;11986:26;;12067:15;;;;12032:12;;;;11959:1;11952:9;11923:169;;12123:322;12200:6;12208;12216;12269:2;12257:9;12248:7;12244:23;12240:32;12237:52;;;12285:1;12282;12275:12;12237:52;12308:29;12327:9;12308:29;:::i;:::-;12298:39;12384:2;12369:18;;12356:32;;-1:-1:-1;12435:2:1;12420:18;;;12407:32;;12123:322;-1:-1:-1;;;12123:322:1:o;12450:347::-;12515:6;12523;12576:2;12564:9;12555:7;12551:23;12547:32;12544:52;;;12592:1;12589;12582:12;12544:52;12615:29;12634:9;12615:29;:::i;:::-;12605:39;;12694:2;12683:9;12679:18;12666:32;12741:5;12734:13;12727:21;12720:5;12717:32;12707:60;;12763:1;12760;12753:12;12707:60;12786:5;12776:15;;;12450:347;;;;;:::o;12802:159::-;12869:20;;12929:6;12918:18;;12908:29;;12898:57;;12951:1;12948;12941:12;12966:895;13049:6;13080:2;13123;13111:9;13102:7;13098:23;13094:32;13091:52;;;13139:1;13136;13129:12;13091:52;13179:9;13166:23;-1:-1:-1;;;;;13204:6:1;13201:30;13198:50;;;13244:1;13241;13234:12;13198:50;13267:22;;13320:4;13312:13;;13308:27;-1:-1:-1;13298:55:1;;13349:1;13346;13339:12;13298:55;13385:2;13372:16;13408:60;13424:43;13464:2;13424:43;:::i;13408:60::-;13502:15;;;13584:1;13580:10;;;;13572:19;;13568:28;;;13533:12;;;;13608:19;;;13605:39;;;13640:1;13637;13630:12;13605:39;13664:11;;;;13684:147;13700:6;13695:3;13692:15;13684:147;;;13766:22;13784:3;13766:22;:::i;:::-;13754:35;;13717:12;;;;13809;;;;13684:147;;14190:980;14285:6;14293;14301;14309;14362:3;14350:9;14341:7;14337:23;14333:33;14330:53;;;14379:1;14376;14369:12;14330:53;14402:29;14421:9;14402:29;:::i;:::-;14392:39;;14450:2;14471:38;14505:2;14494:9;14490:18;14471:38;:::i;:::-;14461:48;;14556:2;14545:9;14541:18;14528:32;14518:42;;14611:2;14600:9;14596:18;14583:32;-1:-1:-1;;;;;14675:2:1;14667:6;14664:14;14661:34;;;14691:1;14688;14681:12;14661:34;14729:6;14718:9;14714:22;14704:32;;14774:7;14767:4;14763:2;14759:13;14755:27;14745:55;;14796:1;14793;14786:12;14745:55;14832:2;14819:16;14854:2;14850;14847:10;14844:36;;;14860:18;;:::i;:::-;14902:53;14945:2;14926:13;;-1:-1:-1;;14922:27:1;14918:36;;14902:53;:::i;:::-;14889:66;;14978:2;14971:5;14964:17;15018:7;15013:2;15008;15004;15000:11;14996:20;14993:33;14990:53;;;15039:1;15036;15029:12;14990:53;15094:2;15089;15085;15081:11;15076:2;15069:5;15065:14;15052:45;15138:1;15133:2;15128;15121:5;15117:14;15113:23;15106:34;;15159:5;15149:15;;;;;14190:980;;;;;;;:::o;15175:265::-;6001:12;;-1:-1:-1;;;;;5997:38:1;5985:51;;6089:4;6078:16;;;6072:23;-1:-1:-1;;;;;6068:48:1;6052:14;;;6045:72;6180:4;6169:16;;;6163:23;6156:31;6149:39;6133:14;;;6126:63;15371:2;15356:18;;15383:51;5917:278;15445:577;15545:6;15553;15561;15569;15622:2;15610:9;15601:7;15597:23;15593:32;15590:52;;;15638:1;15635;15628:12;15590:52;15678:9;15665:23;-1:-1:-1;;;;;15703:6:1;15700:30;15697:50;;;15743:1;15740;15733:12;15697:50;15782:70;15844:7;15835:6;15824:9;15820:22;15782:70;:::i;:::-;15871:8;;-1:-1:-1;15756:96:1;-1:-1:-1;15925:36:1;;-1:-1:-1;15957:2:1;15942:18;;15925:36;:::i;:::-;15915:46;;15980:36;16012:2;16001:9;15997:18;15980:36;:::i;:::-;15970:46;;15445:577;;;;;;;:::o;16468:260::-;16536:6;16544;16597:2;16585:9;16576:7;16572:23;16568:32;16565:52;;;16613:1;16610;16603:12;16565:52;16636:29;16655:9;16636:29;:::i;:::-;16626:39;;16684:38;16718:2;16707:9;16703:18;16684:38;:::i;:::-;16674:48;;16468:260;;;;;:::o;16733:380::-;16812:1;16808:12;;;;16855;;;16876:61;;16930:4;16922:6;16918:17;16908:27;;16876:61;16983:2;16975:6;16972:14;16952:18;16949:38;16946:161;;17029:10;17024:3;17020:20;17017:1;17010:31;17064:4;17061:1;17054:15;17092:4;17089:1;17082:15;16946:161;;16733:380;;;:::o;17118:330::-;17320:2;17302:21;;;17359:1;17339:18;;;17332:29;-1:-1:-1;;;17392:2:1;17377:18;;17370:37;17439:2;17424:18;;17118:330::o;18694:127::-;18755:10;18750:3;18746:20;18743:1;18736:31;18786:4;18783:1;18776:15;18810:4;18807:1;18800:15;19527:127;19588:10;19583:3;19579:20;19576:1;19569:31;19619:4;19616:1;19609:15;19643:4;19640:1;19633:15;19659:125;19699:4;19727:1;19724;19721:8;19718:34;;;19732:18;;:::i;:::-;-1:-1:-1;19769:9:1;;19659:125::o;19789:168::-;19829:7;19895:1;19891;19887:6;19883:14;19880:1;19877:21;19872:1;19865:9;19858:17;19854:45;19851:71;;;19902:18;;:::i;:::-;-1:-1:-1;19942:9:1;;19789:168::o;19962:127::-;20023:10;20018:3;20014:20;20011:1;20004:31;20054:4;20051:1;20044:15;20078:4;20075:1;20068:15;20094:120;20134:1;20160;20150:35;;20165:18;;:::i;:::-;-1:-1:-1;20199:9:1;;20094:120::o;20927:135::-;20966:3;20987:17;;;20984:43;;21007:18;;:::i;:::-;-1:-1:-1;21054:1:1;21043:13;;20927:135::o;21067:136::-;21106:3;21134:5;21124:39;;21143:18;;:::i;:::-;-1:-1:-1;;;21179:18:1;;21067:136::o;21911:204::-;21949:3;21985:4;21982:1;21978:12;22017:4;22014:1;22010:12;22052:3;22046:4;22042:14;22037:3;22034:23;22031:49;;;22060:18;;:::i;:::-;22096:13;;21911:204;-1:-1:-1;;;21911:204:1:o;23222:224::-;23261:3;23289:6;23322:2;23319:1;23315:10;23352:2;23349:1;23345:10;23383:3;23379:2;23375:12;23370:3;23367:21;23364:47;;;23391:18;;:::i;:::-;23427:13;;23222:224;-1:-1:-1;;;;23222:224:1:o;23451:127::-;23512:10;23507:3;23503:20;23500:1;23493:31;23543:4;23540:1;23533:15;23567:4;23564:1;23557:15;23937:128;23977:3;24008:1;24004:6;24001:1;23998:13;23995:39;;;24014:18;;:::i;:::-;-1:-1:-1;24050:9:1;;23937:128::o;24775:217::-;24814:4;24843:6;24899:10;;;;24869;;24921:12;;;24918:38;;;24936:18;;:::i;:::-;24973:13;;24775:217;-1:-1:-1;;;24775:217:1:o;24997:175::-;25034:3;25078:4;25071:5;25067:16;25107:4;25098:7;25095:17;25092:43;;25115:18;;:::i;:::-;25164:1;25151:15;;24997:175;-1:-1:-1;;24997:175:1:o;25177:637::-;25457:3;25495:6;25489:13;25511:53;25557:6;25552:3;25545:4;25537:6;25533:17;25511:53;:::i;:::-;25627:13;;25586:16;;;;25649:57;25627:13;25586:16;25683:4;25671:17;;25649:57;:::i;:::-;-1:-1:-1;;;25728:20:1;;25757:22;;;25806:1;25795:13;;25177:637;-1:-1:-1;;;;25177:637:1:o;26169:184::-;26227:6;26280:2;26268:9;26259:7;26255:23;26251:32;26248:52;;;26296:1;26293;26286:12;26248:52;26319:28;26337:9;26319:28;:::i;26358:127::-;26419:10;26414:3;26410:20;26407:1;26400:31;26450:4;26447:1;26440:15;26474:4;26471:1;26464:15;26490:181;26528:3;26572:6;26565:5;26561:18;26598:7;26588:41;;26609:18;;:::i;:::-;-1:-1:-1;;26645:20:1;;26490:181;-1:-1:-1;;26490:181:1:o;27083:489::-;-1:-1:-1;;;;;27352:15:1;;;27334:34;;27404:15;;27399:2;27384:18;;27377:43;27451:2;27436:18;;27429:34;;;27499:3;27494:2;27479:18;;27472:31;;;27277:4;;27520:46;;27546:19;;27538:6;27520:46;:::i;:::-;27512:54;27083:489;-1:-1:-1;;;;;;27083:489:1:o;27577:249::-;27646:6;27699:2;27687:9;27678:7;27674:23;27670:32;27667:52;;;27715:1;27712;27705:12;27667:52;27747:9;27741:16;27766:30;27790:5;27766:30;:::i;28410:258::-;28449:7;28481:6;28514:2;28511:1;28507:10;28544:2;28541:1;28537:10;28600:3;28596:2;28592:12;28587:3;28584:21;28577:3;28570:11;28563:19;28559:47;28556:73;;;28609:18;;:::i;:::-;28649:13;;28410:258;-1:-1:-1;;;;28410:258:1:o;28673:187::-;28712:1;28738:6;28771:2;28768:1;28764:10;28793:3;28783:37;;28800:18;;:::i;:::-;28838:10;;28834:20;;;;;28673:187;-1:-1:-1;;28673:187:1:o
Swarm Source
ipfs://2eddc70254bc663d3c41fcc6993ea43f507e184e308f6662aa693e467d6d864c
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.