ERC-721
Overview
Max Total Supply
1,322 CMA
Holders
364
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
8 CMALoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CosaMonstraAugmented
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-02-03 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Strings.sol // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol // File: @openzeppelin/contracts/utils/Strings.sol // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } pragma solidity >=0.8.9 <0.9.0; contract CosaMonstraAugmented is Ownable, ERC721A { uint public totalMinted = 0; string public baseURI; uint public maxPerTransaction = 500; uint public collectionSize = 1322; address private com = 0x439fCAe2ac5020c64a14DA26D1277F4C0BD53dE9; constructor() ERC721A("CosaMonstraAugmented", "CMA"){ // mint first to company _safeMint(0x439fCAe2ac5020c64a14DA26D1277F4C0BD53dE9,1); totalMinted +=1; } // airdrop augmented to multiple wallets function airdrop(address[] memory _wallets) public onlyOwner{ require(_wallets.length <= maxPerTransaction, "Max per transaction limit reached"); require(totalMinted + _wallets.length <= collectionSize, "not enough tokens left"); for(uint i = 0; i < _wallets.length; i++){ _safeMint(_wallets[i], 1); totalMinted += 1; } } // airdrop to one wallet function airdropToWallet(address wallet, uint count) public onlyOwner{ require(count > 0, "mint at least one token"); require(count <= maxPerTransaction, "Max per transaction limit reached"); require(totalMinted + count <= collectionSize, "not enough tokens left"); _safeMint(wallet, count); totalMinted += count; } //burn augmented function burn(uint tokenId) public { require(_msgSender() == ownerOf(tokenId), "Caller is not owner"); _burn(tokenId); totalMinted -=1; } //burn augmented by big boss function burnByBoss(uint tokenId) public onlyOwner{ _burn(tokenId); totalMinted -=1; } // set per transaction token limit function setTransactionLimit(uint _limit) external onlyOwner{ maxPerTransaction = _limit; } // get per transaction token limit function getTransactionLimit() public view returns(uint){ return maxPerTransaction; } // set collection supply function setCollectionSize(uint supply) external onlyOwner { collectionSize = supply; } // get collection supply function getCollectionSize() public view returns(uint){ return collectionSize; } // set base URI function setBaseUri(string memory _uri) external onlyOwner { baseURI = _uri; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function setCOMWallet(address adrs) external onlyOwner{ com = adrs; } // take out function withdraw() external onlyOwner { payable(com).transfer(address(this).balance); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"airdropToWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnByBoss","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransactionLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adrs","type":"address"}],"name":"setCOMWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setCollectionSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setTransactionLimit","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":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006009556101f4600b5561052a600c5573439fcae2ac5020c64a14da26d1277f4c0bd53de9600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200007757600080fd5b506040518060400160405280601481526020017f436f73614d6f6e737472614175676d656e7465640000000000000000000000008152506040518060400160405280600381526020017f434d41000000000000000000000000000000000000000000000000000000000081525062000104620000f86200018960201b60201c565b6200019160201b60201c565b816003908162000115919062000a9d565b50806004908162000127919062000a9d565b50620001386200025560201b60201c565b60018190555050506200016773439fcae2ac5020c64a14da26d1277f4c0bd53de960016200025a60201b60201c565b6001600960008282546200017c919062000bb3565b9250508190555062000dc6565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b6200027c8282604051806020016040528060008152506200028060201b60201c565b5050565b6200029583838360016200029a60201b60201c565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160362000308576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000840362000343576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200035860008683876200069360201b60201c565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156200053057506200052f8773ffffffffffffffffffffffffffffffffffffffff166200069960201b620016c11760201c565b5b1562000602575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620005ae6000888480600101955088620006bc60201b60201c565b620005e5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820362000537578260015414620005fc57600080fd5b6200066e565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820362000603575b8160018190555050506200068c60008683876200081d60201b60201c565b5050505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006ea6200018960201b60201c565b8786866040518563ffffffff1660e01b81526004016200070e949392919062000cde565b6020604051808303816000875af19250505080156200074d57506040513d601f19601f820116820180604052508101906200074a919062000d94565b60015b620007ca573d806000811462000780576040519150601f19603f3d011682016040523d82523d6000602084013e62000785565b606091505b506000815103620007c2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620008a557607f821691505b602082108103620008bb57620008ba6200085d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620009257fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620008e6565b620009318683620008e6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200097e62000978620009728462000949565b62000953565b62000949565b9050919050565b6000819050919050565b6200099a836200095d565b620009b2620009a98262000985565b848454620008f3565b825550505050565b600090565b620009c9620009ba565b620009d68184846200098f565b505050565b5b81811015620009fe57620009f2600082620009bf565b600181019050620009dc565b5050565b601f82111562000a4d5762000a1781620008c1565b62000a2284620008d6565b8101602085101562000a32578190505b62000a4a62000a4185620008d6565b830182620009db565b50505b505050565b600082821c905092915050565b600062000a726000198460080262000a52565b1980831691505092915050565b600062000a8d838362000a5f565b9150826002028217905092915050565b62000aa88262000823565b67ffffffffffffffff81111562000ac45762000ac36200082e565b5b62000ad082546200088c565b62000add82828562000a02565b600060209050601f83116001811462000b15576000841562000b00578287015190505b62000b0c858262000a7f565b86555062000b7c565b601f19841662000b2586620008c1565b60005b8281101562000b4f5784890151825560018201915060208501945060208101905062000b28565b8683101562000b6f578489015162000b6b601f89168262000a5f565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000bc08262000949565b915062000bcd8362000949565b925082820190508082111562000be85762000be762000b84565b5b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000c1b8262000bee565b9050919050565b62000c2d8162000c0e565b82525050565b62000c3e8162000949565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101562000c8057808201518184015260208101905062000c63565b60008484015250505050565b6000601f19601f8301169050919050565b600062000caa8262000c44565b62000cb6818562000c4f565b935062000cc881856020860162000c60565b62000cd38162000c8c565b840191505092915050565b600060808201905062000cf5600083018762000c22565b62000d04602083018662000c22565b62000d13604083018562000c33565b818103606083015262000d27818462000c9d565b905095945050505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000d6e8162000d37565b811462000d7a57600080fd5b50565b60008151905062000d8e8162000d63565b92915050565b60006020828403121562000dad5762000dac62000d32565b5b600062000dbd8482850162000d7d565b91505092915050565b613d4c8062000dd66000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063a2309ff8116100a2578063c87b56dd11610071578063c87b56dd14610545578063da47f76714610575578063e985e9c514610591578063f2fde38b146105c1576101f0565b8063a2309ff8146104d1578063aca8ffe7146104ef578063b88d4fde1461050b578063c3743cff14610527576101f0565b80638da5cb5b116100de5780638da5cb5b1461045d57806395d89b411461047b578063a0bcfc7f14610499578063a22cb465146104b5576101f0565b806370a08231146103e9578063715018a6146104195780637155c1ea14610423578063729ad39e14610441576101f0565b80633ccfd60b116101875780634b980d67116101565780634b980d67146103615780636352211e1461037f57806364bfa546146103af5780636c0360eb146103cb576101f0565b80633ccfd60b1461030157806342842e0e1461030b57806342966c681461032757806345c0f53314610343576101f0565b80630c6ea51c116101c35780630c6ea51c1461028f57806318160ddd146102ab57806323b872dd146102c957806323d98917146102e5576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a9190612d39565b6105dd565b60405161021c9190612d81565b60405180910390f35b61022d6105ef565b60405161023a9190612e2c565b60405180910390f35b61025d60048036038101906102589190612e84565b610681565b60405161026a9190612ef2565b60405180910390f35b61028d60048036038101906102889190612f39565b6106fd565b005b6102a960048036038101906102a49190612e84565b610807565b005b6102b36108a9565b6040516102c09190612f88565b60405180910390f35b6102e360048036038101906102de9190612fa3565b6108c0565b005b6102ff60048036038101906102fa9190612f39565b6108d0565b005b610309610a4d565b005b61032560048036038101906103209190612fa3565b610b34565b005b610341600480360381019061033c9190612e84565b610b54565b005b61034b610bf7565b6040516103589190612f88565b60405180910390f35b610369610bfd565b6040516103769190612f88565b60405180910390f35b61039960048036038101906103949190612e84565b610c03565b6040516103a69190612ef2565b60405180910390f35b6103c960048036038101906103c49190612e84565b610c19565b005b6103d3610c9f565b6040516103e09190612e2c565b60405180910390f35b61040360048036038101906103fe9190612ff6565b610d2d565b6040516104109190612f88565b60405180910390f35b610421610dfc565b005b61042b610e84565b6040516104389190612f88565b60405180910390f35b61045b6004803603810190610456919061316b565b610e8e565b005b610465611005565b6040516104729190612ef2565b60405180910390f35b61048361102e565b6040516104909190612e2c565b60405180910390f35b6104b360048036038101906104ae9190613269565b6110c0565b005b6104cf60048036038101906104ca91906132de565b61114f565b005b6104d96112c6565b6040516104e69190612f88565b60405180910390f35b61050960048036038101906105049190612e84565b6112cc565b005b610525600480360381019061052091906133bf565b611352565b005b61052f6113ce565b60405161053c9190612f88565b60405180910390f35b61055f600480360381019061055a9190612e84565b6113d8565b60405161056c9190612e2c565b60405180910390f35b61058f600480360381019061058a9190612ff6565b611476565b005b6105ab60048036038101906105a69190613442565b611536565b6040516105b89190612d81565b60405180910390f35b6105db60048036038101906105d69190612ff6565b6115ca565b005b60006105e8826116e4565b9050919050565b6060600380546105fe906134b1565b80601f016020809104026020016040519081016040528092919081815260200182805461062a906134b1565b80156106775780601f1061064c57610100808354040283529160200191610677565b820191906000526020600020905b81548152906001019060200180831161065a57829003601f168201915b5050505050905090565b600061068c826117c6565b6106c2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061070882610c03565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361076f576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661078e611814565b73ffffffffffffffffffffffffffffffffffffffff16141580156107c057506107be816107b9611814565b611536565b155b156107f7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61080283838361181c565b505050565b61080f611814565b73ffffffffffffffffffffffffffffffffffffffff1661082d611005565b73ffffffffffffffffffffffffffffffffffffffff1614610883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087a9061352e565b60405180910390fd5b61088c816118ce565b60016009600082825461089f919061357d565b9250508190555050565b60006108b36118dc565b6002546001540303905090565b6108cb8383836118e1565b505050565b6108d8611814565b73ffffffffffffffffffffffffffffffffffffffff166108f6611005565b73ffffffffffffffffffffffffffffffffffffffff161461094c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109439061352e565b60405180910390fd5b6000811161098f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610986906135fd565b60405180910390fd5b600b548111156109d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cb9061368f565b60405180910390fd5b600c54816009546109e591906136af565b1115610a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1d9061372f565b60405180910390fd5b610a308282611d95565b8060096000828254610a4291906136af565b925050819055505050565b610a55611814565b73ffffffffffffffffffffffffffffffffffffffff16610a73611005565b73ffffffffffffffffffffffffffffffffffffffff1614610ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac09061352e565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610b31573d6000803e3d6000fd5b50565b610b4f83838360405180602001604052806000815250611352565b505050565b610b5d81610c03565b73ffffffffffffffffffffffffffffffffffffffff16610b7b611814565b73ffffffffffffffffffffffffffffffffffffffff1614610bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc89061379b565b60405180910390fd5b610bda816118ce565b600160096000828254610bed919061357d565b9250508190555050565b600c5481565b600b5481565b6000610c0e82611db3565b600001519050919050565b610c21611814565b73ffffffffffffffffffffffffffffffffffffffff16610c3f611005565b73ffffffffffffffffffffffffffffffffffffffff1614610c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8c9061352e565b60405180910390fd5b80600b8190555050565b600a8054610cac906134b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd8906134b1565b8015610d255780601f10610cfa57610100808354040283529160200191610d25565b820191906000526020600020905b815481529060010190602001808311610d0857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d94576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610e04611814565b73ffffffffffffffffffffffffffffffffffffffff16610e22611005565b73ffffffffffffffffffffffffffffffffffffffff1614610e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6f9061352e565b60405180910390fd5b610e826000612042565b565b6000600c54905090565b610e96611814565b73ffffffffffffffffffffffffffffffffffffffff16610eb4611005565b73ffffffffffffffffffffffffffffffffffffffff1614610f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f019061352e565b60405180910390fd5b600b5481511115610f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f479061368f565b60405180910390fd5b600c548151600954610f6291906136af565b1115610fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9a9061372f565b60405180910390fd5b60005b815181101561100157610fd4828281518110610fc557610fc46137bb565b5b60200260200101516001611d95565b600160096000828254610fe791906136af565b925050819055508080610ff9906137ea565b915050610fa6565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461103d906134b1565b80601f0160208091040260200160405190810160405280929190818152602001828054611069906134b1565b80156110b65780601f1061108b576101008083540402835291602001916110b6565b820191906000526020600020905b81548152906001019060200180831161109957829003601f168201915b5050505050905090565b6110c8611814565b73ffffffffffffffffffffffffffffffffffffffff166110e6611005565b73ffffffffffffffffffffffffffffffffffffffff161461113c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111339061352e565b60405180910390fd5b80600a908161114b91906139de565b5050565b611157611814565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111bb576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006111c8611814565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611275611814565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112ba9190612d81565b60405180910390a35050565b60095481565b6112d4611814565b73ffffffffffffffffffffffffffffffffffffffff166112f2611005565b73ffffffffffffffffffffffffffffffffffffffff1614611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f9061352e565b60405180910390fd5b80600c8190555050565b61135d8484846118e1565b61137c8373ffffffffffffffffffffffffffffffffffffffff166116c1565b8015611391575061138f84848484612106565b155b156113c8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000600b54905090565b60606113e3826117c6565b611419576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611423612256565b90506000815103611443576040518060200160405280600081525061146e565b8061144d846122e8565b60405160200161145e929190613aec565b6040516020818303038152906040525b915050919050565b61147e611814565b73ffffffffffffffffffffffffffffffffffffffff1661149c611005565b73ffffffffffffffffffffffffffffffffffffffff16146114f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e99061352e565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115d2611814565b73ffffffffffffffffffffffffffffffffffffffff166115f0611005565b73ffffffffffffffffffffffffffffffffffffffff1614611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163d9061352e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ac90613b82565b60405180910390fd5b6116be81612042565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117af57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806117bf57506117be82612448565b5b9050919050565b6000816117d16118dc565b111580156117e0575060015482105b801561180d575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6118d98160006124b2565b50565b600090565b60006118ec82611db3565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611957576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611978611814565b73ffffffffffffffffffffffffffffffffffffffff1614806119a757506119a6856119a1611814565b611536565b5b806119ec57506119b5611814565b73ffffffffffffffffffffffffffffffffffffffff166119d484610681565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611a25576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611a8b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a9885858560016128a1565b611aa46000848761181c565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611d23576001548214611d2257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d8e85858560016128a7565b5050505050565b611daf8282604051806020016040528060008152506128ad565b5050565b611dbb612c8a565b600082905080611dc96118dc565b11158015611dd8575060015481105b1561200b576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161200957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611eed57809250505061203d565b5b60011561200857818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461200357809250505061203d565b611eee565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261212c611814565b8786866040518563ffffffff1660e01b815260040161214e9493929190613bf7565b6020604051808303816000875af192505050801561218a57506040513d601f19601f820116820180604052508101906121879190613c58565b60015b612203573d80600081146121ba576040519150601f19603f3d011682016040523d82523d6000602084013e6121bf565b606091505b5060008151036121fb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054612265906134b1565b80601f0160208091040260200160405190810160405280929190818152602001828054612291906134b1565b80156122de5780601f106122b3576101008083540402835291602001916122de565b820191906000526020600020905b8154815290600101906020018083116122c157829003601f168201915b5050505050905090565b60606000820361232f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612443565b600082905060005b6000821461236157808061234a906137ea565b915050600a8261235a9190613cb4565b9150612337565b60008167ffffffffffffffff81111561237d5761237c613028565b5b6040519080825280601f01601f1916602001820160405280156123af5781602001600182028036833780820191505090505b5090505b6000851461243c576001826123c8919061357d565b9150600a856123d79190613ce5565b60306123e391906136af565b60f81b8183815181106123f9576123f86137bb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124359190613cb4565b94506123b3565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006124bd83611db3565b9050600081600001519050821561259e5760008173ffffffffffffffffffffffffffffffffffffffff166124ef611814565b73ffffffffffffffffffffffffffffffffffffffff16148061251e575061251d82612518611814565b611536565b5b80612563575061252c611814565b73ffffffffffffffffffffffffffffffffffffffff1661254b86610681565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061259c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6125ac8160008660016128a1565b6125b86000858361181c565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361281b57600154821461281a57848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128898160008660016128a7565b60026000815480929190600101919050555050505050565b50505050565b50505050565b6128ba83838360016128bf565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361292c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612966576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61297360008683876128a1565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612b3d5750612b3c8773ffffffffffffffffffffffffffffffffffffffff166116c1565b5b15612c02575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bb26000888480600101955088612106565b612be8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203612b43578260015414612bfd57600080fd5b612c6d565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612c03575b816001819055505050612c8360008683876128a7565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d1681612ce1565b8114612d2157600080fd5b50565b600081359050612d3381612d0d565b92915050565b600060208284031215612d4f57612d4e612cd7565b5b6000612d5d84828501612d24565b91505092915050565b60008115159050919050565b612d7b81612d66565b82525050565b6000602082019050612d966000830184612d72565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612dd6578082015181840152602081019050612dbb565b60008484015250505050565b6000601f19601f8301169050919050565b6000612dfe82612d9c565b612e088185612da7565b9350612e18818560208601612db8565b612e2181612de2565b840191505092915050565b60006020820190508181036000830152612e468184612df3565b905092915050565b6000819050919050565b612e6181612e4e565b8114612e6c57600080fd5b50565b600081359050612e7e81612e58565b92915050565b600060208284031215612e9a57612e99612cd7565b5b6000612ea884828501612e6f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612edc82612eb1565b9050919050565b612eec81612ed1565b82525050565b6000602082019050612f076000830184612ee3565b92915050565b612f1681612ed1565b8114612f2157600080fd5b50565b600081359050612f3381612f0d565b92915050565b60008060408385031215612f5057612f4f612cd7565b5b6000612f5e85828601612f24565b9250506020612f6f85828601612e6f565b9150509250929050565b612f8281612e4e565b82525050565b6000602082019050612f9d6000830184612f79565b92915050565b600080600060608486031215612fbc57612fbb612cd7565b5b6000612fca86828701612f24565b9350506020612fdb86828701612f24565b9250506040612fec86828701612e6f565b9150509250925092565b60006020828403121561300c5761300b612cd7565b5b600061301a84828501612f24565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61306082612de2565b810181811067ffffffffffffffff8211171561307f5761307e613028565b5b80604052505050565b6000613092612ccd565b905061309e8282613057565b919050565b600067ffffffffffffffff8211156130be576130bd613028565b5b602082029050602081019050919050565b600080fd5b60006130e76130e2846130a3565b613088565b9050808382526020820190506020840283018581111561310a576131096130cf565b5b835b81811015613133578061311f8882612f24565b84526020840193505060208101905061310c565b5050509392505050565b600082601f83011261315257613151613023565b5b81356131628482602086016130d4565b91505092915050565b60006020828403121561318157613180612cd7565b5b600082013567ffffffffffffffff81111561319f5761319e612cdc565b5b6131ab8482850161313d565b91505092915050565b600080fd5b600067ffffffffffffffff8211156131d4576131d3613028565b5b6131dd82612de2565b9050602081019050919050565b82818337600083830152505050565b600061320c613207846131b9565b613088565b905082815260208101848484011115613228576132276131b4565b5b6132338482856131ea565b509392505050565b600082601f8301126132505761324f613023565b5b81356132608482602086016131f9565b91505092915050565b60006020828403121561327f5761327e612cd7565b5b600082013567ffffffffffffffff81111561329d5761329c612cdc565b5b6132a98482850161323b565b91505092915050565b6132bb81612d66565b81146132c657600080fd5b50565b6000813590506132d8816132b2565b92915050565b600080604083850312156132f5576132f4612cd7565b5b600061330385828601612f24565b9250506020613314858286016132c9565b9150509250929050565b600067ffffffffffffffff82111561333957613338613028565b5b61334282612de2565b9050602081019050919050565b600061336261335d8461331e565b613088565b90508281526020810184848401111561337e5761337d6131b4565b5b6133898482856131ea565b509392505050565b600082601f8301126133a6576133a5613023565b5b81356133b684826020860161334f565b91505092915050565b600080600080608085870312156133d9576133d8612cd7565b5b60006133e787828801612f24565b94505060206133f887828801612f24565b935050604061340987828801612e6f565b925050606085013567ffffffffffffffff81111561342a57613429612cdc565b5b61343687828801613391565b91505092959194509250565b6000806040838503121561345957613458612cd7565b5b600061346785828601612f24565b925050602061347885828601612f24565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806134c957607f821691505b6020821081036134dc576134db613482565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613518602083612da7565b9150613523826134e2565b602082019050919050565b600060208201905081810360008301526135478161350b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061358882612e4e565b915061359383612e4e565b92508282039050818111156135ab576135aa61354e565b5b92915050565b7f6d696e74206174206c65617374206f6e6520746f6b656e000000000000000000600082015250565b60006135e7601783612da7565b91506135f2826135b1565b602082019050919050565b60006020820190508181036000830152613616816135da565b9050919050565b7f4d617820706572207472616e73616374696f6e206c696d69742072656163686560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000613679602183612da7565b91506136848261361d565b604082019050919050565b600060208201905081810360008301526136a88161366c565b9050919050565b60006136ba82612e4e565b91506136c583612e4e565b92508282019050808211156136dd576136dc61354e565b5b92915050565b7f6e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b6000613719601683612da7565b9150613724826136e3565b602082019050919050565b600060208201905081810360008301526137488161370c565b9050919050565b7f43616c6c6572206973206e6f74206f776e657200000000000000000000000000600082015250565b6000613785601383612da7565b91506137908261374f565b602082019050919050565b600060208201905081810360008301526137b481613778565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006137f582612e4e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138275761382661354e565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613857565b61389e8683613857565b95508019841693508086168417925050509392505050565b6000819050919050565b60006138db6138d66138d184612e4e565b6138b6565b612e4e565b9050919050565b6000819050919050565b6138f5836138c0565b613909613901826138e2565b848454613864565b825550505050565b600090565b61391e613911565b6139298184846138ec565b505050565b5b8181101561394d57613942600082613916565b60018101905061392f565b5050565b601f8211156139925761396381613832565b61396c84613847565b8101602085101561397b578190505b61398f61398785613847565b83018261392e565b50505b505050565b600082821c905092915050565b60006139b560001984600802613997565b1980831691505092915050565b60006139ce83836139a4565b9150826002028217905092915050565b6139e782612d9c565b67ffffffffffffffff811115613a00576139ff613028565b5b613a0a82546134b1565b613a15828285613951565b600060209050601f831160018114613a485760008415613a36578287015190505b613a4085826139c2565b865550613aa8565b601f198416613a5686613832565b60005b82811015613a7e57848901518255600182019150602085019450602081019050613a59565b86831015613a9b5784890151613a97601f8916826139a4565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b6000613ac682612d9c565b613ad08185613ab0565b9350613ae0818560208601612db8565b80840191505092915050565b6000613af88285613abb565b9150613b048284613abb565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b6c602683612da7565b9150613b7782613b10565b604082019050919050565b60006020820190508181036000830152613b9b81613b5f565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613bc982613ba2565b613bd38185613bad565b9350613be3818560208601612db8565b613bec81612de2565b840191505092915050565b6000608082019050613c0c6000830187612ee3565b613c196020830186612ee3565b613c266040830185612f79565b8181036060830152613c388184613bbe565b905095945050505050565b600081519050613c5281612d0d565b92915050565b600060208284031215613c6e57613c6d612cd7565b5b6000613c7c84828501613c43565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613cbf82612e4e565b9150613cca83612e4e565b925082613cda57613cd9613c85565b5b828204905092915050565b6000613cf082612e4e565b9150613cfb83612e4e565b925082613d0b57613d0a613c85565b5b82820690509291505056fea2646970667358221220bab59aeaac053aa00676af5d598e5134ad0e7176f676afa28427d76efcea002a64736f6c63430008120033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063a2309ff8116100a2578063c87b56dd11610071578063c87b56dd14610545578063da47f76714610575578063e985e9c514610591578063f2fde38b146105c1576101f0565b8063a2309ff8146104d1578063aca8ffe7146104ef578063b88d4fde1461050b578063c3743cff14610527576101f0565b80638da5cb5b116100de5780638da5cb5b1461045d57806395d89b411461047b578063a0bcfc7f14610499578063a22cb465146104b5576101f0565b806370a08231146103e9578063715018a6146104195780637155c1ea14610423578063729ad39e14610441576101f0565b80633ccfd60b116101875780634b980d67116101565780634b980d67146103615780636352211e1461037f57806364bfa546146103af5780636c0360eb146103cb576101f0565b80633ccfd60b1461030157806342842e0e1461030b57806342966c681461032757806345c0f53314610343576101f0565b80630c6ea51c116101c35780630c6ea51c1461028f57806318160ddd146102ab57806323b872dd146102c957806323d98917146102e5576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a9190612d39565b6105dd565b60405161021c9190612d81565b60405180910390f35b61022d6105ef565b60405161023a9190612e2c565b60405180910390f35b61025d60048036038101906102589190612e84565b610681565b60405161026a9190612ef2565b60405180910390f35b61028d60048036038101906102889190612f39565b6106fd565b005b6102a960048036038101906102a49190612e84565b610807565b005b6102b36108a9565b6040516102c09190612f88565b60405180910390f35b6102e360048036038101906102de9190612fa3565b6108c0565b005b6102ff60048036038101906102fa9190612f39565b6108d0565b005b610309610a4d565b005b61032560048036038101906103209190612fa3565b610b34565b005b610341600480360381019061033c9190612e84565b610b54565b005b61034b610bf7565b6040516103589190612f88565b60405180910390f35b610369610bfd565b6040516103769190612f88565b60405180910390f35b61039960048036038101906103949190612e84565b610c03565b6040516103a69190612ef2565b60405180910390f35b6103c960048036038101906103c49190612e84565b610c19565b005b6103d3610c9f565b6040516103e09190612e2c565b60405180910390f35b61040360048036038101906103fe9190612ff6565b610d2d565b6040516104109190612f88565b60405180910390f35b610421610dfc565b005b61042b610e84565b6040516104389190612f88565b60405180910390f35b61045b6004803603810190610456919061316b565b610e8e565b005b610465611005565b6040516104729190612ef2565b60405180910390f35b61048361102e565b6040516104909190612e2c565b60405180910390f35b6104b360048036038101906104ae9190613269565b6110c0565b005b6104cf60048036038101906104ca91906132de565b61114f565b005b6104d96112c6565b6040516104e69190612f88565b60405180910390f35b61050960048036038101906105049190612e84565b6112cc565b005b610525600480360381019061052091906133bf565b611352565b005b61052f6113ce565b60405161053c9190612f88565b60405180910390f35b61055f600480360381019061055a9190612e84565b6113d8565b60405161056c9190612e2c565b60405180910390f35b61058f600480360381019061058a9190612ff6565b611476565b005b6105ab60048036038101906105a69190613442565b611536565b6040516105b89190612d81565b60405180910390f35b6105db60048036038101906105d69190612ff6565b6115ca565b005b60006105e8826116e4565b9050919050565b6060600380546105fe906134b1565b80601f016020809104026020016040519081016040528092919081815260200182805461062a906134b1565b80156106775780601f1061064c57610100808354040283529160200191610677565b820191906000526020600020905b81548152906001019060200180831161065a57829003601f168201915b5050505050905090565b600061068c826117c6565b6106c2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061070882610c03565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361076f576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661078e611814565b73ffffffffffffffffffffffffffffffffffffffff16141580156107c057506107be816107b9611814565b611536565b155b156107f7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61080283838361181c565b505050565b61080f611814565b73ffffffffffffffffffffffffffffffffffffffff1661082d611005565b73ffffffffffffffffffffffffffffffffffffffff1614610883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087a9061352e565b60405180910390fd5b61088c816118ce565b60016009600082825461089f919061357d565b9250508190555050565b60006108b36118dc565b6002546001540303905090565b6108cb8383836118e1565b505050565b6108d8611814565b73ffffffffffffffffffffffffffffffffffffffff166108f6611005565b73ffffffffffffffffffffffffffffffffffffffff161461094c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109439061352e565b60405180910390fd5b6000811161098f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610986906135fd565b60405180910390fd5b600b548111156109d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cb9061368f565b60405180910390fd5b600c54816009546109e591906136af565b1115610a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1d9061372f565b60405180910390fd5b610a308282611d95565b8060096000828254610a4291906136af565b925050819055505050565b610a55611814565b73ffffffffffffffffffffffffffffffffffffffff16610a73611005565b73ffffffffffffffffffffffffffffffffffffffff1614610ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac09061352e565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610b31573d6000803e3d6000fd5b50565b610b4f83838360405180602001604052806000815250611352565b505050565b610b5d81610c03565b73ffffffffffffffffffffffffffffffffffffffff16610b7b611814565b73ffffffffffffffffffffffffffffffffffffffff1614610bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc89061379b565b60405180910390fd5b610bda816118ce565b600160096000828254610bed919061357d565b9250508190555050565b600c5481565b600b5481565b6000610c0e82611db3565b600001519050919050565b610c21611814565b73ffffffffffffffffffffffffffffffffffffffff16610c3f611005565b73ffffffffffffffffffffffffffffffffffffffff1614610c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8c9061352e565b60405180910390fd5b80600b8190555050565b600a8054610cac906134b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd8906134b1565b8015610d255780601f10610cfa57610100808354040283529160200191610d25565b820191906000526020600020905b815481529060010190602001808311610d0857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d94576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610e04611814565b73ffffffffffffffffffffffffffffffffffffffff16610e22611005565b73ffffffffffffffffffffffffffffffffffffffff1614610e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6f9061352e565b60405180910390fd5b610e826000612042565b565b6000600c54905090565b610e96611814565b73ffffffffffffffffffffffffffffffffffffffff16610eb4611005565b73ffffffffffffffffffffffffffffffffffffffff1614610f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f019061352e565b60405180910390fd5b600b5481511115610f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f479061368f565b60405180910390fd5b600c548151600954610f6291906136af565b1115610fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9a9061372f565b60405180910390fd5b60005b815181101561100157610fd4828281518110610fc557610fc46137bb565b5b60200260200101516001611d95565b600160096000828254610fe791906136af565b925050819055508080610ff9906137ea565b915050610fa6565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461103d906134b1565b80601f0160208091040260200160405190810160405280929190818152602001828054611069906134b1565b80156110b65780601f1061108b576101008083540402835291602001916110b6565b820191906000526020600020905b81548152906001019060200180831161109957829003601f168201915b5050505050905090565b6110c8611814565b73ffffffffffffffffffffffffffffffffffffffff166110e6611005565b73ffffffffffffffffffffffffffffffffffffffff161461113c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111339061352e565b60405180910390fd5b80600a908161114b91906139de565b5050565b611157611814565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111bb576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006111c8611814565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611275611814565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112ba9190612d81565b60405180910390a35050565b60095481565b6112d4611814565b73ffffffffffffffffffffffffffffffffffffffff166112f2611005565b73ffffffffffffffffffffffffffffffffffffffff1614611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f9061352e565b60405180910390fd5b80600c8190555050565b61135d8484846118e1565b61137c8373ffffffffffffffffffffffffffffffffffffffff166116c1565b8015611391575061138f84848484612106565b155b156113c8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000600b54905090565b60606113e3826117c6565b611419576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611423612256565b90506000815103611443576040518060200160405280600081525061146e565b8061144d846122e8565b60405160200161145e929190613aec565b6040516020818303038152906040525b915050919050565b61147e611814565b73ffffffffffffffffffffffffffffffffffffffff1661149c611005565b73ffffffffffffffffffffffffffffffffffffffff16146114f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e99061352e565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115d2611814565b73ffffffffffffffffffffffffffffffffffffffff166115f0611005565b73ffffffffffffffffffffffffffffffffffffffff1614611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163d9061352e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ac90613b82565b60405180910390fd5b6116be81612042565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117af57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806117bf57506117be82612448565b5b9050919050565b6000816117d16118dc565b111580156117e0575060015482105b801561180d575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6118d98160006124b2565b50565b600090565b60006118ec82611db3565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611957576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611978611814565b73ffffffffffffffffffffffffffffffffffffffff1614806119a757506119a6856119a1611814565b611536565b5b806119ec57506119b5611814565b73ffffffffffffffffffffffffffffffffffffffff166119d484610681565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611a25576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611a8b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a9885858560016128a1565b611aa46000848761181c565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611d23576001548214611d2257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d8e85858560016128a7565b5050505050565b611daf8282604051806020016040528060008152506128ad565b5050565b611dbb612c8a565b600082905080611dc96118dc565b11158015611dd8575060015481105b1561200b576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161200957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611eed57809250505061203d565b5b60011561200857818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461200357809250505061203d565b611eee565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261212c611814565b8786866040518563ffffffff1660e01b815260040161214e9493929190613bf7565b6020604051808303816000875af192505050801561218a57506040513d601f19601f820116820180604052508101906121879190613c58565b60015b612203573d80600081146121ba576040519150601f19603f3d011682016040523d82523d6000602084013e6121bf565b606091505b5060008151036121fb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054612265906134b1565b80601f0160208091040260200160405190810160405280929190818152602001828054612291906134b1565b80156122de5780601f106122b3576101008083540402835291602001916122de565b820191906000526020600020905b8154815290600101906020018083116122c157829003601f168201915b5050505050905090565b60606000820361232f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612443565b600082905060005b6000821461236157808061234a906137ea565b915050600a8261235a9190613cb4565b9150612337565b60008167ffffffffffffffff81111561237d5761237c613028565b5b6040519080825280601f01601f1916602001820160405280156123af5781602001600182028036833780820191505090505b5090505b6000851461243c576001826123c8919061357d565b9150600a856123d79190613ce5565b60306123e391906136af565b60f81b8183815181106123f9576123f86137bb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124359190613cb4565b94506123b3565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006124bd83611db3565b9050600081600001519050821561259e5760008173ffffffffffffffffffffffffffffffffffffffff166124ef611814565b73ffffffffffffffffffffffffffffffffffffffff16148061251e575061251d82612518611814565b611536565b5b80612563575061252c611814565b73ffffffffffffffffffffffffffffffffffffffff1661254b86610681565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061259c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6125ac8160008660016128a1565b6125b86000858361181c565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361281b57600154821461281a57848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128898160008660016128a7565b60026000815480929190600101919050555050505050565b50505050565b50505050565b6128ba83838360016128bf565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361292c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612966576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61297360008683876128a1565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612b3d5750612b3c8773ffffffffffffffffffffffffffffffffffffffff166116c1565b5b15612c02575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bb26000888480600101955088612106565b612be8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203612b43578260015414612bfd57600080fd5b612c6d565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612c03575b816001819055505050612c8360008683876128a7565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d1681612ce1565b8114612d2157600080fd5b50565b600081359050612d3381612d0d565b92915050565b600060208284031215612d4f57612d4e612cd7565b5b6000612d5d84828501612d24565b91505092915050565b60008115159050919050565b612d7b81612d66565b82525050565b6000602082019050612d966000830184612d72565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612dd6578082015181840152602081019050612dbb565b60008484015250505050565b6000601f19601f8301169050919050565b6000612dfe82612d9c565b612e088185612da7565b9350612e18818560208601612db8565b612e2181612de2565b840191505092915050565b60006020820190508181036000830152612e468184612df3565b905092915050565b6000819050919050565b612e6181612e4e565b8114612e6c57600080fd5b50565b600081359050612e7e81612e58565b92915050565b600060208284031215612e9a57612e99612cd7565b5b6000612ea884828501612e6f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612edc82612eb1565b9050919050565b612eec81612ed1565b82525050565b6000602082019050612f076000830184612ee3565b92915050565b612f1681612ed1565b8114612f2157600080fd5b50565b600081359050612f3381612f0d565b92915050565b60008060408385031215612f5057612f4f612cd7565b5b6000612f5e85828601612f24565b9250506020612f6f85828601612e6f565b9150509250929050565b612f8281612e4e565b82525050565b6000602082019050612f9d6000830184612f79565b92915050565b600080600060608486031215612fbc57612fbb612cd7565b5b6000612fca86828701612f24565b9350506020612fdb86828701612f24565b9250506040612fec86828701612e6f565b9150509250925092565b60006020828403121561300c5761300b612cd7565b5b600061301a84828501612f24565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61306082612de2565b810181811067ffffffffffffffff8211171561307f5761307e613028565b5b80604052505050565b6000613092612ccd565b905061309e8282613057565b919050565b600067ffffffffffffffff8211156130be576130bd613028565b5b602082029050602081019050919050565b600080fd5b60006130e76130e2846130a3565b613088565b9050808382526020820190506020840283018581111561310a576131096130cf565b5b835b81811015613133578061311f8882612f24565b84526020840193505060208101905061310c565b5050509392505050565b600082601f83011261315257613151613023565b5b81356131628482602086016130d4565b91505092915050565b60006020828403121561318157613180612cd7565b5b600082013567ffffffffffffffff81111561319f5761319e612cdc565b5b6131ab8482850161313d565b91505092915050565b600080fd5b600067ffffffffffffffff8211156131d4576131d3613028565b5b6131dd82612de2565b9050602081019050919050565b82818337600083830152505050565b600061320c613207846131b9565b613088565b905082815260208101848484011115613228576132276131b4565b5b6132338482856131ea565b509392505050565b600082601f8301126132505761324f613023565b5b81356132608482602086016131f9565b91505092915050565b60006020828403121561327f5761327e612cd7565b5b600082013567ffffffffffffffff81111561329d5761329c612cdc565b5b6132a98482850161323b565b91505092915050565b6132bb81612d66565b81146132c657600080fd5b50565b6000813590506132d8816132b2565b92915050565b600080604083850312156132f5576132f4612cd7565b5b600061330385828601612f24565b9250506020613314858286016132c9565b9150509250929050565b600067ffffffffffffffff82111561333957613338613028565b5b61334282612de2565b9050602081019050919050565b600061336261335d8461331e565b613088565b90508281526020810184848401111561337e5761337d6131b4565b5b6133898482856131ea565b509392505050565b600082601f8301126133a6576133a5613023565b5b81356133b684826020860161334f565b91505092915050565b600080600080608085870312156133d9576133d8612cd7565b5b60006133e787828801612f24565b94505060206133f887828801612f24565b935050604061340987828801612e6f565b925050606085013567ffffffffffffffff81111561342a57613429612cdc565b5b61343687828801613391565b91505092959194509250565b6000806040838503121561345957613458612cd7565b5b600061346785828601612f24565b925050602061347885828601612f24565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806134c957607f821691505b6020821081036134dc576134db613482565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613518602083612da7565b9150613523826134e2565b602082019050919050565b600060208201905081810360008301526135478161350b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061358882612e4e565b915061359383612e4e565b92508282039050818111156135ab576135aa61354e565b5b92915050565b7f6d696e74206174206c65617374206f6e6520746f6b656e000000000000000000600082015250565b60006135e7601783612da7565b91506135f2826135b1565b602082019050919050565b60006020820190508181036000830152613616816135da565b9050919050565b7f4d617820706572207472616e73616374696f6e206c696d69742072656163686560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000613679602183612da7565b91506136848261361d565b604082019050919050565b600060208201905081810360008301526136a88161366c565b9050919050565b60006136ba82612e4e565b91506136c583612e4e565b92508282019050808211156136dd576136dc61354e565b5b92915050565b7f6e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b6000613719601683612da7565b9150613724826136e3565b602082019050919050565b600060208201905081810360008301526137488161370c565b9050919050565b7f43616c6c6572206973206e6f74206f776e657200000000000000000000000000600082015250565b6000613785601383612da7565b91506137908261374f565b602082019050919050565b600060208201905081810360008301526137b481613778565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006137f582612e4e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138275761382661354e565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613857565b61389e8683613857565b95508019841693508086168417925050509392505050565b6000819050919050565b60006138db6138d66138d184612e4e565b6138b6565b612e4e565b9050919050565b6000819050919050565b6138f5836138c0565b613909613901826138e2565b848454613864565b825550505050565b600090565b61391e613911565b6139298184846138ec565b505050565b5b8181101561394d57613942600082613916565b60018101905061392f565b5050565b601f8211156139925761396381613832565b61396c84613847565b8101602085101561397b578190505b61398f61398785613847565b83018261392e565b50505b505050565b600082821c905092915050565b60006139b560001984600802613997565b1980831691505092915050565b60006139ce83836139a4565b9150826002028217905092915050565b6139e782612d9c565b67ffffffffffffffff811115613a00576139ff613028565b5b613a0a82546134b1565b613a15828285613951565b600060209050601f831160018114613a485760008415613a36578287015190505b613a4085826139c2565b865550613aa8565b601f198416613a5686613832565b60005b82811015613a7e57848901518255600182019150602085019450602081019050613a59565b86831015613a9b5784890151613a97601f8916826139a4565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b6000613ac682612d9c565b613ad08185613ab0565b9350613ae0818560208601612db8565b80840191505092915050565b6000613af88285613abb565b9150613b048284613abb565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b6c602683612da7565b9150613b7782613b10565b604082019050919050565b60006020820190508181036000830152613b9b81613b5f565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613bc982613ba2565b613bd38185613bad565b9350613be3818560208601612db8565b613bec81612de2565b840191505092915050565b6000608082019050613c0c6000830187612ee3565b613c196020830186612ee3565b613c266040830185612f79565b8181036060830152613c388184613bbe565b905095945050505050565b600081519050613c5281612d0d565b92915050565b600060208284031215613c6e57613c6d612cd7565b5b6000613c7c84828501613c43565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613cbf82612e4e565b9150613cca83612e4e565b925082613cda57613cd9613c85565b5b828204905092915050565b6000613cf082612e4e565b9150613cfb83612e4e565b925082613d0b57613d0a613c85565b5b82820690509291505056fea2646970667358221220bab59aeaac053aa00676af5d598e5134ad0e7176f676afa28427d76efcea002a64736f6c63430008120033
Deployed Bytecode Sourcemap
47820:3011:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50666:162;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33128:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34631:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34194:371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49442:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29264:303;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35496:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48827:368;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50487:103;;;:::i;:::-;;35737:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49231:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47995:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47951:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32936:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49599:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47923:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30384:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7733:103;;;:::i;:::-;;50034:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48369:414;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7082:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33297:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50157:92;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34907:287;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47889:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49895:101;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35993:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49752:99;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33472:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50379:83;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35265:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7991:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50666:162;50760:4;50784:36;50808:11;50784:23;:36::i;:::-;50777:43;;50666:162;;;:::o;33128:100::-;33182:13;33215:5;33208:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33128:100;:::o;34631:204::-;34699:7;34724:16;34732:7;34724;:16::i;:::-;34719:64;;34749:34;;;;;;;;;;;;;;34719:64;34803:15;:24;34819:7;34803:24;;;;;;;;;;;;;;;;;;;;;34796:31;;34631:204;;;:::o;34194:371::-;34267:13;34283:24;34299:7;34283:15;:24::i;:::-;34267:40;;34328:5;34322:11;;:2;:11;;;34318:48;;34342:24;;;;;;;;;;;;;;34318:48;34399:5;34383:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;34409:37;34426:5;34433:12;:10;:12::i;:::-;34409:16;:37::i;:::-;34408:38;34383:63;34379:138;;;34470:35;;;;;;;;;;;;;;34379:138;34529:28;34538:2;34542:7;34551:5;34529:8;:28::i;:::-;34256:309;34194:371;;:::o;49442:109::-;7313:12;:10;:12::i;:::-;7302:23;;:7;:5;:7::i;:::-;:23;;;7294:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49503:14:::1;49509:7;49503:5;:14::i;:::-;49542:1;49528:11;;:15;;;;;;;:::i;:::-;;;;;;;;49442:109:::0;:::o;29264:303::-;29308:7;29533:15;:13;:15::i;:::-;29518:12;;29502:13;;:28;:46;29495:53;;29264:303;:::o;35496:170::-;35630:28;35640:4;35646:2;35650:7;35630:9;:28::i;:::-;35496:170;;;:::o;48827:368::-;7313:12;:10;:12::i;:::-;7302:23;;:7;:5;:7::i;:::-;:23;;;7294:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48924:1:::1;48916:5;:9;48908:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;48981:17;;48972:5;:26;;48964:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;49080:14;;49070:5;49055:11;;:20;;;;:::i;:::-;:39;;49047:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;49132:24;49142:6;49150:5;49132:9;:24::i;:::-;49182:5;49167:11;;:20;;;;;;;:::i;:::-;;;;;;;;48827:368:::0;;:::o;50487:103::-;7313:12;:10;:12::i;:::-;7302:23;;:7;:5;:7::i;:::-;:23;;;7294:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50545:3:::1;;;;;;;;;;;50537:21;;:44;50559:21;50537:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;50487:103::o:0;35737:185::-;35875:39;35892:4;35898:2;35902:7;35875:39;;;;;;;;;;;;:16;:39::i;:::-;35737:185;;;:::o;49231:169::-;49301:16;49309:7;49301;:16::i;:::-;49285:32;;:12;:10;:12::i;:::-;:32;;;49277:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;49352:14;49358:7;49352:5;:14::i;:::-;49391:1;49377:11;;:15;;;;;;;:::i;:::-;;;;;;;;49231:169;:::o;47995:33::-;;;;:::o;47951:35::-;;;;:::o;32936:125::-;33000:7;33027:21;33040:7;33027:12;:21::i;:::-;:26;;;33020:33;;32936:125;;;:::o;49599:105::-;7313:12;:10;:12::i;:::-;7302:23;;:7;:5;:7::i;:::-;:23;;;7294:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49690:6:::1;49670:17;:26;;;;49599:105:::0;:::o;47923:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30384:206::-;30448:7;30489:1;30472:19;;:5;:19;;;30468:60;;30500:28;;;;;;;;;;;;;;30468:60;30554:12;:19;30567:5;30554:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;30546:36;;30539:43;;30384:206;;;:::o;7733:103::-;7313:12;:10;:12::i;:::-;7302:23;;:7;:5;:7::i;:::-;:23;;;7294:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7798:30:::1;7825:1;7798:18;:30::i;:::-;7733:103::o:0;50034:94::-;50083:4;50106:14;;50099:21;;50034:94;:::o;48369:414::-;7313:12;:10;:12::i;:::-;7302:23;;:7;:5;:7::i;:::-;:23;;;7294:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48477:17:::1;;48458:8;:15;:36;;48450:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;48586:14;;48566:8;:15;48551:11;;:30;;;;:::i;:::-;:49;;48543:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;48642:6;48638:124;48658:8;:15;48654:1;:19;48638:124;;;48694:25;48704:8;48713:1;48704:11;;;;;;;;:::i;:::-;;;;;;;;48717:1;48694:9;:25::i;:::-;48749:1;48734:11;;:16;;;;;;;:::i;:::-;;;;;;;;48675:3;;;;;:::i;:::-;;;;48638:124;;;;48369:414:::0;:::o;7082:87::-;7128:7;7155:6;;;;;;;;;;;7148:13;;7082:87;:::o;33297:104::-;33353:13;33386:7;33379:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33297:104;:::o;50157:92::-;7313:12;:10;:12::i;:::-;7302:23;;:7;:5;:7::i;:::-;:23;;;7294:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50237:4:::1;50227:7;:14;;;;;;:::i;:::-;;50157:92:::0;:::o;34907:287::-;35018:12;:10;:12::i;:::-;35006:24;;:8;:24;;;35002:54;;35039:17;;;;;;;;;;;;;;35002:54;35114:8;35069:18;:32;35088:12;:10;:12::i;:::-;35069:32;;;;;;;;;;;;;;;:42;35102:8;35069:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;35167:8;35138:48;;35153:12;:10;:12::i;:::-;35138:48;;;35177:8;35138:48;;;;;;:::i;:::-;;;;;;;;34907:287;;:::o;47889:27::-;;;;:::o;49895:101::-;7313:12;:10;:12::i;:::-;7302:23;;:7;:5;:7::i;:::-;:23;;;7294:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49982:6:::1;49965:14;:23;;;;49895:101:::0;:::o;35993:369::-;36160:28;36170:4;36176:2;36180:7;36160:9;:28::i;:::-;36203:15;:2;:13;;;:15::i;:::-;:76;;;;;36223:56;36254:4;36260:2;36264:7;36273:5;36223:30;:56::i;:::-;36222:57;36203:76;36199:156;;;36303:40;;;;;;;;;;;;;;36199:156;35993:369;;;;:::o;49752:99::-;49803:4;49826:17;;49819:24;;49752:99;:::o;33472:318::-;33545:13;33576:16;33584:7;33576;:16::i;:::-;33571:59;;33601:29;;;;;;;;;;;;;;33571:59;33643:21;33667:10;:8;:10::i;:::-;33643:34;;33720:1;33701:7;33695:21;:26;:87;;;;;;;;;;;;;;;;;33748:7;33757:18;:7;:16;:18::i;:::-;33731:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33695:87;33688:94;;;33472:318;;;:::o;50379:83::-;7313:12;:10;:12::i;:::-;7302:23;;:7;:5;:7::i;:::-;:23;;;7294:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50450:4:::1;50444:3;;:10;;;;;;;;;;;;;;;;;;50379:83:::0;:::o;35265:164::-;35362:4;35386:18;:25;35405:5;35386:25;;;;;;;;;;;;;;;:35;35412:8;35386:35;;;;;;;;;;;;;;;;;;;;;;;;;35379:42;;35265:164;;;;:::o;7991:201::-;7313:12;:10;:12::i;:::-;7302:23;;:7;:5;:7::i;:::-;:23;;;7294:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8100:1:::1;8080:22;;:8;:22;;::::0;8072:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;8156:28;8175:8;8156:18;:28::i;:::-;7991:201:::0;:::o;9783:326::-;9843:4;10100:1;10078:7;:19;;;:23;10071:30;;9783:326;;;:::o;30015:305::-;30117:4;30169:25;30154:40;;;:11;:40;;;;:105;;;;30226:33;30211:48;;;:11;:48;;;;30154:105;:158;;;;30276:36;30300:11;30276:23;:36::i;:::-;30154:158;30134:178;;30015:305;;;:::o;36617:187::-;36674:4;36717:7;36698:15;:13;:15::i;:::-;:26;;:53;;;;;36738:13;;36728:7;:23;36698:53;:98;;;;;36769:11;:20;36781:7;36769:20;;;;;;;;;;;:27;;;;;;;;;;;;36768:28;36698:98;36691:105;;36617:187;;;:::o;5806:98::-;5859:7;5886:10;5879:17;;5806:98;:::o;44787:196::-;44929:2;44902:15;:24;44918:7;44902:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44967:7;44963:2;44947:28;;44956:5;44947:28;;;;;;;;;;;;44787:196;;;:::o;41943:89::-;42003:21;42009:7;42018:5;42003;:21::i;:::-;41943:89;:::o;29038:92::-;29094:7;29038:92;:::o;39730:2130::-;39845:35;39883:21;39896:7;39883:12;:21::i;:::-;39845:59;;39943:4;39921:26;;:13;:18;;;:26;;;39917:67;;39956:28;;;;;;;;;;;;;;39917:67;39997:22;40039:4;40023:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;40060:36;40077:4;40083:12;:10;:12::i;:::-;40060:16;:36::i;:::-;40023:73;:126;;;;40137:12;:10;:12::i;:::-;40113:36;;:20;40125:7;40113:11;:20::i;:::-;:36;;;40023:126;39997:153;;40168:17;40163:66;;40194:35;;;;;;;;;;;;;;40163:66;40258:1;40244:16;;:2;:16;;;40240:52;;40269:23;;;;;;;;;;;;;;40240:52;40305:43;40327:4;40333:2;40337:7;40346:1;40305:21;:43::i;:::-;40413:35;40430:1;40434:7;40443:4;40413:8;:35::i;:::-;40774:1;40744:12;:18;40757:4;40744:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40818:1;40790:12;:16;40803:2;40790:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40836:31;40870:11;:20;40882:7;40870:20;;;;;;;;;;;40836:54;;40921:2;40905:8;:13;;;:18;;;;;;;;;;;;;;;;;;40971:15;40938:8;:23;;;:49;;;;;;;;;;;;;;;;;;41239:19;41271:1;41261:7;:11;41239:33;;41287:31;41321:11;:24;41333:11;41321:24;;;;;;;;;;;41287:58;;41389:1;41364:27;;:8;:13;;;;;;;;;;;;:27;;;41360:384;;41574:13;;41559:11;:28;41555:174;;41628:4;41612:8;:13;;;:20;;;;;;;;;;;;;;;;;;41681:13;:28;;;41655:8;:23;;;:54;;;;;;;;;;;;;;;;;;41555:174;41360:384;40719:1036;;;41791:7;41787:2;41772:27;;41781:4;41772:27;;;;;;;;;;;;41810:42;41831:4;41837:2;41841:7;41850:1;41810:20;:42::i;:::-;39834:2026;;39730:2130;;;:::o;36812:104::-;36881:27;36891:2;36895:8;36881:27;;;;;;;;;;;;:9;:27::i;:::-;36812:104;;:::o;31765:1109::-;31827:21;;:::i;:::-;31861:12;31876:7;31861:22;;31944:4;31925:15;:13;:15::i;:::-;:23;;:47;;;;;31959:13;;31952:4;:20;31925:47;31921:886;;;31993:31;32027:11;:17;32039:4;32027:17;;;;;;;;;;;31993:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32068:9;:16;;;32063:729;;32139:1;32113:28;;:9;:14;;;:28;;;32109:101;;32177:9;32170:16;;;;;;32109:101;32512:261;32519:4;32512:261;;;32552:6;;;;;;;;32597:11;:17;32609:4;32597:17;;;;;;;;;;;32585:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32671:1;32645:28;;:9;:14;;;:28;;;32641:109;;32713:9;32706:16;;;;;;32641:109;32512:261;;;32063:729;31974:833;31921:886;32835:31;;;;;;;;;;;;;;31765:1109;;;;:::o;8352:191::-;8426:16;8445:6;;;;;;;;;;;8426:25;;8471:8;8462:6;;:17;;;;;;;;;;;;;;;;;;8526:8;8495:40;;8516:8;8495:40;;;;;;;;;;;;8415:128;8352:191;:::o;45475:667::-;45638:4;45675:2;45659:36;;;45696:12;:10;:12::i;:::-;45710:4;45716:7;45725:5;45659:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45655:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45910:1;45893:6;:13;:18;45889:235;;45939:40;;;;;;;;;;;;;;45889:235;46082:6;46076:13;46067:6;46063:2;46059:15;46052:38;45655:480;45788:45;;;45778:55;;;:6;:55;;;;45771:62;;;45475:667;;;;;;:::o;50263:108::-;50323:13;50356:7;50349:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50263:108;:::o;3368:723::-;3424:13;3654:1;3645:5;:10;3641:53;;3672:10;;;;;;;;;;;;;;;;;;;;;3641:53;3704:12;3719:5;3704:20;;3735:14;3760:78;3775:1;3767:4;:9;3760:78;;3793:8;;;;;:::i;:::-;;;;3824:2;3816:10;;;;;:::i;:::-;;;3760:78;;;3848:19;3880:6;3870:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3848:39;;3898:154;3914:1;3905:5;:10;3898:154;;3942:1;3932:11;;;;;:::i;:::-;;;4009:2;4001:5;:10;;;;:::i;:::-;3988:2;:24;;;;:::i;:::-;3975:39;;3958:6;3965;3958:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;4038:2;4029:11;;;;;:::i;:::-;;;3898:154;;;4076:6;4062:21;;;;;3368:723;;;;:::o;19866:157::-;19951:4;19990:25;19975:40;;;:11;:40;;;;19968:47;;19866:157;;;:::o;42261:2408::-;42341:35;42379:21;42392:7;42379:12;:21::i;:::-;42341:59;;42413:12;42428:13;:18;;;42413:33;;42463:13;42459:290;;;42493:22;42535:4;42519:20;;:12;:10;:12::i;:::-;:20;;;:77;;;;42560:36;42577:4;42583:12;:10;:12::i;:::-;42560:16;:36::i;:::-;42519:77;:134;;;;42641:12;:10;:12::i;:::-;42617:36;;:20;42629:7;42617:11;:20::i;:::-;:36;;;42519:134;42493:161;;42676:17;42671:66;;42702:35;;;;;;;;;;;;;;42671:66;42478:271;42459:290;42761:51;42783:4;42797:1;42801:7;42810:1;42761:21;:51::i;:::-;42877:35;42894:1;42898:7;42907:4;42877:8;:35::i;:::-;43208:31;43242:12;:18;43255:4;43242:18;;;;;;;;;;;;;;;43208:52;;43298:1;43275:11;:19;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43342:1;43314:11;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43442:31;43476:11;:20;43488:7;43476:20;;;;;;;;;;;43442:54;;43527:4;43511:8;:13;;;:20;;;;;;;;;;;;;;;;;;43579:15;43546:8;:23;;;:49;;;;;;;;;;;;;;;;;;43628:4;43610:8;:15;;;:22;;;;;;;;;;;;;;;;;;43880:19;43912:1;43902:7;:11;43880:33;;43928:31;43962:11;:24;43974:11;43962:24;;;;;;;;;;;43928:58;;44030:1;44005:27;;:8;:13;;;;;;;;;;;;:27;;;44001:384;;44215:13;;44200:11;:28;44196:174;;44269:4;44253:8;:13;;;:20;;;;;;;;;;;;;;;;;;44322:13;:28;;;44296:8;:23;;;:54;;;;;;;;;;;;;;;;;;44196:174;44001:384;43183:1213;;;;44440:7;44436:1;44413:35;;44422:4;44413:35;;;;;;;;;;;;44459:50;44480:4;44494:1;44498:7;44507:1;44459:20;:50::i;:::-;44636:12;;:14;;;;;;;;;;;;;42330:2339;;42261:2408;;:::o;46790:159::-;;;;;:::o;47608:158::-;;;;;:::o;37279:163::-;37402:32;37408:2;37412:8;37422:5;37429:4;37402:5;:32::i;:::-;37279:163;;;:::o;37701:1775::-;37840:20;37863:13;;37840:36;;37905:1;37891:16;;:2;:16;;;37887:48;;37916:19;;;;;;;;;;;;;;37887:48;37962:1;37950:8;:13;37946:44;;37972:18;;;;;;;;;;;;;;37946:44;38003:61;38033:1;38037:2;38041:12;38055:8;38003:21;:61::i;:::-;38376:8;38341:12;:16;38354:2;38341:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38440:8;38400:12;:16;38413:2;38400:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38499:2;38466:11;:25;38478:12;38466:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;38566:15;38516:11;:25;38528:12;38516:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;38599:20;38622:12;38599:35;;38649:11;38678:8;38663:12;:23;38649:37;;38707:4;:23;;;;;38715:15;:2;:13;;;:15::i;:::-;38707:23;38703:641;;;38751:314;38807:12;38803:2;38782:38;;38799:1;38782:38;;;;;;;;;;;;38848:69;38887:1;38891:2;38895:14;;;;;;38911:5;38848:30;:69::i;:::-;38843:174;;38953:40;;;;;;;;;;;;;;38843:174;39060:3;39044:12;:19;38751:314;;39146:12;39129:13;;:29;39125:43;;39160:8;;;39125:43;38703:641;;;39209:120;39265:14;;;;;;39261:2;39240:40;;39257:1;39240:40;;;;;;;;;;;;39324:3;39308:12;:19;39209:120;;38703:641;39374:12;39358:13;:28;;;;38316:1082;;39408:60;39437:1;39441:2;39445:12;39459:8;39408:20;:60::i;:::-;37829:1647;37701:1775;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:180;6373:77;6370:1;6363:88;6470:4;6467:1;6460:15;6494:4;6491:1;6484:15;6511:281;6594:27;6616:4;6594:27;:::i;:::-;6586:6;6582:40;6724:6;6712:10;6709:22;6688:18;6676:10;6673:34;6670:62;6667:88;;;6735:18;;:::i;:::-;6667:88;6775:10;6771:2;6764:22;6554:238;6511:281;;:::o;6798:129::-;6832:6;6859:20;;:::i;:::-;6849:30;;6888:33;6916:4;6908:6;6888:33;:::i;:::-;6798:129;;;:::o;6933:311::-;7010:4;7100:18;7092:6;7089:30;7086:56;;;7122:18;;:::i;:::-;7086:56;7172:4;7164:6;7160:17;7152:25;;7232:4;7226;7222:15;7214:23;;6933:311;;;:::o;7250:117::-;7359:1;7356;7349:12;7390:710;7486:5;7511:81;7527:64;7584:6;7527:64;:::i;:::-;7511:81;:::i;:::-;7502:90;;7612:5;7641:6;7634:5;7627:21;7675:4;7668:5;7664:16;7657:23;;7728:4;7720:6;7716:17;7708:6;7704:30;7757:3;7749:6;7746:15;7743:122;;;7776:79;;:::i;:::-;7743:122;7891:6;7874:220;7908:6;7903:3;7900:15;7874:220;;;7983:3;8012:37;8045:3;8033:10;8012:37;:::i;:::-;8007:3;8000:50;8079:4;8074:3;8070:14;8063:21;;7950:144;7934:4;7929:3;7925:14;7918:21;;7874:220;;;7878:21;7492:608;;7390:710;;;;;:::o;8123:370::-;8194:5;8243:3;8236:4;8228:6;8224:17;8220:27;8210:122;;8251:79;;:::i;:::-;8210:122;8368:6;8355:20;8393:94;8483:3;8475:6;8468:4;8460:6;8456:17;8393:94;:::i;:::-;8384:103;;8200:293;8123:370;;;;:::o;8499:539::-;8583:6;8632:2;8620:9;8611:7;8607:23;8603:32;8600:119;;;8638:79;;:::i;:::-;8600:119;8786:1;8775:9;8771:17;8758:31;8816:18;8808:6;8805:30;8802:117;;;8838:79;;:::i;:::-;8802:117;8943:78;9013:7;9004:6;8993:9;8989:22;8943:78;:::i;:::-;8933:88;;8729:302;8499:539;;;;:::o;9044:117::-;9153:1;9150;9143:12;9167:308;9229:4;9319:18;9311:6;9308:30;9305:56;;;9341:18;;:::i;:::-;9305:56;9379:29;9401:6;9379:29;:::i;:::-;9371:37;;9463:4;9457;9453:15;9445:23;;9167:308;;;:::o;9481:146::-;9578:6;9573:3;9568;9555:30;9619:1;9610:6;9605:3;9601:16;9594:27;9481:146;;;:::o;9633:425::-;9711:5;9736:66;9752:49;9794:6;9752:49;:::i;:::-;9736:66;:::i;:::-;9727:75;;9825:6;9818:5;9811:21;9863:4;9856:5;9852:16;9901:3;9892:6;9887:3;9883:16;9880:25;9877:112;;;9908:79;;:::i;:::-;9877:112;9998:54;10045:6;10040:3;10035;9998:54;:::i;:::-;9717:341;9633:425;;;;;:::o;10078:340::-;10134:5;10183:3;10176:4;10168:6;10164:17;10160:27;10150:122;;10191:79;;:::i;:::-;10150:122;10308:6;10295:20;10333:79;10408:3;10400:6;10393:4;10385:6;10381:17;10333:79;:::i;:::-;10324:88;;10140:278;10078:340;;;;:::o;10424:509::-;10493:6;10542:2;10530:9;10521:7;10517:23;10513:32;10510:119;;;10548:79;;:::i;:::-;10510:119;10696:1;10685:9;10681:17;10668:31;10726:18;10718:6;10715:30;10712:117;;;10748:79;;:::i;:::-;10712:117;10853:63;10908:7;10899:6;10888:9;10884:22;10853:63;:::i;:::-;10843:73;;10639:287;10424:509;;;;:::o;10939:116::-;11009:21;11024:5;11009:21;:::i;:::-;11002:5;10999:32;10989:60;;11045:1;11042;11035:12;10989:60;10939:116;:::o;11061:133::-;11104:5;11142:6;11129:20;11120:29;;11158:30;11182:5;11158:30;:::i;:::-;11061:133;;;;:::o;11200:468::-;11265:6;11273;11322:2;11310:9;11301:7;11297:23;11293:32;11290:119;;;11328:79;;:::i;:::-;11290:119;11448:1;11473:53;11518:7;11509:6;11498:9;11494:22;11473:53;:::i;:::-;11463:63;;11419:117;11575:2;11601:50;11643:7;11634:6;11623:9;11619:22;11601:50;:::i;:::-;11591:60;;11546:115;11200:468;;;;;:::o;11674:307::-;11735:4;11825:18;11817:6;11814:30;11811:56;;;11847:18;;:::i;:::-;11811:56;11885:29;11907:6;11885:29;:::i;:::-;11877:37;;11969:4;11963;11959:15;11951:23;;11674:307;;;:::o;11987:423::-;12064:5;12089:65;12105:48;12146:6;12105:48;:::i;:::-;12089:65;:::i;:::-;12080:74;;12177:6;12170:5;12163:21;12215:4;12208:5;12204:16;12253:3;12244:6;12239:3;12235:16;12232:25;12229:112;;;12260:79;;:::i;:::-;12229:112;12350:54;12397:6;12392:3;12387;12350:54;:::i;:::-;12070:340;11987:423;;;;;:::o;12429:338::-;12484:5;12533:3;12526:4;12518:6;12514:17;12510:27;12500:122;;12541:79;;:::i;:::-;12500:122;12658:6;12645:20;12683:78;12757:3;12749:6;12742:4;12734:6;12730:17;12683:78;:::i;:::-;12674:87;;12490:277;12429:338;;;;:::o;12773:943::-;12868:6;12876;12884;12892;12941:3;12929:9;12920:7;12916:23;12912:33;12909:120;;;12948:79;;:::i;:::-;12909:120;13068:1;13093:53;13138:7;13129:6;13118:9;13114:22;13093:53;:::i;:::-;13083:63;;13039:117;13195:2;13221:53;13266:7;13257:6;13246:9;13242:22;13221:53;:::i;:::-;13211:63;;13166:118;13323:2;13349:53;13394:7;13385:6;13374:9;13370:22;13349:53;:::i;:::-;13339:63;;13294:118;13479:2;13468:9;13464:18;13451:32;13510:18;13502:6;13499:30;13496:117;;;13532:79;;:::i;:::-;13496:117;13637:62;13691:7;13682:6;13671:9;13667:22;13637:62;:::i;:::-;13627:72;;13422:287;12773:943;;;;;;;:::o;13722:474::-;13790:6;13798;13847:2;13835:9;13826:7;13822:23;13818:32;13815:119;;;13853:79;;:::i;:::-;13815:119;13973:1;13998:53;14043:7;14034:6;14023:9;14019:22;13998:53;:::i;:::-;13988:63;;13944:117;14100:2;14126:53;14171:7;14162:6;14151:9;14147:22;14126:53;:::i;:::-;14116:63;;14071:118;13722:474;;;;;:::o;14202:180::-;14250:77;14247:1;14240:88;14347:4;14344:1;14337:15;14371:4;14368:1;14361:15;14388:320;14432:6;14469:1;14463:4;14459:12;14449:22;;14516:1;14510:4;14506:12;14537:18;14527:81;;14593:4;14585:6;14581:17;14571:27;;14527:81;14655:2;14647:6;14644:14;14624:18;14621:38;14618:84;;14674:18;;:::i;:::-;14618:84;14439:269;14388:320;;;:::o;14714:182::-;14854:34;14850:1;14842:6;14838:14;14831:58;14714:182;:::o;14902:366::-;15044:3;15065:67;15129:2;15124:3;15065:67;:::i;:::-;15058:74;;15141:93;15230:3;15141:93;:::i;:::-;15259:2;15254:3;15250:12;15243:19;;14902:366;;;:::o;15274:419::-;15440:4;15478:2;15467:9;15463:18;15455:26;;15527:9;15521:4;15517:20;15513:1;15502:9;15498:17;15491:47;15555:131;15681:4;15555:131;:::i;:::-;15547:139;;15274:419;;;:::o;15699:180::-;15747:77;15744:1;15737:88;15844:4;15841:1;15834:15;15868:4;15865:1;15858:15;15885:194;15925:4;15945:20;15963:1;15945:20;:::i;:::-;15940:25;;15979:20;15997:1;15979:20;:::i;:::-;15974:25;;16023:1;16020;16016:9;16008:17;;16047:1;16041:4;16038:11;16035:37;;;16052:18;;:::i;:::-;16035:37;15885:194;;;;:::o;16085:173::-;16225:25;16221:1;16213:6;16209:14;16202:49;16085:173;:::o;16264:366::-;16406:3;16427:67;16491:2;16486:3;16427:67;:::i;:::-;16420:74;;16503:93;16592:3;16503:93;:::i;:::-;16621:2;16616:3;16612:12;16605:19;;16264:366;;;:::o;16636:419::-;16802:4;16840:2;16829:9;16825:18;16817:26;;16889:9;16883:4;16879:20;16875:1;16864:9;16860:17;16853:47;16917:131;17043:4;16917:131;:::i;:::-;16909:139;;16636:419;;;:::o;17061:220::-;17201:34;17197:1;17189:6;17185:14;17178:58;17270:3;17265:2;17257:6;17253:15;17246:28;17061:220;:::o;17287:366::-;17429:3;17450:67;17514:2;17509:3;17450:67;:::i;:::-;17443:74;;17526:93;17615:3;17526:93;:::i;:::-;17644:2;17639:3;17635:12;17628:19;;17287:366;;;:::o;17659:419::-;17825:4;17863:2;17852:9;17848:18;17840:26;;17912:9;17906:4;17902:20;17898:1;17887:9;17883:17;17876:47;17940:131;18066:4;17940:131;:::i;:::-;17932:139;;17659:419;;;:::o;18084:191::-;18124:3;18143:20;18161:1;18143:20;:::i;:::-;18138:25;;18177:20;18195:1;18177:20;:::i;:::-;18172:25;;18220:1;18217;18213:9;18206:16;;18241:3;18238:1;18235:10;18232:36;;;18248:18;;:::i;:::-;18232:36;18084:191;;;;:::o;18281:172::-;18421:24;18417:1;18409:6;18405:14;18398:48;18281:172;:::o;18459:366::-;18601:3;18622:67;18686:2;18681:3;18622:67;:::i;:::-;18615:74;;18698:93;18787:3;18698:93;:::i;:::-;18816:2;18811:3;18807:12;18800:19;;18459:366;;;:::o;18831:419::-;18997:4;19035:2;19024:9;19020:18;19012:26;;19084:9;19078:4;19074:20;19070:1;19059:9;19055:17;19048:47;19112:131;19238:4;19112:131;:::i;:::-;19104:139;;18831:419;;;:::o;19256:169::-;19396:21;19392:1;19384:6;19380:14;19373:45;19256:169;:::o;19431:366::-;19573:3;19594:67;19658:2;19653:3;19594:67;:::i;:::-;19587:74;;19670:93;19759:3;19670:93;:::i;:::-;19788:2;19783:3;19779:12;19772:19;;19431:366;;;:::o;19803:419::-;19969:4;20007:2;19996:9;19992:18;19984:26;;20056:9;20050:4;20046:20;20042:1;20031:9;20027:17;20020:47;20084:131;20210:4;20084:131;:::i;:::-;20076:139;;19803:419;;;:::o;20228:180::-;20276:77;20273:1;20266:88;20373:4;20370:1;20363:15;20397:4;20394:1;20387:15;20414:233;20453:3;20476:24;20494:5;20476:24;:::i;:::-;20467:33;;20522:66;20515:5;20512:77;20509:103;;20592:18;;:::i;:::-;20509:103;20639:1;20632:5;20628:13;20621:20;;20414:233;;;:::o;20653:141::-;20702:4;20725:3;20717:11;;20748:3;20745:1;20738:14;20782:4;20779:1;20769:18;20761:26;;20653:141;;;:::o;20800:93::-;20837:6;20884:2;20879;20872:5;20868:14;20864:23;20854:33;;20800:93;;;:::o;20899:107::-;20943:8;20993:5;20987:4;20983:16;20962:37;;20899:107;;;;:::o;21012:393::-;21081:6;21131:1;21119:10;21115:18;21154:97;21184:66;21173:9;21154:97;:::i;:::-;21272:39;21302:8;21291:9;21272:39;:::i;:::-;21260:51;;21344:4;21340:9;21333:5;21329:21;21320:30;;21393:4;21383:8;21379:19;21372:5;21369:30;21359:40;;21088:317;;21012:393;;;;;:::o;21411:60::-;21439:3;21460:5;21453:12;;21411:60;;;:::o;21477:142::-;21527:9;21560:53;21578:34;21587:24;21605:5;21587:24;:::i;:::-;21578:34;:::i;:::-;21560:53;:::i;:::-;21547:66;;21477:142;;;:::o;21625:75::-;21668:3;21689:5;21682:12;;21625:75;;;:::o;21706:269::-;21816:39;21847:7;21816:39;:::i;:::-;21877:91;21926:41;21950:16;21926:41;:::i;:::-;21918:6;21911:4;21905:11;21877:91;:::i;:::-;21871:4;21864:105;21782:193;21706:269;;;:::o;21981:73::-;22026:3;21981:73;:::o;22060:189::-;22137:32;;:::i;:::-;22178:65;22236:6;22228;22222:4;22178:65;:::i;:::-;22113:136;22060:189;;:::o;22255:186::-;22315:120;22332:3;22325:5;22322:14;22315:120;;;22386:39;22423:1;22416:5;22386:39;:::i;:::-;22359:1;22352:5;22348:13;22339:22;;22315:120;;;22255:186;;:::o;22447:543::-;22548:2;22543:3;22540:11;22537:446;;;22582:38;22614:5;22582:38;:::i;:::-;22666:29;22684:10;22666:29;:::i;:::-;22656:8;22652:44;22849:2;22837:10;22834:18;22831:49;;;22870:8;22855:23;;22831:49;22893:80;22949:22;22967:3;22949:22;:::i;:::-;22939:8;22935:37;22922:11;22893:80;:::i;:::-;22552:431;;22537:446;22447:543;;;:::o;22996:117::-;23050:8;23100:5;23094:4;23090:16;23069:37;;22996:117;;;;:::o;23119:169::-;23163:6;23196:51;23244:1;23240:6;23232:5;23229:1;23225:13;23196:51;:::i;:::-;23192:56;23277:4;23271;23267:15;23257:25;;23170:118;23119:169;;;;:::o;23293:295::-;23369:4;23515:29;23540:3;23534:4;23515:29;:::i;:::-;23507:37;;23577:3;23574:1;23570:11;23564:4;23561:21;23553:29;;23293:295;;;;:::o;23593:1395::-;23710:37;23743:3;23710:37;:::i;:::-;23812:18;23804:6;23801:30;23798:56;;;23834:18;;:::i;:::-;23798:56;23878:38;23910:4;23904:11;23878:38;:::i;:::-;23963:67;24023:6;24015;24009:4;23963:67;:::i;:::-;24057:1;24081:4;24068:17;;24113:2;24105:6;24102:14;24130:1;24125:618;;;;24787:1;24804:6;24801:77;;;24853:9;24848:3;24844:19;24838:26;24829:35;;24801:77;24904:67;24964:6;24957:5;24904:67;:::i;:::-;24898:4;24891:81;24760:222;24095:887;;24125:618;24177:4;24173:9;24165:6;24161:22;24211:37;24243:4;24211:37;:::i;:::-;24270:1;24284:208;24298:7;24295:1;24292:14;24284:208;;;24377:9;24372:3;24368:19;24362:26;24354:6;24347:42;24428:1;24420:6;24416:14;24406:24;;24475:2;24464:9;24460:18;24447:31;;24321:4;24318:1;24314:12;24309:17;;24284:208;;;24520:6;24511:7;24508:19;24505:179;;;24578:9;24573:3;24569:19;24563:26;24621:48;24663:4;24655:6;24651:17;24640:9;24621:48;:::i;:::-;24613:6;24606:64;24528:156;24505:179;24730:1;24726;24718:6;24714:14;24710:22;24704:4;24697:36;24132:611;;;24095:887;;23685:1303;;;23593:1395;;:::o;24994:148::-;25096:11;25133:3;25118:18;;24994:148;;;;:::o;25148:390::-;25254:3;25282:39;25315:5;25282:39;:::i;:::-;25337:89;25419:6;25414:3;25337:89;:::i;:::-;25330:96;;25435:65;25493:6;25488:3;25481:4;25474:5;25470:16;25435:65;:::i;:::-;25525:6;25520:3;25516:16;25509:23;;25258:280;25148:390;;;;:::o;25544:435::-;25724:3;25746:95;25837:3;25828:6;25746:95;:::i;:::-;25739:102;;25858:95;25949:3;25940:6;25858:95;:::i;:::-;25851:102;;25970:3;25963:10;;25544:435;;;;;:::o;25985:225::-;26125:34;26121:1;26113:6;26109:14;26102:58;26194:8;26189:2;26181:6;26177:15;26170:33;25985:225;:::o;26216:366::-;26358:3;26379:67;26443:2;26438:3;26379:67;:::i;:::-;26372:74;;26455:93;26544:3;26455:93;:::i;:::-;26573:2;26568:3;26564:12;26557:19;;26216:366;;;:::o;26588:419::-;26754:4;26792:2;26781:9;26777:18;26769:26;;26841:9;26835:4;26831:20;26827:1;26816:9;26812:17;26805:47;26869:131;26995:4;26869:131;:::i;:::-;26861:139;;26588:419;;;:::o;27013:98::-;27064:6;27098:5;27092:12;27082:22;;27013:98;;;:::o;27117:168::-;27200:11;27234:6;27229:3;27222:19;27274:4;27269:3;27265:14;27250:29;;27117:168;;;;:::o;27291:373::-;27377:3;27405:38;27437:5;27405:38;:::i;:::-;27459:70;27522:6;27517:3;27459:70;:::i;:::-;27452:77;;27538:65;27596:6;27591:3;27584:4;27577:5;27573:16;27538:65;:::i;:::-;27628:29;27650:6;27628:29;:::i;:::-;27623:3;27619:39;27612:46;;27381:283;27291:373;;;;:::o;27670:640::-;27865:4;27903:3;27892:9;27888:19;27880:27;;27917:71;27985:1;27974:9;27970:17;27961:6;27917:71;:::i;:::-;27998:72;28066:2;28055:9;28051:18;28042:6;27998:72;:::i;:::-;28080;28148:2;28137:9;28133:18;28124:6;28080:72;:::i;:::-;28199:9;28193:4;28189:20;28184:2;28173:9;28169:18;28162:48;28227:76;28298:4;28289:6;28227:76;:::i;:::-;28219:84;;27670:640;;;;;;;:::o;28316:141::-;28372:5;28403:6;28397:13;28388:22;;28419:32;28445:5;28419:32;:::i;:::-;28316:141;;;;:::o;28463:349::-;28532:6;28581:2;28569:9;28560:7;28556:23;28552:32;28549:119;;;28587:79;;:::i;:::-;28549:119;28707:1;28732:63;28787:7;28778:6;28767:9;28763:22;28732:63;:::i;:::-;28722:73;;28678:127;28463:349;;;;:::o;28818:180::-;28866:77;28863:1;28856:88;28963:4;28960:1;28953:15;28987:4;28984:1;28977:15;29004:185;29044:1;29061:20;29079:1;29061:20;:::i;:::-;29056:25;;29095:20;29113:1;29095:20;:::i;:::-;29090:25;;29134:1;29124:35;;29139:18;;:::i;:::-;29124:35;29181:1;29178;29174:9;29169:14;;29004:185;;;;:::o;29195:176::-;29227:1;29244:20;29262:1;29244:20;:::i;:::-;29239:25;;29278:20;29296:1;29278:20;:::i;:::-;29273:25;;29317:1;29307:35;;29322:18;;:::i;:::-;29307:35;29363:1;29360;29356:9;29351:14;;29195:176;;;;:::o
Swarm Source
ipfs://bab59aeaac053aa00676af5d598e5134ad0e7176f676afa28427d76efcea002a
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.