ERC-721
Overview
Max Total Supply
4,443 LAMP
Holders
1,517
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 LAMPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PersonaLamps
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-20 */ // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts v4.4.0 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ 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/Counters.sol // OpenZeppelin Contracts v4.4.0 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.0 (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.0 (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.0 (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.0 (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.0 (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.0 (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.0 (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.0 (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/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.0 (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.0 (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: contracts/PersonaLamps.sol //Contract based on https://docs.openzeppelin.com/contracts/3.x/erc721 pragma solidity ^0.8.0; contract PersonaLamps is ERC721, Ownable { using Counters for Counters.Counter; uint256 public constant MAX_LAMP_PURCHASE = 20; uint256 public constant MAX_SUPPLY = 4444; uint256 public constant HOLDER_CAP = 2222; bytes32 immutable whitelistRoot; bytes32 immutable holderRoot; uint256 public holderBuys; uint256 public lampPrice = 0.044 ether; uint256 public presalePrice = 0.04 ether; uint256 public saleStartTime = type(uint256).max; uint256 public presaleStartTime = type(uint256).max; string public baseURI; address treasury = 0xB299aE977acAc0eAc606EBCa28d171B7F5670002; address uwulabs = 0x354A70969F0b4a4C994403051A81C2ca45db3615; bool public saleIsActive = true; bool private devMinted = false; Counters.Counter private _tokenIds; // This is a packed array of booleans. mapping(uint256 => uint256) private claimedBitMap; constructor(uint256 _presaleStartTime, uint256 _saleStartTime, bytes32 _whitelistRoot, bytes32 _holderRoot) Ownable() ERC721("Persona Lamps", "LAMP") { require(_saleStartTime > _presaleStartTime, "Invalid timestamp"); presaleStartTime = _presaleStartTime; saleStartTime = _saleStartTime; whitelistRoot = _whitelistRoot; holderRoot = _holderRoot; } function devMint() external onlyOwner { require(!devMinted, "Already minted"); devMinted = true; for (uint256 i = 0; i < 40; i++) { _mintNFT(msg.sender); } } function withdraw() external onlyOwner { uint256 treasuryShare = (address(this).balance*850)/1000; require(payable(treasury).send(treasuryShare)); require(payable(uwulabs).send(address(this).balance)); } // Function to disable sale and close minting. function setSaleActive(bool active) external onlyOwner { saleIsActive = active; } function setPresalePrice(uint256 newPresalePrice) external onlyOwner { presalePrice = newPresalePrice; } function setLampPrice(uint256 newLampPrice) external onlyOwner { lampPrice = newLampPrice; } function setPresaleStartTime(uint256 _presaleStartTime) external onlyOwner { presaleStartTime = _presaleStartTime; } function setSaleStartTime(uint256 startTime) external onlyOwner { saleStartTime = startTime; } function setBaseURI(string memory newURI) external onlyOwner { baseURI = newURI; } function holderMint(uint256 index, uint256 amountToMint, bytes32[] calldata merkleProof) external payable { require(saleIsActive, "Not active"); require(block.timestamp >= presaleStartTime, "Presale must be active"); require(block.timestamp < saleStartTime, "Presale has ended"); require(amountToMint != 0 && amountToMint <= MAX_LAMP_PURCHASE, "0/limit"); require(holderBuys + amountToMint <= HOLDER_CAP, "Capped holder sale"); require(msg.value == presalePrice*amountToMint, "Ether value sent is not correct"); // Verify the merkle proof. bytes32 node = keccak256(abi.encodePacked(index, msg.sender, uint256(1))); require(MerkleProof.verify(merkleProof, holderRoot, node), 'MerkleDistributor: Invalid proof.'); holderBuys += amountToMint; for (uint256 i = 0; i < amountToMint; i++) { _mintNFT(msg.sender); } } function whitelistMint(uint256 index, bytes32[] calldata merkleProof) external payable { require(saleIsActive, "Not active"); require(block.timestamp >= presaleStartTime, "Presale must be active"); require(block.timestamp < saleStartTime, "Presale has ended"); require(msg.value == lampPrice, "Ether value sent is not correct"); // Verify the merkle proof. require(!isClaimed(index), "Already claimed"); bytes32 node = keccak256(abi.encodePacked(index, msg.sender, uint256(1))); require(MerkleProof.verify(merkleProof, whitelistRoot, node), 'MerkleDistributor: Invalid proof.'); _setClaimed(index); _mintNFT(msg.sender); } function mint(uint256 numberOfTokens) external payable { require(saleIsActive, "Not active"); require(numberOfTokens != 0 && numberOfTokens <= MAX_LAMP_PURCHASE, "0/limit"); require(block.timestamp >= saleStartTime, "Sale must be active"); require(msg.value == lampPrice * numberOfTokens, "Ether value sent is not correct"); for(uint i = 0; i < numberOfTokens; i++) { _mintNFT(msg.sender); } } function totalSupply() external view returns (uint256) { return _tokenIds.current(); } function isClaimed(uint256 index) public view returns (bool) { uint256 claimedWordIndex = index / 256; uint256 claimedBitIndex = index % 256; uint256 claimedWord = claimedBitMap[claimedWordIndex]; uint256 mask = (1 << claimedBitIndex); return claimedWord & mask == mask; } function _setClaimed(uint256 index) private { uint256 claimedWordIndex = index / 256; uint256 claimedBitIndex = index % 256; claimedBitMap[claimedWordIndex] = claimedBitMap[claimedWordIndex] | (1 << claimedBitIndex); } function _mintNFT(address to) internal { require(_tokenIds.current() + 1 < MAX_SUPPLY, "MAX_SUPPLY"); uint256 newItemId = _tokenIds.current(); _tokenIds.increment(); _mint(to, newItemId); } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_presaleStartTime","type":"uint256"},{"internalType":"uint256","name":"_saleStartTime","type":"uint256"},{"internalType":"bytes32","name":"_whitelistRoot","type":"bytes32"},{"internalType":"bytes32","name":"_holderRoot","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":"HOLDER_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LAMP_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devMint","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":"holderBuys","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"amountToMint","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"holderMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lampPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLampPrice","type":"uint256"}],"name":"setLampPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPresalePrice","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleStartTime","type":"uint256"}],"name":"setPresaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startTime","type":"uint256"}],"name":"setSaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052669c51c4521e0000600855668e1bc9bf0400006009557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600a557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600b5573b299ae977acac0eac606ebca28d171b7f5670002600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073354a70969f0b4a4c994403051a81c2ca45db3615600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e60146101000a81548160ff0219169083151502179055506000600e60156101000a81548160ff0219169083151502179055503480156200014f57600080fd5b5060405162004ed338038062004ed383398181016040528101906200017591906200049b565b6040518060400160405280600d81526020017f506572736f6e61204c616d7073000000000000000000000000000000000000008152506040518060400160405280600481526020017f4c414d50000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001f992919062000370565b5080600190805190602001906200021292919062000370565b5050506200023562000229620002a260201b60201c565b620002aa60201b60201c565b8383116200027a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000271906200056e565b60405180910390fd5b83600b8190555082600a8190555081608081815250508060a0818152505050505050620005f5565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200037e90620005bf565b90600052602060002090601f016020900481019282620003a25760008555620003ee565b82601f10620003bd57805160ff1916838001178555620003ee565b82800160010185558215620003ee579182015b82811115620003ed578251825591602001919060010190620003d0565b5b509050620003fd919062000401565b5090565b5b808211156200041c57600081600090555060010162000402565b5090565b600080fd5b6000819050919050565b6200043a8162000425565b81146200044657600080fd5b50565b6000815190506200045a816200042f565b92915050565b6000819050919050565b620004758162000460565b81146200048157600080fd5b50565b60008151905062000495816200046a565b92915050565b60008060008060808587031215620004b857620004b762000420565b5b6000620004c88782880162000449565b9450506020620004db8782880162000449565b9350506040620004ee8782880162000484565b9250506060620005018782880162000484565b91505092959194509250565b600082825260208201905092915050565b7f496e76616c69642074696d657374616d70000000000000000000000000000000600082015250565b6000620005566011836200050d565b915062000563826200051e565b602082019050919050565b60006020820190508181036000830152620005898162000547565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005d857607f821691505b60208210811415620005ef57620005ee62000590565b5b50919050565b60805160a0516148b86200061b600039600061123401526000611d1f01526148b86000f3fe60806040526004361061022f5760003560e01c80636352211e1161012e5780639e34070f116100ab578063c87b56dd1161006f578063c87b56dd146107d4578063d2cab05614610811578063e985e9c51461082d578063eb8d24441461086a578063f2fde38b146108955761022f565b80639e34070f146106fe578063a0712d681461073b578063a22cb46514610757578063a82524b214610780578063b88d4fde146107ab5761022f565b80637c69e207116100f25780637c69e2071461063d578063841718a6146106545780638da5cb5b1461067d578063921ad4d8146106a857806395d89b41146106d35761022f565b80636352211e146105565780636b077523146105935780636c0360eb146105be57806370a08231146105e9578063715018a6146106265761022f565b806323b872dd116101bc57806342842e0e1161018057806342842e0e146104945780634dd710d1146104bd578063525f8a5c146104e857806354a8ccea1461051157806355f804b31461052d5761022f565b806323b872dd146103d7578063296cab551461040057806332cb6b0c146104295780633549345e146104545780633ccfd60b1461047d5761022f565b8063095ea7b311610203578063095ea7b31461030457806318160ddd1461032d5780631cbaee2d146103585780631fca850a146103835780632261c6b6146103ae5761022f565b80620e7fa81461023457806301ffc9a71461025f57806306fdde031461029c578063081812fc146102c7575b600080fd5b34801561024057600080fd5b506102496108be565b6040516102569190612e7e565b60405180910390f35b34801561026b57600080fd5b5061028660048036038101906102819190612f05565b6108c4565b6040516102939190612f4d565b60405180910390f35b3480156102a857600080fd5b506102b16109a6565b6040516102be9190613001565b60405180910390f35b3480156102d357600080fd5b506102ee60048036038101906102e9919061304f565b610a38565b6040516102fb91906130bd565b60405180910390f35b34801561031057600080fd5b5061032b60048036038101906103269190613104565b610abd565b005b34801561033957600080fd5b50610342610bd5565b60405161034f9190612e7e565b60405180910390f35b34801561036457600080fd5b5061036d610be6565b60405161037a9190612e7e565b60405180910390f35b34801561038f57600080fd5b50610398610bec565b6040516103a59190612e7e565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d0919061304f565b610bf2565b005b3480156103e357600080fd5b506103fe60048036038101906103f99190613144565b610c78565b005b34801561040c57600080fd5b506104276004803603810190610422919061304f565b610cd8565b005b34801561043557600080fd5b5061043e610d5e565b60405161044b9190612e7e565b60405180910390f35b34801561046057600080fd5b5061047b6004803603810190610476919061304f565b610d64565b005b34801561048957600080fd5b50610492610dea565b005b3480156104a057600080fd5b506104bb60048036038101906104b69190613144565b610f48565b005b3480156104c957600080fd5b506104d2610f68565b6040516104df9190612e7e565b60405180910390f35b3480156104f457600080fd5b5061050f600480360381019061050a919061304f565b610f6d565b005b61052b600480360381019061052691906131fc565b610ff3565b005b34801561053957600080fd5b50610554600480360381019061054f91906133a0565b6112e0565b005b34801561056257600080fd5b5061057d6004803603810190610578919061304f565b611376565b60405161058a91906130bd565b60405180910390f35b34801561059f57600080fd5b506105a8611428565b6040516105b59190612e7e565b60405180910390f35b3480156105ca57600080fd5b506105d361142e565b6040516105e09190613001565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b91906133e9565b6114bc565b60405161061d9190612e7e565b60405180910390f35b34801561063257600080fd5b5061063b611574565b005b34801561064957600080fd5b506106526115fc565b005b34801561066057600080fd5b5061067b60048036038101906106769190613442565b61170e565b005b34801561068957600080fd5b506106926117a7565b60405161069f91906130bd565b60405180910390f35b3480156106b457600080fd5b506106bd6117d1565b6040516106ca9190612e7e565b60405180910390f35b3480156106df57600080fd5b506106e86117d7565b6040516106f59190613001565b60405180910390f35b34801561070a57600080fd5b506107256004803603810190610720919061304f565b611869565b6040516107329190612f4d565b60405180910390f35b6107556004803603810190610750919061304f565b6118bf565b005b34801561076357600080fd5b5061077e6004803603810190610779919061346f565b611a1e565b005b34801561078c57600080fd5b50610795611a34565b6040516107a29190612e7e565b60405180910390f35b3480156107b757600080fd5b506107d260048036038101906107cd9190613550565b611a3a565b005b3480156107e057600080fd5b506107fb60048036038101906107f6919061304f565b611a9c565b6040516108089190613001565b60405180910390f35b61082b600480360381019061082691906135d3565b611b43565b005b34801561083957600080fd5b50610854600480360381019061084f9190613633565b611d9b565b6040516108619190612f4d565b60405180910390f35b34801561087657600080fd5b5061087f611e2f565b60405161088c9190612f4d565b60405180910390f35b3480156108a157600080fd5b506108bc60048036038101906108b791906133e9565b611e42565b005b60095481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061099f575061099e82611f3a565b5b9050919050565b6060600080546109b5906136a2565b80601f01602080910402602001604051908101604052809291908181526020018280546109e1906136a2565b8015610a2e5780601f10610a0357610100808354040283529160200191610a2e565b820191906000526020600020905b815481529060010190602001808311610a1157829003601f168201915b5050505050905090565b6000610a4382611fa4565b610a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7990613746565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac882611376565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b30906137d8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b58612010565b73ffffffffffffffffffffffffffffffffffffffff161480610b875750610b8681610b81612010565b611d9b565b5b610bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbd9061386a565b60405180910390fd5b610bd08383612018565b505050565b6000610be1600f6120d1565b905090565b600a5481565b6108ae81565b610bfa612010565b73ffffffffffffffffffffffffffffffffffffffff16610c186117a7565b73ffffffffffffffffffffffffffffffffffffffff1614610c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c65906138d6565b60405180910390fd5b8060088190555050565b610c89610c83612010565b826120df565b610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbf90613968565b60405180910390fd5b610cd38383836121bd565b505050565b610ce0612010565b73ffffffffffffffffffffffffffffffffffffffff16610cfe6117a7565b73ffffffffffffffffffffffffffffffffffffffff1614610d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4b906138d6565b60405180910390fd5b80600b8190555050565b61115c81565b610d6c612010565b73ffffffffffffffffffffffffffffffffffffffff16610d8a6117a7565b73ffffffffffffffffffffffffffffffffffffffff1614610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd7906138d6565b60405180910390fd5b8060098190555050565b610df2612010565b73ffffffffffffffffffffffffffffffffffffffff16610e106117a7565b73ffffffffffffffffffffffffffffffffffffffff1614610e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5d906138d6565b60405180910390fd5b60006103e861035247610e7991906139b7565b610e839190613a40565b9050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610ee557600080fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610f4557600080fd5b50565b610f6383838360405180602001604052806000815250611a3a565b505050565b601481565b610f75612010565b73ffffffffffffffffffffffffffffffffffffffff16610f936117a7565b73ffffffffffffffffffffffffffffffffffffffff1614610fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe0906138d6565b60405180910390fd5b80600a8190555050565b600e60149054906101000a900460ff16611042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103990613abd565b60405180910390fd5b600b54421015611087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107e90613b29565b60405180910390fd5b600a5442106110cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c290613b95565b60405180910390fd5b600083141580156110dd575060148311155b61111c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111390613c01565b60405180910390fd5b6108ae8360075461112d9190613c21565b111561116e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116590613cc3565b60405180910390fd5b8260095461117c91906139b7565b34146111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b490613d2f565b60405180910390fd5b6000843360016040516020016111d593929190613db8565b604051602081830303815290604052805190602001209050611259838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050507f000000000000000000000000000000000000000000000000000000000000000083612419565b611298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128f90613e67565b60405180910390fd5b83600760008282546112aa9190613c21565b9250508190555060005b848110156112d8576112c533612430565b80806112d090613e87565b9150506112b4565b505050505050565b6112e8612010565b73ffffffffffffffffffffffffffffffffffffffff166113066117a7565b73ffffffffffffffffffffffffffffffffffffffff161461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906138d6565b60405180910390fd5b80600c9080519060200190611372929190612dc2565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561141f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141690613f42565b60405180910390fd5b80915050919050565b60085481565b600c805461143b906136a2565b80601f0160208091040260200160405190810160405280929190818152602001828054611467906136a2565b80156114b45780601f10611489576101008083540402835291602001916114b4565b820191906000526020600020905b81548152906001019060200180831161149757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561152d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152490613fd4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61157c612010565b73ffffffffffffffffffffffffffffffffffffffff1661159a6117a7565b73ffffffffffffffffffffffffffffffffffffffff16146115f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e7906138d6565b60405180910390fd5b6115fa60006124af565b565b611604612010565b73ffffffffffffffffffffffffffffffffffffffff166116226117a7565b73ffffffffffffffffffffffffffffffffffffffff1614611678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166f906138d6565b60405180910390fd5b600e60159054906101000a900460ff16156116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bf90614040565b60405180910390fd5b6001600e60156101000a81548160ff02191690831515021790555060005b602881101561170b576116f833612430565b808061170390613e87565b9150506116e6565b50565b611716612010565b73ffffffffffffffffffffffffffffffffffffffff166117346117a7565b73ffffffffffffffffffffffffffffffffffffffff161461178a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611781906138d6565b60405180910390fd5b80600e60146101000a81548160ff02191690831515021790555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60075481565b6060600180546117e6906136a2565b80601f0160208091040260200160405190810160405280929190818152602001828054611812906136a2565b801561185f5780601f106118345761010080835404028352916020019161185f565b820191906000526020600020905b81548152906001019060200180831161184257829003601f168201915b5050505050905090565b6000806101008361187a9190613a40565b905060006101008461188c9190614060565b90506000601060008481526020019081526020016000205490506000826001901b90508081831614945050505050919050565b600e60149054906101000a900460ff1661190e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190590613abd565b60405180910390fd5b60008114158015611920575060148111155b61195f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195690613c01565b60405180910390fd5b600a544210156119a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199b906140dd565b60405180910390fd5b806008546119b291906139b7565b34146119f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ea90613d2f565b60405180910390fd5b60005b81811015611a1a57611a0733612430565b8080611a1290613e87565b9150506119f6565b5050565b611a30611a29612010565b8383612575565b5050565b600b5481565b611a4b611a45612010565b836120df565b611a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8190613968565b60405180910390fd5b611a96848484846126e2565b50505050565b6060611aa782611fa4565b611ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611add9061416f565b60405180910390fd5b6000611af061273e565b90506000815111611b105760405180602001604052806000815250611b3b565b80611b1a846127d0565b604051602001611b2b9291906141cb565b6040516020818303038152906040525b915050919050565b600e60149054906101000a900460ff16611b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8990613abd565b60405180910390fd5b600b54421015611bd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bce90613b29565b60405180910390fd5b600a544210611c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1290613b95565b60405180910390fd5b6008543414611c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5690613d2f565b60405180910390fd5b611c6883611869565b15611ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9f9061423b565b60405180910390fd5b600083336001604051602001611cc093929190613db8565b604051602081830303815290604052805190602001209050611d44838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050507f000000000000000000000000000000000000000000000000000000000000000083612419565b611d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7a90613e67565b60405180910390fd5b611d8c84612931565b611d9533612430565b50505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60149054906101000a900460ff1681565b611e4a612010565b73ffffffffffffffffffffffffffffffffffffffff16611e686117a7565b73ffffffffffffffffffffffffffffffffffffffff1614611ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb5906138d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f25906142cd565b60405180910390fd5b611f37816124af565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661208b83611376565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60006120ea82611fa4565b612129576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121209061435f565b60405180910390fd5b600061213483611376565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121a357508373ffffffffffffffffffffffffffffffffffffffff1661218b84610a38565b73ffffffffffffffffffffffffffffffffffffffff16145b806121b457506121b38185611d9b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121dd82611376565b73ffffffffffffffffffffffffffffffffffffffff1614612233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222a906143f1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229a90614483565b60405180910390fd5b6122ae83838361298b565b6122b9600082612018565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461230991906144a3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123609190613c21565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000826124268584612990565b1490509392505050565b61115c600161243f600f6120d1565b6124499190613c21565b10612489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248090614523565b60405180910390fd5b6000612495600f6120d1565b90506124a1600f612a43565b6124ab8282612a59565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125db9061458f565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126d59190612f4d565b60405180910390a3505050565b6126ed8484846121bd565b6126f984848484612c27565b612738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272f90614621565b60405180910390fd5b50505050565b6060600c805461274d906136a2565b80601f0160208091040260200160405190810160405280929190818152602001828054612779906136a2565b80156127c65780601f1061279b576101008083540402835291602001916127c6565b820191906000526020600020905b8154815290600101906020018083116127a957829003601f168201915b5050505050905090565b60606000821415612818576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061292c565b600082905060005b6000821461284a57808061283390613e87565b915050600a826128439190613a40565b9150612820565b60008167ffffffffffffffff81111561286657612865613275565b5b6040519080825280601f01601f1916602001820160405280156128985781602001600182028036833780820191505090505b5090505b60008514612925576001826128b191906144a3565b9150600a856128c09190614060565b60306128cc9190613c21565b60f81b8183815181106128e2576128e1614641565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561291e9190613a40565b945061289c565b8093505050505b919050565b6000610100826129419190613a40565b90506000610100836129539190614060565b9050806001901b6010600084815260200190815260200160002054176010600084815260200190815260200160002081905550505050565b505050565b60008082905060005b8451811015612a385760008582815181106129b7576129b6614641565b5b602002602001015190508083116129f85782816040516020016129db92919061469b565b604051602081830303815290604052805190602001209250612a24565b8083604051602001612a0b92919061469b565b6040516020818303038152906040528051906020012092505b508080612a3090613e87565b915050612999565b508091505092915050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac090614713565b60405180910390fd5b612ad281611fa4565b15612b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b099061477f565b60405180910390fd5b612b1e6000838361298b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b6e9190613c21565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612c488473ffffffffffffffffffffffffffffffffffffffff16612daf565b15612da2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c71612010565b8786866040518563ffffffff1660e01b8152600401612c9394939291906147f4565b6020604051808303816000875af1925050508015612ccf57506040513d601f19601f82011682018060405250810190612ccc9190614855565b60015b612d52573d8060008114612cff576040519150601f19603f3d011682016040523d82523d6000602084013e612d04565b606091505b50600081511415612d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4190614621565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612da7565b600190505b949350505050565b600080823b905060008111915050919050565b828054612dce906136a2565b90600052602060002090601f016020900481019282612df05760008555612e37565b82601f10612e0957805160ff1916838001178555612e37565b82800160010185558215612e37579182015b82811115612e36578251825591602001919060010190612e1b565b5b509050612e449190612e48565b5090565b5b80821115612e61576000816000905550600101612e49565b5090565b6000819050919050565b612e7881612e65565b82525050565b6000602082019050612e936000830184612e6f565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ee281612ead565b8114612eed57600080fd5b50565b600081359050612eff81612ed9565b92915050565b600060208284031215612f1b57612f1a612ea3565b5b6000612f2984828501612ef0565b91505092915050565b60008115159050919050565b612f4781612f32565b82525050565b6000602082019050612f626000830184612f3e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fa2578082015181840152602081019050612f87565b83811115612fb1576000848401525b50505050565b6000601f19601f8301169050919050565b6000612fd382612f68565b612fdd8185612f73565b9350612fed818560208601612f84565b612ff681612fb7565b840191505092915050565b6000602082019050818103600083015261301b8184612fc8565b905092915050565b61302c81612e65565b811461303757600080fd5b50565b60008135905061304981613023565b92915050565b60006020828403121561306557613064612ea3565b5b60006130738482850161303a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130a78261307c565b9050919050565b6130b78161309c565b82525050565b60006020820190506130d260008301846130ae565b92915050565b6130e18161309c565b81146130ec57600080fd5b50565b6000813590506130fe816130d8565b92915050565b6000806040838503121561311b5761311a612ea3565b5b6000613129858286016130ef565b925050602061313a8582860161303a565b9150509250929050565b60008060006060848603121561315d5761315c612ea3565b5b600061316b868287016130ef565b935050602061317c868287016130ef565b925050604061318d8682870161303a565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126131bc576131bb613197565b5b8235905067ffffffffffffffff8111156131d9576131d861319c565b5b6020830191508360208202830111156131f5576131f46131a1565b5b9250929050565b6000806000806060858703121561321657613215612ea3565b5b60006132248782880161303a565b94505060206132358782880161303a565b935050604085013567ffffffffffffffff81111561325657613255612ea8565b5b613262878288016131a6565b925092505092959194509250565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6132ad82612fb7565b810181811067ffffffffffffffff821117156132cc576132cb613275565b5b80604052505050565b60006132df612e99565b90506132eb82826132a4565b919050565b600067ffffffffffffffff82111561330b5761330a613275565b5b61331482612fb7565b9050602081019050919050565b82818337600083830152505050565b600061334361333e846132f0565b6132d5565b90508281526020810184848401111561335f5761335e613270565b5b61336a848285613321565b509392505050565b600082601f83011261338757613386613197565b5b8135613397848260208601613330565b91505092915050565b6000602082840312156133b6576133b5612ea3565b5b600082013567ffffffffffffffff8111156133d4576133d3612ea8565b5b6133e084828501613372565b91505092915050565b6000602082840312156133ff576133fe612ea3565b5b600061340d848285016130ef565b91505092915050565b61341f81612f32565b811461342a57600080fd5b50565b60008135905061343c81613416565b92915050565b60006020828403121561345857613457612ea3565b5b60006134668482850161342d565b91505092915050565b6000806040838503121561348657613485612ea3565b5b6000613494858286016130ef565b92505060206134a58582860161342d565b9150509250929050565b600067ffffffffffffffff8211156134ca576134c9613275565b5b6134d382612fb7565b9050602081019050919050565b60006134f36134ee846134af565b6132d5565b90508281526020810184848401111561350f5761350e613270565b5b61351a848285613321565b509392505050565b600082601f83011261353757613536613197565b5b81356135478482602086016134e0565b91505092915050565b6000806000806080858703121561356a57613569612ea3565b5b6000613578878288016130ef565b9450506020613589878288016130ef565b935050604061359a8782880161303a565b925050606085013567ffffffffffffffff8111156135bb576135ba612ea8565b5b6135c787828801613522565b91505092959194509250565b6000806000604084860312156135ec576135eb612ea3565b5b60006135fa8682870161303a565b935050602084013567ffffffffffffffff81111561361b5761361a612ea8565b5b613627868287016131a6565b92509250509250925092565b6000806040838503121561364a57613649612ea3565b5b6000613658858286016130ef565b9250506020613669858286016130ef565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136ba57607f821691505b602082108114156136ce576136cd613673565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613730602c83612f73565b915061373b826136d4565b604082019050919050565b6000602082019050818103600083015261375f81613723565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006137c2602183612f73565b91506137cd82613766565b604082019050919050565b600060208201905081810360008301526137f1816137b5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613854603883612f73565b915061385f826137f8565b604082019050919050565b6000602082019050818103600083015261388381613847565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006138c0602083612f73565b91506138cb8261388a565b602082019050919050565b600060208201905081810360008301526138ef816138b3565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613952603183612f73565b915061395d826138f6565b604082019050919050565b6000602082019050818103600083015261398181613945565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139c282612e65565b91506139cd83612e65565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a0657613a05613988565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a4b82612e65565b9150613a5683612e65565b925082613a6657613a65613a11565b5b828204905092915050565b7f4e6f742061637469766500000000000000000000000000000000000000000000600082015250565b6000613aa7600a83612f73565b9150613ab282613a71565b602082019050919050565b60006020820190508181036000830152613ad681613a9a565b9050919050565b7f50726573616c65206d7573742062652061637469766500000000000000000000600082015250565b6000613b13601683612f73565b9150613b1e82613add565b602082019050919050565b60006020820190508181036000830152613b4281613b06565b9050919050565b7f50726573616c652068617320656e646564000000000000000000000000000000600082015250565b6000613b7f601183612f73565b9150613b8a82613b49565b602082019050919050565b60006020820190508181036000830152613bae81613b72565b9050919050565b7f302f6c696d697400000000000000000000000000000000000000000000000000600082015250565b6000613beb600783612f73565b9150613bf682613bb5565b602082019050919050565b60006020820190508181036000830152613c1a81613bde565b9050919050565b6000613c2c82612e65565b9150613c3783612e65565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c6c57613c6b613988565b5b828201905092915050565b7f43617070656420686f6c6465722073616c650000000000000000000000000000600082015250565b6000613cad601283612f73565b9150613cb882613c77565b602082019050919050565b60006020820190508181036000830152613cdc81613ca0565b9050919050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000613d19601f83612f73565b9150613d2482613ce3565b602082019050919050565b60006020820190508181036000830152613d4881613d0c565b9050919050565b6000819050919050565b613d6a613d6582612e65565b613d4f565b82525050565b60008160601b9050919050565b6000613d8882613d70565b9050919050565b6000613d9a82613d7d565b9050919050565b613db2613dad8261309c565b613d8f565b82525050565b6000613dc48286613d59565b602082019150613dd48285613da1565b601482019150613de48284613d59565b602082019150819050949350505050565b7f4d65726b6c654469737472696275746f723a20496e76616c69642070726f6f6660008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e51602183612f73565b9150613e5c82613df5565b604082019050919050565b60006020820190508181036000830152613e8081613e44565b9050919050565b6000613e9282612e65565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ec557613ec4613988565b5b600182019050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613f2c602983612f73565b9150613f3782613ed0565b604082019050919050565b60006020820190508181036000830152613f5b81613f1f565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613fbe602a83612f73565b9150613fc982613f62565b604082019050919050565b60006020820190508181036000830152613fed81613fb1565b9050919050565b7f416c7265616479206d696e746564000000000000000000000000000000000000600082015250565b600061402a600e83612f73565b915061403582613ff4565b602082019050919050565b600060208201905081810360008301526140598161401d565b9050919050565b600061406b82612e65565b915061407683612e65565b92508261408657614085613a11565b5b828206905092915050565b7f53616c65206d7573742062652061637469766500000000000000000000000000600082015250565b60006140c7601383612f73565b91506140d282614091565b602082019050919050565b600060208201905081810360008301526140f6816140ba565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614159602f83612f73565b9150614164826140fd565b604082019050919050565b600060208201905081810360008301526141888161414c565b9050919050565b600081905092915050565b60006141a582612f68565b6141af818561418f565b93506141bf818560208601612f84565b80840191505092915050565b60006141d7828561419a565b91506141e3828461419a565b91508190509392505050565b7f416c726561647920636c61696d65640000000000000000000000000000000000600082015250565b6000614225600f83612f73565b9150614230826141ef565b602082019050919050565b6000602082019050818103600083015261425481614218565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006142b7602683612f73565b91506142c28261425b565b604082019050919050565b600060208201905081810360008301526142e6816142aa565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614349602c83612f73565b9150614354826142ed565b604082019050919050565b600060208201905081810360008301526143788161433c565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006143db602983612f73565b91506143e68261437f565b604082019050919050565b6000602082019050818103600083015261440a816143ce565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061446d602483612f73565b915061447882614411565b604082019050919050565b6000602082019050818103600083015261449c81614460565b9050919050565b60006144ae82612e65565b91506144b983612e65565b9250828210156144cc576144cb613988565b5b828203905092915050565b7f4d41585f535550504c5900000000000000000000000000000000000000000000600082015250565b600061450d600a83612f73565b9150614518826144d7565b602082019050919050565b6000602082019050818103600083015261453c81614500565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614579601983612f73565b915061458482614543565b602082019050919050565b600060208201905081810360008301526145a88161456c565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061460b603283612f73565b9150614616826145af565b604082019050919050565b6000602082019050818103600083015261463a816145fe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000819050919050565b61469561469082614670565b61467a565b82525050565b60006146a78285614684565b6020820191506146b78284614684565b6020820191508190509392505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006146fd602083612f73565b9150614708826146c7565b602082019050919050565b6000602082019050818103600083015261472c816146f0565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614769601c83612f73565b915061477482614733565b602082019050919050565b600060208201905081810360008301526147988161475c565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006147c68261479f565b6147d081856147aa565b93506147e0818560208601612f84565b6147e981612fb7565b840191505092915050565b600060808201905061480960008301876130ae565b61481660208301866130ae565b6148236040830185612e6f565b818103606083015261483581846147bb565b905095945050505050565b60008151905061484f81612ed9565b92915050565b60006020828403121561486b5761486a612ea3565b5b600061487984828501614840565b9150509291505056fea26469706673582212204812816b4be3fd9402f5b19f2cefdc837d7434ef65cb222ab730f8a4f4405ba464736f6c634300080a00330000000000000000000000000000000000000000000000000000000061bff1b00000000000000000000000000000000000000000000000000000000061c294b0584be09e9027215d42738e0e4609b2fce52ef3080388a5ecf844b812368cd7032f02d937e933ee30c12ef2dee0201a15a588cde97faaf8aa58c175ecc350f982
Deployed Bytecode
0x60806040526004361061022f5760003560e01c80636352211e1161012e5780639e34070f116100ab578063c87b56dd1161006f578063c87b56dd146107d4578063d2cab05614610811578063e985e9c51461082d578063eb8d24441461086a578063f2fde38b146108955761022f565b80639e34070f146106fe578063a0712d681461073b578063a22cb46514610757578063a82524b214610780578063b88d4fde146107ab5761022f565b80637c69e207116100f25780637c69e2071461063d578063841718a6146106545780638da5cb5b1461067d578063921ad4d8146106a857806395d89b41146106d35761022f565b80636352211e146105565780636b077523146105935780636c0360eb146105be57806370a08231146105e9578063715018a6146106265761022f565b806323b872dd116101bc57806342842e0e1161018057806342842e0e146104945780634dd710d1146104bd578063525f8a5c146104e857806354a8ccea1461051157806355f804b31461052d5761022f565b806323b872dd146103d7578063296cab551461040057806332cb6b0c146104295780633549345e146104545780633ccfd60b1461047d5761022f565b8063095ea7b311610203578063095ea7b31461030457806318160ddd1461032d5780631cbaee2d146103585780631fca850a146103835780632261c6b6146103ae5761022f565b80620e7fa81461023457806301ffc9a71461025f57806306fdde031461029c578063081812fc146102c7575b600080fd5b34801561024057600080fd5b506102496108be565b6040516102569190612e7e565b60405180910390f35b34801561026b57600080fd5b5061028660048036038101906102819190612f05565b6108c4565b6040516102939190612f4d565b60405180910390f35b3480156102a857600080fd5b506102b16109a6565b6040516102be9190613001565b60405180910390f35b3480156102d357600080fd5b506102ee60048036038101906102e9919061304f565b610a38565b6040516102fb91906130bd565b60405180910390f35b34801561031057600080fd5b5061032b60048036038101906103269190613104565b610abd565b005b34801561033957600080fd5b50610342610bd5565b60405161034f9190612e7e565b60405180910390f35b34801561036457600080fd5b5061036d610be6565b60405161037a9190612e7e565b60405180910390f35b34801561038f57600080fd5b50610398610bec565b6040516103a59190612e7e565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d0919061304f565b610bf2565b005b3480156103e357600080fd5b506103fe60048036038101906103f99190613144565b610c78565b005b34801561040c57600080fd5b506104276004803603810190610422919061304f565b610cd8565b005b34801561043557600080fd5b5061043e610d5e565b60405161044b9190612e7e565b60405180910390f35b34801561046057600080fd5b5061047b6004803603810190610476919061304f565b610d64565b005b34801561048957600080fd5b50610492610dea565b005b3480156104a057600080fd5b506104bb60048036038101906104b69190613144565b610f48565b005b3480156104c957600080fd5b506104d2610f68565b6040516104df9190612e7e565b60405180910390f35b3480156104f457600080fd5b5061050f600480360381019061050a919061304f565b610f6d565b005b61052b600480360381019061052691906131fc565b610ff3565b005b34801561053957600080fd5b50610554600480360381019061054f91906133a0565b6112e0565b005b34801561056257600080fd5b5061057d6004803603810190610578919061304f565b611376565b60405161058a91906130bd565b60405180910390f35b34801561059f57600080fd5b506105a8611428565b6040516105b59190612e7e565b60405180910390f35b3480156105ca57600080fd5b506105d361142e565b6040516105e09190613001565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b91906133e9565b6114bc565b60405161061d9190612e7e565b60405180910390f35b34801561063257600080fd5b5061063b611574565b005b34801561064957600080fd5b506106526115fc565b005b34801561066057600080fd5b5061067b60048036038101906106769190613442565b61170e565b005b34801561068957600080fd5b506106926117a7565b60405161069f91906130bd565b60405180910390f35b3480156106b457600080fd5b506106bd6117d1565b6040516106ca9190612e7e565b60405180910390f35b3480156106df57600080fd5b506106e86117d7565b6040516106f59190613001565b60405180910390f35b34801561070a57600080fd5b506107256004803603810190610720919061304f565b611869565b6040516107329190612f4d565b60405180910390f35b6107556004803603810190610750919061304f565b6118bf565b005b34801561076357600080fd5b5061077e6004803603810190610779919061346f565b611a1e565b005b34801561078c57600080fd5b50610795611a34565b6040516107a29190612e7e565b60405180910390f35b3480156107b757600080fd5b506107d260048036038101906107cd9190613550565b611a3a565b005b3480156107e057600080fd5b506107fb60048036038101906107f6919061304f565b611a9c565b6040516108089190613001565b60405180910390f35b61082b600480360381019061082691906135d3565b611b43565b005b34801561083957600080fd5b50610854600480360381019061084f9190613633565b611d9b565b6040516108619190612f4d565b60405180910390f35b34801561087657600080fd5b5061087f611e2f565b60405161088c9190612f4d565b60405180910390f35b3480156108a157600080fd5b506108bc60048036038101906108b791906133e9565b611e42565b005b60095481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061099f575061099e82611f3a565b5b9050919050565b6060600080546109b5906136a2565b80601f01602080910402602001604051908101604052809291908181526020018280546109e1906136a2565b8015610a2e5780601f10610a0357610100808354040283529160200191610a2e565b820191906000526020600020905b815481529060010190602001808311610a1157829003601f168201915b5050505050905090565b6000610a4382611fa4565b610a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7990613746565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac882611376565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b30906137d8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b58612010565b73ffffffffffffffffffffffffffffffffffffffff161480610b875750610b8681610b81612010565b611d9b565b5b610bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbd9061386a565b60405180910390fd5b610bd08383612018565b505050565b6000610be1600f6120d1565b905090565b600a5481565b6108ae81565b610bfa612010565b73ffffffffffffffffffffffffffffffffffffffff16610c186117a7565b73ffffffffffffffffffffffffffffffffffffffff1614610c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c65906138d6565b60405180910390fd5b8060088190555050565b610c89610c83612010565b826120df565b610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbf90613968565b60405180910390fd5b610cd38383836121bd565b505050565b610ce0612010565b73ffffffffffffffffffffffffffffffffffffffff16610cfe6117a7565b73ffffffffffffffffffffffffffffffffffffffff1614610d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4b906138d6565b60405180910390fd5b80600b8190555050565b61115c81565b610d6c612010565b73ffffffffffffffffffffffffffffffffffffffff16610d8a6117a7565b73ffffffffffffffffffffffffffffffffffffffff1614610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd7906138d6565b60405180910390fd5b8060098190555050565b610df2612010565b73ffffffffffffffffffffffffffffffffffffffff16610e106117a7565b73ffffffffffffffffffffffffffffffffffffffff1614610e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5d906138d6565b60405180910390fd5b60006103e861035247610e7991906139b7565b610e839190613a40565b9050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610ee557600080fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610f4557600080fd5b50565b610f6383838360405180602001604052806000815250611a3a565b505050565b601481565b610f75612010565b73ffffffffffffffffffffffffffffffffffffffff16610f936117a7565b73ffffffffffffffffffffffffffffffffffffffff1614610fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe0906138d6565b60405180910390fd5b80600a8190555050565b600e60149054906101000a900460ff16611042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103990613abd565b60405180910390fd5b600b54421015611087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107e90613b29565b60405180910390fd5b600a5442106110cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c290613b95565b60405180910390fd5b600083141580156110dd575060148311155b61111c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111390613c01565b60405180910390fd5b6108ae8360075461112d9190613c21565b111561116e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116590613cc3565b60405180910390fd5b8260095461117c91906139b7565b34146111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b490613d2f565b60405180910390fd5b6000843360016040516020016111d593929190613db8565b604051602081830303815290604052805190602001209050611259838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050507f2f02d937e933ee30c12ef2dee0201a15a588cde97faaf8aa58c175ecc350f98283612419565b611298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128f90613e67565b60405180910390fd5b83600760008282546112aa9190613c21565b9250508190555060005b848110156112d8576112c533612430565b80806112d090613e87565b9150506112b4565b505050505050565b6112e8612010565b73ffffffffffffffffffffffffffffffffffffffff166113066117a7565b73ffffffffffffffffffffffffffffffffffffffff161461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906138d6565b60405180910390fd5b80600c9080519060200190611372929190612dc2565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561141f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141690613f42565b60405180910390fd5b80915050919050565b60085481565b600c805461143b906136a2565b80601f0160208091040260200160405190810160405280929190818152602001828054611467906136a2565b80156114b45780601f10611489576101008083540402835291602001916114b4565b820191906000526020600020905b81548152906001019060200180831161149757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561152d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152490613fd4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61157c612010565b73ffffffffffffffffffffffffffffffffffffffff1661159a6117a7565b73ffffffffffffffffffffffffffffffffffffffff16146115f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e7906138d6565b60405180910390fd5b6115fa60006124af565b565b611604612010565b73ffffffffffffffffffffffffffffffffffffffff166116226117a7565b73ffffffffffffffffffffffffffffffffffffffff1614611678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166f906138d6565b60405180910390fd5b600e60159054906101000a900460ff16156116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bf90614040565b60405180910390fd5b6001600e60156101000a81548160ff02191690831515021790555060005b602881101561170b576116f833612430565b808061170390613e87565b9150506116e6565b50565b611716612010565b73ffffffffffffffffffffffffffffffffffffffff166117346117a7565b73ffffffffffffffffffffffffffffffffffffffff161461178a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611781906138d6565b60405180910390fd5b80600e60146101000a81548160ff02191690831515021790555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60075481565b6060600180546117e6906136a2565b80601f0160208091040260200160405190810160405280929190818152602001828054611812906136a2565b801561185f5780601f106118345761010080835404028352916020019161185f565b820191906000526020600020905b81548152906001019060200180831161184257829003601f168201915b5050505050905090565b6000806101008361187a9190613a40565b905060006101008461188c9190614060565b90506000601060008481526020019081526020016000205490506000826001901b90508081831614945050505050919050565b600e60149054906101000a900460ff1661190e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190590613abd565b60405180910390fd5b60008114158015611920575060148111155b61195f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195690613c01565b60405180910390fd5b600a544210156119a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199b906140dd565b60405180910390fd5b806008546119b291906139b7565b34146119f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ea90613d2f565b60405180910390fd5b60005b81811015611a1a57611a0733612430565b8080611a1290613e87565b9150506119f6565b5050565b611a30611a29612010565b8383612575565b5050565b600b5481565b611a4b611a45612010565b836120df565b611a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8190613968565b60405180910390fd5b611a96848484846126e2565b50505050565b6060611aa782611fa4565b611ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611add9061416f565b60405180910390fd5b6000611af061273e565b90506000815111611b105760405180602001604052806000815250611b3b565b80611b1a846127d0565b604051602001611b2b9291906141cb565b6040516020818303038152906040525b915050919050565b600e60149054906101000a900460ff16611b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8990613abd565b60405180910390fd5b600b54421015611bd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bce90613b29565b60405180910390fd5b600a544210611c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1290613b95565b60405180910390fd5b6008543414611c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5690613d2f565b60405180910390fd5b611c6883611869565b15611ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9f9061423b565b60405180910390fd5b600083336001604051602001611cc093929190613db8565b604051602081830303815290604052805190602001209050611d44838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050507f584be09e9027215d42738e0e4609b2fce52ef3080388a5ecf844b812368cd70383612419565b611d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7a90613e67565b60405180910390fd5b611d8c84612931565b611d9533612430565b50505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60149054906101000a900460ff1681565b611e4a612010565b73ffffffffffffffffffffffffffffffffffffffff16611e686117a7565b73ffffffffffffffffffffffffffffffffffffffff1614611ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb5906138d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f25906142cd565b60405180910390fd5b611f37816124af565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661208b83611376565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60006120ea82611fa4565b612129576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121209061435f565b60405180910390fd5b600061213483611376565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121a357508373ffffffffffffffffffffffffffffffffffffffff1661218b84610a38565b73ffffffffffffffffffffffffffffffffffffffff16145b806121b457506121b38185611d9b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121dd82611376565b73ffffffffffffffffffffffffffffffffffffffff1614612233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222a906143f1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229a90614483565b60405180910390fd5b6122ae83838361298b565b6122b9600082612018565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461230991906144a3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123609190613c21565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000826124268584612990565b1490509392505050565b61115c600161243f600f6120d1565b6124499190613c21565b10612489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248090614523565b60405180910390fd5b6000612495600f6120d1565b90506124a1600f612a43565b6124ab8282612a59565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125db9061458f565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126d59190612f4d565b60405180910390a3505050565b6126ed8484846121bd565b6126f984848484612c27565b612738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272f90614621565b60405180910390fd5b50505050565b6060600c805461274d906136a2565b80601f0160208091040260200160405190810160405280929190818152602001828054612779906136a2565b80156127c65780601f1061279b576101008083540402835291602001916127c6565b820191906000526020600020905b8154815290600101906020018083116127a957829003601f168201915b5050505050905090565b60606000821415612818576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061292c565b600082905060005b6000821461284a57808061283390613e87565b915050600a826128439190613a40565b9150612820565b60008167ffffffffffffffff81111561286657612865613275565b5b6040519080825280601f01601f1916602001820160405280156128985781602001600182028036833780820191505090505b5090505b60008514612925576001826128b191906144a3565b9150600a856128c09190614060565b60306128cc9190613c21565b60f81b8183815181106128e2576128e1614641565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561291e9190613a40565b945061289c565b8093505050505b919050565b6000610100826129419190613a40565b90506000610100836129539190614060565b9050806001901b6010600084815260200190815260200160002054176010600084815260200190815260200160002081905550505050565b505050565b60008082905060005b8451811015612a385760008582815181106129b7576129b6614641565b5b602002602001015190508083116129f85782816040516020016129db92919061469b565b604051602081830303815290604052805190602001209250612a24565b8083604051602001612a0b92919061469b565b6040516020818303038152906040528051906020012092505b508080612a3090613e87565b915050612999565b508091505092915050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac090614713565b60405180910390fd5b612ad281611fa4565b15612b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b099061477f565b60405180910390fd5b612b1e6000838361298b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b6e9190613c21565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612c488473ffffffffffffffffffffffffffffffffffffffff16612daf565b15612da2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c71612010565b8786866040518563ffffffff1660e01b8152600401612c9394939291906147f4565b6020604051808303816000875af1925050508015612ccf57506040513d601f19601f82011682018060405250810190612ccc9190614855565b60015b612d52573d8060008114612cff576040519150601f19603f3d011682016040523d82523d6000602084013e612d04565b606091505b50600081511415612d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4190614621565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612da7565b600190505b949350505050565b600080823b905060008111915050919050565b828054612dce906136a2565b90600052602060002090601f016020900481019282612df05760008555612e37565b82601f10612e0957805160ff1916838001178555612e37565b82800160010185558215612e37579182015b82811115612e36578251825591602001919060010190612e1b565b5b509050612e449190612e48565b5090565b5b80821115612e61576000816000905550600101612e49565b5090565b6000819050919050565b612e7881612e65565b82525050565b6000602082019050612e936000830184612e6f565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ee281612ead565b8114612eed57600080fd5b50565b600081359050612eff81612ed9565b92915050565b600060208284031215612f1b57612f1a612ea3565b5b6000612f2984828501612ef0565b91505092915050565b60008115159050919050565b612f4781612f32565b82525050565b6000602082019050612f626000830184612f3e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fa2578082015181840152602081019050612f87565b83811115612fb1576000848401525b50505050565b6000601f19601f8301169050919050565b6000612fd382612f68565b612fdd8185612f73565b9350612fed818560208601612f84565b612ff681612fb7565b840191505092915050565b6000602082019050818103600083015261301b8184612fc8565b905092915050565b61302c81612e65565b811461303757600080fd5b50565b60008135905061304981613023565b92915050565b60006020828403121561306557613064612ea3565b5b60006130738482850161303a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130a78261307c565b9050919050565b6130b78161309c565b82525050565b60006020820190506130d260008301846130ae565b92915050565b6130e18161309c565b81146130ec57600080fd5b50565b6000813590506130fe816130d8565b92915050565b6000806040838503121561311b5761311a612ea3565b5b6000613129858286016130ef565b925050602061313a8582860161303a565b9150509250929050565b60008060006060848603121561315d5761315c612ea3565b5b600061316b868287016130ef565b935050602061317c868287016130ef565b925050604061318d8682870161303a565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126131bc576131bb613197565b5b8235905067ffffffffffffffff8111156131d9576131d861319c565b5b6020830191508360208202830111156131f5576131f46131a1565b5b9250929050565b6000806000806060858703121561321657613215612ea3565b5b60006132248782880161303a565b94505060206132358782880161303a565b935050604085013567ffffffffffffffff81111561325657613255612ea8565b5b613262878288016131a6565b925092505092959194509250565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6132ad82612fb7565b810181811067ffffffffffffffff821117156132cc576132cb613275565b5b80604052505050565b60006132df612e99565b90506132eb82826132a4565b919050565b600067ffffffffffffffff82111561330b5761330a613275565b5b61331482612fb7565b9050602081019050919050565b82818337600083830152505050565b600061334361333e846132f0565b6132d5565b90508281526020810184848401111561335f5761335e613270565b5b61336a848285613321565b509392505050565b600082601f83011261338757613386613197565b5b8135613397848260208601613330565b91505092915050565b6000602082840312156133b6576133b5612ea3565b5b600082013567ffffffffffffffff8111156133d4576133d3612ea8565b5b6133e084828501613372565b91505092915050565b6000602082840312156133ff576133fe612ea3565b5b600061340d848285016130ef565b91505092915050565b61341f81612f32565b811461342a57600080fd5b50565b60008135905061343c81613416565b92915050565b60006020828403121561345857613457612ea3565b5b60006134668482850161342d565b91505092915050565b6000806040838503121561348657613485612ea3565b5b6000613494858286016130ef565b92505060206134a58582860161342d565b9150509250929050565b600067ffffffffffffffff8211156134ca576134c9613275565b5b6134d382612fb7565b9050602081019050919050565b60006134f36134ee846134af565b6132d5565b90508281526020810184848401111561350f5761350e613270565b5b61351a848285613321565b509392505050565b600082601f83011261353757613536613197565b5b81356135478482602086016134e0565b91505092915050565b6000806000806080858703121561356a57613569612ea3565b5b6000613578878288016130ef565b9450506020613589878288016130ef565b935050604061359a8782880161303a565b925050606085013567ffffffffffffffff8111156135bb576135ba612ea8565b5b6135c787828801613522565b91505092959194509250565b6000806000604084860312156135ec576135eb612ea3565b5b60006135fa8682870161303a565b935050602084013567ffffffffffffffff81111561361b5761361a612ea8565b5b613627868287016131a6565b92509250509250925092565b6000806040838503121561364a57613649612ea3565b5b6000613658858286016130ef565b9250506020613669858286016130ef565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136ba57607f821691505b602082108114156136ce576136cd613673565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613730602c83612f73565b915061373b826136d4565b604082019050919050565b6000602082019050818103600083015261375f81613723565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006137c2602183612f73565b91506137cd82613766565b604082019050919050565b600060208201905081810360008301526137f1816137b5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613854603883612f73565b915061385f826137f8565b604082019050919050565b6000602082019050818103600083015261388381613847565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006138c0602083612f73565b91506138cb8261388a565b602082019050919050565b600060208201905081810360008301526138ef816138b3565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613952603183612f73565b915061395d826138f6565b604082019050919050565b6000602082019050818103600083015261398181613945565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139c282612e65565b91506139cd83612e65565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a0657613a05613988565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a4b82612e65565b9150613a5683612e65565b925082613a6657613a65613a11565b5b828204905092915050565b7f4e6f742061637469766500000000000000000000000000000000000000000000600082015250565b6000613aa7600a83612f73565b9150613ab282613a71565b602082019050919050565b60006020820190508181036000830152613ad681613a9a565b9050919050565b7f50726573616c65206d7573742062652061637469766500000000000000000000600082015250565b6000613b13601683612f73565b9150613b1e82613add565b602082019050919050565b60006020820190508181036000830152613b4281613b06565b9050919050565b7f50726573616c652068617320656e646564000000000000000000000000000000600082015250565b6000613b7f601183612f73565b9150613b8a82613b49565b602082019050919050565b60006020820190508181036000830152613bae81613b72565b9050919050565b7f302f6c696d697400000000000000000000000000000000000000000000000000600082015250565b6000613beb600783612f73565b9150613bf682613bb5565b602082019050919050565b60006020820190508181036000830152613c1a81613bde565b9050919050565b6000613c2c82612e65565b9150613c3783612e65565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c6c57613c6b613988565b5b828201905092915050565b7f43617070656420686f6c6465722073616c650000000000000000000000000000600082015250565b6000613cad601283612f73565b9150613cb882613c77565b602082019050919050565b60006020820190508181036000830152613cdc81613ca0565b9050919050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000613d19601f83612f73565b9150613d2482613ce3565b602082019050919050565b60006020820190508181036000830152613d4881613d0c565b9050919050565b6000819050919050565b613d6a613d6582612e65565b613d4f565b82525050565b60008160601b9050919050565b6000613d8882613d70565b9050919050565b6000613d9a82613d7d565b9050919050565b613db2613dad8261309c565b613d8f565b82525050565b6000613dc48286613d59565b602082019150613dd48285613da1565b601482019150613de48284613d59565b602082019150819050949350505050565b7f4d65726b6c654469737472696275746f723a20496e76616c69642070726f6f6660008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e51602183612f73565b9150613e5c82613df5565b604082019050919050565b60006020820190508181036000830152613e8081613e44565b9050919050565b6000613e9282612e65565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ec557613ec4613988565b5b600182019050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613f2c602983612f73565b9150613f3782613ed0565b604082019050919050565b60006020820190508181036000830152613f5b81613f1f565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613fbe602a83612f73565b9150613fc982613f62565b604082019050919050565b60006020820190508181036000830152613fed81613fb1565b9050919050565b7f416c7265616479206d696e746564000000000000000000000000000000000000600082015250565b600061402a600e83612f73565b915061403582613ff4565b602082019050919050565b600060208201905081810360008301526140598161401d565b9050919050565b600061406b82612e65565b915061407683612e65565b92508261408657614085613a11565b5b828206905092915050565b7f53616c65206d7573742062652061637469766500000000000000000000000000600082015250565b60006140c7601383612f73565b91506140d282614091565b602082019050919050565b600060208201905081810360008301526140f6816140ba565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614159602f83612f73565b9150614164826140fd565b604082019050919050565b600060208201905081810360008301526141888161414c565b9050919050565b600081905092915050565b60006141a582612f68565b6141af818561418f565b93506141bf818560208601612f84565b80840191505092915050565b60006141d7828561419a565b91506141e3828461419a565b91508190509392505050565b7f416c726561647920636c61696d65640000000000000000000000000000000000600082015250565b6000614225600f83612f73565b9150614230826141ef565b602082019050919050565b6000602082019050818103600083015261425481614218565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006142b7602683612f73565b91506142c28261425b565b604082019050919050565b600060208201905081810360008301526142e6816142aa565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614349602c83612f73565b9150614354826142ed565b604082019050919050565b600060208201905081810360008301526143788161433c565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006143db602983612f73565b91506143e68261437f565b604082019050919050565b6000602082019050818103600083015261440a816143ce565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061446d602483612f73565b915061447882614411565b604082019050919050565b6000602082019050818103600083015261449c81614460565b9050919050565b60006144ae82612e65565b91506144b983612e65565b9250828210156144cc576144cb613988565b5b828203905092915050565b7f4d41585f535550504c5900000000000000000000000000000000000000000000600082015250565b600061450d600a83612f73565b9150614518826144d7565b602082019050919050565b6000602082019050818103600083015261453c81614500565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614579601983612f73565b915061458482614543565b602082019050919050565b600060208201905081810360008301526145a88161456c565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061460b603283612f73565b9150614616826145af565b604082019050919050565b6000602082019050818103600083015261463a816145fe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000819050919050565b61469561469082614670565b61467a565b82525050565b60006146a78285614684565b6020820191506146b78284614684565b6020820191508190509392505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006146fd602083612f73565b9150614708826146c7565b602082019050919050565b6000602082019050818103600083015261472c816146f0565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614769601c83612f73565b915061477482614733565b602082019050919050565b600060208201905081810360008301526147988161475c565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006147c68261479f565b6147d081856147aa565b93506147e0818560208601612f84565b6147e981612fb7565b840191505092915050565b600060808201905061480960008301876130ae565b61481660208301866130ae565b6148236040830185612e6f565b818103606083015261483581846147bb565b905095945050505050565b60008151905061484f81612ed9565b92915050565b60006020828403121561486b5761486a612ea3565b5b600061487984828501614840565b9150509291505056fea26469706673582212204812816b4be3fd9402f5b19f2cefdc837d7434ef65cb222ab730f8a4f4405ba464736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000061bff1b00000000000000000000000000000000000000000000000000000000061c294b0584be09e9027215d42738e0e4609b2fce52ef3080388a5ecf844b812368cd7032f02d937e933ee30c12ef2dee0201a15a588cde97faaf8aa58c175ecc350f982
-----Decoded View---------------
Arg [0] : _presaleStartTime (uint256): 1639969200
Arg [1] : _saleStartTime (uint256): 1640142000
Arg [2] : _whitelistRoot (bytes32): 0x584be09e9027215d42738e0e4609b2fce52ef3080388a5ecf844b812368cd703
Arg [3] : _holderRoot (bytes32): 0x2f02d937e933ee30c12ef2dee0201a15a588cde97faaf8aa58c175ecc350f982
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000061bff1b0
Arg [1] : 0000000000000000000000000000000000000000000000000000000061c294b0
Arg [2] : 584be09e9027215d42738e0e4609b2fce52ef3080388a5ecf844b812368cd703
Arg [3] : 2f02d937e933ee30c12ef2dee0201a15a588cde97faaf8aa58c175ecc350f982
Deployed Bytecode Sourcemap
39963:5820:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40363:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27375:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28320:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29879:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29402:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44735:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40410:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40161:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42064:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30629:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42178:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40113:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41938:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41540:235;;;;;;;;;;;;;:::i;:::-;;31039:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40060:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42316:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42536:960;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42432:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28014:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40318:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40525:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27744:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8363:103;;;;;;;;;;;;;:::i;:::-;;41321:211;;;;;;;;;;;;;:::i;:::-;;41835:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7712:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40286:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28489:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44843:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44244:482;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30172:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40465:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31295:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28664:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43504:732;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30398:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40690:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8621:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40363:40;;;;:::o;27375:305::-;27477:4;27529:25;27514:40;;;:11;:40;;;;:105;;;;27586:33;27571:48;;;:11;:48;;;;27514:105;:158;;;;27636:36;27660:11;27636:23;:36::i;:::-;27514:158;27494:178;;27375:305;;;:::o;28320:100::-;28374:13;28407:5;28400:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28320:100;:::o;29879:221::-;29955:7;29983:16;29991:7;29983;:16::i;:::-;29975:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30068:15;:24;30084:7;30068:24;;;;;;;;;;;;;;;;;;;;;30061:31;;29879:221;;;:::o;29402:411::-;29483:13;29499:23;29514:7;29499:14;:23::i;:::-;29483:39;;29547:5;29541:11;;:2;:11;;;;29533:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29641:5;29625:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29650:37;29667:5;29674:12;:10;:12::i;:::-;29650:16;:37::i;:::-;29625:62;29603:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;29784:21;29793:2;29797:7;29784:8;:21::i;:::-;29472:341;29402:411;;:::o;44735:100::-;44781:7;44808:19;:9;:17;:19::i;:::-;44801:26;;44735:100;:::o;40410:48::-;;;;:::o;40161:41::-;40198:4;40161:41;:::o;42064:106::-;7943:12;:10;:12::i;:::-;7932:23;;:7;:5;:7::i;:::-;:23;;;7924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42150:12:::1;42138:9;:24;;;;42064:106:::0;:::o;30629:339::-;30824:41;30843:12;:10;:12::i;:::-;30857:7;30824:18;:41::i;:::-;30816:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30932:28;30942:4;30948:2;30952:7;30932:9;:28::i;:::-;30629:339;;;:::o;42178:130::-;7943:12;:10;:12::i;:::-;7932:23;;:7;:5;:7::i;:::-;:23;;;7924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42283:17:::1;42264:16;:36;;;;42178:130:::0;:::o;40113:41::-;40150:4;40113:41;:::o;41938:118::-;7943:12;:10;:12::i;:::-;7932:23;;:7;:5;:7::i;:::-;:23;;;7924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42033:15:::1;42018:12;:30;;;;41938:118:::0;:::o;41540:235::-;7943:12;:10;:12::i;:::-;7932:23;;:7;:5;:7::i;:::-;:23;;;7924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41590:21:::1;41642:4;41637:3;41615:21;:25;;;;:::i;:::-;41614:32;;;;:::i;:::-;41590:56;;41673:8;;;;;;;;;;;41665:22;;:37;41688:13;41665:37;;;;;;;;;;;;;;;;;;;;;;;41657:46;;;::::0;::::1;;41730:7;;;;;;;;;;;41722:21;;:44;41744:21;41722:44;;;;;;;;;;;;;;;;;;;;;;;41714:53;;;::::0;::::1;;41579:196;41540:235::o:0;31039:185::-;31177:39;31194:4;31200:2;31204:7;31177:39;;;;;;;;;;;;:16;:39::i;:::-;31039:185;;;:::o;40060:46::-;40104:2;40060:46;:::o;42316:108::-;7943:12;:10;:12::i;:::-;7932:23;;:7;:5;:7::i;:::-;:23;;;7924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42407:9:::1;42391:13;:25;;;;42316:108:::0;:::o;42536:960::-;42663:12;;;;;;;;;;;42655:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;42735:16;;42716:15;:35;;42708:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;42820:13;;42802:15;:31;42794:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;42892:1;42876:12;:17;;:54;;;;;40104:2;42897:12;:33;;42876:54;42868:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;40198:4;42974:12;42961:10;;:25;;;;:::i;:::-;:39;;42953:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;43070:12;43057;;:25;;;;:::i;:::-;43044:9;:38;43036:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;43168:12;43210:5;43217:10;43237:1;43193:47;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43183:58;;;;;;43168:73;;43260:49;43279:11;;43260:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43292:10;43304:4;43260:18;:49::i;:::-;43252:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43374:12;43360:10;;:26;;;;;;;:::i;:::-;;;;;;;;43404:9;43399:90;43423:12;43419:1;:16;43399:90;;;43457:20;43466:10;43457:8;:20::i;:::-;43437:3;;;;;:::i;:::-;;;;43399:90;;;;42642:854;42536:960;;;;:::o;42432:96::-;7943:12;:10;:12::i;:::-;7932:23;;:7;:5;:7::i;:::-;:23;;;7924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42514:6:::1;42504:7;:16;;;;;;;;;;;;:::i;:::-;;42432:96:::0;:::o;28014:239::-;28086:7;28106:13;28122:7;:16;28130:7;28122:16;;;;;;;;;;;;;;;;;;;;;28106:32;;28174:1;28157:19;;:5;:19;;;;28149:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28240:5;28233:12;;;28014:239;;;:::o;40318:38::-;;;;:::o;40525:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27744:208::-;27816:7;27861:1;27844:19;;:5;:19;;;;27836:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27928:9;:16;27938:5;27928:16;;;;;;;;;;;;;;;;27921:23;;27744:208;;;:::o;8363:103::-;7943:12;:10;:12::i;:::-;7932:23;;:7;:5;:7::i;:::-;:23;;;7924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8428:30:::1;8455:1;8428:18;:30::i;:::-;8363:103::o:0;41321:211::-;7943:12;:10;:12::i;:::-;7932:23;;:7;:5;:7::i;:::-;:23;;;7924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41379:9:::1;;;;;;;;;;;41378:10;41370:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;41430:4;41418:9;;:16;;;;;;;;;;;;;;;;;;41450:9;41445:80;41469:2;41465:1;:6;41445:80;;;41493:20;41502:10;41493:8;:20::i;:::-;41473:3;;;;;:::i;:::-;;;;41445:80;;;;41321:211::o:0;41835:95::-;7943:12;:10;:12::i;:::-;7932:23;;:7;:5;:7::i;:::-;:23;;;7924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41916:6:::1;41901:12;;:21;;;;;;;;;;;;;;;;;;41835:95:::0;:::o;7712:87::-;7758:7;7785:6;;;;;;;;;;;7778:13;;7712:87;:::o;40286:25::-;;;;:::o;28489:104::-;28545:13;28578:7;28571:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28489:104;:::o;44843:322::-;44898:4;44915:24;44950:3;44942:5;:11;;;;:::i;:::-;44915:38;;44964:23;44998:3;44990:5;:11;;;;:::i;:::-;44964:37;;45012:19;45034:13;:31;45048:16;45034:31;;;;;;;;;;;;45012:53;;45076:12;45097:15;45092:1;:20;;45076:37;;45153:4;45145;45131:11;:18;:26;45124:33;;;;;;44843:322;;;:::o;44244:482::-;44318:12;;;;;;;;;;;44310:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;44388:1;44370:14;:19;;:58;;;;;40104:2;44393:14;:35;;44370:58;44362:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;44479:13;;44460:15;:32;;44452:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;44560:14;44548:9;;:26;;;;:::i;:::-;44535:9;:39;44527:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;44635:6;44631:88;44651:14;44647:1;:18;44631:88;;;44687:20;44696:10;44687:8;:20::i;:::-;44667:3;;;;;:::i;:::-;;;;44631:88;;;;44244:482;:::o;30172:155::-;30267:52;30286:12;:10;:12::i;:::-;30300:8;30310;30267:18;:52::i;:::-;30172:155;;:::o;40465:51::-;;;;:::o;31295:328::-;31470:41;31489:12;:10;:12::i;:::-;31503:7;31470:18;:41::i;:::-;31462:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31576:39;31590:4;31596:2;31600:7;31609:5;31576:13;:39::i;:::-;31295:328;;;;:::o;28664:334::-;28737:13;28771:16;28779:7;28771;:16::i;:::-;28763:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;28852:21;28876:10;:8;:10::i;:::-;28852:34;;28928:1;28910:7;28904:21;:25;:86;;;;;;;;;;;;;;;;;28956:7;28965:18;:7;:16;:18::i;:::-;28939:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28904:86;28897:93;;;28664:334;;;:::o;43504:732::-;43611:12;;;;;;;;;;;43603:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;43682:16;;43663:15;:35;;43655:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;43764:13;;43746:15;:31;43738:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;43833:9;;43820;:22;43812:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43937:16;43947:5;43937:9;:16::i;:::-;43936:17;43928:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;43984:12;44026:5;44033:10;44053:1;44009:47;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43999:58;;;;;;43984:73;;44076:52;44095:11;;44076:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44108:13;44123:4;44076:18;:52::i;:::-;44068:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;44179:18;44191:5;44179:11;:18::i;:::-;44208:20;44217:10;44208:8;:20::i;:::-;43591:645;43504:732;;;:::o;30398:164::-;30495:4;30519:18;:25;30538:5;30519:25;;;;;;;;;;;;;;;:35;30545:8;30519:35;;;;;;;;;;;;;;;;;;;;;;;;;30512:42;;30398:164;;;;:::o;40690:31::-;;;;;;;;;;;;;:::o;8621:201::-;7943:12;:10;:12::i;:::-;7932:23;;:7;:5;:7::i;:::-;:23;;;7924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8730:1:::1;8710:22;;:8;:22;;;;8702:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8786:28;8805:8;8786:18;:28::i;:::-;8621:201:::0;:::o;20144:157::-;20229:4;20268:25;20253:40;;;:11;:40;;;;20246:47;;20144:157;;;:::o;33133:127::-;33198:4;33250:1;33222:30;;:7;:16;33230:7;33222:16;;;;;;;;;;;;;;;;;;;;;:30;;;;33215:37;;33133:127;;;:::o;6436:98::-;6489:7;6516:10;6509:17;;6436:98;:::o;37115:174::-;37217:2;37190:15;:24;37206:7;37190:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37273:7;37269:2;37235:46;;37244:23;37259:7;37244:14;:23::i;:::-;37235:46;;;;;;;;;;;;37115:174;;:::o;3040:114::-;3105:7;3132;:14;;;3125:21;;3040:114;;;:::o;33427:348::-;33520:4;33545:16;33553:7;33545;:16::i;:::-;33537:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33621:13;33637:23;33652:7;33637:14;:23::i;:::-;33621:39;;33690:5;33679:16;;:7;:16;;;:51;;;;33723:7;33699:31;;:20;33711:7;33699:11;:20::i;:::-;:31;;;33679:51;:87;;;;33734:32;33751:5;33758:7;33734:16;:32::i;:::-;33679:87;33671:96;;;33427:348;;;;:::o;36419:578::-;36578:4;36551:31;;:23;36566:7;36551:14;:23::i;:::-;:31;;;36543:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;36661:1;36647:16;;:2;:16;;;;36639:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36717:39;36738:4;36744:2;36748:7;36717:20;:39::i;:::-;36821:29;36838:1;36842:7;36821:8;:29::i;:::-;36882:1;36863:9;:15;36873:4;36863:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36911:1;36894:9;:13;36904:2;36894:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36942:2;36923:7;:16;36931:7;36923:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36981:7;36977:2;36962:27;;36971:4;36962:27;;;;;;;;;;;;36419:578;;;:::o;908:190::-;1033:4;1086;1057:25;1070:5;1077:4;1057:12;:25::i;:::-;:33;1050:40;;908:190;;;;;:::o;45431:232::-;40150:4;45511:1;45489:19;:9;:17;:19::i;:::-;:23;;;;:::i;:::-;:36;45481:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;45551:17;45571:19;:9;:17;:19::i;:::-;45551:39;;45602:21;:9;:19;:21::i;:::-;45635:20;45641:2;45645:9;45635:5;:20::i;:::-;45470:193;45431:232;:::o;8982:191::-;9056:16;9075:6;;;;;;;;;;;9056:25;;9101:8;9092:6;;:17;;;;;;;;;;;;;;;;;;9156:8;9125:40;;9146:8;9125:40;;;;;;;;;;;;9045:128;8982:191;:::o;37431:315::-;37586:8;37577:17;;:5;:17;;;;37569:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;37673:8;37635:18;:25;37654:5;37635:25;;;;;;;;;;;;;;;:35;37661:8;37635:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;37719:8;37697:41;;37712:5;37697:41;;;37729:8;37697:41;;;;;;:::i;:::-;;;;;;;;37431:315;;;:::o;32505:::-;32662:28;32672:4;32678:2;32682:7;32662:9;:28::i;:::-;32709:48;32732:4;32738:2;32742:7;32751:5;32709:22;:48::i;:::-;32701:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32505:315;;;;:::o;45672:108::-;45732:13;45765:7;45758:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45672:108;:::o;3998:723::-;4054:13;4284:1;4275:5;:10;4271:53;;;4302:10;;;;;;;;;;;;;;;;;;;;;4271:53;4334:12;4349:5;4334:20;;4365:14;4390:78;4405:1;4397:4;:9;4390:78;;4423:8;;;;;:::i;:::-;;;;4454:2;4446:10;;;;;:::i;:::-;;;4390:78;;;4478:19;4510:6;4500:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4478:39;;4528:154;4544:1;4535:5;:10;4528:154;;4572:1;4562:11;;;;;:::i;:::-;;;4639:2;4631:5;:10;;;;:::i;:::-;4618:2;:24;;;;:::i;:::-;4605:39;;4588:6;4595;4588:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;4668:2;4659:11;;;;;:::i;:::-;;;4528:154;;;4706:6;4692:21;;;;;3998:723;;;;:::o;45173:250::-;45228:24;45263:3;45255:5;:11;;;;:::i;:::-;45228:38;;45277:23;45311:3;45303:5;:11;;;;:::i;:::-;45277:37;;45399:15;45394:1;:20;;45359:13;:31;45373:16;45359:31;;;;;;;;;;;;:56;45325:13;:31;45339:16;45325:31;;;;;;;;;;;:90;;;;45217:206;;45173:250;:::o;39682:126::-;;;;:::o;1460:701::-;1543:7;1563:20;1586:4;1563:27;;1606:9;1601:523;1625:5;:12;1621:1;:16;1601:523;;;1659:20;1682:5;1688:1;1682:8;;;;;;;;:::i;:::-;;;;;;;;1659:31;;1725:12;1709;:28;1705:408;;1879:12;1893;1862:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1852:55;;;;;;1837:70;;1705:408;;;2069:12;2083;2052:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2042:55;;;;;;2027:70;;1705:408;1644:480;1639:3;;;;;:::i;:::-;;;;1601:523;;;;2141:12;2134:19;;;1460:701;;;;:::o;3162:127::-;3269:1;3251:7;:14;;;:19;;;;;;;;;;;3162:127;:::o;35111:382::-;35205:1;35191:16;;:2;:16;;;;35183:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35264:16;35272:7;35264;:16::i;:::-;35263:17;35255:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35326:45;35355:1;35359:2;35363:7;35326:20;:45::i;:::-;35401:1;35384:9;:13;35394:2;35384:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35432:2;35413:7;:16;35421:7;35413:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35477:7;35473:2;35452:33;;35469:1;35452:33;;;;;;;;;;;;35111:382;;:::o;38311:799::-;38466:4;38487:15;:2;:13;;;:15::i;:::-;38483:620;;;38539:2;38523:36;;;38560:12;:10;:12::i;:::-;38574:4;38580:7;38589:5;38523:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38519:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38782:1;38765:6;:13;:18;38761:272;;;38808:60;;;;;;;;;;:::i;:::-;;;;;;;;38761:272;38983:6;38977:13;38968:6;38964:2;38960:15;38953:38;38519:529;38656:41;;;38646:51;;;:6;:51;;;;38639:58;;;;;38483:620;39087:4;39080:11;;38311:799;;;;;;;:::o;10000:387::-;10060:4;10268:12;10335:7;10323:20;10315:28;;10378:1;10371:4;:8;10364:15;;;10000:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:117;6270:1;6267;6260:12;6301:568;6374:8;6384:6;6434:3;6427:4;6419:6;6415:17;6411:27;6401:122;;6442:79;;:::i;:::-;6401:122;6555:6;6542:20;6532:30;;6585:18;6577:6;6574:30;6571:117;;;6607:79;;:::i;:::-;6571:117;6721:4;6713:6;6709:17;6697:29;;6775:3;6767:4;6759:6;6755:17;6745:8;6741:32;6738:41;6735:128;;;6782:79;;:::i;:::-;6735:128;6301:568;;;;;:::o;6875:849::-;6979:6;6987;6995;7003;7052:2;7040:9;7031:7;7027:23;7023:32;7020:119;;;7058:79;;:::i;:::-;7020:119;7178:1;7203:53;7248:7;7239:6;7228:9;7224:22;7203:53;:::i;:::-;7193:63;;7149:117;7305:2;7331:53;7376:7;7367:6;7356:9;7352:22;7331:53;:::i;:::-;7321:63;;7276:118;7461:2;7450:9;7446:18;7433:32;7492:18;7484:6;7481:30;7478:117;;;7514:79;;:::i;:::-;7478:117;7627:80;7699:7;7690:6;7679:9;7675:22;7627:80;:::i;:::-;7609:98;;;;7404:313;6875:849;;;;;;;:::o;7730:117::-;7839:1;7836;7829:12;7853:180;7901:77;7898:1;7891:88;7998:4;7995:1;7988:15;8022:4;8019:1;8012:15;8039:281;8122:27;8144:4;8122:27;:::i;:::-;8114:6;8110:40;8252:6;8240:10;8237:22;8216:18;8204:10;8201:34;8198:62;8195:88;;;8263:18;;:::i;:::-;8195:88;8303:10;8299:2;8292:22;8082:238;8039:281;;:::o;8326:129::-;8360:6;8387:20;;:::i;:::-;8377:30;;8416:33;8444:4;8436:6;8416:33;:::i;:::-;8326:129;;;:::o;8461:308::-;8523:4;8613:18;8605:6;8602:30;8599:56;;;8635:18;;:::i;:::-;8599:56;8673:29;8695:6;8673:29;:::i;:::-;8665:37;;8757:4;8751;8747:15;8739:23;;8461:308;;;:::o;8775:154::-;8859:6;8854:3;8849;8836:30;8921:1;8912:6;8907:3;8903:16;8896:27;8775:154;;;:::o;8935:412::-;9013:5;9038:66;9054:49;9096:6;9054:49;:::i;:::-;9038:66;:::i;:::-;9029:75;;9127:6;9120:5;9113:21;9165:4;9158:5;9154:16;9203:3;9194:6;9189:3;9185:16;9182:25;9179:112;;;9210:79;;:::i;:::-;9179:112;9300:41;9334:6;9329:3;9324;9300:41;:::i;:::-;9019:328;8935:412;;;;;:::o;9367:340::-;9423:5;9472:3;9465:4;9457:6;9453:17;9449:27;9439:122;;9480:79;;:::i;:::-;9439:122;9597:6;9584:20;9622:79;9697:3;9689:6;9682:4;9674:6;9670:17;9622:79;:::i;:::-;9613:88;;9429:278;9367:340;;;;:::o;9713:509::-;9782:6;9831:2;9819:9;9810:7;9806:23;9802:32;9799:119;;;9837:79;;:::i;:::-;9799:119;9985:1;9974:9;9970:17;9957:31;10015:18;10007:6;10004:30;10001:117;;;10037:79;;:::i;:::-;10001:117;10142:63;10197:7;10188:6;10177:9;10173:22;10142:63;:::i;:::-;10132:73;;9928:287;9713:509;;;;:::o;10228:329::-;10287:6;10336:2;10324:9;10315:7;10311:23;10307:32;10304:119;;;10342:79;;:::i;:::-;10304:119;10462:1;10487:53;10532:7;10523:6;10512:9;10508:22;10487:53;:::i;:::-;10477:63;;10433:117;10228:329;;;;:::o;10563:116::-;10633:21;10648:5;10633:21;:::i;:::-;10626:5;10623:32;10613:60;;10669:1;10666;10659:12;10613:60;10563:116;:::o;10685:133::-;10728:5;10766:6;10753:20;10744:29;;10782:30;10806:5;10782:30;:::i;:::-;10685:133;;;;:::o;10824:323::-;10880:6;10929:2;10917:9;10908:7;10904:23;10900:32;10897:119;;;10935:79;;:::i;:::-;10897:119;11055:1;11080:50;11122:7;11113:6;11102:9;11098:22;11080:50;:::i;:::-;11070:60;;11026:114;10824:323;;;;:::o;11153:468::-;11218:6;11226;11275:2;11263:9;11254:7;11250:23;11246:32;11243:119;;;11281:79;;:::i;:::-;11243:119;11401:1;11426:53;11471:7;11462:6;11451:9;11447:22;11426:53;:::i;:::-;11416:63;;11372:117;11528:2;11554:50;11596:7;11587:6;11576:9;11572:22;11554:50;:::i;:::-;11544:60;;11499:115;11153:468;;;;;:::o;11627:307::-;11688:4;11778:18;11770:6;11767:30;11764:56;;;11800:18;;:::i;:::-;11764:56;11838:29;11860:6;11838:29;:::i;:::-;11830:37;;11922:4;11916;11912:15;11904:23;;11627:307;;;:::o;11940:410::-;12017:5;12042:65;12058:48;12099:6;12058:48;:::i;:::-;12042:65;:::i;:::-;12033:74;;12130:6;12123:5;12116:21;12168:4;12161:5;12157:16;12206:3;12197:6;12192:3;12188:16;12185:25;12182:112;;;12213:79;;:::i;:::-;12182:112;12303:41;12337:6;12332:3;12327;12303:41;:::i;:::-;12023:327;11940:410;;;;;:::o;12369:338::-;12424:5;12473:3;12466:4;12458:6;12454:17;12450:27;12440:122;;12481:79;;:::i;:::-;12440:122;12598:6;12585:20;12623:78;12697:3;12689:6;12682:4;12674:6;12670:17;12623:78;:::i;:::-;12614:87;;12430:277;12369:338;;;;:::o;12713:943::-;12808:6;12816;12824;12832;12881:3;12869:9;12860:7;12856:23;12852:33;12849:120;;;12888:79;;:::i;:::-;12849:120;13008:1;13033:53;13078:7;13069:6;13058:9;13054:22;13033:53;:::i;:::-;13023:63;;12979:117;13135:2;13161:53;13206:7;13197:6;13186:9;13182:22;13161:53;:::i;:::-;13151:63;;13106:118;13263:2;13289:53;13334:7;13325:6;13314:9;13310:22;13289:53;:::i;:::-;13279:63;;13234:118;13419:2;13408:9;13404:18;13391:32;13450:18;13442:6;13439:30;13436:117;;;13472:79;;:::i;:::-;13436:117;13577:62;13631:7;13622:6;13611:9;13607:22;13577:62;:::i;:::-;13567:72;;13362:287;12713:943;;;;;;;:::o;13662:704::-;13757:6;13765;13773;13822:2;13810:9;13801:7;13797:23;13793:32;13790:119;;;13828:79;;:::i;:::-;13790:119;13948:1;13973:53;14018:7;14009:6;13998:9;13994:22;13973:53;:::i;:::-;13963:63;;13919:117;14103:2;14092:9;14088:18;14075:32;14134:18;14126:6;14123:30;14120:117;;;14156:79;;:::i;:::-;14120:117;14269:80;14341:7;14332:6;14321:9;14317:22;14269:80;:::i;:::-;14251:98;;;;14046:313;13662:704;;;;;:::o;14372:474::-;14440:6;14448;14497:2;14485:9;14476:7;14472:23;14468:32;14465:119;;;14503:79;;:::i;:::-;14465:119;14623:1;14648:53;14693:7;14684:6;14673:9;14669:22;14648:53;:::i;:::-;14638:63;;14594:117;14750:2;14776:53;14821:7;14812:6;14801:9;14797:22;14776:53;:::i;:::-;14766:63;;14721:118;14372:474;;;;;:::o;14852:180::-;14900:77;14897:1;14890:88;14997:4;14994:1;14987:15;15021:4;15018:1;15011:15;15038:320;15082:6;15119:1;15113:4;15109:12;15099:22;;15166:1;15160:4;15156:12;15187:18;15177:81;;15243:4;15235:6;15231:17;15221:27;;15177:81;15305:2;15297:6;15294:14;15274:18;15271:38;15268:84;;;15324:18;;:::i;:::-;15268:84;15089:269;15038:320;;;:::o;15364:231::-;15504:34;15500:1;15492:6;15488:14;15481:58;15573:14;15568:2;15560:6;15556:15;15549:39;15364:231;:::o;15601:366::-;15743:3;15764:67;15828:2;15823:3;15764:67;:::i;:::-;15757:74;;15840:93;15929:3;15840:93;:::i;:::-;15958:2;15953:3;15949:12;15942:19;;15601:366;;;:::o;15973:419::-;16139:4;16177:2;16166:9;16162:18;16154:26;;16226:9;16220:4;16216:20;16212:1;16201:9;16197:17;16190:47;16254:131;16380:4;16254:131;:::i;:::-;16246:139;;15973:419;;;:::o;16398:220::-;16538:34;16534:1;16526:6;16522:14;16515:58;16607:3;16602:2;16594:6;16590:15;16583:28;16398:220;:::o;16624:366::-;16766:3;16787:67;16851:2;16846:3;16787:67;:::i;:::-;16780:74;;16863:93;16952:3;16863:93;:::i;:::-;16981:2;16976:3;16972:12;16965:19;;16624:366;;;:::o;16996:419::-;17162:4;17200:2;17189:9;17185:18;17177:26;;17249:9;17243:4;17239:20;17235:1;17224:9;17220:17;17213:47;17277:131;17403:4;17277:131;:::i;:::-;17269:139;;16996:419;;;:::o;17421:243::-;17561:34;17557:1;17549:6;17545:14;17538:58;17630:26;17625:2;17617:6;17613:15;17606:51;17421:243;:::o;17670:366::-;17812:3;17833:67;17897:2;17892:3;17833:67;:::i;:::-;17826:74;;17909:93;17998:3;17909:93;:::i;:::-;18027:2;18022:3;18018:12;18011:19;;17670:366;;;:::o;18042:419::-;18208:4;18246:2;18235:9;18231:18;18223:26;;18295:9;18289:4;18285:20;18281:1;18270:9;18266:17;18259:47;18323:131;18449:4;18323:131;:::i;:::-;18315:139;;18042:419;;;:::o;18467:182::-;18607:34;18603:1;18595:6;18591:14;18584:58;18467:182;:::o;18655:366::-;18797:3;18818:67;18882:2;18877:3;18818:67;:::i;:::-;18811:74;;18894:93;18983:3;18894:93;:::i;:::-;19012:2;19007:3;19003:12;18996:19;;18655:366;;;:::o;19027:419::-;19193:4;19231:2;19220:9;19216:18;19208:26;;19280:9;19274:4;19270:20;19266:1;19255:9;19251:17;19244:47;19308:131;19434:4;19308:131;:::i;:::-;19300:139;;19027:419;;;:::o;19452:236::-;19592:34;19588:1;19580:6;19576:14;19569:58;19661:19;19656:2;19648:6;19644:15;19637:44;19452:236;:::o;19694:366::-;19836:3;19857:67;19921:2;19916:3;19857:67;:::i;:::-;19850:74;;19933:93;20022:3;19933:93;:::i;:::-;20051:2;20046:3;20042:12;20035:19;;19694:366;;;:::o;20066:419::-;20232:4;20270:2;20259:9;20255:18;20247:26;;20319:9;20313:4;20309:20;20305:1;20294:9;20290:17;20283:47;20347:131;20473:4;20347:131;:::i;:::-;20339:139;;20066:419;;;:::o;20491:180::-;20539:77;20536:1;20529:88;20636:4;20633:1;20626:15;20660:4;20657:1;20650:15;20677:348;20717:7;20740:20;20758:1;20740:20;:::i;:::-;20735:25;;20774:20;20792:1;20774:20;:::i;:::-;20769:25;;20962:1;20894:66;20890:74;20887:1;20884:81;20879:1;20872:9;20865:17;20861:105;20858:131;;;20969:18;;:::i;:::-;20858:131;21017:1;21014;21010:9;20999:20;;20677:348;;;;:::o;21031:180::-;21079:77;21076:1;21069:88;21176:4;21173:1;21166:15;21200:4;21197:1;21190:15;21217:185;21257:1;21274:20;21292:1;21274:20;:::i;:::-;21269:25;;21308:20;21326:1;21308:20;:::i;:::-;21303:25;;21347:1;21337:35;;21352:18;;:::i;:::-;21337:35;21394:1;21391;21387:9;21382:14;;21217:185;;;;:::o;21408:160::-;21548:12;21544:1;21536:6;21532:14;21525:36;21408:160;:::o;21574:366::-;21716:3;21737:67;21801:2;21796:3;21737:67;:::i;:::-;21730:74;;21813:93;21902:3;21813:93;:::i;:::-;21931:2;21926:3;21922:12;21915:19;;21574:366;;;:::o;21946:419::-;22112:4;22150:2;22139:9;22135:18;22127:26;;22199:9;22193:4;22189:20;22185:1;22174:9;22170:17;22163:47;22227:131;22353:4;22227:131;:::i;:::-;22219:139;;21946:419;;;:::o;22371:172::-;22511:24;22507:1;22499:6;22495:14;22488:48;22371:172;:::o;22549:366::-;22691:3;22712:67;22776:2;22771:3;22712:67;:::i;:::-;22705:74;;22788:93;22877:3;22788:93;:::i;:::-;22906:2;22901:3;22897:12;22890:19;;22549:366;;;:::o;22921:419::-;23087:4;23125:2;23114:9;23110:18;23102:26;;23174:9;23168:4;23164:20;23160:1;23149:9;23145:17;23138:47;23202:131;23328:4;23202:131;:::i;:::-;23194:139;;22921:419;;;:::o;23346:167::-;23486:19;23482:1;23474:6;23470:14;23463:43;23346:167;:::o;23519:366::-;23661:3;23682:67;23746:2;23741:3;23682:67;:::i;:::-;23675:74;;23758:93;23847:3;23758:93;:::i;:::-;23876:2;23871:3;23867:12;23860:19;;23519:366;;;:::o;23891:419::-;24057:4;24095:2;24084:9;24080:18;24072:26;;24144:9;24138:4;24134:20;24130:1;24119:9;24115:17;24108:47;24172:131;24298:4;24172:131;:::i;:::-;24164:139;;23891:419;;;:::o;24316:157::-;24456:9;24452:1;24444:6;24440:14;24433:33;24316:157;:::o;24479:365::-;24621:3;24642:66;24706:1;24701:3;24642:66;:::i;:::-;24635:73;;24717:93;24806:3;24717:93;:::i;:::-;24835:2;24830:3;24826:12;24819:19;;24479:365;;;:::o;24850:419::-;25016:4;25054:2;25043:9;25039:18;25031:26;;25103:9;25097:4;25093:20;25089:1;25078:9;25074:17;25067:47;25131:131;25257:4;25131:131;:::i;:::-;25123:139;;24850:419;;;:::o;25275:305::-;25315:3;25334:20;25352:1;25334:20;:::i;:::-;25329:25;;25368:20;25386:1;25368:20;:::i;:::-;25363:25;;25522:1;25454:66;25450:74;25447:1;25444:81;25441:107;;;25528:18;;:::i;:::-;25441:107;25572:1;25569;25565:9;25558:16;;25275:305;;;;:::o;25586:168::-;25726:20;25722:1;25714:6;25710:14;25703:44;25586:168;:::o;25760:366::-;25902:3;25923:67;25987:2;25982:3;25923:67;:::i;:::-;25916:74;;25999:93;26088:3;25999:93;:::i;:::-;26117:2;26112:3;26108:12;26101:19;;25760:366;;;:::o;26132:419::-;26298:4;26336:2;26325:9;26321:18;26313:26;;26385:9;26379:4;26375:20;26371:1;26360:9;26356:17;26349:47;26413:131;26539:4;26413:131;:::i;:::-;26405:139;;26132:419;;;:::o;26557:181::-;26697:33;26693:1;26685:6;26681:14;26674:57;26557:181;:::o;26744:366::-;26886:3;26907:67;26971:2;26966:3;26907:67;:::i;:::-;26900:74;;26983:93;27072:3;26983:93;:::i;:::-;27101:2;27096:3;27092:12;27085:19;;26744:366;;;:::o;27116:419::-;27282:4;27320:2;27309:9;27305:18;27297:26;;27369:9;27363:4;27359:20;27355:1;27344:9;27340:17;27333:47;27397:131;27523:4;27397:131;:::i;:::-;27389:139;;27116:419;;;:::o;27541:79::-;27580:7;27609:5;27598:16;;27541:79;;;:::o;27626:157::-;27731:45;27751:24;27769:5;27751:24;:::i;:::-;27731:45;:::i;:::-;27726:3;27719:58;27626:157;;:::o;27789:94::-;27822:8;27870:5;27866:2;27862:14;27841:35;;27789:94;;;:::o;27889:::-;27928:7;27957:20;27971:5;27957:20;:::i;:::-;27946:31;;27889:94;;;:::o;27989:100::-;28028:7;28057:26;28077:5;28057:26;:::i;:::-;28046:37;;27989:100;;;:::o;28095:157::-;28200:45;28220:24;28238:5;28220:24;:::i;:::-;28200:45;:::i;:::-;28195:3;28188:58;28095:157;;:::o;28258:538::-;28426:3;28441:75;28512:3;28503:6;28441:75;:::i;:::-;28541:2;28536:3;28532:12;28525:19;;28554:75;28625:3;28616:6;28554:75;:::i;:::-;28654:2;28649:3;28645:12;28638:19;;28667:75;28738:3;28729:6;28667:75;:::i;:::-;28767:2;28762:3;28758:12;28751:19;;28787:3;28780:10;;28258:538;;;;;;:::o;28802:220::-;28942:34;28938:1;28930:6;28926:14;28919:58;29011:3;29006:2;28998:6;28994:15;28987:28;28802:220;:::o;29028:366::-;29170:3;29191:67;29255:2;29250:3;29191:67;:::i;:::-;29184:74;;29267:93;29356:3;29267:93;:::i;:::-;29385:2;29380:3;29376:12;29369:19;;29028:366;;;:::o;29400:419::-;29566:4;29604:2;29593:9;29589:18;29581:26;;29653:9;29647:4;29643:20;29639:1;29628:9;29624:17;29617:47;29681:131;29807:4;29681:131;:::i;:::-;29673:139;;29400:419;;;:::o;29825:233::-;29864:3;29887:24;29905:5;29887:24;:::i;:::-;29878:33;;29933:66;29926:5;29923:77;29920:103;;;30003:18;;:::i;:::-;29920:103;30050:1;30043:5;30039:13;30032:20;;29825:233;;;:::o;30064:228::-;30204:34;30200:1;30192:6;30188:14;30181:58;30273:11;30268:2;30260:6;30256:15;30249:36;30064:228;:::o;30298:366::-;30440:3;30461:67;30525:2;30520:3;30461:67;:::i;:::-;30454:74;;30537:93;30626:3;30537:93;:::i;:::-;30655:2;30650:3;30646:12;30639:19;;30298:366;;;:::o;30670:419::-;30836:4;30874:2;30863:9;30859:18;30851:26;;30923:9;30917:4;30913:20;30909:1;30898:9;30894:17;30887:47;30951:131;31077:4;30951:131;:::i;:::-;30943:139;;30670:419;;;:::o;31095:229::-;31235:34;31231:1;31223:6;31219:14;31212:58;31304:12;31299:2;31291:6;31287:15;31280:37;31095:229;:::o;31330:366::-;31472:3;31493:67;31557:2;31552:3;31493:67;:::i;:::-;31486:74;;31569:93;31658:3;31569:93;:::i;:::-;31687:2;31682:3;31678:12;31671:19;;31330:366;;;:::o;31702:419::-;31868:4;31906:2;31895:9;31891:18;31883:26;;31955:9;31949:4;31945:20;31941:1;31930:9;31926:17;31919:47;31983:131;32109:4;31983:131;:::i;:::-;31975:139;;31702:419;;;:::o;32127:164::-;32267:16;32263:1;32255:6;32251:14;32244:40;32127:164;:::o;32297:366::-;32439:3;32460:67;32524:2;32519:3;32460:67;:::i;:::-;32453:74;;32536:93;32625:3;32536:93;:::i;:::-;32654:2;32649:3;32645:12;32638:19;;32297:366;;;:::o;32669:419::-;32835:4;32873:2;32862:9;32858:18;32850:26;;32922:9;32916:4;32912:20;32908:1;32897:9;32893:17;32886:47;32950:131;33076:4;32950:131;:::i;:::-;32942:139;;32669:419;;;:::o;33094:176::-;33126:1;33143:20;33161:1;33143:20;:::i;:::-;33138:25;;33177:20;33195:1;33177:20;:::i;:::-;33172:25;;33216:1;33206:35;;33221:18;;:::i;:::-;33206:35;33262:1;33259;33255:9;33250:14;;33094:176;;;;:::o;33276:169::-;33416:21;33412:1;33404:6;33400:14;33393:45;33276:169;:::o;33451:366::-;33593:3;33614:67;33678:2;33673:3;33614:67;:::i;:::-;33607:74;;33690:93;33779:3;33690:93;:::i;:::-;33808:2;33803:3;33799:12;33792:19;;33451:366;;;:::o;33823:419::-;33989:4;34027:2;34016:9;34012:18;34004:26;;34076:9;34070:4;34066:20;34062:1;34051:9;34047:17;34040:47;34104:131;34230:4;34104:131;:::i;:::-;34096:139;;33823:419;;;:::o;34248:234::-;34388:34;34384:1;34376:6;34372:14;34365:58;34457:17;34452:2;34444:6;34440:15;34433:42;34248:234;:::o;34488:366::-;34630:3;34651:67;34715:2;34710:3;34651:67;:::i;:::-;34644:74;;34727:93;34816:3;34727:93;:::i;:::-;34845:2;34840:3;34836:12;34829:19;;34488:366;;;:::o;34860:419::-;35026:4;35064:2;35053:9;35049:18;35041:26;;35113:9;35107:4;35103:20;35099:1;35088:9;35084:17;35077:47;35141:131;35267:4;35141:131;:::i;:::-;35133:139;;34860:419;;;:::o;35285:148::-;35387:11;35424:3;35409:18;;35285:148;;;;:::o;35439:377::-;35545:3;35573:39;35606:5;35573:39;:::i;:::-;35628:89;35710:6;35705:3;35628:89;:::i;:::-;35621:96;;35726:52;35771:6;35766:3;35759:4;35752:5;35748:16;35726:52;:::i;:::-;35803:6;35798:3;35794:16;35787:23;;35549:267;35439:377;;;;:::o;35822:435::-;36002:3;36024:95;36115:3;36106:6;36024:95;:::i;:::-;36017:102;;36136:95;36227:3;36218:6;36136:95;:::i;:::-;36129:102;;36248:3;36241:10;;35822:435;;;;;:::o;36263:165::-;36403:17;36399:1;36391:6;36387:14;36380:41;36263:165;:::o;36434:366::-;36576:3;36597:67;36661:2;36656:3;36597:67;:::i;:::-;36590:74;;36673:93;36762:3;36673:93;:::i;:::-;36791:2;36786:3;36782:12;36775:19;;36434:366;;;:::o;36806:419::-;36972:4;37010:2;36999:9;36995:18;36987:26;;37059:9;37053:4;37049:20;37045:1;37034:9;37030:17;37023:47;37087:131;37213:4;37087:131;:::i;:::-;37079:139;;36806:419;;;:::o;37231:225::-;37371:34;37367:1;37359:6;37355:14;37348:58;37440:8;37435:2;37427:6;37423:15;37416:33;37231:225;:::o;37462:366::-;37604:3;37625:67;37689:2;37684:3;37625:67;:::i;:::-;37618:74;;37701:93;37790:3;37701:93;:::i;:::-;37819:2;37814:3;37810:12;37803:19;;37462:366;;;:::o;37834:419::-;38000:4;38038:2;38027:9;38023:18;38015:26;;38087:9;38081:4;38077:20;38073:1;38062:9;38058:17;38051:47;38115:131;38241:4;38115:131;:::i;:::-;38107:139;;37834:419;;;:::o;38259:231::-;38399:34;38395:1;38387:6;38383:14;38376:58;38468:14;38463:2;38455:6;38451:15;38444:39;38259:231;:::o;38496:366::-;38638:3;38659:67;38723:2;38718:3;38659:67;:::i;:::-;38652:74;;38735:93;38824:3;38735:93;:::i;:::-;38853:2;38848:3;38844:12;38837:19;;38496:366;;;:::o;38868:419::-;39034:4;39072:2;39061:9;39057:18;39049:26;;39121:9;39115:4;39111:20;39107:1;39096:9;39092:17;39085:47;39149:131;39275:4;39149:131;:::i;:::-;39141:139;;38868:419;;;:::o;39293:228::-;39433:34;39429:1;39421:6;39417:14;39410:58;39502:11;39497:2;39489:6;39485:15;39478:36;39293:228;:::o;39527:366::-;39669:3;39690:67;39754:2;39749:3;39690:67;:::i;:::-;39683:74;;39766:93;39855:3;39766:93;:::i;:::-;39884:2;39879:3;39875:12;39868:19;;39527:366;;;:::o;39899:419::-;40065:4;40103:2;40092:9;40088:18;40080:26;;40152:9;40146:4;40142:20;40138:1;40127:9;40123:17;40116:47;40180:131;40306:4;40180:131;:::i;:::-;40172:139;;39899:419;;;:::o;40324:223::-;40464:34;40460:1;40452:6;40448:14;40441:58;40533:6;40528:2;40520:6;40516:15;40509:31;40324:223;:::o;40553:366::-;40695:3;40716:67;40780:2;40775:3;40716:67;:::i;:::-;40709:74;;40792:93;40881:3;40792:93;:::i;:::-;40910:2;40905:3;40901:12;40894:19;;40553:366;;;:::o;40925:419::-;41091:4;41129:2;41118:9;41114:18;41106:26;;41178:9;41172:4;41168:20;41164:1;41153:9;41149:17;41142:47;41206:131;41332:4;41206:131;:::i;:::-;41198:139;;40925:419;;;:::o;41350:191::-;41390:4;41410:20;41428:1;41410:20;:::i;:::-;41405:25;;41444:20;41462:1;41444:20;:::i;:::-;41439:25;;41483:1;41480;41477:8;41474:34;;;41488:18;;:::i;:::-;41474:34;41533:1;41530;41526:9;41518:17;;41350:191;;;;:::o;41547:160::-;41687:12;41683:1;41675:6;41671:14;41664:36;41547:160;:::o;41713:366::-;41855:3;41876:67;41940:2;41935:3;41876:67;:::i;:::-;41869:74;;41952:93;42041:3;41952:93;:::i;:::-;42070:2;42065:3;42061:12;42054:19;;41713:366;;;:::o;42085:419::-;42251:4;42289:2;42278:9;42274:18;42266:26;;42338:9;42332:4;42328:20;42324:1;42313:9;42309:17;42302:47;42366:131;42492:4;42366:131;:::i;:::-;42358:139;;42085:419;;;:::o;42510:175::-;42650:27;42646:1;42638:6;42634:14;42627:51;42510:175;:::o;42691:366::-;42833:3;42854:67;42918:2;42913:3;42854:67;:::i;:::-;42847:74;;42930:93;43019:3;42930:93;:::i;:::-;43048:2;43043:3;43039:12;43032:19;;42691:366;;;:::o;43063:419::-;43229:4;43267:2;43256:9;43252:18;43244:26;;43316:9;43310:4;43306:20;43302:1;43291:9;43287:17;43280:47;43344:131;43470:4;43344:131;:::i;:::-;43336:139;;43063:419;;;:::o;43488:237::-;43628:34;43624:1;43616:6;43612:14;43605:58;43697:20;43692:2;43684:6;43680:15;43673:45;43488:237;:::o;43731:366::-;43873:3;43894:67;43958:2;43953:3;43894:67;:::i;:::-;43887:74;;43970:93;44059:3;43970:93;:::i;:::-;44088:2;44083:3;44079:12;44072:19;;43731:366;;;:::o;44103:419::-;44269:4;44307:2;44296:9;44292:18;44284:26;;44356:9;44350:4;44346:20;44342:1;44331:9;44327:17;44320:47;44384:131;44510:4;44384:131;:::i;:::-;44376:139;;44103:419;;;:::o;44528:180::-;44576:77;44573:1;44566:88;44673:4;44670:1;44663:15;44697:4;44694:1;44687:15;44714:77;44751:7;44780:5;44769:16;;44714:77;;;:::o;44797:79::-;44836:7;44865:5;44854:16;;44797:79;;;:::o;44882:157::-;44987:45;45007:24;45025:5;45007:24;:::i;:::-;44987:45;:::i;:::-;44982:3;44975:58;44882:157;;:::o;45045:397::-;45185:3;45200:75;45271:3;45262:6;45200:75;:::i;:::-;45300:2;45295:3;45291:12;45284:19;;45313:75;45384:3;45375:6;45313:75;:::i;:::-;45413:2;45408:3;45404:12;45397:19;;45433:3;45426:10;;45045:397;;;;;:::o;45448:182::-;45588:34;45584:1;45576:6;45572:14;45565:58;45448:182;:::o;45636:366::-;45778:3;45799:67;45863:2;45858:3;45799:67;:::i;:::-;45792:74;;45875:93;45964:3;45875:93;:::i;:::-;45993:2;45988:3;45984:12;45977:19;;45636:366;;;:::o;46008:419::-;46174:4;46212:2;46201:9;46197:18;46189:26;;46261:9;46255:4;46251:20;46247:1;46236:9;46232:17;46225:47;46289:131;46415:4;46289:131;:::i;:::-;46281:139;;46008:419;;;:::o;46433:178::-;46573:30;46569:1;46561:6;46557:14;46550:54;46433:178;:::o;46617:366::-;46759:3;46780:67;46844:2;46839:3;46780:67;:::i;:::-;46773:74;;46856:93;46945:3;46856:93;:::i;:::-;46974:2;46969:3;46965:12;46958:19;;46617:366;;;:::o;46989:419::-;47155:4;47193:2;47182:9;47178:18;47170:26;;47242:9;47236:4;47232:20;47228:1;47217:9;47213:17;47206:47;47270:131;47396:4;47270:131;:::i;:::-;47262:139;;46989:419;;;:::o;47414:98::-;47465:6;47499:5;47493:12;47483:22;;47414:98;;;:::o;47518:168::-;47601:11;47635:6;47630:3;47623:19;47675:4;47670:3;47666:14;47651:29;;47518:168;;;;:::o;47692:360::-;47778:3;47806:38;47838:5;47806:38;:::i;:::-;47860:70;47923:6;47918:3;47860:70;:::i;:::-;47853:77;;47939:52;47984:6;47979:3;47972:4;47965:5;47961:16;47939:52;:::i;:::-;48016:29;48038:6;48016:29;:::i;:::-;48011:3;48007:39;48000:46;;47782:270;47692:360;;;;:::o;48058:640::-;48253:4;48291:3;48280:9;48276:19;48268:27;;48305:71;48373:1;48362:9;48358:17;48349:6;48305:71;:::i;:::-;48386:72;48454:2;48443:9;48439:18;48430:6;48386:72;:::i;:::-;48468;48536:2;48525:9;48521:18;48512:6;48468:72;:::i;:::-;48587:9;48581:4;48577:20;48572:2;48561:9;48557:18;48550:48;48615:76;48686:4;48677:6;48615:76;:::i;:::-;48607:84;;48058:640;;;;;;;:::o;48704:141::-;48760:5;48791:6;48785:13;48776:22;;48807:32;48833:5;48807:32;:::i;:::-;48704:141;;;;:::o;48851:349::-;48920:6;48969:2;48957:9;48948:7;48944:23;48940:32;48937:119;;;48975:79;;:::i;:::-;48937:119;49095:1;49120:63;49175:7;49166:6;49155:9;49151:22;49120:63;:::i;:::-;49110:73;;49066:127;48851:349;;;;:::o
Swarm Source
ipfs://4812816b4be3fd9402f5b19f2cefdc837d7434ef65cb222ab730f8a4f4405ba4
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.