ERC-721
Overview
Max Total Supply
1,482 BLU3PRINTS
Holders
1,102
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 BLU3PRINTSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Blueprints
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-03 */ // File: contracts/AnonymiceLibrary.sol pragma solidity ^0.8.0; library AnonymiceLibrary { string internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ""; // load the table into memory string memory table = TABLE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for { } lt(dataPtr, endPtr) { } { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(input, 0x3F)))) ) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { 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); } function parseInt(string memory _a) internal pure returns (uint8 _parsedInt) { bytes memory bresult = bytes(_a); uint8 mint = 0; for (uint8 i = 0; i < bresult.length; i++) { if ( (uint8(uint8(bresult[i])) >= 48) && (uint8(uint8(bresult[i])) <= 57) ) { mint *= 10; mint += uint8(bresult[i]) - 48; } } return mint; } function substring( string memory str, uint256 startIndex, uint256 endIndex ) internal pure returns (string memory) { bytes memory strBytes = bytes(str); bytes memory result = new bytes(endIndex - startIndex); for (uint256 i = startIndex; i < endIndex; i++) { result[i - startIndex] = strBytes[i]; } return string(result); } function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } } // File: contracts/interfaces/IBlueprintsData.sol /// @title Interface for BlueprintsData pragma solidity ^0.8.0; interface IBlueprintsData { function partialBlueprintsCode() external view returns (string memory); } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts v4.4.1 (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. */ 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 Merklee 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 = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } } // 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/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: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // 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; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @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) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _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 { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @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`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * 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 ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a 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 _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/Blueprints.sol // contracts/Blueprints.sol pragma solidity ^0.8.0; contract Blueprints is ERC721Enumerable, Ownable { /* _ _ _ _ _ _ _ _ _ _ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ ( B | L | U | 3 | P | R | I | N | T | S ) \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ credit to mouse dev and 0xinuarashi for making amazing on chain project with Anonymice that was used as the basis for Filaments, Axons, and this contract */ using AnonymiceLibrary for uint8; bytes32 public immutable dayOneMerkleRoot; bytes32 public immutable eightsMerkleRoot; bytes32 public immutable sevensMerkleRoot; // Data contract address public blueprintsData; struct Trait { string traitName; string traitType; } //Mappings mapping(uint256 => Trait[]) public traitTypes; mapping(string => bool) hashToMinted; mapping(uint256 => string) internal tokenIdToHash; mapping(uint256 => bool) internal tokenIdToLandscape; //uint256s uint256 MAX_SUPPLY = 1489; uint256 SEED_NONCE = 0; //minting flag bool public MINTING_LIVE = false; uint256 public BLOCKS_IN_A_DAY = 6400; uint256 public mintStartBlock = 0; bool public didShuffleGroups = false; uint256[] public groups = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29]; //uint arrays uint16[][16] TIERS; //allowlist mapping (address => bool) public addressToMinted; mapping (address => bool) public communityMints; uint256 communityCounter = 0; uint256 ownerCounter = 0; uint256 publicCounter = 0; //p5js url string p5jsUrl = 'https%3A%2F%2Fcdnjs.cloudflare.com%2Fajax%2Flibs%2Fp5.js%2F1.4.0%2Fp5.js'; string p5jsIntegrity = 'sha256-maU2GxaUCz5WChkAGR40nt9sbWRPEfF8qo%2FprxhoKPQ%3D'; string imageUrl = 'https://axons.art/api/blu3prints/image/'; string externalUrl = 'https://ipfs.io/ipfs/QmNVdU7qTpZzm7Es2ZQ1ShmWDKQmJFAr4dsz5qZRovCozS?x='; string otherTraits = ''; constructor(address _blueprintsData, bytes32 _dayOneMerkleRoot, bytes32 _eightsMerkleRoot, bytes32 _sevensMerkleRoot) ERC721("BLU3PRINTS", "BLU3PRINTS") { blueprintsData = _blueprintsData; dayOneMerkleRoot = _dayOneMerkleRoot; eightsMerkleRoot = _eightsMerkleRoot; sevensMerkleRoot = _sevensMerkleRoot; //Declare all the rarity tiers // Palette TIERS[0] = [900,900,900,800,300,300,300,700,100,100,400,100,3600,600]; // Form TIERS[1] = [50, 300, 1000, 8650]; // blossom, axon, spiral, normal // Size TIERS[2] = [100, 3000, 5000, 1000, 900]; // micro, mini, normal, mega, ultra // Scale TIERS[3] = [100, 800, 4100, 5000]; // Strength TIERS[4] = [100, 400, 1300, 2100, 6100]; // Twist TIERS[5] = [1250, 2000, 3250, 3500]; // Spacing TIERS[6] = [100, 500, 9400]; // Special Sizing TIERS[7] = [1000,400,400,400,400,7400]; // uniform, size grads, normal // Rigid TIERS[8] = [3000, 7000]; // Color Gradient TIERS[9] = [1000,9000]; // Lonely TIERS[10] = [100,9900]; // No collisions TIERS[11] = [25,9975]; // Spine TIERS[12] = [300,9700]; // Lines TIERS[13] = [100,100,100,200,1000,2000,50,6450]; // Side borders TIERS[14] = [3500,6500]; // Tightly packed TIERS[15] = [900,9100]; } /* __ __ _ _ _ ___ _ _ | \/ (_)_ _| |_(_)_ _ __ _ | __| _ _ _ __| |_(_)___ _ _ ___ | |\/| | | ' \ _| | ' \/ _` | | _| || | ' \/ _| _| / _ \ ' \(_-< |_| |_|_|_||_\__|_|_||_\__, | |_| \_,_|_||_\__|\__|_\___/_||_/__/ |___/ */ /** * @dev Converts a digit from 0 - 10000 into its corresponding rarity based on the given rarity tier. * @param _randinput The input from 0 - 10000 to use for rarity gen. * @param _rarityTier The tier to use. */ function rarityGen(uint256 _randinput, uint8 _rarityTier) internal view returns (uint8) { uint16 currentLowerBound = 0; for (uint8 i = 0; i < TIERS[_rarityTier].length; i++) { uint16 thisPercentage = TIERS[_rarityTier][i]; if ( _randinput >= currentLowerBound && _randinput < currentLowerBound + thisPercentage ) return i; currentLowerBound = currentLowerBound + thisPercentage; } revert(); } /** * @dev Generates a 11 digit hash from a tokenId, address, and random number. * @param _t The token id to be used within the hash. * @param _a The address to be used within the hash. * @param _c The custom nonce to be used within the hash. */ function hash( uint256 _t, address _a, uint256 _c ) internal returns (string memory) { require(_c < 11); // This will generate a 11 character string. // The first 2 digits are the palette. string memory currentHash = ""; for (uint8 i = 0; i < 16; i++) { SEED_NONCE++; uint16 _randinput = uint16( uint256( keccak256( abi.encodePacked( block.timestamp, block.difficulty, _t, _a, _c, SEED_NONCE ) ) ) % 10000 ); if (i == 0) { uint8 rar = rarityGen(_randinput, i); if (rar > 9) { currentHash = string( abi.encodePacked(currentHash, rar.toString()) ); } else { currentHash = string( abi.encodePacked(currentHash, "0", rar.toString()) ); } } else { currentHash = string( abi.encodePacked(currentHash, rarityGen(_randinput, i).toString()) ); } } if (hashToMinted[currentHash]) return hash(_t, _a, _c + 1); return currentHash; } function addCommunityMint(address _account) public onlyOwner { communityMints[_account] = true; } function ownerMintReserve() public onlyOwner { require(ownerCounter < 15); ownerCounter++; mintBlueprint(); } function mintCommunityReserve() public { require(communityMints[msg.sender] == true); require(communityCounter < 15); communityMints[msg.sender] = false; communityCounter++; mintBlueprint(); } /** * @dev Mint internal */ function mintBlueprint() internal { require(MINTING_LIVE == true || msg.sender == owner(), "Minting is not live."); require(addressToMinted[msg.sender] == false || msg.sender == owner(), "Can only mint 1."); require(!AnonymiceLibrary.isContract(msg.sender)); uint256 _totalSupply = totalSupply(); require(_totalSupply < MAX_SUPPLY); uint256 thisTokenId = _totalSupply; tokenIdToHash[thisTokenId] = hash(thisTokenId, msg.sender, 0); hashToMinted[tokenIdToHash[thisTokenId]] = true; addressToMinted[msg.sender] = true; _mint(msg.sender, thisTokenId); updateGroupEight(); } function mintWithMerkleScoreNineAndTen( address account, bytes32[] calldata merkleProof ) public { // Verify the merkle proof. bytes32 node = keccak256(abi.encodePacked(account)); require( MerkleProof.verify(merkleProof, dayOneMerkleRoot, node), "Invalid proof." ); require(msg.sender == account, "Must be you"); require(publicCounter < 1459); publicCounter++; mintBlueprint(); } function updateGroupEight() internal { if (didShuffleGroups) { return; } if (mintStartBlock == 0) { return; } if (block.number < (BLOCKS_IN_A_DAY + mintStartBlock)) { return; } didShuffleGroups = true; // Shuffle the groups for (uint256 i = 0; i < groups.length; i++) { uint256 n = i + uint256(keccak256(abi.encodePacked(block.timestamp, block.difficulty, msg.sender))) % (groups.length - i); uint256 temp = groups[n]; groups[n] = groups[i]; groups[i] = temp; } } function getIndexOfGroup(uint256 groupId) public view returns (uint256) { for (uint256 i = 0; i < groups.length; i++) { if (groups[i] == groupId) { return i; } } require(false); // error return 10000; } function getCurrentGroupIndex() public view returns (uint256) { require(block.number >= (BLOCKS_IN_A_DAY + mintStartBlock)); require(mintStartBlock > 0); uint256 numBlocksPassed = block.number - (BLOCKS_IN_A_DAY + mintStartBlock); uint256 currentGroup = numBlocksPassed / BLOCKS_IN_A_DAY; return currentGroup; } function mintWithMerkleScoreEight( address account, uint256 group, bytes32[] calldata merkleProof ) public { // Verify the merkle proof. bytes32 node = keccak256(abi.encodePacked(account, group)); require( MerkleProof.verify(merkleProof, eightsMerkleRoot, node), "Invalid proof." ); // Check current group require(msg.sender == account, "Must be you"); require(didShuffleGroups == true); uint256 yourGroupIndex = getIndexOfGroup(group); require(getCurrentGroupIndex() >= yourGroupIndex); // Can only mint if you're the current group require(publicCounter < 1459); publicCounter++; mintBlueprint(); } function mintWithMerkleScoreSeven(address account, bytes32[] calldata merkleProof) public { // Verify the merkle proof. bytes32 node = keccak256(abi.encodePacked(account)); require( MerkleProof.verify(merkleProof, sevensMerkleRoot, node), "Invalid proof." ); require(msg.sender == account, "Must be you"); require(didShuffleGroups == true); require(getCurrentGroupIndex() > 29, "Not time yet"); require(publicCounter < 1459); publicCounter++; mintBlueprint(); } /* ____ ___ ____ ___ _____ __ __ ____ __ ______ ____ ___ ____ _____ | \ / _] / || \ | || | || \ / ] || |/ \ | \ / ___/ | D ) / [_ | o || \ | __|| | || _ | / /| | | || || _ ( \_ | / | _]| || D | | |_ | | || | |/ / |_| |_| | || O || | |\__ | | \ | [_ | _ || | | _] | : || | / \_ | | | || || | |/ \ | | . \| || | || | | | | || | \ | | | | || || | |\ | |__|\_||_____||__|__||_____| |__| \__,_||__|__|\____| |__| |____|\___/ |__|__| \___| */ /** * @dev Hash to HTML function */ function hashToHTML(string memory _hash, uint256 _tokenId) public view returns (string memory) { string memory htmlString = string( abi.encodePacked( 'data:text/html,%3Chtml%3E%3Chead%3E%3Cscript%20src%3D%22', p5jsUrl, '%22%20integrity%3D%22', p5jsIntegrity, '%22%20crossorigin%3D%22anonymous%22%3E%3C%2Fscript%3E%3C%2Fhead%3E%3Cbody%3E%3Cscript%3Evar%20seed%3D', AnonymiceLibrary.toString(_tokenId), '%3Bvar%20ts%3D%22', _hash ) ); string memory dataString = IBlueprintsData(blueprintsData).partialBlueprintsCode(); htmlString = string( abi.encodePacked( htmlString, dataString ) ); return htmlString; } /** * @dev Hash to metadata function */ function hashToMetadata(string memory _hash) public view returns (string memory) { string memory metadataString; uint8 paletteTraitIndex = AnonymiceLibrary.parseInt( AnonymiceLibrary.substring(_hash, 0, 2) ); metadataString = string( abi.encodePacked( metadataString, '{"trait_type":"', traitTypes[0][paletteTraitIndex].traitType, '","value":"', traitTypes[0][paletteTraitIndex].traitName, '"},' ) ); for (uint8 i = 2; i < 18; i++) { uint8 thisTraitIndex = AnonymiceLibrary.parseInt( AnonymiceLibrary.substring(_hash, i, i + 1) ); string memory traitType = traitTypes[i][thisTraitIndex].traitType; if (bytes(traitType).length > 0) { metadataString = string( abi.encodePacked( metadataString, '{"trait_type":"', traitType, '","value":"', traitTypes[i][thisTraitIndex].traitName, '"}' ) ); if (i != 17) { metadataString = string(abi.encodePacked(metadataString, ",")); } } } return string(abi.encodePacked("[", metadataString, "]")); } /** * @dev Returns the SVG and metadata for a token Id * @param _tokenId The tokenId to return the SVG and metadata for. */ function tokenURI(uint256 _tokenId) public view override returns (string memory) { require(_exists(_tokenId)); string memory tokenHash = _tokenIdToHash(_tokenId); string memory description = '", "description": "1489 forgotten BLU3PRINTS were found, left behind by a distant civilization. Traits generated on-chain. Metadata and BLU3PRINTS are mirrored permanently on-chain. Owners can swap between portrait and landscape on-chain.",'; string memory encodedTokenId = AnonymiceLibrary.encode(bytes(string(abi.encodePacked(AnonymiceLibrary.toString(_tokenId))))); string memory encodedHash = AnonymiceLibrary.encode(bytes(string(abi.encodePacked(tokenHash)))); return string( abi.encodePacked( "data:application/json;base64,", AnonymiceLibrary.encode( bytes( string( abi.encodePacked( '{"name": "BLU3PRINTS #', AnonymiceLibrary.toString(_tokenId), description, '"external_url":"', externalUrl, encodedTokenId, '&t=', encodedHash, '","image":"', imageUrl, AnonymiceLibrary.toString(_tokenId), '/', tokenHash, '","attributes":', hashToMetadata(tokenHash), '}' ) ) ) ) ) ); } /** * @dev Returns a hash for a given tokenId * @param _tokenId The tokenId to return the hash for. */ function _tokenIdToHash(uint256 _tokenId) public view returns (string memory) { string memory tokenHash = tokenIdToHash[_tokenId]; if (tokenIdToLandscape[_tokenId]) { tokenHash = string(abi.encodePacked(tokenHash,"0")); } else { tokenHash = string(abi.encodePacked(tokenHash,"1")); } return tokenHash; } /* ___ __ __ ____ ___ ____ _____ __ __ ____ __ ______ ____ ___ ____ _____ / \ | |__| || \ / _]| \ | || | || \ / ] || |/ \ | \ / ___/ | || | | || _ | / [_ | D ) | __|| | || _ | / /| | | || || _ ( \_ | O || | | || | || _]| / | |_ | | || | |/ / |_| |_| | || O || | |\__ | | || ` ' || | || [_ | \ | _] | : || | / \_ | | | || || | |/ \ | | | \ / | | || || . \ | | | || | \ | | | | || || | |\ | \___/ \_/\_/ |__|__||_____||__|\_| |__| \__,_||__|__|\____| |__| |____|\___/ |__|__| \___| */ /** * @dev Clears the traits. */ function clearTraits() public onlyOwner { for (uint256 i = 0; i < 18; i++) { delete traitTypes[i]; } } /** * @dev Add a trait type * @param _traitTypeIndex The trait type index * @param traits Array of traits to add */ function addTraitType(uint256 _traitTypeIndex, Trait[] memory traits) public onlyOwner { for (uint256 i = 0; i < traits.length; i++) { traitTypes[_traitTypeIndex].push( Trait( traits[i].traitName, traits[i].traitType ) ); } return; } function flipMintingSwitch() public onlyOwner { if (mintStartBlock == 0) { mintStartBlock = block.number; } MINTING_LIVE = !MINTING_LIVE; } function changeOrientation(uint256 tokenId) public { require(ownerOf(tokenId) == msg.sender, "Only owner of token can modify it"); tokenIdToLandscape[tokenId] = !tokenIdToLandscape[tokenId]; } /** * @dev Sets the p5js url * @param _p5jsUrl The address of the p5js file hosted on CDN */ function setJsAddress(string memory _p5jsUrl) public onlyOwner { p5jsUrl = _p5jsUrl; } /** * @dev Sets the p5js resource integrity * @param _p5jsIntegrity The hash of the p5js file (to protect w subresource integrity) */ function setJsIntegrity(string memory _p5jsIntegrity) public onlyOwner { p5jsIntegrity = _p5jsIntegrity; } /** * @dev Sets the base image url * @param _imageUrl The base url for image field */ function setImageUrl(string memory _imageUrl) public onlyOwner { imageUrl = _imageUrl; } /** * @dev Used to add additional static traits if needed later on * @param _otherTraits The other traits string */ function setOtherTraits(string memory _otherTraits) public onlyOwner { otherTraits = _otherTraits; } /** * @dev Used to update the external image url * @param _externalUrl The external url string */ function setExternalUrl(string memory _externalUrl) public onlyOwner { externalUrl = _externalUrl; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_blueprintsData","type":"address"},{"internalType":"bytes32","name":"_dayOneMerkleRoot","type":"bytes32"},{"internalType":"bytes32","name":"_eightsMerkleRoot","type":"bytes32"},{"internalType":"bytes32","name":"_sevensMerkleRoot","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"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"},{"inputs":[],"name":"BLOCKS_IN_A_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTING_LIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"_tokenIdToHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"addCommunityMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_traitTypeIndex","type":"uint256"},{"components":[{"internalType":"string","name":"traitName","type":"string"},{"internalType":"string","name":"traitType","type":"string"}],"internalType":"struct Blueprints.Trait[]","name":"traits","type":"tuple[]"}],"name":"addTraitType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blueprintsData","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"changeOrientation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearTraits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"communityMints","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dayOneMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"didShuffleGroups","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eightsMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipMintingSwitch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentGroupIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"groupId","type":"uint256"}],"name":"getIndexOfGroup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"groups","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"hashToHTML","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"}],"name":"hashToMetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCommunityReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"group","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintWithMerkleScoreEight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintWithMerkleScoreNineAndTen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintWithMerkleScoreSeven","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerMintReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_externalUrl","type":"string"}],"name":"setExternalUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_imageUrl","type":"string"}],"name":"setImageUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_p5jsUrl","type":"string"}],"name":"setJsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_p5jsIntegrity","type":"string"}],"name":"setJsIntegrity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_otherTraits","type":"string"}],"name":"setOtherTraits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sevensMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"traitTypes","outputs":[{"internalType":"string","name":"traitName","type":"string"},{"internalType":"string","name":"traitType","type":"string"}],"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"}]
Contract Creation Code
6105d16010908155600060118181556012805460ff199081168255611900601390815560148581556015805490931683556104a060405260e095865260016101005260026101205260036101405260046101605260056101805260066101a05260076101c05260086101e052600961020052600a61022052600b61024052600c61026052600d61028052600e6102a052600f6102c0526102e096909652610300939093526103209190915261034091909152610360929092526103809190915260166103a081905260176103c05260186103e052601961040052601a61042052601b61044052601c61046052601d61048052620000fe91601e620006bf565b5060006029556000602a556000602b5560405180608001604052806048815260200162004b786048913980516200013e91602c9160209091019062000714565b5060405180606001604052806037815260200162004b416037913980516200016f91602d9160209091019062000714565b5060405180606001604052806027815260200162004bc0602791398051620001a091602e9160209091019062000714565b5060405180608001604052806046815260200162004be7604691398051620001d191602f9160209091019062000714565b50604080516020810191829052600090819052620001f29160309162000714565b503480156200020057600080fd5b5060405162004c2d38038062004c2d83398101604081905262000223916200084e565b604080518082018252600a80825269424c55335052494e545360b01b602080840182815285518087019096529285528401528151919291620002689160009162000714565b5080516200027e90600190602084019062000714565b5050506200029b620002956200066960201b60201c565b6200066d565b600b80546001600160a01b0319166001600160a01b038616179055608083815260a083815260c0838152604080516101c0810182526103848082526020820181905291810191909152610320606082015261012c9381018490529182018390528101919091526102bc60e0820152606461010082018190526101208201819052610190610140830152610160820152610e106101808201526102586101a08201526200034c90601790600e62000791565b50604080516080810182526032815261012c60208201526103e8918101919091526121ca60608201526200038590601890600462000791565b506040805160a08101825260648152610bb86020820152611388918101919091526103e860608201526103846080820152620003c690601990600562000791565b5060408051608081018252606481526103206020820152611004918101919091526113886060820152620003ff90601a90600462000791565b506040805160a0810182526064815261019060208201526105149181019190915261083460608201526117d460808201526200044090601b90600562000791565b50604080516080810182526104e281526107d06020820152610cb291810191909152610dac60608201526200047a90601c90600462000791565b5060408051606081018252606481526101f460208201526124b891810191909152620004ab90601d90600362000791565b506040805160c0810182526103e8815261019060208201819052918101829052606081018290526080810191909152611ce860a0820152620004f290601e90600662000791565b5060408051808201909152610bb88152611b5860208201526200051a90601f90600262000791565b50604080518082019091526103e881526123286020808301919091526200054391600262000791565b5060408051808201909152606481526126ac60208201526200056a90602190600262000791565b5060408051808201909152601981526126f760208201526200059190602290600262000791565b506040805180820190915261012c81526125e46020820152620005b990602390600262000791565b5060408051610100810182526064808252602082018190529181019190915260c860608201526103e860808201526107d060a0820152603260c082015261193260e08201526200060e90602490600862000791565b5060408051808201909152610dac815261196460208201526200063690602590600262000791565b5060408051808201909152610384815261238c60208201526200065e90602690600262000791565b5050505050620008d8565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805482825590600052602060002090810192821562000702579160200282015b8281111562000702578251829060ff16905591602001919060010190620006e0565b506200071092915062000837565b5090565b82805462000722906200089b565b90600052602060002090601f01602090048101928262000746576000855562000702565b82601f106200076157805160ff191683800117855562000702565b8280016001018555821562000702579182015b828111156200070257825182559160200191906001019062000774565b82805482825590600052602060002090600f01601090048101928215620007025791602002820160005b83821115620007fd57835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302620007bb565b80156200082d5782816101000a81549061ffff0219169055600201602081600101049283019260010302620007fd565b5050620007109291505b5b8082111562000710576000815560010162000838565b600080600080608085870312156200086557600080fd5b84516001600160a01b03811681146200087d57600080fd5b60208601516040870151606090970151919890975090945092505050565b600181811c90821680620008b057607f821691505b60208210811415620008d257634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c0516142246200091d600039600081816105cd0152610d770152600081816103ce015261189101526000818161065b01526116bf01526142246000f3fe608060405234801561001057600080fd5b50600436106102f05760003560e01c806366e338701161019d578063a2410a3d116100e9578063e985e9c5116100a2578063f3c81d2a1161007c578063f3c81d2a146106df578063f6b596b4146106e7578063f7c47f14146106fa578063fa54b4d81461070d57600080fd5b8063e985e9c51461067d578063f0e369bc146106b9578063f2fde38b146106cc57600080fd5b8063a2410a3d14610602578063a698f7f51461060a578063b88d4fde1461061d578063c87b56dd14610630578063d9d2628314610643578063e62fa3c41461065657600080fd5b80638da5cb5b1161015657806398f494681161013057806398f494681461059d5780639ec00c95146105a5578063a060bc74146105c8578063a22cb465146105ef57600080fd5b80638da5cb5b1461057157806395d89b411461058257806396324bd41461058a57600080fd5b806366e338701461050057806370a0823114610513578063715018a61461052657806372f90ac11461052e57806377d6c6e51461053b5780638a631a1c1461054e57600080fd5b806326d58ad31161025c578063349d2748116102155780634f6ccce7116101ef5780634f6ccce7146104be5780635455bec4146104d15780635ce1bf99146104da5780636352211e146104ed57600080fd5b8063349d27481461048557806342842e0e146104985780634da38f21146104ab57600080fd5b806326d58ad31461040b5780632abff1f21461041e5780632be154a8146104315780632e4e02891461043e5780632f745c59146104515780632fb098d21461046457600080fd5b80630a3d4cc4116102ae5780630a3d4cc41461039157806313fb44bf146103a457806318160ddd146103b7578063188c4c7a146103c95780631a07fb79146103f057806323b872dd146103f857600080fd5b80625ea307146102f557806301ffc9a71461031e57806306fdde0314610341578063081812fc14610349578063095ea7b314610374578063098afd4b14610389575b600080fd5b61030861030336600461353f565b610716565b6040516103159190613cb8565b60405180910390f35b61033161032c366004613417565b61081c565b6040519015158152602001610315565b610308610841565b61035c61035736600461353f565b6108d3565b6040516001600160a01b039091168152602001610315565b610387610382366004613394565b61096d565b005b610387610a83565b61030861039f3660046134fb565b610ae5565b6103876103b2366004613451565b610bc9565b6008545b604051908152602001610315565b6103bb7f000000000000000000000000000000000000000000000000000000000000000081565b610387610c0a565b61038761040636600461324f565b610c62565b610387610419366004613451565b610c93565b61038761042c366004613451565b610cd0565b6015546103319060ff1681565b61038761044c366004613306565b610d0d565b6103bb61045f366004613394565b610e73565b610477610472366004613682565b610f09565b604051610315929190613ccb565b610387610493366004613558565b61105a565b6103876104a636600461324f565b61114f565b6103876104b9366004613451565b61116a565b6103bb6104cc36600461353f565b6111a7565b6103bb60145481565b6103876104e8366004613201565b61123a565b61035c6104fb36600461353f565b611288565b61030861050e366004613451565b6112ff565b6103bb610521366004613201565b61159a565b610387611621565b6012546103319060ff1681565b610387610549366004613306565b611655565b61033161055c366004613201565b60286020526000908152604090205460ff1681565b600a546001600160a01b031661035c565b61030861172e565b6103bb61059836600461353f565b61173d565b6103bb61175e565b6103316105b3366004613201565b60276020526000908152604090205460ff1681565b6103bb7f000000000000000000000000000000000000000000000000000000000000000081565b6103876105fd366004613358565b6117c0565b6103876117cb565b6103876106183660046133be565b611820565b61038761062b36600461328b565b61196a565b61030861063e36600461353f565b61199c565b610387610651366004613451565b611a9f565b6103bb7f000000000000000000000000000000000000000000000000000000000000000081565b61033161068b36600461321c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6103bb6106c736600461353f565b611adc565b6103876106da366004613201565b611b2d565b610387611bc5565b6103876106f536600461353f565b611c0f565b600b5461035c906001600160a01b031681565b6103bb60135481565b6000818152600e602052604081208054606092919061073490613fb0565b80601f016020809104026020016040519081016040528092919081815260200182805461076090613fb0565b80156107ad5780601f10610782576101008083540402835291602001916107ad565b820191906000526020600020905b81548152906001019060200180831161079057829003601f168201915b5050506000868152600f6020526040902054929350505060ff16156107f357806040516020016107dd91906137d1565b6040516020818303038152906040529050610816565b80604051602001610804919061393e565b60405160208183030381529060405290505b92915050565b60006001600160e01b0319821663780e9d6360e01b1480610816575061081682611c99565b60606000805461085090613fb0565b80601f016020809104026020016040519081016040528092919081815260200182805461087c90613fb0565b80156108c95780601f1061089e576101008083540402835291602001916108c9565b820191906000526020600020905b8154815290600101906020018083116108ac57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109515760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061097882611288565b9050806001600160a01b0316836001600160a01b031614156109e65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610948565b336001600160a01b0382161480610a025750610a02813361068b565b610a745760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610948565b610a7e8383611ce9565b505050565b600a546001600160a01b03163314610aad5760405162461bcd60e51b815260040161094890613d42565b60005b6012811015610ae2576000818152600c60205260408120610ad09161301d565b80610ada81613feb565b915050610ab0565b50565b60606000602c602d610af685611d57565b86604051602001610b0a9493929190613ab0565b60408051601f19818403018152828252600b54630373cd4d60e31b845291519093506000926001600160a01b0390921691631b9e6a689160048083019286929190829003018186803b158015610b5f57600080fd5b505afa158015610b73573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b9b9190810190613485565b90508181604051602001610bb09291906137a2565b60408051808303601f1901815291905295945050505050565b600a546001600160a01b03163314610bf35760405162461bcd60e51b815260040161094890613d42565b8051610c0690602d90602084019061303e565b5050565b600a546001600160a01b03163314610c345760405162461bcd60e51b815260040161094890613d42565b600f602a5410610c4357600080fd5b602a8054906000610c5383613feb565b9190505550610c60611e5c565b565b610c6c3382611fee565b610c885760405162461bcd60e51b815260040161094890613d9c565b610a7e8383836120e1565b600a546001600160a01b03163314610cbd5760405162461bcd60e51b815260040161094890613d42565b8051610c0690602f90602084019061303e565b600a546001600160a01b03163314610cfa5760405162461bcd60e51b815260040161094890613d42565b8051610c0690602e90602084019061303e565b6040516001600160601b0319606085901b166020820152600090603401604051602081830303815290604052805190602001209050610da28383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f0000000000000000000000000000000000000000000000000000000000000000925085915061228c9050565b610dbe5760405162461bcd60e51b815260040161094890613ded565b336001600160a01b03851614610de65760405162461bcd60e51b815260040161094890613d77565b60155460ff161515600114610dfa57600080fd5b601d610e0461175e565b11610e405760405162461bcd60e51b815260206004820152600c60248201526b139bdd081d1a5b59481e595d60a21b6044820152606401610948565b6105b3602b5410610e5057600080fd5b602b8054906000610e6083613feb565b9190505550610e6d611e5c565b50505050565b6000610e7e8361159a565b8210610ee05760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610948565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600c6020528160005260406000208181548110610f2557600080fd5b906000526020600020906002020160009150915050806000018054610f4990613fb0565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7590613fb0565b8015610fc25780601f10610f9757610100808354040283529160200191610fc2565b820191906000526020600020905b815481529060010190602001808311610fa557829003601f168201915b505050505090806001018054610fd790613fb0565b80601f016020809104026020016040519081016040528092919081815260200182805461100390613fb0565b80156110505780601f1061102557610100808354040283529160200191611050565b820191906000526020600020905b81548152906001019060200180831161103357829003601f168201915b5050505050905082565b600a546001600160a01b031633146110845760405162461bcd60e51b815260040161094890613d42565b60005b8151811015610a7e57600c600084815260200190815260200160002060405180604001604052808484815181106110c0576110c061407c565b60200260200101516000015181526020018484815181106110e3576110e361407c565b602090810291909101810151810151909152825460018101845560009384529281902082518051939460020290910192611120928492019061303e565b506020828101518051611139926001850192019061303e565b505050808061114790613feb565b915050611087565b610a7e8383836040518060200160405280600081525061196a565b600a546001600160a01b031633146111945760405162461bcd60e51b815260040161094890613d42565b8051610c0690603090602084019061303e565b60006111b260085490565b82106112155760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610948565b600882815481106112285761122861407c565b90600052602060002001549050919050565b600a546001600160a01b031633146112645760405162461bcd60e51b815260040161094890613d42565b6001600160a01b03166000908152602860205260409020805460ff19166001179055565b6000818152600260205260408120546001600160a01b0316806108165760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610948565b606080600061131961131485600060026122a2565b61236e565b60008052600c6020527f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e88054919250839160ff841690811061135d5761135d61407c565b9060005260206000209060020201600101600c60008081526020019081526020016000208360ff16815481106113955761139561407c565b90600052602060002090600202016000016040516020016113b8939291906138d0565b60408051601f19818403018152919052915060025b60128160ff1610156115705760006113f96113148760ff85166113f1866001613ec9565b60ff166122a2565b90506000600c60008460ff1681526020019081526020016000208260ff16815481106114275761142761407c565b9060005260206000209060020201600101805461144390613fb0565b80601f016020809104026020016040519081016040528092919081815260200182805461146f90613fb0565b80156114bc5780601f10611491576101008083540402835291602001916114bc565b820191906000526020600020905b81548152906001019060200180831161149f57829003601f168201915b5050505050905060008151111561155b578481600c60008660ff1681526020019081526020016000208460ff16815481106114f9576114f961407c565b906000526020600020906002020160000160405160200161151c93929190613857565b60405160208183030381529060405294508260ff1660111461155b57846040516020016115499190613832565b60405160208183030381529060405294505b5050808061156890614006565b9150506113cd565b50816040516020016115829190613c02565b60405160208183030381529060405292505050919050565b60006001600160a01b0382166116055760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610948565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461164b5760405162461bcd60e51b815260040161094890613d42565b610c60600061242c565b6040516001600160601b0319606085901b1660208201526000906034016040516020818303038152906040528051906020012090506116ea8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f0000000000000000000000000000000000000000000000000000000000000000925085915061228c9050565b6117065760405162461bcd60e51b815260040161094890613ded565b336001600160a01b03851614610e405760405162461bcd60e51b815260040161094890613d77565b60606001805461085090613fb0565b6016818154811061174d57600080fd5b600091825260209091200154905081565b60006014546013546117709190613eb1565b43101561177c57600080fd5b60006014541161178b57600080fd5b600060145460135461179d9190613eb1565b6117a79043613f4a565b90506000601354826117b99190613eee565b9392505050565b610c0633838361247e565b3360009081526028602052604090205460ff1615156001146117ec57600080fd5b600f602954106117fb57600080fd5b336000908152602860205260408120805460ff191690556029805491610c5383613feb565b6040516001600160601b0319606086901b166020820152603481018490526000906054016040516020818303038152906040528051906020012090506118bc8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f0000000000000000000000000000000000000000000000000000000000000000925085915061228c9050565b6118d85760405162461bcd60e51b815260040161094890613ded565b336001600160a01b038616146119005760405162461bcd60e51b815260040161094890613d77565b60155460ff16151560011461191457600080fd5b600061191f85611adc565b90508061192a61175e565b101561193557600080fd5b6105b3602b541061194557600080fd5b602b805490600061195583613feb565b9190505550611962611e5c565b505050505050565b6119743383611fee565b6119905760405162461bcd60e51b815260040161094890613d9c565b610e6d8484848461254d565b6000818152600260205260409020546060906001600160a01b03166119c057600080fd5b60006119cb83610716565b9050600060405180610120016040528060f081526020016140ff60f0913990506000611a1d6119f986611d57565b604051602001611a099190613786565b604051602081830303815290604052612580565b90506000611a3584604051602001611a099190613786565b9050611a75611a4387611d57565b84602f8585602e611a538d611d57565b8b611a5d8d6112ff565b604051602001611a099998979695949392919061396f565b604051602001611a859190613c36565b604051602081830303815290604052945050505050919050565b600a546001600160a01b03163314611ac95760405162461bcd60e51b815260040161094890613d42565b8051610c0690602c90602084019061303e565b6000805b601654811015611b27578260168281548110611afe57611afe61407c565b90600052602060002001541415611b155792915050565b80611b1f81613feb565b915050611ae0565b50600080fd5b600a546001600160a01b03163314611b575760405162461bcd60e51b815260040161094890613d42565b6001600160a01b038116611bbc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610948565b610ae28161242c565b600a546001600160a01b03163314611bef5760405162461bcd60e51b815260040161094890613d42565b601454611bfb57436014555b6012805460ff19811660ff90911615179055565b33611c1982611288565b6001600160a01b031614611c795760405162461bcd60e51b815260206004820152602160248201527f4f6e6c79206f776e6572206f6620746f6b656e2063616e206d6f6469667920696044820152601d60fa1b6064820152608401610948565b6000908152600f60205260409020805460ff19811660ff90911615179055565b60006001600160e01b031982166380ac58cd60e01b1480611cca57506001600160e01b03198216635b5e139f60e01b145b8061081657506301ffc9a760e01b6001600160e01b0319831614610816565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d1e82611288565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b606081611d7b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611da55780611d8f81613feb565b9150611d9e9050600a83613eee565b9150611d7f565b6000816001600160401b03811115611dbf57611dbf614092565b6040519080825280601f01601f191660200182016040528015611de9576020820181803683370190505b5090505b8415611e5457611dfe600183613f4a565b9150611e0b600a86614026565b611e16906030613eb1565b60f81b818381518110611e2b57611e2b61407c565b60200101906001600160f81b031916908160001a905350611e4d600a86613eee565b9450611ded565b949350505050565b60125460ff16151560011480611e7c5750600a546001600160a01b031633145b611ebf5760405162461bcd60e51b815260206004820152601460248201527326b4b73a34b7339034b9903737ba103634bb329760611b6044820152606401610948565b3360009081526027602052604090205460ff161580611ee85750600a546001600160a01b031633145b611f275760405162461bcd60e51b815260206004820152601060248201526f21b0b71037b7363c9036b4b73a10189760811b6044820152606401610948565b333b15611f3357600080fd5b6000611f3e60085490565b90506010548110611f4e57600080fd5b80611f5b813360006126e7565b6000828152600e602090815260409091208251611f7e939192919091019061303e565b506001600d600e6000848152602001908152602001600020604051611fa39190613963565b90815260408051918290036020908101909220805493151560ff19948516179055336000818152602790935291208054909216600117909155611fe690826128bb565b610c06612a09565b6000818152600260205260408120546001600160a01b03166120675760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610948565b600061207283611288565b9050806001600160a01b0316846001600160a01b031614806120ad5750836001600160a01b03166120a2846108d3565b6001600160a01b0316145b80611e5457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611e54565b826001600160a01b03166120f482611288565b6001600160a01b03161461215c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610948565b6001600160a01b0382166121be5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610948565b6121c9838383612b5b565b6121d4600082611ce9565b6001600160a01b03831660009081526003602052604081208054600192906121fd908490613f4a565b90915550506001600160a01b038216600090815260036020526040812080546001929061222b908490613eb1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000826122998584612c13565b14949350505050565b60608360006122b18585613f4a565b6001600160401b038111156122c8576122c8614092565b6040519080825280601f01601f1916602001820160405280156122f2576020820181803683370190505b509050845b84811015612364578281815181106123115761231161407c565b01602001516001600160f81b0319168261232b8884613f4a565b8151811061233b5761233b61407c565b60200101906001600160f81b031916908160001a9053508061235c81613feb565b9150506122f7565b5095945050505050565b60008181805b82518160ff161015612424576030838260ff16815181106123975761239761407c565b016020015160f81c108015906123ca57506039838260ff16815181106123bf576123bf61407c565b016020015160f81c11155b15612412576123da600a83613f21565b91506030838260ff16815181106123f3576123f361407c565b0160200151612405919060f81c613f61565b61240f9083613ec9565b91505b8061241c81614006565b915050612374565b509392505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156124e05760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610948565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6125588484846120e1565b61256484848484612cb7565b610e6d5760405162461bcd60e51b815260040161094890613cf0565b60608151600014156125a057505060408051602081019091526000815290565b60006040518060600160405280604081526020016140bf60409139905060006003845160026125cf9190613eb1565b6125d99190613eee565b6125e4906004613f02565b905060006125f3826020613eb1565b6001600160401b0381111561260a5761260a614092565b6040519080825280601f01601f191660200182016040528015612634576020820181803683370190505b509050818152600183018586518101602084015b818310156126a25760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401612648565b6003895106600181146126bc57600281146126cd576126d9565b613d3d60f01b6001198301526126d9565b603d60f81b6000198301525b509398975050505050505050565b6060600b82106126f657600080fd5b604080516020810190915260008082525b60108160ff161015612875576011805490600061272383613feb565b9091555050601154604080514260208201524491810191909152606080820189905287901b6001600160601b03191660808201526094810186905260b48101919091526000906127109060d4016040516020818303038152906040528051906020012060001c6127939190614026565b905060ff82166128255760006127ad8261ffff1684612dc4565b905060098160ff1611156127ef57836127c88260ff16611d57565b6040516020016127d99291906137a2565b604051602081830303815290604052935061281f565b836127fc8260ff16611d57565b60405160200161280d9291906137f6565b60405160208183030381529060405293505b50612862565b8261283f6128378361ffff1685612dc4565b60ff16611d57565b6040516020016128509291906137a2565b60405160208183030381529060405292505b508061286d81614006565b915050612707565b50600d816040516128869190613786565b9081526040519081900360200190205460ff1615611e54576128b385856128ae866001613eb1565b6126e7565b9150506117b9565b6001600160a01b0382166129115760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610948565b6000818152600260205260409020546001600160a01b0316156129765760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610948565b61298260008383612b5b565b6001600160a01b03821660009081526003602052604081208054600192906129ab908490613eb1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60155460ff1615612a1657565b601454612a1f57565b601454601354612a2f9190613eb1565b431015612a3857565b6015805460ff1916600117905560005b601654811015610ae257601654600090612a63908390613f4a565b424433604051602001612a9693929190928352602083019190915260601b6001600160601b031916604082015260540190565b6040516020818303038152906040528051906020012060001c612ab99190614026565b612ac39083613eb1565b9050600060168281548110612ada57612ada61407c565b9060005260206000200154905060168381548110612afa57612afa61407c565b906000526020600020015460168381548110612b1857612b1861407c565b90600052602060002001819055508060168481548110612b3a57612b3a61407c565b60009182526020909120015550819050612b5381613feb565b915050612a48565b6001600160a01b038316612bb657612bb181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612bd9565b816001600160a01b0316836001600160a01b031614612bd957612bd98382612e8d565b6001600160a01b038216612bf057610a7e81612f2a565b826001600160a01b0316826001600160a01b031614610a7e57610a7e8282612fd9565b600081815b8451811015612424576000858281518110612c3557612c3561407c565b60200260200101519050808311612c77576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612ca4565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612caf81613feb565b915050612c18565b60006001600160a01b0384163b15612db957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612cfb903390899088908890600401613c7b565b602060405180830381600087803b158015612d1557600080fd5b505af1925050508015612d45575060408051601f3d908101601f19168201909252612d4291810190613434565b60015b612d9f573d808015612d73576040519150601f19603f3d011682016040523d82523d6000602084013e612d78565b606091505b508051612d975760405162461bcd60e51b815260040161094890613cf0565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e54565b506001949350505050565b600080805b60178460ff1660108110612ddf57612ddf61407c565b015460ff82161015611b2757600060178560ff1660108110612e0357612e0361407c565b018260ff1681548110612e1857612e1861407c565b90600052602060002090601091828204019190066002029054906101000a900461ffff1690508261ffff168610158015612e5e5750612e578184613e94565b61ffff1686105b15612e6d575091506108169050565b612e778184613e94565b9250508080612e8590614006565b915050612dc9565b60006001612e9a8461159a565b612ea49190613f4a565b600083815260076020526040902054909150808214612ef7576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612f3c90600190613f4a565b60008381526009602052604081205460088054939450909284908110612f6457612f6461407c565b906000526020600020015490508060088381548110612f8557612f8561407c565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612fbd57612fbd614066565b6001900381819060005260206000200160009055905550505050565b6000612fe48361159a565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b5080546000825560020290600052602060002090810190610ae291906130c2565b82805461304a90613fb0565b90600052602060002090601f01602090048101928261306c57600085556130b2565b82601f1061308557805160ff19168380011785556130b2565b828001600101855582156130b2579182015b828111156130b2578251825591602001919060010190613097565b506130be9291506130ed565b5090565b808211156130be5760006130d68282613102565b6130e4600183016000613102565b506002016130c2565b5b808211156130be57600081556001016130ee565b50805461310e90613fb0565b6000825580601f1061311e575050565b601f016020900490600052602060002090810190610ae291906130ed565b600061314f61314a84613e6d565b613e3d565b905082815283838301111561316357600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461319157600080fd5b919050565b60008083601f8401126131a857600080fd5b5081356001600160401b038111156131bf57600080fd5b6020830191508360208260051b85010111156131da57600080fd5b9250929050565b600082601f8301126131f257600080fd5b6117b98383356020850161313c565b60006020828403121561321357600080fd5b6117b98261317a565b6000806040838503121561322f57600080fd5b6132388361317a565b91506132466020840161317a565b90509250929050565b60008060006060848603121561326457600080fd5b61326d8461317a565b925061327b6020850161317a565b9150604084013590509250925092565b600080600080608085870312156132a157600080fd5b6132aa8561317a565b93506132b86020860161317a565b92506040850135915060608501356001600160401b038111156132da57600080fd5b8501601f810187136132eb57600080fd5b6132fa8782356020840161313c565b91505092959194509250565b60008060006040848603121561331b57600080fd5b6133248461317a565b925060208401356001600160401b0381111561333f57600080fd5b61334b86828701613196565b9497909650939450505050565b6000806040838503121561336b57600080fd5b6133748361317a565b91506020830135801515811461338957600080fd5b809150509250929050565b600080604083850312156133a757600080fd5b6133b08361317a565b946020939093013593505050565b600080600080606085870312156133d457600080fd5b6133dd8561317a565b93506020850135925060408501356001600160401b038111156133ff57600080fd5b61340b87828801613196565b95989497509550505050565b60006020828403121561342957600080fd5b81356117b9816140a8565b60006020828403121561344657600080fd5b81516117b9816140a8565b60006020828403121561346357600080fd5b81356001600160401b0381111561347957600080fd5b611e54848285016131e1565b60006020828403121561349757600080fd5b81516001600160401b038111156134ad57600080fd5b8201601f810184136134be57600080fd5b80516134cc61314a82613e6d565b8181528560208385010111156134e157600080fd5b6134f2826020830160208601613f84565b95945050505050565b6000806040838503121561350e57600080fd5b82356001600160401b0381111561352457600080fd5b613530858286016131e1565b95602094909401359450505050565b60006020828403121561355157600080fd5b5035919050565b6000806040838503121561356b57600080fd5b823591506020808401356001600160401b038082111561358a57600080fd5b818601915086601f83011261359e57600080fd5b8135818111156135b0576135b0614092565b8060051b6135bf858201613e3d565b8281528581019085870183870188018c10156135da57600080fd5b600093505b84841015613670578035868111156135f657600080fd5b87016040818e03601f1901121561360c57600080fd5b613614613e15565b898201358881111561362557600080fd5b6136338f8c838601016131e1565b82525060408201358881111561364857600080fd5b6136568f8c838601016131e1565b828c015250845250600193909301929187019187016135df565b50809750505050505050509250929050565b6000806040838503121561369557600080fd5b50508035926020909101359150565b600081518084526136bc816020860160208601613f84565b601f01601f19169290920160200192915050565b600081516136e2818560208601613f84565b9290920192915050565b8054600090600181811c908083168061370657607f831692505b602080841082141561372857634e487b7160e01b600052602260045260246000fd5b81801561373c576001811461374d5761377a565b60ff1986168952848901965061377a565b60008881526020902060005b868110156137725781548b820152908501908301613759565b505084890196505b50505050505092915050565b60008251613798818460208701613f84565b9190910192915050565b600083516137b4818460208801613f84565b8351908301906137c8818360208801613f84565b01949350505050565b600082516137e3818460208701613f84565b600360fc1b920191825250600101919050565b60008351613808818460208801613f84565b600360fc1b9083019081528351613826816001840160208801613f84565b01600101949350505050565b60008251613844818460208701613f84565b600b60fa1b920191825250600101919050565b60008451613869818460208901613f84565b6e3d913a3930b4ba2fba3cb832911d1160891b908301908152845161389581600f840160208901613f84565b6a1116113b30b63ab2911d1160a91b600f92909101918201526138bb601a8201856136ec565b61227d60f01b81526002019695505050505050565b600084516138e2818460208901613f84565b6e3d913a3930b4ba2fba3cb832911d1160891b908301908152613908600f8201866136ec565b6a1116113b30b63ab2911d1160a91b81529050613928600b8201856136ec565b62089f4b60ea1b81526003019695505050505050565b60008251613950818460208701613f84565b603160f81b920191825250600101919050565b60006117b982846136ec565b757b226e616d65223a2022424c55335052494e5453202360501b815289516000906139a1816016850160208f01613f84565b8a51908301906139b8816016840160208f01613f84565b6f1132bc3a32b93730b62fbab936111d1160811b601692909101918201526139e3602682018b6136ec565b905088516139f5818360208d01613f84565b6226743d60e81b91019081528751613a14816003840160208c01613f84565b6a11161134b6b0b3b2911d1160a91b60039290910191820152613a3a600e8201886136ec565b90508551613a4c818360208a01613f84565b613a9f613a92613a8c613a71613a6b858701602f60f81b815260010190565b8a6136d0565b6e11161130ba3a3934b13aba32b9911d60891b8152600f0190565b876136d0565b607d60f81b815260010190565b9d9c50505050505050505050505050565b7f646174613a746578742f68746d6c2c25334368746d6c2533452533436865616481527f253345253343736372697074253230737263253344253232000000000000000060208201526000613b0860388301876136ec565b7412991912991834b73a32b3b934ba3c9299a212991960591b8152613b3060158201876136ec565b90507f25323225323063726f73736f726967696e253344253232616e6f6e796d6f757381527f253232253345253343253246736372697074253345253343253246686561642560208201527f3345253343626f647925334525334373637269707425334576617225323073656040820152641959094cd160da1b60608201528451613bc2816065840160208901613f84565b701299a13b30b91299183a399299a212991960791b606592909101918201528351613bf4816076840160208801613f84565b016076019695505050505050565b605b60f81b815260008251613c1e816001850160208701613f84565b605d60f81b6001939091019283015250600201919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613c6e81601d850160208701613f84565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613cae908301846136a4565b9695505050505050565b6020815260006117b960208301846136a4565b604081526000613cde60408301856136a4565b82810360208401526134f281856136a4565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600b908201526a4d75737420626520796f7560a81b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600e908201526d24b73b30b634b210383937b7b31760911b604082015260600190565b604080519081016001600160401b0381118282101715613e3757613e37614092565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e6557613e65614092565b604052919050565b60006001600160401b03821115613e8657613e86614092565b50601f01601f191660200190565b600061ffff8083168185168083038211156137c8576137c861403a565b60008219821115613ec457613ec461403a565b500190565b600060ff821660ff84168060ff03821115613ee657613ee661403a565b019392505050565b600082613efd57613efd614050565b500490565b6000816000190483118215151615613f1c57613f1c61403a565b500290565b600060ff821660ff84168160ff0481118215151615613f4257613f4261403a565b029392505050565b600082821015613f5c57613f5c61403a565b500390565b600060ff821660ff841680821015613f7b57613f7b61403a565b90039392505050565b60005b83811015613f9f578181015183820152602001613f87565b83811115610e6d5750506000910152565b600181811c90821680613fc457607f821691505b60208210811415613fe557634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613fff57613fff61403a565b5060010190565b600060ff821660ff81141561401d5761401d61403a565b60010192915050565b60008261403557614035614050565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610ae257600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f222c20226465736372697074696f6e223a20223134383920666f72676f7474656e20424c55335052494e5453207765726520666f756e642c206c65667420626568696e6420627920612064697374616e7420636976696c697a6174696f6e2e205472616974732067656e657261746564206f6e2d636861696e2e204d6574616461746120616e6420424c55335052494e545320617265206d6972726f726564207065726d616e656e746c79206f6e2d636861696e2e204f776e6572732063616e2073776170206265747765656e20706f72747261697420616e64206c616e647363617065206f6e2d636861696e2e222ca26469706673582212202d0ccd92a175a9ce6a808736560b2690d05c4b1e206f92285ce46c3d8fa7195064736f6c634300080700337368613235362d6d61553247786155437a355743686b41475234306e7439736257525045664638716f253246707278686f4b5051253344687474707325334125324625324663646e6a732e636c6f7564666c6172652e636f6d253246616a61782532466c69627325324670352e6a73253246312e342e3025324670352e6a7368747470733a2f2f61786f6e732e6172742f6170692f626c75337072696e74732f696d6167652f68747470733a2f2f697066732e696f2f697066732f516d4e566455377154705a7a6d374573325a513153686d57444b516d4a4641723464737a35715a526f76436f7a533f783d000000000000000000000000ff330c328cf7ae6a5aefe8df13a06480fb1f7c59884422f18752a10e0e52e81b923380acc61f8c390c03ba3022cdd13df5a770bc5360b515863c2f7fc723a9cea9c7420babdbb584aaa1b494e054fa31c914276ad213e0913132cf563f72e5a1d1d079fcf807b1f864b58d1f9bf97060f9ff1f6f
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102f05760003560e01c806366e338701161019d578063a2410a3d116100e9578063e985e9c5116100a2578063f3c81d2a1161007c578063f3c81d2a146106df578063f6b596b4146106e7578063f7c47f14146106fa578063fa54b4d81461070d57600080fd5b8063e985e9c51461067d578063f0e369bc146106b9578063f2fde38b146106cc57600080fd5b8063a2410a3d14610602578063a698f7f51461060a578063b88d4fde1461061d578063c87b56dd14610630578063d9d2628314610643578063e62fa3c41461065657600080fd5b80638da5cb5b1161015657806398f494681161013057806398f494681461059d5780639ec00c95146105a5578063a060bc74146105c8578063a22cb465146105ef57600080fd5b80638da5cb5b1461057157806395d89b411461058257806396324bd41461058a57600080fd5b806366e338701461050057806370a0823114610513578063715018a61461052657806372f90ac11461052e57806377d6c6e51461053b5780638a631a1c1461054e57600080fd5b806326d58ad31161025c578063349d2748116102155780634f6ccce7116101ef5780634f6ccce7146104be5780635455bec4146104d15780635ce1bf99146104da5780636352211e146104ed57600080fd5b8063349d27481461048557806342842e0e146104985780634da38f21146104ab57600080fd5b806326d58ad31461040b5780632abff1f21461041e5780632be154a8146104315780632e4e02891461043e5780632f745c59146104515780632fb098d21461046457600080fd5b80630a3d4cc4116102ae5780630a3d4cc41461039157806313fb44bf146103a457806318160ddd146103b7578063188c4c7a146103c95780631a07fb79146103f057806323b872dd146103f857600080fd5b80625ea307146102f557806301ffc9a71461031e57806306fdde0314610341578063081812fc14610349578063095ea7b314610374578063098afd4b14610389575b600080fd5b61030861030336600461353f565b610716565b6040516103159190613cb8565b60405180910390f35b61033161032c366004613417565b61081c565b6040519015158152602001610315565b610308610841565b61035c61035736600461353f565b6108d3565b6040516001600160a01b039091168152602001610315565b610387610382366004613394565b61096d565b005b610387610a83565b61030861039f3660046134fb565b610ae5565b6103876103b2366004613451565b610bc9565b6008545b604051908152602001610315565b6103bb7f5360b515863c2f7fc723a9cea9c7420babdbb584aaa1b494e054fa31c914276a81565b610387610c0a565b61038761040636600461324f565b610c62565b610387610419366004613451565b610c93565b61038761042c366004613451565b610cd0565b6015546103319060ff1681565b61038761044c366004613306565b610d0d565b6103bb61045f366004613394565b610e73565b610477610472366004613682565b610f09565b604051610315929190613ccb565b610387610493366004613558565b61105a565b6103876104a636600461324f565b61114f565b6103876104b9366004613451565b61116a565b6103bb6104cc36600461353f565b6111a7565b6103bb60145481565b6103876104e8366004613201565b61123a565b61035c6104fb36600461353f565b611288565b61030861050e366004613451565b6112ff565b6103bb610521366004613201565b61159a565b610387611621565b6012546103319060ff1681565b610387610549366004613306565b611655565b61033161055c366004613201565b60286020526000908152604090205460ff1681565b600a546001600160a01b031661035c565b61030861172e565b6103bb61059836600461353f565b61173d565b6103bb61175e565b6103316105b3366004613201565b60276020526000908152604090205460ff1681565b6103bb7fd213e0913132cf563f72e5a1d1d079fcf807b1f864b58d1f9bf97060f9ff1f6f81565b6103876105fd366004613358565b6117c0565b6103876117cb565b6103876106183660046133be565b611820565b61038761062b36600461328b565b61196a565b61030861063e36600461353f565b61199c565b610387610651366004613451565b611a9f565b6103bb7f884422f18752a10e0e52e81b923380acc61f8c390c03ba3022cdd13df5a770bc81565b61033161068b36600461321c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6103bb6106c736600461353f565b611adc565b6103876106da366004613201565b611b2d565b610387611bc5565b6103876106f536600461353f565b611c0f565b600b5461035c906001600160a01b031681565b6103bb60135481565b6000818152600e602052604081208054606092919061073490613fb0565b80601f016020809104026020016040519081016040528092919081815260200182805461076090613fb0565b80156107ad5780601f10610782576101008083540402835291602001916107ad565b820191906000526020600020905b81548152906001019060200180831161079057829003601f168201915b5050506000868152600f6020526040902054929350505060ff16156107f357806040516020016107dd91906137d1565b6040516020818303038152906040529050610816565b80604051602001610804919061393e565b60405160208183030381529060405290505b92915050565b60006001600160e01b0319821663780e9d6360e01b1480610816575061081682611c99565b60606000805461085090613fb0565b80601f016020809104026020016040519081016040528092919081815260200182805461087c90613fb0565b80156108c95780601f1061089e576101008083540402835291602001916108c9565b820191906000526020600020905b8154815290600101906020018083116108ac57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109515760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061097882611288565b9050806001600160a01b0316836001600160a01b031614156109e65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610948565b336001600160a01b0382161480610a025750610a02813361068b565b610a745760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610948565b610a7e8383611ce9565b505050565b600a546001600160a01b03163314610aad5760405162461bcd60e51b815260040161094890613d42565b60005b6012811015610ae2576000818152600c60205260408120610ad09161301d565b80610ada81613feb565b915050610ab0565b50565b60606000602c602d610af685611d57565b86604051602001610b0a9493929190613ab0565b60408051601f19818403018152828252600b54630373cd4d60e31b845291519093506000926001600160a01b0390921691631b9e6a689160048083019286929190829003018186803b158015610b5f57600080fd5b505afa158015610b73573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b9b9190810190613485565b90508181604051602001610bb09291906137a2565b60408051808303601f1901815291905295945050505050565b600a546001600160a01b03163314610bf35760405162461bcd60e51b815260040161094890613d42565b8051610c0690602d90602084019061303e565b5050565b600a546001600160a01b03163314610c345760405162461bcd60e51b815260040161094890613d42565b600f602a5410610c4357600080fd5b602a8054906000610c5383613feb565b9190505550610c60611e5c565b565b610c6c3382611fee565b610c885760405162461bcd60e51b815260040161094890613d9c565b610a7e8383836120e1565b600a546001600160a01b03163314610cbd5760405162461bcd60e51b815260040161094890613d42565b8051610c0690602f90602084019061303e565b600a546001600160a01b03163314610cfa5760405162461bcd60e51b815260040161094890613d42565b8051610c0690602e90602084019061303e565b6040516001600160601b0319606085901b166020820152600090603401604051602081830303815290604052805190602001209050610da28383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507fd213e0913132cf563f72e5a1d1d079fcf807b1f864b58d1f9bf97060f9ff1f6f925085915061228c9050565b610dbe5760405162461bcd60e51b815260040161094890613ded565b336001600160a01b03851614610de65760405162461bcd60e51b815260040161094890613d77565b60155460ff161515600114610dfa57600080fd5b601d610e0461175e565b11610e405760405162461bcd60e51b815260206004820152600c60248201526b139bdd081d1a5b59481e595d60a21b6044820152606401610948565b6105b3602b5410610e5057600080fd5b602b8054906000610e6083613feb565b9190505550610e6d611e5c565b50505050565b6000610e7e8361159a565b8210610ee05760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610948565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600c6020528160005260406000208181548110610f2557600080fd5b906000526020600020906002020160009150915050806000018054610f4990613fb0565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7590613fb0565b8015610fc25780601f10610f9757610100808354040283529160200191610fc2565b820191906000526020600020905b815481529060010190602001808311610fa557829003601f168201915b505050505090806001018054610fd790613fb0565b80601f016020809104026020016040519081016040528092919081815260200182805461100390613fb0565b80156110505780601f1061102557610100808354040283529160200191611050565b820191906000526020600020905b81548152906001019060200180831161103357829003601f168201915b5050505050905082565b600a546001600160a01b031633146110845760405162461bcd60e51b815260040161094890613d42565b60005b8151811015610a7e57600c600084815260200190815260200160002060405180604001604052808484815181106110c0576110c061407c565b60200260200101516000015181526020018484815181106110e3576110e361407c565b602090810291909101810151810151909152825460018101845560009384529281902082518051939460020290910192611120928492019061303e565b506020828101518051611139926001850192019061303e565b505050808061114790613feb565b915050611087565b610a7e8383836040518060200160405280600081525061196a565b600a546001600160a01b031633146111945760405162461bcd60e51b815260040161094890613d42565b8051610c0690603090602084019061303e565b60006111b260085490565b82106112155760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610948565b600882815481106112285761122861407c565b90600052602060002001549050919050565b600a546001600160a01b031633146112645760405162461bcd60e51b815260040161094890613d42565b6001600160a01b03166000908152602860205260409020805460ff19166001179055565b6000818152600260205260408120546001600160a01b0316806108165760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610948565b606080600061131961131485600060026122a2565b61236e565b60008052600c6020527f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e88054919250839160ff841690811061135d5761135d61407c565b9060005260206000209060020201600101600c60008081526020019081526020016000208360ff16815481106113955761139561407c565b90600052602060002090600202016000016040516020016113b8939291906138d0565b60408051601f19818403018152919052915060025b60128160ff1610156115705760006113f96113148760ff85166113f1866001613ec9565b60ff166122a2565b90506000600c60008460ff1681526020019081526020016000208260ff16815481106114275761142761407c565b9060005260206000209060020201600101805461144390613fb0565b80601f016020809104026020016040519081016040528092919081815260200182805461146f90613fb0565b80156114bc5780601f10611491576101008083540402835291602001916114bc565b820191906000526020600020905b81548152906001019060200180831161149f57829003601f168201915b5050505050905060008151111561155b578481600c60008660ff1681526020019081526020016000208460ff16815481106114f9576114f961407c565b906000526020600020906002020160000160405160200161151c93929190613857565b60405160208183030381529060405294508260ff1660111461155b57846040516020016115499190613832565b60405160208183030381529060405294505b5050808061156890614006565b9150506113cd565b50816040516020016115829190613c02565b60405160208183030381529060405292505050919050565b60006001600160a01b0382166116055760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610948565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461164b5760405162461bcd60e51b815260040161094890613d42565b610c60600061242c565b6040516001600160601b0319606085901b1660208201526000906034016040516020818303038152906040528051906020012090506116ea8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f884422f18752a10e0e52e81b923380acc61f8c390c03ba3022cdd13df5a770bc925085915061228c9050565b6117065760405162461bcd60e51b815260040161094890613ded565b336001600160a01b03851614610e405760405162461bcd60e51b815260040161094890613d77565b60606001805461085090613fb0565b6016818154811061174d57600080fd5b600091825260209091200154905081565b60006014546013546117709190613eb1565b43101561177c57600080fd5b60006014541161178b57600080fd5b600060145460135461179d9190613eb1565b6117a79043613f4a565b90506000601354826117b99190613eee565b9392505050565b610c0633838361247e565b3360009081526028602052604090205460ff1615156001146117ec57600080fd5b600f602954106117fb57600080fd5b336000908152602860205260408120805460ff191690556029805491610c5383613feb565b6040516001600160601b0319606086901b166020820152603481018490526000906054016040516020818303038152906040528051906020012090506118bc8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f5360b515863c2f7fc723a9cea9c7420babdbb584aaa1b494e054fa31c914276a925085915061228c9050565b6118d85760405162461bcd60e51b815260040161094890613ded565b336001600160a01b038616146119005760405162461bcd60e51b815260040161094890613d77565b60155460ff16151560011461191457600080fd5b600061191f85611adc565b90508061192a61175e565b101561193557600080fd5b6105b3602b541061194557600080fd5b602b805490600061195583613feb565b9190505550611962611e5c565b505050505050565b6119743383611fee565b6119905760405162461bcd60e51b815260040161094890613d9c565b610e6d8484848461254d565b6000818152600260205260409020546060906001600160a01b03166119c057600080fd5b60006119cb83610716565b9050600060405180610120016040528060f081526020016140ff60f0913990506000611a1d6119f986611d57565b604051602001611a099190613786565b604051602081830303815290604052612580565b90506000611a3584604051602001611a099190613786565b9050611a75611a4387611d57565b84602f8585602e611a538d611d57565b8b611a5d8d6112ff565b604051602001611a099998979695949392919061396f565b604051602001611a859190613c36565b604051602081830303815290604052945050505050919050565b600a546001600160a01b03163314611ac95760405162461bcd60e51b815260040161094890613d42565b8051610c0690602c90602084019061303e565b6000805b601654811015611b27578260168281548110611afe57611afe61407c565b90600052602060002001541415611b155792915050565b80611b1f81613feb565b915050611ae0565b50600080fd5b600a546001600160a01b03163314611b575760405162461bcd60e51b815260040161094890613d42565b6001600160a01b038116611bbc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610948565b610ae28161242c565b600a546001600160a01b03163314611bef5760405162461bcd60e51b815260040161094890613d42565b601454611bfb57436014555b6012805460ff19811660ff90911615179055565b33611c1982611288565b6001600160a01b031614611c795760405162461bcd60e51b815260206004820152602160248201527f4f6e6c79206f776e6572206f6620746f6b656e2063616e206d6f6469667920696044820152601d60fa1b6064820152608401610948565b6000908152600f60205260409020805460ff19811660ff90911615179055565b60006001600160e01b031982166380ac58cd60e01b1480611cca57506001600160e01b03198216635b5e139f60e01b145b8061081657506301ffc9a760e01b6001600160e01b0319831614610816565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d1e82611288565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b606081611d7b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611da55780611d8f81613feb565b9150611d9e9050600a83613eee565b9150611d7f565b6000816001600160401b03811115611dbf57611dbf614092565b6040519080825280601f01601f191660200182016040528015611de9576020820181803683370190505b5090505b8415611e5457611dfe600183613f4a565b9150611e0b600a86614026565b611e16906030613eb1565b60f81b818381518110611e2b57611e2b61407c565b60200101906001600160f81b031916908160001a905350611e4d600a86613eee565b9450611ded565b949350505050565b60125460ff16151560011480611e7c5750600a546001600160a01b031633145b611ebf5760405162461bcd60e51b815260206004820152601460248201527326b4b73a34b7339034b9903737ba103634bb329760611b6044820152606401610948565b3360009081526027602052604090205460ff161580611ee85750600a546001600160a01b031633145b611f275760405162461bcd60e51b815260206004820152601060248201526f21b0b71037b7363c9036b4b73a10189760811b6044820152606401610948565b333b15611f3357600080fd5b6000611f3e60085490565b90506010548110611f4e57600080fd5b80611f5b813360006126e7565b6000828152600e602090815260409091208251611f7e939192919091019061303e565b506001600d600e6000848152602001908152602001600020604051611fa39190613963565b90815260408051918290036020908101909220805493151560ff19948516179055336000818152602790935291208054909216600117909155611fe690826128bb565b610c06612a09565b6000818152600260205260408120546001600160a01b03166120675760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610948565b600061207283611288565b9050806001600160a01b0316846001600160a01b031614806120ad5750836001600160a01b03166120a2846108d3565b6001600160a01b0316145b80611e5457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611e54565b826001600160a01b03166120f482611288565b6001600160a01b03161461215c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610948565b6001600160a01b0382166121be5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610948565b6121c9838383612b5b565b6121d4600082611ce9565b6001600160a01b03831660009081526003602052604081208054600192906121fd908490613f4a565b90915550506001600160a01b038216600090815260036020526040812080546001929061222b908490613eb1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000826122998584612c13565b14949350505050565b60608360006122b18585613f4a565b6001600160401b038111156122c8576122c8614092565b6040519080825280601f01601f1916602001820160405280156122f2576020820181803683370190505b509050845b84811015612364578281815181106123115761231161407c565b01602001516001600160f81b0319168261232b8884613f4a565b8151811061233b5761233b61407c565b60200101906001600160f81b031916908160001a9053508061235c81613feb565b9150506122f7565b5095945050505050565b60008181805b82518160ff161015612424576030838260ff16815181106123975761239761407c565b016020015160f81c108015906123ca57506039838260ff16815181106123bf576123bf61407c565b016020015160f81c11155b15612412576123da600a83613f21565b91506030838260ff16815181106123f3576123f361407c565b0160200151612405919060f81c613f61565b61240f9083613ec9565b91505b8061241c81614006565b915050612374565b509392505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156124e05760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610948565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6125588484846120e1565b61256484848484612cb7565b610e6d5760405162461bcd60e51b815260040161094890613cf0565b60608151600014156125a057505060408051602081019091526000815290565b60006040518060600160405280604081526020016140bf60409139905060006003845160026125cf9190613eb1565b6125d99190613eee565b6125e4906004613f02565b905060006125f3826020613eb1565b6001600160401b0381111561260a5761260a614092565b6040519080825280601f01601f191660200182016040528015612634576020820181803683370190505b509050818152600183018586518101602084015b818310156126a25760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401612648565b6003895106600181146126bc57600281146126cd576126d9565b613d3d60f01b6001198301526126d9565b603d60f81b6000198301525b509398975050505050505050565b6060600b82106126f657600080fd5b604080516020810190915260008082525b60108160ff161015612875576011805490600061272383613feb565b9091555050601154604080514260208201524491810191909152606080820189905287901b6001600160601b03191660808201526094810186905260b48101919091526000906127109060d4016040516020818303038152906040528051906020012060001c6127939190614026565b905060ff82166128255760006127ad8261ffff1684612dc4565b905060098160ff1611156127ef57836127c88260ff16611d57565b6040516020016127d99291906137a2565b604051602081830303815290604052935061281f565b836127fc8260ff16611d57565b60405160200161280d9291906137f6565b60405160208183030381529060405293505b50612862565b8261283f6128378361ffff1685612dc4565b60ff16611d57565b6040516020016128509291906137a2565b60405160208183030381529060405292505b508061286d81614006565b915050612707565b50600d816040516128869190613786565b9081526040519081900360200190205460ff1615611e54576128b385856128ae866001613eb1565b6126e7565b9150506117b9565b6001600160a01b0382166129115760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610948565b6000818152600260205260409020546001600160a01b0316156129765760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610948565b61298260008383612b5b565b6001600160a01b03821660009081526003602052604081208054600192906129ab908490613eb1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60155460ff1615612a1657565b601454612a1f57565b601454601354612a2f9190613eb1565b431015612a3857565b6015805460ff1916600117905560005b601654811015610ae257601654600090612a63908390613f4a565b424433604051602001612a9693929190928352602083019190915260601b6001600160601b031916604082015260540190565b6040516020818303038152906040528051906020012060001c612ab99190614026565b612ac39083613eb1565b9050600060168281548110612ada57612ada61407c565b9060005260206000200154905060168381548110612afa57612afa61407c565b906000526020600020015460168381548110612b1857612b1861407c565b90600052602060002001819055508060168481548110612b3a57612b3a61407c565b60009182526020909120015550819050612b5381613feb565b915050612a48565b6001600160a01b038316612bb657612bb181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612bd9565b816001600160a01b0316836001600160a01b031614612bd957612bd98382612e8d565b6001600160a01b038216612bf057610a7e81612f2a565b826001600160a01b0316826001600160a01b031614610a7e57610a7e8282612fd9565b600081815b8451811015612424576000858281518110612c3557612c3561407c565b60200260200101519050808311612c77576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612ca4565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612caf81613feb565b915050612c18565b60006001600160a01b0384163b15612db957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612cfb903390899088908890600401613c7b565b602060405180830381600087803b158015612d1557600080fd5b505af1925050508015612d45575060408051601f3d908101601f19168201909252612d4291810190613434565b60015b612d9f573d808015612d73576040519150601f19603f3d011682016040523d82523d6000602084013e612d78565b606091505b508051612d975760405162461bcd60e51b815260040161094890613cf0565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e54565b506001949350505050565b600080805b60178460ff1660108110612ddf57612ddf61407c565b015460ff82161015611b2757600060178560ff1660108110612e0357612e0361407c565b018260ff1681548110612e1857612e1861407c565b90600052602060002090601091828204019190066002029054906101000a900461ffff1690508261ffff168610158015612e5e5750612e578184613e94565b61ffff1686105b15612e6d575091506108169050565b612e778184613e94565b9250508080612e8590614006565b915050612dc9565b60006001612e9a8461159a565b612ea49190613f4a565b600083815260076020526040902054909150808214612ef7576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612f3c90600190613f4a565b60008381526009602052604081205460088054939450909284908110612f6457612f6461407c565b906000526020600020015490508060088381548110612f8557612f8561407c565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612fbd57612fbd614066565b6001900381819060005260206000200160009055905550505050565b6000612fe48361159a565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b5080546000825560020290600052602060002090810190610ae291906130c2565b82805461304a90613fb0565b90600052602060002090601f01602090048101928261306c57600085556130b2565b82601f1061308557805160ff19168380011785556130b2565b828001600101855582156130b2579182015b828111156130b2578251825591602001919060010190613097565b506130be9291506130ed565b5090565b808211156130be5760006130d68282613102565b6130e4600183016000613102565b506002016130c2565b5b808211156130be57600081556001016130ee565b50805461310e90613fb0565b6000825580601f1061311e575050565b601f016020900490600052602060002090810190610ae291906130ed565b600061314f61314a84613e6d565b613e3d565b905082815283838301111561316357600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461319157600080fd5b919050565b60008083601f8401126131a857600080fd5b5081356001600160401b038111156131bf57600080fd5b6020830191508360208260051b85010111156131da57600080fd5b9250929050565b600082601f8301126131f257600080fd5b6117b98383356020850161313c565b60006020828403121561321357600080fd5b6117b98261317a565b6000806040838503121561322f57600080fd5b6132388361317a565b91506132466020840161317a565b90509250929050565b60008060006060848603121561326457600080fd5b61326d8461317a565b925061327b6020850161317a565b9150604084013590509250925092565b600080600080608085870312156132a157600080fd5b6132aa8561317a565b93506132b86020860161317a565b92506040850135915060608501356001600160401b038111156132da57600080fd5b8501601f810187136132eb57600080fd5b6132fa8782356020840161313c565b91505092959194509250565b60008060006040848603121561331b57600080fd5b6133248461317a565b925060208401356001600160401b0381111561333f57600080fd5b61334b86828701613196565b9497909650939450505050565b6000806040838503121561336b57600080fd5b6133748361317a565b91506020830135801515811461338957600080fd5b809150509250929050565b600080604083850312156133a757600080fd5b6133b08361317a565b946020939093013593505050565b600080600080606085870312156133d457600080fd5b6133dd8561317a565b93506020850135925060408501356001600160401b038111156133ff57600080fd5b61340b87828801613196565b95989497509550505050565b60006020828403121561342957600080fd5b81356117b9816140a8565b60006020828403121561344657600080fd5b81516117b9816140a8565b60006020828403121561346357600080fd5b81356001600160401b0381111561347957600080fd5b611e54848285016131e1565b60006020828403121561349757600080fd5b81516001600160401b038111156134ad57600080fd5b8201601f810184136134be57600080fd5b80516134cc61314a82613e6d565b8181528560208385010111156134e157600080fd5b6134f2826020830160208601613f84565b95945050505050565b6000806040838503121561350e57600080fd5b82356001600160401b0381111561352457600080fd5b613530858286016131e1565b95602094909401359450505050565b60006020828403121561355157600080fd5b5035919050565b6000806040838503121561356b57600080fd5b823591506020808401356001600160401b038082111561358a57600080fd5b818601915086601f83011261359e57600080fd5b8135818111156135b0576135b0614092565b8060051b6135bf858201613e3d565b8281528581019085870183870188018c10156135da57600080fd5b600093505b84841015613670578035868111156135f657600080fd5b87016040818e03601f1901121561360c57600080fd5b613614613e15565b898201358881111561362557600080fd5b6136338f8c838601016131e1565b82525060408201358881111561364857600080fd5b6136568f8c838601016131e1565b828c015250845250600193909301929187019187016135df565b50809750505050505050509250929050565b6000806040838503121561369557600080fd5b50508035926020909101359150565b600081518084526136bc816020860160208601613f84565b601f01601f19169290920160200192915050565b600081516136e2818560208601613f84565b9290920192915050565b8054600090600181811c908083168061370657607f831692505b602080841082141561372857634e487b7160e01b600052602260045260246000fd5b81801561373c576001811461374d5761377a565b60ff1986168952848901965061377a565b60008881526020902060005b868110156137725781548b820152908501908301613759565b505084890196505b50505050505092915050565b60008251613798818460208701613f84565b9190910192915050565b600083516137b4818460208801613f84565b8351908301906137c8818360208801613f84565b01949350505050565b600082516137e3818460208701613f84565b600360fc1b920191825250600101919050565b60008351613808818460208801613f84565b600360fc1b9083019081528351613826816001840160208801613f84565b01600101949350505050565b60008251613844818460208701613f84565b600b60fa1b920191825250600101919050565b60008451613869818460208901613f84565b6e3d913a3930b4ba2fba3cb832911d1160891b908301908152845161389581600f840160208901613f84565b6a1116113b30b63ab2911d1160a91b600f92909101918201526138bb601a8201856136ec565b61227d60f01b81526002019695505050505050565b600084516138e2818460208901613f84565b6e3d913a3930b4ba2fba3cb832911d1160891b908301908152613908600f8201866136ec565b6a1116113b30b63ab2911d1160a91b81529050613928600b8201856136ec565b62089f4b60ea1b81526003019695505050505050565b60008251613950818460208701613f84565b603160f81b920191825250600101919050565b60006117b982846136ec565b757b226e616d65223a2022424c55335052494e5453202360501b815289516000906139a1816016850160208f01613f84565b8a51908301906139b8816016840160208f01613f84565b6f1132bc3a32b93730b62fbab936111d1160811b601692909101918201526139e3602682018b6136ec565b905088516139f5818360208d01613f84565b6226743d60e81b91019081528751613a14816003840160208c01613f84565b6a11161134b6b0b3b2911d1160a91b60039290910191820152613a3a600e8201886136ec565b90508551613a4c818360208a01613f84565b613a9f613a92613a8c613a71613a6b858701602f60f81b815260010190565b8a6136d0565b6e11161130ba3a3934b13aba32b9911d60891b8152600f0190565b876136d0565b607d60f81b815260010190565b9d9c50505050505050505050505050565b7f646174613a746578742f68746d6c2c25334368746d6c2533452533436865616481527f253345253343736372697074253230737263253344253232000000000000000060208201526000613b0860388301876136ec565b7412991912991834b73a32b3b934ba3c9299a212991960591b8152613b3060158201876136ec565b90507f25323225323063726f73736f726967696e253344253232616e6f6e796d6f757381527f253232253345253343253246736372697074253345253343253246686561642560208201527f3345253343626f647925334525334373637269707425334576617225323073656040820152641959094cd160da1b60608201528451613bc2816065840160208901613f84565b701299a13b30b91299183a399299a212991960791b606592909101918201528351613bf4816076840160208801613f84565b016076019695505050505050565b605b60f81b815260008251613c1e816001850160208701613f84565b605d60f81b6001939091019283015250600201919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613c6e81601d850160208701613f84565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613cae908301846136a4565b9695505050505050565b6020815260006117b960208301846136a4565b604081526000613cde60408301856136a4565b82810360208401526134f281856136a4565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600b908201526a4d75737420626520796f7560a81b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600e908201526d24b73b30b634b210383937b7b31760911b604082015260600190565b604080519081016001600160401b0381118282101715613e3757613e37614092565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e6557613e65614092565b604052919050565b60006001600160401b03821115613e8657613e86614092565b50601f01601f191660200190565b600061ffff8083168185168083038211156137c8576137c861403a565b60008219821115613ec457613ec461403a565b500190565b600060ff821660ff84168060ff03821115613ee657613ee661403a565b019392505050565b600082613efd57613efd614050565b500490565b6000816000190483118215151615613f1c57613f1c61403a565b500290565b600060ff821660ff84168160ff0481118215151615613f4257613f4261403a565b029392505050565b600082821015613f5c57613f5c61403a565b500390565b600060ff821660ff841680821015613f7b57613f7b61403a565b90039392505050565b60005b83811015613f9f578181015183820152602001613f87565b83811115610e6d5750506000910152565b600181811c90821680613fc457607f821691505b60208210811415613fe557634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613fff57613fff61403a565b5060010190565b600060ff821660ff81141561401d5761401d61403a565b60010192915050565b60008261403557614035614050565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610ae257600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f222c20226465736372697074696f6e223a20223134383920666f72676f7474656e20424c55335052494e5453207765726520666f756e642c206c65667420626568696e6420627920612064697374616e7420636976696c697a6174696f6e2e205472616974732067656e657261746564206f6e2d636861696e2e204d6574616461746120616e6420424c55335052494e545320617265206d6972726f726564207065726d616e656e746c79206f6e2d636861696e2e204f776e6572732063616e2073776170206265747765656e20706f72747261697420616e64206c616e647363617065206f6e2d636861696e2e222ca26469706673582212202d0ccd92a175a9ce6a808736560b2690d05c4b1e206f92285ce46c3d8fa7195064736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ff330c328cf7ae6a5aefe8df13a06480fb1f7c59884422f18752a10e0e52e81b923380acc61f8c390c03ba3022cdd13df5a770bc5360b515863c2f7fc723a9cea9c7420babdbb584aaa1b494e054fa31c914276ad213e0913132cf563f72e5a1d1d079fcf807b1f864b58d1f9bf97060f9ff1f6f
-----Decoded View---------------
Arg [0] : _blueprintsData (address): 0xff330C328CF7Ae6A5AEfe8df13a06480fB1f7C59
Arg [1] : _dayOneMerkleRoot (bytes32): 0x884422f18752a10e0e52e81b923380acc61f8c390c03ba3022cdd13df5a770bc
Arg [2] : _eightsMerkleRoot (bytes32): 0x5360b515863c2f7fc723a9cea9c7420babdbb584aaa1b494e054fa31c914276a
Arg [3] : _sevensMerkleRoot (bytes32): 0xd213e0913132cf563f72e5a1d1d079fcf807b1f864b58d1f9bf97060f9ff1f6f
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000ff330c328cf7ae6a5aefe8df13a06480fb1f7c59
Arg [1] : 884422f18752a10e0e52e81b923380acc61f8c390c03ba3022cdd13df5a770bc
Arg [2] : 5360b515863c2f7fc723a9cea9c7420babdbb584aaa1b494e054fa31c914276a
Arg [3] : d213e0913132cf563f72e5a1d1d079fcf807b1f864b58d1f9bf97060f9ff1f6f
Deployed Bytecode Sourcemap
51376:20500:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68200:413;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45123:224;;;;;;:::i;:::-;;:::i;:::-;;;22722:14:1;;22715:22;22697:41;;22685:2;22670:18;45123:224:0;22557:187:1;32617:100:0;;;:::i;34176:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;22020:32:1;;;22002:51;;21990:2;21975:18;34176:221:0;21856:203:1;33699:411:0;;;;;;:::i;:::-;;:::i;:::-;;69523:138;;;:::i;63273:923::-;;;;;;:::i;:::-;;:::i;71020:120::-;;;;;;:::i;:::-;;:::i;45763:113::-;45851:10;:17;45763:113;;;22895:25:1;;;22883:2;22868:18;45763:113:0;22749:177:1;51861:41:0;;;;;58075:143;;;:::i;34926:339::-;;;;;;:::i;:::-;;:::i;71759:114::-;;;;;;:::i;:::-;;:::i;71263:102::-;;;;;;:::i;:::-;;:::i;52558:36::-;;;;;;;;;61864:590;;;;;;:::i;:::-;;:::i;45431:256::-;;;;;;:::i;:::-;;:::i;52118:45::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;69816:392::-;;;;;;:::i;:::-;;:::i;35336:185::-;;;;;;:::i;:::-;;:::i;71514:114::-;;;;;;:::i;:::-;;:::i;45953:233::-;;;;;;:::i;:::-;;:::i;52518:33::-;;;;;;57956:111;;;;;;:::i;:::-;;:::i;32311:239::-;;;;;;:::i;:::-;;:::i;64261:1568::-;;;;;;:::i;:::-;;:::i;32041:208::-;;;;;;:::i;:::-;;:::i;11587:103::-;;;:::i;52433:32::-;;;;;;;;;59229:513;;;;;;:::i;:::-;;:::i;52839:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;10936:87;11009:6;;-1:-1:-1;;;;;11009:6:0;10936:87;;32786:104;;;:::i;52601:107::-;;;;;;:::i;:::-;;:::i;60705:365::-;;;:::i;52784:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;51909:41;;;;;34469:155;;;;;;:::i;:::-;;:::i;58226:246::-;;;:::i;61078:778::-;;;;;;:::i;:::-;;:::i;35592:328::-;;;;;;:::i;:::-;;:::i;65984:2082::-;;;;;;:::i;:::-;;:::i;70753:100::-;;;;;;:::i;:::-;;:::i;51813:41::-;;;;;34695:164;;;;;;:::i;:::-;-1:-1:-1;;;;;34816:25:0;;;34792:4;34816:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34695:164;60411:286;;;;;;:::i;:::-;;:::i;11845:201::-;;;;;;:::i;:::-;;:::i;70220:184::-;;;:::i;70412:215::-;;;;;;:::i;:::-;;:::i;51981:29::-;;;;;-1:-1:-1;;;;;51981:29:0;;;52472:37;;;;;;68200:413;68321:23;68347;;;:13;:23;;;;;68321:49;;68290:13;;68321:23;68347;68321:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68385:28:0;;;;:18;:28;;;;;;68321:49;;-1:-1:-1;;;68385:28:0;;68381:196;;;68466:9;68449:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;68430:51;;68381:196;;;68550:9;68533:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;68514:51;;68381:196;68596:9;68200:413;-1:-1:-1;;68200:413:0:o;45123:224::-;45225:4;-1:-1:-1;;;;;;45249:50:0;;-1:-1:-1;;;45249:50:0;;:90;;;45303:36;45327:11;45303:23;:36::i;32617:100::-;32671:13;32704:5;32697:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32617:100;:::o;34176:221::-;34252:7;37519:16;;;:7;:16;;;;;;-1:-1:-1;;;;;37519:16:0;34272:73;;;;-1:-1:-1;;;34272:73:0;;28803:2:1;34272:73:0;;;28785:21:1;28842:2;28822:18;;;28815:30;28881:34;28861:18;;;28854:62;-1:-1:-1;;;28932:18:1;;;28925:42;28984:19;;34272:73:0;;;;;;;;;-1:-1:-1;34365:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34365:24:0;;34176:221::o;33699:411::-;33780:13;33796:23;33811:7;33796:14;:23::i;:::-;33780:39;;33844:5;-1:-1:-1;;;;;33838:11:0;:2;-1:-1:-1;;;;;33838:11:0;;;33830:57;;;;-1:-1:-1;;;33830:57:0;;30729:2:1;33830:57:0;;;30711:21:1;30768:2;30748:18;;;30741:30;30807:34;30787:18;;;30780:62;-1:-1:-1;;;30858:18:1;;;30851:31;30899:19;;33830:57:0;30527:397:1;33830:57:0;9740:10;-1:-1:-1;;;;;33922:21:0;;;;:62;;-1:-1:-1;33947:37:0;33964:5;9740:10;34695:164;:::i;33947:37::-;33900:168;;;;-1:-1:-1;;;33900:168:0;;27196:2:1;33900:168:0;;;27178:21:1;27235:2;27215:18;;;27208:30;27274:34;27254:18;;;27247:62;27345:26;27325:18;;;27318:54;27389:19;;33900:168:0;26994:420:1;33900:168:0;34081:21;34090:2;34094:7;34081:8;:21::i;:::-;33769:341;33699:411;;:::o;69523:138::-;11009:6;;-1:-1:-1;;;;;11009:6:0;9740:10;11156:23;11148:68;;;;-1:-1:-1;;;11148:68:0;;;;;;;:::i;:::-;69579:9:::1;69574:80;69598:2;69594:1;:6;69574:80;;;69629:13;::::0;;;:10:::1;:13;::::0;;;;69622:20:::1;::::0;::::1;:::i;:::-;69602:3:::0;::::1;::::0;::::1;:::i;:::-;;;;69574:80;;;;69523:138::o:0;63273:923::-;63380:13;63411:24;63571:7;63639:13;63793:35;63819:8;63793:25;:35::i;:::-;63885:5;63459:446;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;63459:446:0;;;;;;;;;63972:14;;-1:-1:-1;;;63956:55:0;;;;63459:446;;-1:-1:-1;63929:24:0;;-1:-1:-1;;;;;63972:14:0;;;;63956:53;;:55;;;;;63929:24;;63956:55;;;;;;;63972:14;63956:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63956:55:0;;;;;;;;;;;;:::i;:::-;63929:82;;64093:10;64122;64058:89;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;64058:89:0;;;;;;;63273:923;-1:-1:-1;;;;;63273:923:0:o;71020:120::-;11009:6;;-1:-1:-1;;;;;11009:6:0;9740:10;11156:23;11148:68;;;;-1:-1:-1;;;11148:68:0;;;;;;;:::i;:::-;71102:30;;::::1;::::0;:13:::1;::::0;:30:::1;::::0;::::1;::::0;::::1;:::i;:::-;;71020:120:::0;:::o;58075:143::-;11009:6;;-1:-1:-1;;;;;11009:6:0;9740:10;11156:23;11148:68;;;;-1:-1:-1;;;11148:68:0;;;;;;;:::i;:::-;58154:2:::1;58139:12;;:17;58131:26;;;::::0;::::1;;58168:12;:14:::0;;;:12:::1;:14;::::0;::::1;:::i;:::-;;;;;;58195:15;:13;:15::i;:::-;58075:143::o:0;34926:339::-;35121:41;9740:10;35154:7;35121:18;:41::i;:::-;35113:103;;;;-1:-1:-1;;;35113:103:0;;;;;;;:::i;:::-;35229:28;35239:4;35245:2;35249:7;35229:9;:28::i;71759:114::-;11009:6;;-1:-1:-1;;;;;11009:6:0;9740:10;11156:23;11148:68;;;;-1:-1:-1;;;11148:68:0;;;;;;;:::i;:::-;71839:26;;::::1;::::0;:11:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;71263:102::-:0;11009:6;;-1:-1:-1;;;;;11009:6:0;9740:10;11156:23;11148:68;;;;-1:-1:-1;;;11148:68:0;;;;;;;:::i;:::-;71337:20;;::::1;::::0;:8:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;61864:590::-:0;62027:25;;-1:-1:-1;;;;;;10261:2:1;10257:15;;;10253:53;62027:25:0;;;10241:66:1;62002:12:0;;10323::1;;62027:25:0;;;;;;;;;;;;62017:36;;;;;;62002:51;;62088:55;62107:11;;62088:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62120:16:0;;-1:-1:-1;62138:4:0;;-1:-1:-1;62088:18:0;;-1:-1:-1;62088:55:0:i;:::-;62066:119;;;;-1:-1:-1;;;62066:119:0;;;;;;;:::i;:::-;62206:10;-1:-1:-1;;;;;62206:21:0;;;62198:45;;;;-1:-1:-1;;;62198:45:0;;;;;;;:::i;:::-;62262:16;;;;:24;;:16;:24;62254:33;;;;;;62331:2;62306:22;:20;:22::i;:::-;:27;62298:52;;;;-1:-1:-1;;;62298:52:0;;26855:2:1;62298:52:0;;;26837:21:1;26894:2;26874:18;;;26867:30;-1:-1:-1;;;26913:18:1;;;26906:42;26965:18;;62298:52:0;26653:336:1;62298:52:0;62387:4;62371:13;;:20;62363:29;;;;;;62403:13;:15;;;:13;:15;;;:::i;:::-;;;;;;62431;:13;:15::i;:::-;61954:500;61864:590;;;:::o;45431:256::-;45528:7;45564:23;45581:5;45564:16;:23::i;:::-;45556:5;:31;45548:87;;;;-1:-1:-1;;;45548:87:0;;23743:2:1;45548:87:0;;;23725:21:1;23782:2;23762:18;;;23755:30;23821:34;23801:18;;;23794:62;-1:-1:-1;;;23872:18:1;;;23865:41;23923:19;;45548:87:0;23541:407:1;45548:87:0;-1:-1:-1;;;;;;45653:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;45431:256::o;52118:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;69816:392::-;11009:6;;-1:-1:-1;;;;;11009:6:0;9740:10;11156:23;11148:68;;;;-1:-1:-1;;;11148:68:0;;;;;;;:::i;:::-;69942:9:::1;69937:245;69961:6;:13;69957:1;:17;69937:245;;;69996:10;:27;70007:15;69996:27;;;;;;;;;;;70047:108;;;;;;;;70075:6;70082:1;70075:9;;;;;;;;:::i;:::-;;;;;;;:19;;;70047:108;;;;70117:6;70124:1;70117:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;:19;::::1;::::0;70047:108;;;69996:174;;::::1;::::0;::::1;::::0;;-1:-1:-1;69996:174:0;;;;;;;;;;;;;::::1;;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;69996:174:0::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;69976:3;;;;;:::i;:::-;;;;69937:245;;35336:185:::0;35474:39;35491:4;35497:2;35501:7;35474:39;;;;;;;;;;;;:16;:39::i;71514:114::-;11009:6;;-1:-1:-1;;;;;11009:6:0;9740:10;11156:23;11148:68;;;;-1:-1:-1;;;11148:68:0;;;;;;;:::i;:::-;71594:26;;::::1;::::0;:11:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;45953:233::-:0;46028:7;46064:30;45851:10;:17;;45763:113;46064:30;46056:5;:38;46048:95;;;;-1:-1:-1;;;46048:95:0;;31898:2:1;46048:95:0;;;31880:21:1;31937:2;31917:18;;;31910:30;31976:34;31956:18;;;31949:62;-1:-1:-1;;;32027:18:1;;;32020:42;32079:19;;46048:95:0;31696:408:1;46048:95:0;46161:10;46172:5;46161:17;;;;;;;;:::i;:::-;;;;;;;;;46154:24;;45953:233;;;:::o;57956:111::-;11009:6;;-1:-1:-1;;;;;11009:6:0;9740:10;11156:23;11148:68;;;;-1:-1:-1;;;11148:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;58028:24:0::1;;::::0;;;:14:::1;:24;::::0;;;;:31;;-1:-1:-1;;58028:31:0::1;58055:4;58028:31;::::0;;57956:111::o;32311:239::-;32383:7;32419:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32419:16:0;32454:19;32446:73;;;;-1:-1:-1;;;32446:73:0;;28032:2:1;32446:73:0;;;28014:21:1;28071:2;28051:18;;;28044:30;28110:34;28090:18;;;28083:62;-1:-1:-1;;;28161:18:1;;;28154:39;28210:19;;32446:73:0;27830:405:1;64261:1568:0;64354:13;64385:28;64434:23;64460:90;64500:39;64527:5;64534:1;64537;64500:26;:39::i;:::-;64460:25;:90::i;:::-;64705:13;;;:10;:13;;;:32;;64434:116;;-1:-1:-1;64636:14:0;;64705:32;;;;;;;;;;:::i;:::-;;;;;;;;;;;:42;;64798:10;:13;64809:1;64798:13;;;;;;;;;;;64812:17;64798:32;;;;;;;;;;:::i;:::-;;;;;;;;;;;:42;;64601:278;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;64601:278:0;;;;;;;;;;-1:-1:-1;64918:1:0;64903:849;64925:2;64921:1;:6;;;64903:849;;;64949:20;64972:102;65016:43;65043:5;65016:43;;;65053:5;65050:1;65057;65053:5;:::i;:::-;65016:43;;:26;:43::i;64972:102::-;64949:125;;65091:23;65117:10;:13;65128:1;65117:13;;;;;;;;;;;;;65131:14;65117:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;65091:65;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65203:1;65183:9;65177:23;:27;65173:568;;;65314:14;65399:9;65475:10;:13;65486:1;65475:13;;;;;;;;;;;;;65489:14;65475:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;65271:297;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65225:362;;65612:1;:7;;65617:2;65612:7;65608:118;;65685:14;65668:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;65644:62;;65608:118;64934:818;;64929:3;;;;;:::i;:::-;;;;64903:849;;;;65800:14;65778:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;65764:57;;;;64261:1568;;;:::o;32041:208::-;32113:7;-1:-1:-1;;;;;32141:19:0;;32133:74;;;;-1:-1:-1;;;32133:74:0;;27621:2:1;32133:74:0;;;27603:21:1;27660:2;27640:18;;;27633:30;27699:34;27679:18;;;27672:62;-1:-1:-1;;;27750:18:1;;;27743:40;27800:19;;32133:74:0;27419:406:1;32133:74:0;-1:-1:-1;;;;;;32225:16:0;;;;;:9;:16;;;;;;;32041:208::o;11587:103::-;11009:6;;-1:-1:-1;;;;;11009:6:0;9740:10;11156:23;11148:68;;;;-1:-1:-1;;;11148:68:0;;;;;;;:::i;:::-;11652:30:::1;11679:1;11652:18;:30::i;59229:513::-:0;59422:25;;-1:-1:-1;;;;;;10261:2:1;10257:15;;;10253:53;59422:25:0;;;10241:66:1;59397:12:0;;10323::1;;59422:25:0;;;;;;;;;;;;59412:36;;;;;;59397:51;;59483:55;59502:11;;59483:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59515:16:0;;-1:-1:-1;59533:4:0;;-1:-1:-1;59483:18:0;;-1:-1:-1;59483:55:0:i;:::-;59461:119;;;;-1:-1:-1;;;59461:119:0;;;;;;;:::i;:::-;59601:10;-1:-1:-1;;;;;59601:21:0;;;59593:45;;;;-1:-1:-1;;;59593:45:0;;;;;;;:::i;32786:104::-;32842:13;32875:7;32868:14;;;;;:::i;52601:107::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52601:107:0;:::o;60705:365::-;60758:7;60821:14;;60803:15;;:32;;;;:::i;:::-;60786:12;:50;;60778:59;;;;;;60873:1;60856:14;;:18;60848:27;;;;;;60888:23;60948:14;;60930:15;;:32;;;;:::i;:::-;60914:49;;:12;:49;:::i;:::-;60888:75;;60974:20;61015:15;;60997;:33;;;;:::i;:::-;60974:56;60705:365;-1:-1:-1;;;60705:365:0:o;34469:155::-;34564:52;9740:10;34597:8;34607;34564:18;:52::i;58226:246::-;58299:10;58284:26;;;;:14;:26;;;;;;;;:34;;:26;:34;58276:43;;;;;;58357:2;58338:16;;:21;58330:30;;;;;;58388:10;58402:5;58373:26;;;:14;:26;;;;;:34;;-1:-1:-1;;58373:34:0;;;58418:16;:18;;;;;;:::i;61078:778::-;61290:32;;-1:-1:-1;;;;;;10523:2:1;10519:15;;;10515:53;61290:32:0;;;10503:66:1;10585:12;;;10578:28;;;61265:12:0;;10622::1;;61290:32:0;;;;;;;;;;;;61280:43;;;;;;61265:58;;61358:55;61377:11;;61358:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61390:16:0;;-1:-1:-1;61408:4:0;;-1:-1:-1;61358:18:0;;-1:-1:-1;61358:55:0:i;:::-;61336:119;;;;-1:-1:-1;;;61336:119:0;;;;;;;:::i;:::-;61508:10;-1:-1:-1;;;;;61508:21:0;;;61500:45;;;;-1:-1:-1;;;61500:45:0;;;;;;;:::i;:::-;61564:16;;;;:24;;:16;:24;61556:33;;;;;;61600:22;61625;61641:5;61625:15;:22::i;:::-;61600:47;;61692:14;61666:22;:20;:22::i;:::-;:40;;61658:49;;;;;;61789:4;61773:13;;:20;61765:29;;;;;;61805:13;:15;;;:13;:15;;;:::i;:::-;;;;;;61833;:13;:15::i;:::-;61217:639;;61078:778;;;;:::o;35592:328::-;35767:41;9740:10;35800:7;35767:18;:41::i;:::-;35759:103;;;;-1:-1:-1;;;35759:103:0;;;;;;;:::i;:::-;35873:39;35887:4;35893:2;35897:7;35906:5;35873:13;:39::i;65984:2082::-;37495:4;37519:16;;;:7;:16;;;;;;66086:13;;-1:-1:-1;;;;;37519:16:0;66117:26;;;;;;66156:23;66182:24;66197:8;66182:14;:24::i;:::-;66156:50;;66227:25;:270;;;;;;;;;;;;;;;;;;;66510:28;66541:93;66595:35;66621:8;66595:25;:35::i;:::-;66578:53;;;;;;;;:::i;:::-;;;;;;;;;;;;;66541:23;:93::i;:::-;66510:124;;66645:25;66673:67;66727:9;66710:27;;;;;;;;:::i;66673:67::-;66645:95;;66899:1125;67144:35;67170:8;67144:25;:35::i;:::-;67218:11;67325;67375:14;67472:11;67574:8;67621:35;67647:8;67621:25;:35::i;:::-;67737:9;67841:25;67856:9;67841:14;:25::i;:::-;67026:917;;;;;;;;;;;;;;;;:::i;66899:1125::-;66806:1237;;;;;;;;:::i;:::-;;;;;;;;;;;;;66761:1297;;;;;;65984:2082;;;:::o;70753:100::-;11009:6;;-1:-1:-1;;;;;11009:6:0;9740:10;11156:23;11148:68;;;;-1:-1:-1;;;11148:68:0;;;;;;;:::i;:::-;70827:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;60411:286::-:0;60474:7;;60494:139;60518:6;:13;60514:17;;60494:139;;;60570:7;60557:6;60564:1;60557:9;;;;;;;;:::i;:::-;;;;;;;;;:20;60553:69;;;60605:1;60411:286;-1:-1:-1;;60411:286:0:o;60553:69::-;60533:3;;;;:::i;:::-;;;;60494:139;;;-1:-1:-1;60643:14:0;;;11845:201;11009:6;;-1:-1:-1;;;;;11009:6:0;9740:10;11156:23;11148:68;;;;-1:-1:-1;;;11148:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11934:22:0;::::1;11926:73;;;::::0;-1:-1:-1;;;11926:73:0;;24574:2:1;11926:73:0::1;::::0;::::1;24556:21:1::0;24613:2;24593:18;;;24586:30;24652:34;24632:18;;;24625:62;-1:-1:-1;;;24703:18:1;;;24696:36;24749:19;;11926:73:0::1;24372:402:1::0;11926:73:0::1;12010:28;12029:8;12010:18;:28::i;70220:184::-:0;11009:6;;-1:-1:-1;;;;;11009:6:0;9740:10;11156:23;11148:68;;;;-1:-1:-1;;;11148:68:0;;;;;;;:::i;:::-;70281:14:::1;::::0;70277:81:::1;;70334:12;70317:14;:29:::0;70277:81:::1;70384:12;::::0;;-1:-1:-1;;70368:28:0;::::1;70384:12;::::0;;::::1;70383:13;70368:28;::::0;;70220:184::o;70412:215::-;70502:10;70482:16;70490:7;70482;:16::i;:::-;-1:-1:-1;;;;;70482:30:0;;70474:76;;;;-1:-1:-1;;;70474:76:0;;30327:2:1;70474:76:0;;;30309:21:1;30366:2;30346:18;;;30339:30;30405:34;30385:18;;;30378:62;-1:-1:-1;;;30456:18:1;;;30449:31;30497:19;;70474:76:0;30125:397:1;70474:76:0;70592:27;;;;:18;:27;;;;;;;-1:-1:-1;;70561:58:0;;70592:27;;;;70591:28;70561:58;;;70412:215::o;31672:305::-;31774:4;-1:-1:-1;;;;;;31811:40:0;;-1:-1:-1;;;31811:40:0;;:105;;-1:-1:-1;;;;;;;31868:48:0;;-1:-1:-1;;;31868:48:0;31811:105;:158;;;-1:-1:-1;;;;;;;;;;23477:40:0;;;31933:36;23368:157;41412:174;41487:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;41487:29:0;-1:-1:-1;;;;;41487:29:0;;;;;;;;:24;;41541:23;41487:24;41541:14;:23::i;:::-;-1:-1:-1;;;;;41532:46:0;;;;;;;;;;;41412:174;;:::o;2583:532::-;2639:13;2669:10;2665:53;;-1:-1:-1;;2696:10:0;;;;;;;;;;;;-1:-1:-1;;;2696:10:0;;;;;2583:532::o;2665:53::-;2743:5;2728:12;2784:78;2791:9;;2784:78;;2817:8;;;;:::i;:::-;;-1:-1:-1;2840:10:0;;-1:-1:-1;2848:2:0;2840:10;;:::i;:::-;;;2784:78;;;2872:19;2904:6;-1:-1:-1;;;;;2894:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2894:17:0;;2872:39;;2922:154;2929:10;;2922:154;;2956:11;2966:1;2956:11;;:::i;:::-;;-1:-1:-1;3025:10:0;3033:2;3025:5;:10;:::i;:::-;3012:24;;:2;:24;:::i;:::-;2999:39;;2982:6;2989;2982:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2982:56:0;;;;;;;;-1:-1:-1;3053:11:0;3062:2;3053:11;;:::i;:::-;;;2922:154;;;3100:6;2583:532;-1:-1:-1;;;;2583:532:0:o;58525:696::-;58578:12;;;;:20;;:12;:20;;:45;;-1:-1:-1;11009:6:0;;-1:-1:-1;;;;;11009:6:0;58602:10;:21;58578:45;58570:78;;;;-1:-1:-1;;;58570:78:0;;31549:2:1;58570:78:0;;;31531:21:1;31588:2;31568:18;;;31561:30;-1:-1:-1;;;31607:18:1;;;31600:50;31667:18;;58570:78:0;31347:344:1;58570:78:0;58683:10;58667:27;;;;:15;:27;;;;;;;;:36;;:61;;-1:-1:-1;11009:6:0;;-1:-1:-1;;;;;11009:6:0;58707:10;:21;58667:61;58659:90;;;;-1:-1:-1;;;58659:90:0;;25338:2:1;58659:90:0;;;25320:21:1;25377:2;25357:18;;;25350:30;-1:-1:-1;;;25396:18:1;;;25389:46;25452:18;;58659:90:0;25136:340:1;58659:90:0;58797:10;4384:20;4432:8;58760:49;;;;;;58830:20;58853:13;45851:10;:17;;45763:113;58853:13;58830:36;;58900:10;;58885:12;:25;58877:34;;;;;;58946:12;59000:32;58946:12;59018:10;58924:19;59000:4;:32::i;:::-;58971:26;;;;:13;:26;;;;;;;;:61;;;;:26;;:61;;;;;;:::i;:::-;;59088:4;59045:12;59058:13;:26;59072:11;59058:26;;;;;;;;;;;59045:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:47;;;;;-1:-1:-1;;59045:47:0;;;;;;59121:10;59045:40;59105:27;;;:15;:27;;;;;:34;;;;;59045:47;59105:34;;;;59152:30;;59170:11;59152:5;:30::i;:::-;59195:18;:16;:18::i;37724:348::-;37817:4;37519:16;;;:7;:16;;;;;;-1:-1:-1;;;;;37519:16:0;37834:73;;;;-1:-1:-1;;;37834:73:0;;26442:2:1;37834:73:0;;;26424:21:1;26481:2;26461:18;;;26454:30;26520:34;26500:18;;;26493:62;-1:-1:-1;;;26571:18:1;;;26564:42;26623:19;;37834:73:0;26240:408:1;37834:73:0;37918:13;37934:23;37949:7;37934:14;:23::i;:::-;37918:39;;37987:5;-1:-1:-1;;;;;37976:16:0;:7;-1:-1:-1;;;;;37976:16:0;;:51;;;;38020:7;-1:-1:-1;;;;;37996:31:0;:20;38008:7;37996:11;:20::i;:::-;-1:-1:-1;;;;;37996:31:0;;37976:51;:87;;;-1:-1:-1;;;;;;34816:25:0;;;34792:4;34816:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;38031:32;34695:164;40716:578;40875:4;-1:-1:-1;;;;;40848:31:0;:23;40863:7;40848:14;:23::i;:::-;-1:-1:-1;;;;;40848:31:0;;40840:85;;;;-1:-1:-1;;;40840:85:0;;29917:2:1;40840:85:0;;;29899:21:1;29956:2;29936:18;;;29929:30;29995:34;29975:18;;;29968:62;-1:-1:-1;;;30046:18:1;;;30039:39;30095:19;;40840:85:0;29715:405:1;40840:85:0;-1:-1:-1;;;;;40944:16:0;;40936:65;;;;-1:-1:-1;;;40936:65:0;;25683:2:1;40936:65:0;;;25665:21:1;25722:2;25702:18;;;25695:30;25761:34;25741:18;;;25734:62;-1:-1:-1;;;25812:18:1;;;25805:34;25856:19;;40936:65:0;25481:400:1;40936:65:0;41014:39;41035:4;41041:2;41045:7;41014:20;:39::i;:::-;41118:29;41135:1;41139:7;41118:8;:29::i;:::-;-1:-1:-1;;;;;41160:15:0;;;;;;:9;:15;;;;;:20;;41179:1;;41160:15;:20;;41179:1;;41160:20;:::i;:::-;;;;-1:-1:-1;;;;;;;41191:13:0;;;;;;:9;:13;;;;;:18;;41208:1;;41191:13;:18;;41208:1;;41191:18;:::i;:::-;;;;-1:-1:-1;;41220:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;41220:21:0;-1:-1:-1;;;;;41220:21:0;;;;;;;;;41259:27;;41220:16;;41259:27;;;;;;;40716:578;;;:::o;5597:190::-;5722:4;5775;5746:25;5759:5;5766:4;5746:12;:25::i;:::-;:33;;5597:190;-1:-1:-1;;;;5597:190:0:o;3634:419::-;3767:13;3823:3;3793:21;3870;3881:10;3870:8;:21;:::i;:::-;-1:-1:-1;;;;;3860:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3860:32:0;-1:-1:-1;3838:54:0;-1:-1:-1;3920:10:0;3903:111;3936:8;3932:1;:12;3903:111;;;3991:8;4000:1;3991:11;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;3991:11:0;3966:6;3973:14;3977:10;3973:1;:14;:::i;:::-;3966:22;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;3966:36:0;;;;;;;;-1:-1:-1;3946:3:0;;;;:::i;:::-;;;;3903:111;;;-1:-1:-1;4038:6:0;3634:419;-1:-1:-1;;;;;3634:419:0:o;3123:503::-;3209:16;3272:2;3209:16;;3311:286;3333:7;:14;3329:1;:18;;;3311:286;;;3420:2;3404:7;3412:1;3404:10;;;;;;;;;;:::i;:::-;;;;;;;3392:30;;;;3391:85;;;3473:2;3457:7;3465:1;3457:10;;;;;;;;;;:::i;:::-;;;;;;;3445:30;;3391:85;3369:217;;;3511:10;3519:2;3511:10;;:::i;:::-;;;3568:2;3554:7;3562:1;3554:10;;;;;;;;;;:::i;:::-;;;;;3548:22;;;3554:10;;3548:22;:::i;:::-;3540:30;;;;:::i;:::-;;;3369:217;3349:3;;;;:::i;:::-;;;;3311:286;;;-1:-1:-1;3614:4:0;3123:503;-1:-1:-1;;;3123:503:0:o;12206:191::-;12299:6;;;-1:-1:-1;;;;;12316:17:0;;;-1:-1:-1;;;;;;12316:17:0;;;;;;;12349:40;;12299:6;;;12316:17;12299:6;;12349:40;;12280:16;;12349:40;12269:128;12206:191;:::o;41728:315::-;41883:8;-1:-1:-1;;;;;41874:17:0;:5;-1:-1:-1;;;;;41874:17:0;;;41866:55;;;;-1:-1:-1;;;41866:55:0;;26088:2:1;41866:55:0;;;26070:21:1;26127:2;26107:18;;;26100:30;26166:27;26146:18;;;26139:55;26211:18;;41866:55:0;25886:349:1;41866:55:0;-1:-1:-1;;;;;41932:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;41932:46:0;;;;;;;;;;41994:41;;22697::1;;;41994::0;;22670:18:1;41994:41:0;;;;;;;41728:315;;;:::o;36802:::-;36959:28;36969:4;36975:2;36979:7;36959:9;:28::i;:::-;37006:48;37029:4;37035:2;37039:7;37048:5;37006:22;:48::i;:::-;36998:111;;;;-1:-1:-1;;;36998:111:0;;;;;;;:::i;221:2256::-;279:13;309:4;:11;324:1;309:16;305:31;;;-1:-1:-1;;327:9:0;;;;;;;;;-1:-1:-1;327:9:0;;;221:2256::o;305:31::-;388:19;410:5;;;;;;;;;;;;;;;;;388:27;;467:18;513:1;494:4;:11;508:1;494:15;;;;:::i;:::-;493:21;;;;:::i;:::-;488:27;;:1;:27;:::i;:::-;467:48;-1:-1:-1;598:20:0;632:15;467:48;645:2;632:15;:::i;:::-;-1:-1:-1;;;;;621:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;621:27:0;;598:50;;745:10;737:6;730:26;840:1;833:5;829:13;899:4;950;944:11;935:7;931:25;1046:2;1038:6;1034:15;1119:1045;1154:6;1145:7;1142:19;1119:1045;;;1224:1;1211:15;;;1292:14;;1475:4;1463:2;1459:14;;;1455:25;;1441:40;;1435:47;1430:3;1426:57;;;1365:137;;1666:2;1662:14;;;1658:25;;1644:40;;1638:47;1629:57;;1548:1;1533:17;;1568:137;1869:1;1865:13;;;1861:24;;1847:39;;1841:46;1832:56;;1736:17;;;1771:136;2063:16;;2049:31;;2043:38;2034:48;;1938:17;;;1973:128;;;;2132:17;;1119:1045;;;2237:1;2230:4;2224:11;2220:19;2258:1;2253:84;;;;2356:1;2351:82;;;;2213:220;;2253:84;-1:-1:-1;;;;;2286:17:0;;2279:43;2253:84;;2351:82;-1:-1:-1;;;;;2384:17:0;;2377:41;2213:220;-1:-1:-1;2463:6:0;;221:2256;-1:-1:-1;;;;;;;;221:2256:0:o;56362:1586::-;56464:13;56503:2;56498;:7;56490:16;;;;;;56621:30;;;;;;;;;:25;:30;;;56664:1175;56686:2;56682:1;:6;;;56664:1175;;;56710:10;:12;;;:10;:12;;;:::i;:::-;;;;-1:-1:-1;;57087:10:0;;56848:276;;;56895:15;56848:276;;;21563:19:1;56941:16:0;21598:12:1;;;21591:28;;;;21635:12;;;;21628:28;;;21690:15;;;-1:-1:-1;;;;;;21686:53:1;21672:12;;;21665:75;21756:13;;;21749:29;;;21794:13;;;21787:29;;;;-1:-1:-1;;57169:5:0;;21832:13:1;;56848:276:0;;;;;;;;;;;;56812:335;;;;;;56782:384;;:392;;;;:::i;:::-;56737:452;-1:-1:-1;57222:6:0;;;57218:610;;57249:9;57261:24;57271:10;57261:24;;57283:1;57261:9;:24::i;:::-;57249:36;;57314:1;57308:3;:7;;;57304:340;;;57404:11;57417:14;:3;:12;;;:14::i;:::-;57387:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57340:115;;57304:340;;;57568:11;57586:14;:3;:12;;;:14::i;:::-;57551:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57504:120;;57304:340;57230:429;57218:610;;;57744:11;57757:35;:24;57767:10;57757:24;;57779:1;57757:9;:24::i;:::-;:33;;;:35::i;:::-;57727:66;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57684:128;;57218:610;-1:-1:-1;56690:3:0;;;;:::i;:::-;;;;56664:1175;;;;57855:12;57868:11;57855:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;57851:58;;;57889:20;57894:2;57898;57902:6;:2;57907:1;57902:6;:::i;:::-;57889:4;:20::i;:::-;57882:27;;;;;39408:382;-1:-1:-1;;;;;39488:16:0;;39480:61;;;;-1:-1:-1;;;39480:61:0;;28442:2:1;39480:61:0;;;28424:21:1;;;28461:18;;;28454:30;28520:34;28500:18;;;28493:62;28572:18;;39480:61:0;28240:356:1;39480:61:0;37495:4;37519:16;;;:7;:16;;;;;;-1:-1:-1;;;;;37519:16:0;:30;39552:58;;;;-1:-1:-1;;;39552:58:0;;24981:2:1;39552:58:0;;;24963:21:1;25020:2;25000:18;;;24993:30;25059;25039:18;;;25032:58;25107:18;;39552:58:0;24779:352:1;39552:58:0;39623:45;39652:1;39656:2;39660:7;39623:20;:45::i;:::-;-1:-1:-1;;;;;39681:13:0;;;;;;:9;:13;;;;;:18;;39698:1;;39681:13;:18;;39698:1;;39681:18;:::i;:::-;;;;-1:-1:-1;;39710:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;39710:21:0;-1:-1:-1;;;;;39710:21:0;;;;;;;;39749:33;;39710:16;;;39749:33;;39710:16;;39749:33;39408:382;;:::o;59750:653::-;59802:16;;;;59798:55;;;59750:653::o;59798:55::-;59867:14;;59863:58;;59750:653::o;59863:58::-;59969:14;;59951:15;;:32;;;;:::i;:::-;59935:12;:49;59931:88;;;59750:653::o;59931:88::-;60031:16;:23;;-1:-1:-1;;60031:23:0;60050:4;60031:23;;;:16;60098:298;60122:6;:13;60118:17;;60098:298;;;60260:6;:13;60157:9;;60260:17;;60276:1;;60260:17;:::i;:::-;60208:15;60225:16;60243:10;60191:63;;;;;;;;;21115:19:1;;;21159:2;21150:12;;21143:28;;;;21209:2;21205:15;-1:-1:-1;;;;;;21201:53:1;21196:2;21187:12;;21180:75;21280:2;21271:12;;20930:359;60191:63:0;;;;;;;;;;;;;60181:74;;;;;;60173:83;;:105;;;;:::i;:::-;60169:109;;:1;:109;:::i;:::-;60157:121;;60293:12;60308:6;60315:1;60308:9;;;;;;;;:::i;:::-;;;;;;;;;60293:24;;60344:6;60351:1;60344:9;;;;;;;;:::i;:::-;;;;;;;;;60332:6;60339:1;60332:9;;;;;;;;:::i;:::-;;;;;;;;:21;;;;60380:4;60368:6;60375:1;60368:9;;;;;;;;:::i;:::-;;;;;;;;;;:16;-1:-1:-1;60137:3:0;;-1:-1:-1;60137:3:0;;;:::i;:::-;;;;60098:298;;46799:589;-1:-1:-1;;;;;47005:18:0;;47001:187;;47040:40;47072:7;48215:10;:17;;48188:24;;;;:15;:24;;;;;:44;;;48243:24;;;;;;;;;;;;48111:164;47040:40;47001:187;;;47110:2;-1:-1:-1;;;;;47102:10:0;:4;-1:-1:-1;;;;;47102:10:0;;47098:90;;47129:47;47162:4;47168:7;47129:32;:47::i;:::-;-1:-1:-1;;;;;47202:16:0;;47198:183;;47235:45;47272:7;47235:36;:45::i;47198:183::-;47308:4;-1:-1:-1;;;;;47302:10:0;:2;-1:-1:-1;;;;;47302:10:0;;47298:83;;47329:40;47357:2;47361:7;47329:27;:40::i;6149:701::-;6232:7;6275:4;6232:7;6290:523;6314:5;:12;6310:1;:16;6290:523;;;6348:20;6371:5;6377:1;6371:8;;;;;;;;:::i;:::-;;;;;;;6348:31;;6414:12;6398;:28;6394:408;;6551:44;;;;;;10802:19:1;;;10837:12;;;10830:28;;;10874:12;;6551:44:0;;;;;;;;;;;;6541:55;;;;;;6526:70;;6394:408;;;6741:44;;;;;;10802:19:1;;;10837:12;;;10830:28;;;10874:12;;6741:44:0;;;;;;;;;;;;6731:55;;;;;;6716:70;;6394:408;-1:-1:-1;6328:3:0;;;;:::i;:::-;;;;6290:523;;42608:799;42763:4;-1:-1:-1;;;;;42784:13:0;;4384:20;4432:8;42780:620;;42820:72;;-1:-1:-1;;;42820:72:0;;-1:-1:-1;;;;;42820:36:0;;;;;:72;;9740:10;;42871:4;;42877:7;;42886:5;;42820:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42820:72:0;;;;;;;;-1:-1:-1;;42820:72:0;;;;;;;;;;;;:::i;:::-;;;42816:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43062:13:0;;43058:272;;43105:60;;-1:-1:-1;;;43105:60:0;;;;;;;:::i;43058:272::-;43280:6;43274:13;43265:6;43261:2;43257:15;43250:38;42816:529;-1:-1:-1;;;;;;42943:51:0;-1:-1:-1;;;42943:51:0;;-1:-1:-1;42936:58:0;;42780:620;-1:-1:-1;43384:4:0;42608:799;;;;;;:::o;55520:553::-;55628:5;;;55690:355;55712:5;55718:11;55712:18;;;;;;;;;:::i;:::-;;:25;55708:29;;;;55690:355;;;55759:21;55783:5;55789:11;55783:18;;;;;;;;;:::i;:::-;;55802:1;55783:21;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;55759:45;;55855:17;55841:31;;:10;:31;;:99;;;;-1:-1:-1;55906:34:0;55926:14;55906:17;:34;:::i;:::-;55893:47;;:10;:47;55841:99;55819:145;;;-1:-1:-1;55963:1:0;-1:-1:-1;55956:8:0;;-1:-1:-1;55956:8:0;55819:145;55999:34;56019:14;55999:17;:34;:::i;:::-;55979:54;;55744:301;55739:3;;;;;:::i;:::-;;;;55690:355;;48902:988;49168:22;49218:1;49193:22;49210:4;49193:16;:22::i;:::-;:26;;;;:::i;:::-;49230:18;49251:26;;;:17;:26;;;;;;49168:51;;-1:-1:-1;49384:28:0;;;49380:328;;-1:-1:-1;;;;;49451:18:0;;49429:19;49451:18;;;:12;:18;;;;;;;;:34;;;;;;;;;49502:30;;;;;;:44;;;49619:30;;:17;:30;;;;;:43;;;49380:328;-1:-1:-1;49804:26:0;;;;:17;:26;;;;;;;;49797:33;;;-1:-1:-1;;;;;49848:18:0;;;;;:12;:18;;;;;:34;;;;;;;49841:41;48902:988::o;50185:1079::-;50463:10;:17;50438:22;;50463:21;;50483:1;;50463:21;:::i;:::-;50495:18;50516:24;;;:15;:24;;;;;;50889:10;:26;;50438:46;;-1:-1:-1;50516:24:0;;50438:46;;50889:26;;;;;;:::i;:::-;;;;;;;;;50867:48;;50953:11;50928:10;50939;50928:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;51033:28;;;:15;:28;;;;;;;:41;;;51205:24;;;;;51198:31;51240:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;50256:1008;;;50185:1079;:::o;47689:221::-;47774:14;47791:20;47808:2;47791:16;:20::i;:::-;-1:-1:-1;;;;;47822:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;47867:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;47689:221:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;14:336:1:-;78:5;107:52;123:35;151:6;123:35;:::i;:::-;107:52;:::i;:::-;98:61;;182:6;175:5;168:21;222:3;213:6;208:3;204:16;201:25;198:45;;;239:1;236;229:12;198:45;288:6;283:3;276:4;269:5;265:16;252:43;342:1;335:4;326:6;319:5;315:18;311:29;304:40;14:336;;;;;:::o;355:173::-;423:20;;-1:-1:-1;;;;;472:31:1;;462:42;;452:70;;518:1;515;508:12;452:70;355:173;;;:::o;533:367::-;596:8;606:6;660:3;653:4;645:6;641:17;637:27;627:55;;678:1;675;668:12;627:55;-1:-1:-1;701:20:1;;-1:-1:-1;;;;;733:30:1;;730:50;;;776:1;773;766:12;730:50;813:4;805:6;801:17;789:29;;873:3;866:4;856:6;853:1;849:14;841:6;837:27;833:38;830:47;827:67;;;890:1;887;880:12;827:67;533:367;;;;;:::o;905:221::-;948:5;1001:3;994:4;986:6;982:17;978:27;968:55;;1019:1;1016;1009:12;968:55;1041:79;1116:3;1107:6;1094:20;1087:4;1079:6;1075:17;1041:79;:::i;1131:186::-;1190:6;1243:2;1231:9;1222:7;1218:23;1214:32;1211:52;;;1259:1;1256;1249:12;1211:52;1282:29;1301:9;1282:29;:::i;1322:260::-;1390:6;1398;1451:2;1439:9;1430:7;1426:23;1422:32;1419:52;;;1467:1;1464;1457:12;1419:52;1490:29;1509:9;1490:29;:::i;:::-;1480:39;;1538:38;1572:2;1561:9;1557:18;1538:38;:::i;:::-;1528:48;;1322:260;;;;;:::o;1587:328::-;1664:6;1672;1680;1733:2;1721:9;1712:7;1708:23;1704:32;1701:52;;;1749:1;1746;1739:12;1701:52;1772:29;1791:9;1772:29;:::i;:::-;1762:39;;1820:38;1854:2;1843:9;1839:18;1820:38;:::i;:::-;1810:48;;1905:2;1894:9;1890:18;1877:32;1867:42;;1587:328;;;;;:::o;1920:666::-;2015:6;2023;2031;2039;2092:3;2080:9;2071:7;2067:23;2063:33;2060:53;;;2109:1;2106;2099:12;2060:53;2132:29;2151:9;2132:29;:::i;:::-;2122:39;;2180:38;2214:2;2203:9;2199:18;2180:38;:::i;:::-;2170:48;;2265:2;2254:9;2250:18;2237:32;2227:42;;2320:2;2309:9;2305:18;2292:32;-1:-1:-1;;;;;2339:6:1;2336:30;2333:50;;;2379:1;2376;2369:12;2333:50;2402:22;;2455:4;2447:13;;2443:27;-1:-1:-1;2433:55:1;;2484:1;2481;2474:12;2433:55;2507:73;2572:7;2567:2;2554:16;2549:2;2545;2541:11;2507:73;:::i;:::-;2497:83;;;1920:666;;;;;;;:::o;2591:511::-;2686:6;2694;2702;2755:2;2743:9;2734:7;2730:23;2726:32;2723:52;;;2771:1;2768;2761:12;2723:52;2794:29;2813:9;2794:29;:::i;:::-;2784:39;;2874:2;2863:9;2859:18;2846:32;-1:-1:-1;;;;;2893:6:1;2890:30;2887:50;;;2933:1;2930;2923:12;2887:50;2972:70;3034:7;3025:6;3014:9;3010:22;2972:70;:::i;:::-;2591:511;;3061:8;;-1:-1:-1;2946:96:1;;-1:-1:-1;;;;2591:511:1:o;3107:347::-;3172:6;3180;3233:2;3221:9;3212:7;3208:23;3204:32;3201:52;;;3249:1;3246;3239:12;3201:52;3272:29;3291:9;3272:29;:::i;:::-;3262:39;;3351:2;3340:9;3336:18;3323:32;3398:5;3391:13;3384:21;3377:5;3374:32;3364:60;;3420:1;3417;3410:12;3364:60;3443:5;3433:15;;;3107:347;;;;;:::o;3459:254::-;3527:6;3535;3588:2;3576:9;3567:7;3563:23;3559:32;3556:52;;;3604:1;3601;3594:12;3556:52;3627:29;3646:9;3627:29;:::i;:::-;3617:39;3703:2;3688:18;;;;3675:32;;-1:-1:-1;;;3459:254:1:o;3718:579::-;3822:6;3830;3838;3846;3899:2;3887:9;3878:7;3874:23;3870:32;3867:52;;;3915:1;3912;3905:12;3867:52;3938:29;3957:9;3938:29;:::i;:::-;3928:39;;4014:2;4003:9;3999:18;3986:32;3976:42;;4069:2;4058:9;4054:18;4041:32;-1:-1:-1;;;;;4088:6:1;4085:30;4082:50;;;4128:1;4125;4118:12;4082:50;4167:70;4229:7;4220:6;4209:9;4205:22;4167:70;:::i;:::-;3718:579;;;;-1:-1:-1;4256:8:1;-1:-1:-1;;;;3718:579:1:o;4302:245::-;4360:6;4413:2;4401:9;4392:7;4388:23;4384:32;4381:52;;;4429:1;4426;4419:12;4381:52;4468:9;4455:23;4487:30;4511:5;4487:30;:::i;4552:249::-;4621:6;4674:2;4662:9;4653:7;4649:23;4645:32;4642:52;;;4690:1;4687;4680:12;4642:52;4722:9;4716:16;4741:30;4765:5;4741:30;:::i;4806:322::-;4875:6;4928:2;4916:9;4907:7;4903:23;4899:32;4896:52;;;4944:1;4941;4934:12;4896:52;4984:9;4971:23;-1:-1:-1;;;;;5009:6:1;5006:30;5003:50;;;5049:1;5046;5039:12;5003:50;5072;5114:7;5105:6;5094:9;5090:22;5072:50;:::i;5133:635::-;5213:6;5266:2;5254:9;5245:7;5241:23;5237:32;5234:52;;;5282:1;5279;5272:12;5234:52;5315:9;5309:16;-1:-1:-1;;;;;5340:6:1;5337:30;5334:50;;;5380:1;5377;5370:12;5334:50;5403:22;;5456:4;5448:13;;5444:27;-1:-1:-1;5434:55:1;;5485:1;5482;5475:12;5434:55;5514:2;5508:9;5539:48;5555:31;5583:2;5555:31;:::i;5539:48::-;5610:2;5603:5;5596:17;5650:7;5645:2;5640;5636;5632:11;5628:20;5625:33;5622:53;;;5671:1;5668;5661:12;5622:53;5684:54;5735:2;5730;5723:5;5719:14;5714:2;5710;5706:11;5684:54;:::i;:::-;5757:5;5133:635;-1:-1:-1;;;;;5133:635:1:o;5773:390::-;5851:6;5859;5912:2;5900:9;5891:7;5887:23;5883:32;5880:52;;;5928:1;5925;5918:12;5880:52;5968:9;5955:23;-1:-1:-1;;;;;5993:6:1;5990:30;5987:50;;;6033:1;6030;6023:12;5987:50;6056;6098:7;6089:6;6078:9;6074:22;6056:50;:::i;:::-;6046:60;6153:2;6138:18;;;;6125:32;;-1:-1:-1;;;;5773:390:1:o;6168:180::-;6227:6;6280:2;6268:9;6259:7;6255:23;6251:32;6248:52;;;6296:1;6293;6286:12;6248:52;-1:-1:-1;6319:23:1;;6168:180;-1:-1:-1;6168:180:1:o;6353:1679::-;6469:6;6477;6530:2;6518:9;6509:7;6505:23;6501:32;6498:52;;;6546:1;6543;6536:12;6498:52;6582:9;6569:23;6559:33;;6611:2;6664;6653:9;6649:18;6636:32;-1:-1:-1;;;;;6728:2:1;6720:6;6717:14;6714:34;;;6744:1;6741;6734:12;6714:34;6782:6;6771:9;6767:22;6757:32;;6827:7;6820:4;6816:2;6812:13;6808:27;6798:55;;6849:1;6846;6839:12;6798:55;6885:2;6872:16;6907:2;6903;6900:10;6897:36;;;6913:18;;:::i;:::-;6959:2;6956:1;6952:10;6982:28;7006:2;7002;6998:11;6982:28;:::i;:::-;7044:15;;;7075:12;;;;7107:11;;;7137;;;7133:20;;7130:33;-1:-1:-1;7127:53:1;;;7176:1;7173;7166:12;7127:53;7198:1;7189:10;;7208:794;7222:2;7219:1;7216:9;7208:794;;;7299:3;7286:17;7335:2;7322:11;7319:19;7316:39;;;7351:1;7348;7341:12;7316:39;7378:20;;7450:2;7422:16;;;-1:-1:-1;;7418:30:1;7414:39;7411:59;;;7466:1;7463;7456:12;7411:59;7496:22;;:::i;:::-;7568:2;7564;7560:11;7547:25;7601:2;7591:8;7588:16;7585:36;;;7617:1;7614;7607:12;7585:36;7648:54;7694:7;7689:2;7678:8;7674:2;7670:17;7666:26;7648:54;:::i;:::-;7641:5;7634:69;;7753:2;7749;7745:11;7732:25;7786:2;7776:8;7773:16;7770:36;;;7802:1;7799;7792:12;7770:36;7842:54;7888:7;7883:2;7872:8;7868:2;7864:17;7860:26;7842:54;:::i;:::-;7826:14;;;7819:78;-1:-1:-1;7910:18:1;;-1:-1:-1;7240:1:1;7233:9;;;;;7948:12;;;;7980;;7208:794;;;7212:3;8021:5;8011:15;;;;;;;;;6353:1679;;;;;:::o;8037:248::-;8105:6;8113;8166:2;8154:9;8145:7;8141:23;8137:32;8134:52;;;8182:1;8179;8172:12;8134:52;-1:-1:-1;;8205:23:1;;;8275:2;8260:18;;;8247:32;;-1:-1:-1;8037:248:1:o;8290:257::-;8331:3;8369:5;8363:12;8396:6;8391:3;8384:19;8412:63;8468:6;8461:4;8456:3;8452:14;8445:4;8438:5;8434:16;8412:63;:::i;:::-;8529:2;8508:15;-1:-1:-1;;8504:29:1;8495:39;;;;8536:4;8491:50;;8290:257;-1:-1:-1;;8290:257:1:o;8552:185::-;8594:3;8632:5;8626:12;8647:52;8692:6;8687:3;8680:4;8673:5;8669:16;8647:52;:::i;:::-;8715:16;;;;;8552:185;-1:-1:-1;;8552:185:1:o;8742:973::-;8827:12;;8792:3;;8882:1;8902:18;;;;8955;;;;8982:61;;9036:4;9028:6;9024:17;9014:27;;8982:61;9062:2;9110;9102:6;9099:14;9079:18;9076:38;9073:161;;;9156:10;9151:3;9147:20;9144:1;9137:31;9191:4;9188:1;9181:15;9219:4;9216:1;9209:15;9073:161;9250:18;9277:104;;;;9395:1;9390:319;;;;9243:466;;9277:104;-1:-1:-1;;9310:24:1;;9298:37;;9355:16;;;;-1:-1:-1;9277:104:1;;9390:319;33434:1;33427:14;;;33471:4;33458:18;;9484:1;9498:165;9512:6;9509:1;9506:13;9498:165;;;9590:14;;9577:11;;;9570:35;9633:16;;;;9527:10;;9498:165;;;9502:3;;9692:6;9687:3;9683:16;9676:23;;9243:466;;;;;;;8742:973;;;;:::o;10897:276::-;11028:3;11066:6;11060:13;11082:53;11128:6;11123:3;11116:4;11108:6;11104:17;11082:53;:::i;:::-;11151:16;;;;;10897:276;-1:-1:-1;;10897:276:1:o;11178:470::-;11357:3;11395:6;11389:13;11411:53;11457:6;11452:3;11445:4;11437:6;11433:17;11411:53;:::i;:::-;11527:13;;11486:16;;;;11549:57;11527:13;11486:16;11583:4;11571:17;;11549:57;:::i;:::-;11622:20;;11178:470;-1:-1:-1;;;;11178:470:1:o;11653:439::-;11885:3;11923:6;11917:13;11939:53;11985:6;11980:3;11973:4;11965:6;11961:17;11939:53;:::i;:::-;-1:-1:-1;;;12014:16:1;;12039:18;;;-1:-1:-1;12084:1:1;12073:13;;11653:439;-1:-1:-1;11653:439:1:o;12097:614::-;12377:3;12415:6;12409:13;12431:53;12477:6;12472:3;12465:4;12457:6;12453:17;12431:53;:::i;:::-;-1:-1:-1;;;12506:16:1;;;12531:18;;;12574:13;;12596:65;12574:13;12648:1;12637:13;;12630:4;12618:17;;12596:65;:::i;:::-;12681:20;12703:1;12677:28;;12097:614;-1:-1:-1;;;;12097:614:1:o;12716:439::-;12948:3;12986:6;12980:13;13002:53;13048:6;13043:3;13036:4;13028:6;13024:17;13002:53;:::i;:::-;-1:-1:-1;;;13077:16:1;;13102:18;;;-1:-1:-1;13147:1:1;13136:13;;12716:439;-1:-1:-1;12716:439:1:o;13160:1086::-;13687:3;13725:6;13719:13;13741:53;13787:6;13782:3;13775:4;13767:6;13763:17;13741:53;:::i;:::-;-1:-1:-1;;;13816:16:1;;;13841:57;;;13923:13;;13945:66;13923:13;13997:2;13986:14;;13979:4;13967:17;;13945:66;:::i;:::-;-1:-1:-1;;;14074:2:1;14030:20;;;;14066:11;;;14059:55;14133:46;14175:2;14167:11;;14159:6;14133:46;:::i;:::-;-1:-1:-1;;;14188:26:1;;14238:1;14230:10;;13160:1086;-1:-1:-1;;;;;;13160:1086:1:o;14251:992::-;14775:3;14813:6;14807:13;14829:53;14875:6;14870:3;14863:4;14855:6;14851:17;14829:53;:::i;:::-;-1:-1:-1;;;14904:16:1;;;14929:57;;;15005:49;15050:2;15039:14;;15031:6;15005:49;:::i;:::-;-1:-1:-1;;;15063:46:1;;14995:59;-1:-1:-1;15128:46:1;15170:2;15162:11;;15154:6;15128:46;:::i;:::-;-1:-1:-1;;;15183:28:1;;15235:1;15227:10;;14251:992;-1:-1:-1;;;;;;14251:992:1:o;15248:439::-;15480:3;15518:6;15512:13;15534:53;15580:6;15575:3;15568:4;15560:6;15556:17;15534:53;:::i;:::-;-1:-1:-1;;;15609:16:1;;15634:18;;;-1:-1:-1;15679:1:1;15668:13;;15248:439;-1:-1:-1;15248:439:1:o;15692:197::-;15820:3;15845:38;15879:3;15871:6;15845:38;:::i;15894:2459::-;-1:-1:-1;;;17128:68:1;;17219:13;;17110:3;;17241:62;17219:13;17291:2;17282:12;;17275:4;17263:17;;17241:62;:::i;:::-;17363:13;;17322:16;;;;17385:63;17363:13;17434:2;17426:11;;17419:4;17407:17;;17385:63;:::i;:::-;-1:-1:-1;;;17508:2:1;17467:17;;;;17500:11;;;17493:65;17577:46;17619:2;17611:11;;17603:6;17577:46;:::i;:::-;17567:56;;17654:6;17648:13;17670:54;17715:8;17711:2;17704:4;17696:6;17692:17;17670:54;:::i;:::-;-1:-1:-1;;;17746:17:1;;17772:20;;;17817:13;;17839:65;17817:13;17891:1;17880:13;;17873:4;17861:17;;17839:65;:::i;:::-;-1:-1:-1;;;17967:1:1;17923:20;;;;17959:10;;;17952:54;18025:46;18067:2;18059:11;;18051:6;18025:46;:::i;:::-;18015:56;;18102:6;18096:13;18118:54;18163:8;18159:2;18152:4;18144:6;18140:17;18118:54;:::i;:::-;18188:159;18218:128;18244:101;18269:75;18295:48;18333:8;18329:2;18325:17;-1:-1:-1;;;10058:16:1;;10099:1;10090:11;;9993:114;18295:48;18287:6;18269:75;:::i;:::-;-1:-1:-1;;;9780:55:1;;9860:2;9851:12;;9720:149;18244:101;18236:6;18218:128;:::i;:::-;-1:-1:-1;;;9939:16:1;;9980:1;9971:11;;9874:114;18188:159;18181:166;15894:2459;-1:-1:-1;;;;;;;;;;;;;15894:2459:1:o;18358:1537::-;19061:34;19056:3;19049:47;19126:26;19121:2;19116:3;19112:12;19105:48;19031:3;19172:47;19215:2;19210:3;19206:12;19198:6;19172:47;:::i;:::-;-1:-1:-1;;;19235:2:1;19228:35;19282:46;19324:2;19320;19316:11;19308:6;19282:46;:::i;:::-;19272:56;;19348:34;19344:2;19337:46;19412:34;19407:2;19403;19399:11;19392:55;19476:34;19471:2;19467;19463:11;19456:55;-1:-1:-1;;;19535:2:1;19531;19527:11;19520:28;19577:6;19571:13;19593:60;19646:6;19640:3;19636:2;19632:12;19627:2;19619:6;19615:15;19593:60;:::i;:::-;-1:-1:-1;;;19711:3:1;19672:15;;;;19703:12;;;19696:41;19762:13;;19784:62;19762:13;19831:3;19823:12;;19818:2;19806:15;;19784:62;:::i;:::-;19866:17;19885:3;19862:27;;18358:1537;-1:-1:-1;;;;;;18358:1537:1:o;19900:572::-;-1:-1:-1;;;20258:3:1;20251:16;20233:3;20296:6;20290:13;20312:61;20366:6;20362:1;20357:3;20353:11;20346:4;20338:6;20334:17;20312:61;:::i;:::-;-1:-1:-1;;;20432:1:1;20392:16;;;;20424:10;;;20417:23;-1:-1:-1;20464:1:1;20456:10;;19900:572;-1:-1:-1;19900:572:1:o;20477:448::-;20739:31;20734:3;20727:44;20709:3;20800:6;20794:13;20816:62;20871:6;20866:2;20861:3;20857:12;20850:4;20842:6;20838:17;20816:62;:::i;:::-;20898:16;;;;20916:2;20894:25;;20477:448;-1:-1:-1;;20477:448:1:o;22064:488::-;-1:-1:-1;;;;;22333:15:1;;;22315:34;;22385:15;;22380:2;22365:18;;22358:43;22432:2;22417:18;;22410:34;;;22480:3;22475:2;22460:18;;22453:31;;;22258:4;;22501:45;;22526:19;;22518:6;22501:45;:::i;:::-;22493:53;22064:488;-1:-1:-1;;;;;;22064:488:1:o;22931:219::-;23080:2;23069:9;23062:21;23043:4;23100:44;23140:2;23129:9;23125:18;23117:6;23100:44;:::i;23155:381::-;23352:2;23341:9;23334:21;23315:4;23378:44;23418:2;23407:9;23403:18;23395:6;23378:44;:::i;:::-;23470:9;23462:6;23458:22;23453:2;23442:9;23438:18;23431:50;23498:32;23523:6;23515;23498:32;:::i;23953:414::-;24155:2;24137:21;;;24194:2;24174:18;;;24167:30;24233:34;24228:2;24213:18;;24206:62;-1:-1:-1;;;24299:2:1;24284:18;;24277:48;24357:3;24342:19;;23953:414::o;29014:356::-;29216:2;29198:21;;;29235:18;;;29228:30;29294:34;29289:2;29274:18;;29267:62;29361:2;29346:18;;29014:356::o;29375:335::-;29577:2;29559:21;;;29616:2;29596:18;;;29589:30;-1:-1:-1;;;29650:2:1;29635:18;;29628:41;29701:2;29686:18;;29375:335::o;30929:413::-;31131:2;31113:21;;;31170:2;31150:18;;;31143:30;31209:34;31204:2;31189:18;;31182:62;-1:-1:-1;;;31275:2:1;31260:18;;31253:47;31332:3;31317:19;;30929:413::o;32109:338::-;32311:2;32293:21;;;32350:2;32330:18;;;32323:30;-1:-1:-1;;;32384:2:1;32369:18;;32362:44;32438:2;32423:18;;32109:338::o;32634:251::-;32706:2;32700:9;;;32736:15;;-1:-1:-1;;;;;32766:34:1;;32802:22;;;32763:62;32760:88;;;32828:18;;:::i;:::-;32864:2;32857:22;32634:251;:::o;32890:275::-;32961:2;32955:9;33026:2;33007:13;;-1:-1:-1;;33003:27:1;32991:40;;-1:-1:-1;;;;;33046:34:1;;33082:22;;;33043:62;33040:88;;;33108:18;;:::i;:::-;33144:2;33137:22;32890:275;;-1:-1:-1;32890:275:1:o;33170:186::-;33218:4;-1:-1:-1;;;;;33243:6:1;33240:30;33237:56;;;33273:18;;:::i;:::-;-1:-1:-1;33339:2:1;33318:15;-1:-1:-1;;33314:29:1;33345:4;33310:40;;33170:186::o;33487:224::-;33526:3;33554:6;33587:2;33584:1;33580:10;33617:2;33614:1;33610:10;33648:3;33644:2;33640:12;33635:3;33632:21;33629:47;;;33656:18;;:::i;33716:128::-;33756:3;33787:1;33783:6;33780:1;33777:13;33774:39;;;33793:18;;:::i;:::-;-1:-1:-1;33829:9:1;;33716:128::o;33849:204::-;33887:3;33923:4;33920:1;33916:12;33955:4;33952:1;33948:12;33990:3;33984:4;33980:14;33975:3;33972:23;33969:49;;;33998:18;;:::i;:::-;34034:13;;33849:204;-1:-1:-1;;;33849:204:1:o;34058:120::-;34098:1;34124;34114:35;;34129:18;;:::i;:::-;-1:-1:-1;34163:9:1;;34058:120::o;34183:168::-;34223:7;34289:1;34285;34281:6;34277:14;34274:1;34271:21;34266:1;34259:9;34252:17;34248:45;34245:71;;;34296:18;;:::i;:::-;-1:-1:-1;34336:9:1;;34183:168::o;34356:238::-;34394:7;34434:4;34431:1;34427:12;34466:4;34463:1;34459:12;34526:3;34520:4;34516:14;34511:3;34508:23;34501:3;34494:11;34487:19;34483:49;34480:75;;;34535:18;;:::i;:::-;34575:13;;34356:238;-1:-1:-1;;;34356:238:1:o;34599:125::-;34639:4;34667:1;34664;34661:8;34658:34;;;34672:18;;:::i;:::-;-1:-1:-1;34709:9:1;;34599:125::o;34729:195::-;34767:4;34804;34801:1;34797:12;34836:4;34833:1;34829:12;34861:3;34856;34853:12;34850:38;;;34868:18;;:::i;:::-;34905:13;;;34729:195;-1:-1:-1;;;34729:195:1:o;34929:258::-;35001:1;35011:113;35025:6;35022:1;35019:13;35011:113;;;35101:11;;;35095:18;35082:11;;;35075:39;35047:2;35040:10;35011:113;;;35142:6;35139:1;35136:13;35133:48;;;-1:-1:-1;;35177:1:1;35159:16;;35152:27;34929:258::o;35192:380::-;35271:1;35267:12;;;;35314;;;35335:61;;35389:4;35381:6;35377:17;35367:27;;35335:61;35442:2;35434:6;35431:14;35411:18;35408:38;35405:161;;;35488:10;35483:3;35479:20;35476:1;35469:31;35523:4;35520:1;35513:15;35551:4;35548:1;35541:15;35405:161;;35192:380;;;:::o;35577:135::-;35616:3;-1:-1:-1;;35637:17:1;;35634:43;;;35657:18;;:::i;:::-;-1:-1:-1;35704:1:1;35693:13;;35577:135::o;35717:175::-;35754:3;35798:4;35791:5;35787:16;35827:4;35818:7;35815:17;35812:43;;;35835:18;;:::i;:::-;35884:1;35871:15;;35717:175;-1:-1:-1;;35717:175:1:o;35897:112::-;35929:1;35955;35945:35;;35960:18;;:::i;:::-;-1:-1:-1;35994:9:1;;35897:112::o;36014:127::-;36075:10;36070:3;36066:20;36063:1;36056:31;36106:4;36103:1;36096:15;36130:4;36127:1;36120:15;36146:127;36207:10;36202:3;36198:20;36195:1;36188:31;36238:4;36235:1;36228:15;36262:4;36259:1;36252:15;36278:127;36339:10;36334:3;36330:20;36327:1;36320:31;36370:4;36367:1;36360:15;36394:4;36391:1;36384:15;36410:127;36471:10;36466:3;36462:20;36459:1;36452:31;36502:4;36499:1;36492:15;36526:4;36523:1;36516:15;36542:127;36603:10;36598:3;36594:20;36591:1;36584:31;36634:4;36631:1;36624:15;36658:4;36655:1;36648:15;36674:131;-1:-1:-1;;;;;;36748:32:1;;36738:43;;36728:71;;36795:1;36792;36785:12
Swarm Source
ipfs://2d0ccd92a175a9ce6a808736560b2690d05c4b1e206f92285ce46c3d8fa71950
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.