Overview
S Balance
0 S
S Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Loading...
Loading
Contract Name:
PassTheJoint
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2024-12-29 */ /** *Submitted for verification at ftmscan.com on 2024-10-30 */ // SPDX-License-Identifier: MIT 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); } /** * @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; } /** * @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); } /** * @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); } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "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] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /// @title Base64 /// @author Brecht Devos - <[email protected]> /// @notice Provides a function for encoding some bytes in base64 library Base64 { string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for {} lt(dataPtr, endPtr) {} { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and( input, 0x3F))))) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } } /* * @dev 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @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; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping (uint256 => address) private _owners; // Mapping owner address to token count mapping (address => uint256) private _balances; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _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 { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } /** * @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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /* Presenting … … … … Pass The Joint The Holy Joint Roller rolled the first joint. By passing the Joint we will unite the SONIC chain in a giant smoke sesh. You can keep the lighter. You would probably pocket it anyway. Fucking stoners. Fork of the Worm NFT. All hail the WORM! */ contract PassTheJoint is Ownable, ERC721Enumerable { using Strings for uint256; string public baseURI; string public baseExtension = ".json"; mapping(address => uint256) public addressMintedBalance; // Declare variables for public yoink feature uint256 public lastTransferTimestamp; // Track the last transfer time uint256 public maxHogDuration = 0.5 days; // Maximum hold duration before public yoink uint256 private idTracker; // Manual tracking for IDs constructor() ERC721("PassTheJoint", "JOINT") {} function tokenURI(uint256 tokenId) public view virtual override(ERC721) returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension) ) : ""; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function mint(address to) internal { _safeMint(to, idTracker); idTracker += 1; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function propagate(address to) public { transferOverride(msg.sender, to, 0); } function transferFrom( address from, address to, uint256 tokenId ) public override(ERC721, IERC721) { transferOverride(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) public override(ERC721, IERC721) { transferOverride(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override(ERC721, IERC721) { transferOverride(from, to, tokenId, _data); } function transferOverride( address from, address to, uint256 tokenId ) internal { transferOverride(from, to, tokenId, ""); } function transferOverride( address from, address to, uint256 tokenId, bytes memory _data ) internal { lastTransferTimestamp = block.timestamp; transfer(from, to, tokenId, _data); if (from != owner()) { mint(from); } } function transfer( address from, address to, uint256 tokenId, bytes memory _data ) internal { require(tokenId == 0, "TOO BAD: only the 0riginal can be transferred"); require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } function yoink() public { if (_msgSender() != owner()) { require( block.timestamp - lastTransferTimestamp >= maxHogDuration, "TOO SOON: not enough time has passed since the last transfer" ); require( ownerOf(0) != owner(), "FORBIDDEN: cannot yoink from the contract owner" ); } address from = ownerOf(0); _transfer(from, _msgSender(), 0); mint(from); } function yoinkTo(address target) public { require(target != address(0), "INVALID: Target address cannot be zero"); if (_msgSender() != owner()) { require( block.timestamp - lastTransferTimestamp >= maxHogDuration, "TOO SOON: not enough time has passed since the last transfer" ); require( ownerOf(0) != owner(), "FORBIDDEN: cannot yoink from the contract owner" ); } address from = ownerOf(0); _transfer(from, target, 0); mint(from); } function setMaxHogDuration(uint256 _maxHogDuration) external onlyOwner { maxHogDuration = _maxHogDuration; } function timeUntilYoinkable() public view returns (uint256) { if (block.timestamp - lastTransferTimestamp >= maxHogDuration) { return 0; // Already yoinkable } return maxHogDuration - (block.timestamp - lastTransferTimestamp); } function getPaid() public payable onlyOwner { require(payable(_msgSender()).send(address(this).balance)); } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPaid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTransferTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxHogDuration","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":[{"internalType":"address","name":"to","type":"address"}],"name":"propagate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxHogDuration","type":"uint256"}],"name":"setMaxHogDuration","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":[],"name":"timeUntilYoinkable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"yoink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"yoinkTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90816200004a919062000429565b5061a8c0600f553480156200005e57600080fd5b506040518060400160405280600c81526020017f506173735468654a6f696e7400000000000000000000000000000000000000008152506040518060400160405280600581526020017f4a4f494e540000000000000000000000000000000000000000000000000000008152506000620000dd620001a760201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35081600190816200018c919062000429565b5080600290816200019e919062000429565b50505062000510565b600033905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200023157607f821691505b602082108103620002475762000246620001e9565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002b17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000272565b620002bd868362000272565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200030a62000304620002fe84620002d5565b620002df565b620002d5565b9050919050565b6000819050919050565b6200032683620002e9565b6200033e620003358262000311565b8484546200027f565b825550505050565b600090565b6200035562000346565b620003628184846200031b565b505050565b5b818110156200038a576200037e6000826200034b565b60018101905062000368565b5050565b601f821115620003d957620003a3816200024d565b620003ae8462000262565b81016020851015620003be578190505b620003d6620003cd8562000262565b83018262000367565b50505b505050565b600082821c905092915050565b6000620003fe60001984600802620003de565b1980831691505092915050565b6000620004198383620003eb565b9150826002028217905092915050565b6200043482620001af565b67ffffffffffffffff81111562000450576200044f620001ba565b5b6200045c825462000218565b620004698282856200038e565b600060209050601f831160018114620004a157600084156200048c578287015190505b6200049885826200040b565b86555062000508565b601f198416620004b1866200024d565b60005b82811015620004db57848901518255600182019150602085019450602081019050620004b4565b86831015620004fb5784890151620004f7601f891682620003eb565b8355505b6001600288020188555050505b505050505050565b6144ca80620005206000396000f3fe6080604052600436106101e75760003560e01c80636c0360eb11610102578063c668286211610095578063e985e9c511610064578063e985e9c5146106dc578063eaad7b6514610719578063ee407e6c14610744578063f2fde38b1461076d576101ee565b8063c668286214610641578063c87b56dd1461066c578063cf41d6f8146106a9578063da3ef23f146106b3576101ee565b806395d89b41116100d157806395d89b41146105ad5780639846cd9e146105d8578063a22cb465146105ef578063b88d4fde14610618576101ee565b80636c0360eb1461050357806370a082311461052e578063715018a61461056b5780638da5cb5b14610582576101ee565b806323b872dd1161017a5780634c8b6f8a116101495780634c8b6f8a146104355780634f6ccce71461046057806355f804b31461049d5780636352211e146104c6576101ee565b806323b872dd1461037b5780632f745c59146103a457806330fd956d146103e157806342842e0e1461040c576101ee565b80630906e7cd116101b65780630906e7cd146102c1578063095ea7b3146102ea57806318160ddd1461031357806318cae2691461033e576101ee565b806301ffc9a7146101f357806306fdde0314610230578063074b27031461025b578063081812fc14610284576101ee565b366101ee57005b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612be9565b610796565b6040516102279190612c31565b60405180910390f35b34801561023c57600080fd5b50610245610810565b6040516102529190612cdc565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612d5c565b6108a2565b005b34801561029057600080fd5b506102ab60048036038101906102a69190612dbf565b610a4a565b6040516102b89190612dfb565b60405180910390f35b3480156102cd57600080fd5b506102e860048036038101906102e39190612dbf565b610acf565b005b3480156102f657600080fd5b50610311600480360381019061030c9190612e16565b610b55565b005b34801561031f57600080fd5b50610328610c6c565b6040516103359190612e65565b60405180910390f35b34801561034a57600080fd5b5061036560048036038101906103609190612d5c565b610c79565b6040516103729190612e65565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d9190612e80565b610c91565b005b3480156103b057600080fd5b506103cb60048036038101906103c69190612e16565b610ca1565b6040516103d89190612e65565b60405180910390f35b3480156103ed57600080fd5b506103f6610d46565b6040516104039190612e65565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e9190612e80565b610d4c565b005b34801561044157600080fd5b5061044a610d5c565b6040516104579190612e65565b60405180910390f35b34801561046c57600080fd5b5061048760048036038101906104829190612dbf565b610d62565b6040516104949190612e65565b60405180910390f35b3480156104a957600080fd5b506104c460048036038101906104bf9190613008565b610dd3565b005b3480156104d257600080fd5b506104ed60048036038101906104e89190612dbf565b610e62565b6040516104fa9190612dfb565b60405180910390f35b34801561050f57600080fd5b50610518610f13565b6040516105259190612cdc565b60405180910390f35b34801561053a57600080fd5b5061055560048036038101906105509190612d5c565b610fa1565b6040516105629190612e65565b60405180910390f35b34801561057757600080fd5b50610580611058565b005b34801561058e57600080fd5b50610597611192565b6040516105a49190612dfb565b60405180910390f35b3480156105b957600080fd5b506105c26111bb565b6040516105cf9190612cdc565b60405180910390f35b3480156105e457600080fd5b506105ed61124d565b005b3480156105fb57600080fd5b506106166004803603810190610611919061307d565b61138c565b005b34801561062457600080fd5b5061063f600480360381019061063a919061315e565b61150c565b005b34801561064d57600080fd5b5061065661151e565b6040516106639190612cdc565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e9190612dbf565b6115ac565b6040516106a09190612cdc565b60405180910390f35b6106b1611656565b005b3480156106bf57600080fd5b506106da60048036038101906106d59190613008565b611719565b005b3480156106e857600080fd5b5061070360048036038101906106fe91906131e1565b6117a8565b6040516107109190612c31565b60405180910390f35b34801561072557600080fd5b5061072e61183c565b60405161073b9190612e65565b60405180910390f35b34801561075057600080fd5b5061076b60048036038101906107669190612d5c565b61187e565b005b34801561077957600080fd5b50610794600480360381019061078f9190612d5c565b61188d565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610809575061080882611a35565b5b9050919050565b60606001805461081f90613250565b80601f016020809104026020016040519081016040528092919081815260200182805461084b90613250565b80156108985780601f1061086d57610100808354040283529160200191610898565b820191906000526020600020905b81548152906001019060200180831161087b57829003601f168201915b5050505050905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610911576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610908906132f3565b60405180910390fd5b610919611192565b73ffffffffffffffffffffffffffffffffffffffff16610937611b17565b73ffffffffffffffffffffffffffffffffffffffff1614610a2357600f54600e54426109639190613342565b10156109a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099b906133e8565b60405180910390fd5b6109ac611192565b73ffffffffffffffffffffffffffffffffffffffff166109cc6000610e62565b73ffffffffffffffffffffffffffffffffffffffff1603610a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a199061347a565b60405180910390fd5b5b6000610a2f6000610e62565b9050610a3d81836000611b1f565b610a4681611d7a565b5050565b6000610a5582611da3565b610a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8b9061350c565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610ad7611b17565b73ffffffffffffffffffffffffffffffffffffffff16610af5611192565b73ffffffffffffffffffffffffffffffffffffffff1614610b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4290613578565b60405180910390fd5b80600f8190555050565b6000610b6082610e62565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc79061360a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bef611b17565b73ffffffffffffffffffffffffffffffffffffffff161480610c1e5750610c1d81610c18611b17565b6117a8565b5b610c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c549061369c565b60405180910390fd5b610c678383611e0f565b505050565b6000600980549050905090565b600d6020528060005260406000206000915090505481565b610c9c838383611ec8565b505050565b6000610cac83610fa1565b8210610ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce49061372e565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600e5481565b610d57838383611ec8565b505050565b600f5481565b6000610d6c610c6c565b8210610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da4906137c0565b60405180910390fd5b60098281548110610dc157610dc06137e0565b5b90600052602060002001549050919050565b610ddb611b17565b73ffffffffffffffffffffffffffffffffffffffff16610df9611192565b73ffffffffffffffffffffffffffffffffffffffff1614610e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4690613578565b60405180910390fd5b80600b9081610e5e91906139bb565b5050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0190613aff565b60405180910390fd5b80915050919050565b600b8054610f2090613250565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4c90613250565b8015610f995780601f10610f6e57610100808354040283529160200191610f99565b820191906000526020600020905b815481529060010190602001808311610f7c57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100890613b91565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611060611b17565b73ffffffffffffffffffffffffffffffffffffffff1661107e611192565b73ffffffffffffffffffffffffffffffffffffffff16146110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb90613578565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546111ca90613250565b80601f01602080910402602001604051908101604052809291908181526020018280546111f690613250565b80156112435780601f1061121857610100808354040283529160200191611243565b820191906000526020600020905b81548152906001019060200180831161122657829003601f168201915b5050505050905090565b611255611192565b73ffffffffffffffffffffffffffffffffffffffff16611273611b17565b73ffffffffffffffffffffffffffffffffffffffff161461135f57600f54600e544261129f9190613342565b10156112e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d7906133e8565b60405180910390fd5b6112e8611192565b73ffffffffffffffffffffffffffffffffffffffff166113086000610e62565b73ffffffffffffffffffffffffffffffffffffffff160361135e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113559061347a565b60405180910390fd5b5b600061136b6000610e62565b905061138081611379611b17565b6000611b1f565b61138981611d7a565b50565b611394611b17565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f890613bfd565b60405180910390fd5b806006600061140e611b17565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114bb611b17565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115009190612c31565b60405180910390a35050565b61151884848484611ee8565b50505050565b600c805461152b90613250565b80601f016020809104026020016040519081016040528092919081815260200182805461155790613250565b80156115a45780601f10611579576101008083540402835291602001916115a4565b820191906000526020600020905b81548152906001019060200180831161158757829003601f168201915b505050505081565b60606115b782611da3565b6115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed90613c8f565b60405180910390fd5b6000611600611f45565b90506000815111611620576040518060200160405280600081525061164e565b8061162a84611fd7565b600c60405160200161163e93929190613d6e565b6040516020818303038152906040525b915050919050565b61165e611b17565b73ffffffffffffffffffffffffffffffffffffffff1661167c611192565b73ffffffffffffffffffffffffffffffffffffffff16146116d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c990613578565b60405180910390fd5b6116da611b17565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061171757600080fd5b565b611721611b17565b73ffffffffffffffffffffffffffffffffffffffff1661173f611192565b73ffffffffffffffffffffffffffffffffffffffff1614611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178c90613578565b60405180910390fd5b80600c90816117a491906139bb565b5050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600f54600e544261184f9190613342565b1061185d576000905061187b565b600e544261186b9190613342565b600f546118789190613342565b90505b90565b61188a33826000611ec8565b50565b611895611b17565b73ffffffffffffffffffffffffffffffffffffffff166118b3611192565b73ffffffffffffffffffffffffffffffffffffffff1614611909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190090613578565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f90613e11565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b0057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b105750611b0f82612137565b5b9050919050565b600033905090565b8273ffffffffffffffffffffffffffffffffffffffff16611b3f82610e62565b73ffffffffffffffffffffffffffffffffffffffff1614611b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8c90613ea3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfb90613f35565b60405180910390fd5b611c0f8383836121a1565b611c1a600082611e0f565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c6a9190613342565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cc19190613f55565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611d86816010546122b3565b600160106000828254611d999190613f55565b9250508190555050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e8283610e62565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611ee383838360405180602001604052806000815250611ee8565b505050565b42600e81905550611efb848484846122d1565b611f03611192565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611f3f57611f3e84611d7a565b5b50505050565b6060600b8054611f5490613250565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8090613250565b8015611fcd5780601f10611fa257610100808354040283529160200191611fcd565b820191906000526020600020905b815481529060010190602001808311611fb057829003601f168201915b5050505050905090565b60606000820361201e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612132565b600082905060005b6000821461205057808061203990613f89565b915050600a826120499190614000565b9150612026565b60008167ffffffffffffffff81111561206c5761206b612edd565b5b6040519080825280601f01601f19166020018201604052801561209e5781602001600182028036833780820191505090505b5090505b6000851461212b576001826120b79190613342565b9150600a856120c69190614031565b60306120d29190613f55565b60f81b8183815181106120e8576120e76137e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121249190614000565b94506120a2565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121ac838383612376565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121ee576121e98161237b565b61222d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461222c5761222b83826123c4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361226f5761226a81612531565b6122ae565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122ad576122ac8282612602565b5b5b505050565b6122cd828260405180602001604052806000815250612681565b5050565b60008214612314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230b906140d4565b60405180910390fd5b61232561231f611b17565b836126dc565b612364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235b90614166565b60405180910390fd5b612370848484846127ba565b50505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016123d184610fa1565b6123db9190613342565b90506000600860008481526020019081526020016000205490508181146124c0576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506125459190613342565b90506000600a6000848152602001908152602001600020549050600060098381548110612575576125746137e0565b5b906000526020600020015490508060098381548110612597576125966137e0565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806125e6576125e5614186565b5b6001900381819060005260206000200160009055905550505050565b600061260d83610fa1565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b61268b8383612816565b61269860008484846129e3565b6126d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ce90614227565b60405180910390fd5b505050565b60006126e782611da3565b612726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271d906142b9565b60405180910390fd5b600061273183610e62565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127a057508373ffffffffffffffffffffffffffffffffffffffff1661278884610a4a565b73ffffffffffffffffffffffffffffffffffffffff16145b806127b157506127b081856117a8565b5b91505092915050565b6127c5848484611b1f565b6127d1848484846129e3565b612810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280790614227565b60405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287c90614325565b60405180910390fd5b61288e81611da3565b156128ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c590614391565b60405180910390fd5b6128da600083836121a1565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461292a9190613f55565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612a048473ffffffffffffffffffffffffffffffffffffffff16612b6a565b15612b5d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a2d611b17565b8786866040518563ffffffff1660e01b8152600401612a4f9493929190614406565b6020604051808303816000875af1925050508015612a8b57506040513d601f19601f82011682018060405250810190612a889190614467565b60015b612b0d573d8060008114612abb576040519150601f19603f3d011682016040523d82523d6000602084013e612ac0565b606091505b506000815103612b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afc90614227565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b62565b600190505b949350505050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612bc681612b91565b8114612bd157600080fd5b50565b600081359050612be381612bbd565b92915050565b600060208284031215612bff57612bfe612b87565b5b6000612c0d84828501612bd4565b91505092915050565b60008115159050919050565b612c2b81612c16565b82525050565b6000602082019050612c466000830184612c22565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c86578082015181840152602081019050612c6b565b60008484015250505050565b6000601f19601f8301169050919050565b6000612cae82612c4c565b612cb88185612c57565b9350612cc8818560208601612c68565b612cd181612c92565b840191505092915050565b60006020820190508181036000830152612cf68184612ca3565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d2982612cfe565b9050919050565b612d3981612d1e565b8114612d4457600080fd5b50565b600081359050612d5681612d30565b92915050565b600060208284031215612d7257612d71612b87565b5b6000612d8084828501612d47565b91505092915050565b6000819050919050565b612d9c81612d89565b8114612da757600080fd5b50565b600081359050612db981612d93565b92915050565b600060208284031215612dd557612dd4612b87565b5b6000612de384828501612daa565b91505092915050565b612df581612d1e565b82525050565b6000602082019050612e106000830184612dec565b92915050565b60008060408385031215612e2d57612e2c612b87565b5b6000612e3b85828601612d47565b9250506020612e4c85828601612daa565b9150509250929050565b612e5f81612d89565b82525050565b6000602082019050612e7a6000830184612e56565b92915050565b600080600060608486031215612e9957612e98612b87565b5b6000612ea786828701612d47565b9350506020612eb886828701612d47565b9250506040612ec986828701612daa565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f1582612c92565b810181811067ffffffffffffffff82111715612f3457612f33612edd565b5b80604052505050565b6000612f47612b7d565b9050612f538282612f0c565b919050565b600067ffffffffffffffff821115612f7357612f72612edd565b5b612f7c82612c92565b9050602081019050919050565b82818337600083830152505050565b6000612fab612fa684612f58565b612f3d565b905082815260208101848484011115612fc757612fc6612ed8565b5b612fd2848285612f89565b509392505050565b600082601f830112612fef57612fee612ed3565b5b8135612fff848260208601612f98565b91505092915050565b60006020828403121561301e5761301d612b87565b5b600082013567ffffffffffffffff81111561303c5761303b612b8c565b5b61304884828501612fda565b91505092915050565b61305a81612c16565b811461306557600080fd5b50565b60008135905061307781613051565b92915050565b6000806040838503121561309457613093612b87565b5b60006130a285828601612d47565b92505060206130b385828601613068565b9150509250929050565b600067ffffffffffffffff8211156130d8576130d7612edd565b5b6130e182612c92565b9050602081019050919050565b60006131016130fc846130bd565b612f3d565b90508281526020810184848401111561311d5761311c612ed8565b5b613128848285612f89565b509392505050565b600082601f83011261314557613144612ed3565b5b81356131558482602086016130ee565b91505092915050565b6000806000806080858703121561317857613177612b87565b5b600061318687828801612d47565b945050602061319787828801612d47565b93505060406131a887828801612daa565b925050606085013567ffffffffffffffff8111156131c9576131c8612b8c565b5b6131d587828801613130565b91505092959194509250565b600080604083850312156131f8576131f7612b87565b5b600061320685828601612d47565b925050602061321785828601612d47565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061326857607f821691505b60208210810361327b5761327a613221565b5b50919050565b7f494e56414c49443a2054617267657420616464726573732063616e6e6f74206260008201527f65207a65726f0000000000000000000000000000000000000000000000000000602082015250565b60006132dd602683612c57565b91506132e882613281565b604082019050919050565b6000602082019050818103600083015261330c816132d0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061334d82612d89565b915061335883612d89565b92508282039050818111156133705761336f613313565b5b92915050565b7f544f4f20534f4f4e3a206e6f7420656e6f7567682074696d652068617320706160008201527f737365642073696e636520746865206c617374207472616e7366657200000000602082015250565b60006133d2603c83612c57565b91506133dd82613376565b604082019050919050565b60006020820190508181036000830152613401816133c5565b9050919050565b7f464f5242494444454e3a2063616e6e6f7420796f696e6b2066726f6d2074686560008201527f20636f6e7472616374206f776e65720000000000000000000000000000000000602082015250565b6000613464602f83612c57565b915061346f82613408565b604082019050919050565b6000602082019050818103600083015261349381613457565b9050919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006134f6602c83612c57565b91506135018261349a565b604082019050919050565b60006020820190508181036000830152613525816134e9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613562602083612c57565b915061356d8261352c565b602082019050919050565b6000602082019050818103600083015261359181613555565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006135f4602183612c57565b91506135ff82613598565b604082019050919050565b60006020820190508181036000830152613623816135e7565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613686603883612c57565b91506136918261362a565b604082019050919050565b600060208201905081810360008301526136b581613679565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613718602b83612c57565b9150613723826136bc565b604082019050919050565b600060208201905081810360008301526137478161370b565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006137aa602c83612c57565b91506137b58261374e565b604082019050919050565b600060208201905081810360008301526137d98161379d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138717fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613834565b61387b8683613834565b95508019841693508086168417925050509392505050565b6000819050919050565b60006138b86138b36138ae84612d89565b613893565b612d89565b9050919050565b6000819050919050565b6138d28361389d565b6138e66138de826138bf565b848454613841565b825550505050565b600090565b6138fb6138ee565b6139068184846138c9565b505050565b5b8181101561392a5761391f6000826138f3565b60018101905061390c565b5050565b601f82111561396f576139408161380f565b61394984613824565b81016020851015613958578190505b61396c61396485613824565b83018261390b565b50505b505050565b600082821c905092915050565b600061399260001984600802613974565b1980831691505092915050565b60006139ab8383613981565b9150826002028217905092915050565b6139c482612c4c565b67ffffffffffffffff8111156139dd576139dc612edd565b5b6139e78254613250565b6139f282828561392e565b600060209050601f831160018114613a255760008415613a13578287015190505b613a1d858261399f565b865550613a85565b601f198416613a338661380f565b60005b82811015613a5b57848901518255600182019150602085019450602081019050613a36565b86831015613a785784890151613a74601f891682613981565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613ae9602983612c57565b9150613af482613a8d565b604082019050919050565b60006020820190508181036000830152613b1881613adc565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613b7b602a83612c57565b9150613b8682613b1f565b604082019050919050565b60006020820190508181036000830152613baa81613b6e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613be7601983612c57565b9150613bf282613bb1565b602082019050919050565b60006020820190508181036000830152613c1681613bda565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613c79602f83612c57565b9150613c8482613c1d565b604082019050919050565b60006020820190508181036000830152613ca881613c6c565b9050919050565b600081905092915050565b6000613cc582612c4c565b613ccf8185613caf565b9350613cdf818560208601612c68565b80840191505092915050565b60008154613cf881613250565b613d028186613caf565b94506001821660008114613d1d5760018114613d3257613d65565b60ff1983168652811515820286019350613d65565b613d3b8561380f565b60005b83811015613d5d57815481890152600182019150602081019050613d3e565b838801955050505b50505092915050565b6000613d7a8286613cba565b9150613d868285613cba565b9150613d928284613ceb565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613dfb602683612c57565b9150613e0682613d9f565b604082019050919050565b60006020820190508181036000830152613e2a81613dee565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000613e8d602983612c57565b9150613e9882613e31565b604082019050919050565b60006020820190508181036000830152613ebc81613e80565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613f1f602483612c57565b9150613f2a82613ec3565b604082019050919050565b60006020820190508181036000830152613f4e81613f12565b9050919050565b6000613f6082612d89565b9150613f6b83612d89565b9250828201905080821115613f8357613f82613313565b5b92915050565b6000613f9482612d89565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613fc657613fc5613313565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061400b82612d89565b915061401683612d89565b92508261402657614025613fd1565b5b828204905092915050565b600061403c82612d89565b915061404783612d89565b92508261405757614056613fd1565b5b828206905092915050565b7f544f4f204241443a206f6e6c79207468652030726967696e616c2063616e206260008201527f65207472616e7366657272656400000000000000000000000000000000000000602082015250565b60006140be602d83612c57565b91506140c982614062565b604082019050919050565b600060208201905081810360008301526140ed816140b1565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614150603183612c57565b915061415b826140f4565b604082019050919050565b6000602082019050818103600083015261417f81614143565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614211603283612c57565b915061421c826141b5565b604082019050919050565b6000602082019050818103600083015261424081614204565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006142a3602c83612c57565b91506142ae82614247565b604082019050919050565b600060208201905081810360008301526142d281614296565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061430f602083612c57565b915061431a826142d9565b602082019050919050565b6000602082019050818103600083015261433e81614302565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061437b601c83612c57565b915061438682614345565b602082019050919050565b600060208201905081810360008301526143aa8161436e565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006143d8826143b1565b6143e281856143bc565b93506143f2818560208601612c68565b6143fb81612c92565b840191505092915050565b600060808201905061441b6000830187612dec565b6144286020830186612dec565b6144356040830185612e56565b818103606083015261444781846143cd565b905095945050505050565b60008151905061446181612bbd565b92915050565b60006020828403121561447d5761447c612b87565b5b600061448b84828501614452565b9150509291505056fea2646970667358221220e1e72bdc079c29a9fec18fc792973094003330211de32dba912b076dcea94d9464736f6c63430008130033
Deployed Bytecode
0x6080604052600436106101e75760003560e01c80636c0360eb11610102578063c668286211610095578063e985e9c511610064578063e985e9c5146106dc578063eaad7b6514610719578063ee407e6c14610744578063f2fde38b1461076d576101ee565b8063c668286214610641578063c87b56dd1461066c578063cf41d6f8146106a9578063da3ef23f146106b3576101ee565b806395d89b41116100d157806395d89b41146105ad5780639846cd9e146105d8578063a22cb465146105ef578063b88d4fde14610618576101ee565b80636c0360eb1461050357806370a082311461052e578063715018a61461056b5780638da5cb5b14610582576101ee565b806323b872dd1161017a5780634c8b6f8a116101495780634c8b6f8a146104355780634f6ccce71461046057806355f804b31461049d5780636352211e146104c6576101ee565b806323b872dd1461037b5780632f745c59146103a457806330fd956d146103e157806342842e0e1461040c576101ee565b80630906e7cd116101b65780630906e7cd146102c1578063095ea7b3146102ea57806318160ddd1461031357806318cae2691461033e576101ee565b806301ffc9a7146101f357806306fdde0314610230578063074b27031461025b578063081812fc14610284576101ee565b366101ee57005b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612be9565b610796565b6040516102279190612c31565b60405180910390f35b34801561023c57600080fd5b50610245610810565b6040516102529190612cdc565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612d5c565b6108a2565b005b34801561029057600080fd5b506102ab60048036038101906102a69190612dbf565b610a4a565b6040516102b89190612dfb565b60405180910390f35b3480156102cd57600080fd5b506102e860048036038101906102e39190612dbf565b610acf565b005b3480156102f657600080fd5b50610311600480360381019061030c9190612e16565b610b55565b005b34801561031f57600080fd5b50610328610c6c565b6040516103359190612e65565b60405180910390f35b34801561034a57600080fd5b5061036560048036038101906103609190612d5c565b610c79565b6040516103729190612e65565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d9190612e80565b610c91565b005b3480156103b057600080fd5b506103cb60048036038101906103c69190612e16565b610ca1565b6040516103d89190612e65565b60405180910390f35b3480156103ed57600080fd5b506103f6610d46565b6040516104039190612e65565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e9190612e80565b610d4c565b005b34801561044157600080fd5b5061044a610d5c565b6040516104579190612e65565b60405180910390f35b34801561046c57600080fd5b5061048760048036038101906104829190612dbf565b610d62565b6040516104949190612e65565b60405180910390f35b3480156104a957600080fd5b506104c460048036038101906104bf9190613008565b610dd3565b005b3480156104d257600080fd5b506104ed60048036038101906104e89190612dbf565b610e62565b6040516104fa9190612dfb565b60405180910390f35b34801561050f57600080fd5b50610518610f13565b6040516105259190612cdc565b60405180910390f35b34801561053a57600080fd5b5061055560048036038101906105509190612d5c565b610fa1565b6040516105629190612e65565b60405180910390f35b34801561057757600080fd5b50610580611058565b005b34801561058e57600080fd5b50610597611192565b6040516105a49190612dfb565b60405180910390f35b3480156105b957600080fd5b506105c26111bb565b6040516105cf9190612cdc565b60405180910390f35b3480156105e457600080fd5b506105ed61124d565b005b3480156105fb57600080fd5b506106166004803603810190610611919061307d565b61138c565b005b34801561062457600080fd5b5061063f600480360381019061063a919061315e565b61150c565b005b34801561064d57600080fd5b5061065661151e565b6040516106639190612cdc565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e9190612dbf565b6115ac565b6040516106a09190612cdc565b60405180910390f35b6106b1611656565b005b3480156106bf57600080fd5b506106da60048036038101906106d59190613008565b611719565b005b3480156106e857600080fd5b5061070360048036038101906106fe91906131e1565b6117a8565b6040516107109190612c31565b60405180910390f35b34801561072557600080fd5b5061072e61183c565b60405161073b9190612e65565b60405180910390f35b34801561075057600080fd5b5061076b60048036038101906107669190612d5c565b61187e565b005b34801561077957600080fd5b50610794600480360381019061078f9190612d5c565b61188d565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610809575061080882611a35565b5b9050919050565b60606001805461081f90613250565b80601f016020809104026020016040519081016040528092919081815260200182805461084b90613250565b80156108985780601f1061086d57610100808354040283529160200191610898565b820191906000526020600020905b81548152906001019060200180831161087b57829003601f168201915b5050505050905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610911576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610908906132f3565b60405180910390fd5b610919611192565b73ffffffffffffffffffffffffffffffffffffffff16610937611b17565b73ffffffffffffffffffffffffffffffffffffffff1614610a2357600f54600e54426109639190613342565b10156109a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099b906133e8565b60405180910390fd5b6109ac611192565b73ffffffffffffffffffffffffffffffffffffffff166109cc6000610e62565b73ffffffffffffffffffffffffffffffffffffffff1603610a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a199061347a565b60405180910390fd5b5b6000610a2f6000610e62565b9050610a3d81836000611b1f565b610a4681611d7a565b5050565b6000610a5582611da3565b610a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8b9061350c565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610ad7611b17565b73ffffffffffffffffffffffffffffffffffffffff16610af5611192565b73ffffffffffffffffffffffffffffffffffffffff1614610b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4290613578565b60405180910390fd5b80600f8190555050565b6000610b6082610e62565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc79061360a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bef611b17565b73ffffffffffffffffffffffffffffffffffffffff161480610c1e5750610c1d81610c18611b17565b6117a8565b5b610c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c549061369c565b60405180910390fd5b610c678383611e0f565b505050565b6000600980549050905090565b600d6020528060005260406000206000915090505481565b610c9c838383611ec8565b505050565b6000610cac83610fa1565b8210610ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce49061372e565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600e5481565b610d57838383611ec8565b505050565b600f5481565b6000610d6c610c6c565b8210610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da4906137c0565b60405180910390fd5b60098281548110610dc157610dc06137e0565b5b90600052602060002001549050919050565b610ddb611b17565b73ffffffffffffffffffffffffffffffffffffffff16610df9611192565b73ffffffffffffffffffffffffffffffffffffffff1614610e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4690613578565b60405180910390fd5b80600b9081610e5e91906139bb565b5050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0190613aff565b60405180910390fd5b80915050919050565b600b8054610f2090613250565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4c90613250565b8015610f995780601f10610f6e57610100808354040283529160200191610f99565b820191906000526020600020905b815481529060010190602001808311610f7c57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100890613b91565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611060611b17565b73ffffffffffffffffffffffffffffffffffffffff1661107e611192565b73ffffffffffffffffffffffffffffffffffffffff16146110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb90613578565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546111ca90613250565b80601f01602080910402602001604051908101604052809291908181526020018280546111f690613250565b80156112435780601f1061121857610100808354040283529160200191611243565b820191906000526020600020905b81548152906001019060200180831161122657829003601f168201915b5050505050905090565b611255611192565b73ffffffffffffffffffffffffffffffffffffffff16611273611b17565b73ffffffffffffffffffffffffffffffffffffffff161461135f57600f54600e544261129f9190613342565b10156112e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d7906133e8565b60405180910390fd5b6112e8611192565b73ffffffffffffffffffffffffffffffffffffffff166113086000610e62565b73ffffffffffffffffffffffffffffffffffffffff160361135e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113559061347a565b60405180910390fd5b5b600061136b6000610e62565b905061138081611379611b17565b6000611b1f565b61138981611d7a565b50565b611394611b17565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f890613bfd565b60405180910390fd5b806006600061140e611b17565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114bb611b17565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115009190612c31565b60405180910390a35050565b61151884848484611ee8565b50505050565b600c805461152b90613250565b80601f016020809104026020016040519081016040528092919081815260200182805461155790613250565b80156115a45780601f10611579576101008083540402835291602001916115a4565b820191906000526020600020905b81548152906001019060200180831161158757829003601f168201915b505050505081565b60606115b782611da3565b6115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed90613c8f565b60405180910390fd5b6000611600611f45565b90506000815111611620576040518060200160405280600081525061164e565b8061162a84611fd7565b600c60405160200161163e93929190613d6e565b6040516020818303038152906040525b915050919050565b61165e611b17565b73ffffffffffffffffffffffffffffffffffffffff1661167c611192565b73ffffffffffffffffffffffffffffffffffffffff16146116d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c990613578565b60405180910390fd5b6116da611b17565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061171757600080fd5b565b611721611b17565b73ffffffffffffffffffffffffffffffffffffffff1661173f611192565b73ffffffffffffffffffffffffffffffffffffffff1614611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178c90613578565b60405180910390fd5b80600c90816117a491906139bb565b5050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600f54600e544261184f9190613342565b1061185d576000905061187b565b600e544261186b9190613342565b600f546118789190613342565b90505b90565b61188a33826000611ec8565b50565b611895611b17565b73ffffffffffffffffffffffffffffffffffffffff166118b3611192565b73ffffffffffffffffffffffffffffffffffffffff1614611909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190090613578565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f90613e11565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b0057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b105750611b0f82612137565b5b9050919050565b600033905090565b8273ffffffffffffffffffffffffffffffffffffffff16611b3f82610e62565b73ffffffffffffffffffffffffffffffffffffffff1614611b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8c90613ea3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfb90613f35565b60405180910390fd5b611c0f8383836121a1565b611c1a600082611e0f565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c6a9190613342565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cc19190613f55565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611d86816010546122b3565b600160106000828254611d999190613f55565b9250508190555050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e8283610e62565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611ee383838360405180602001604052806000815250611ee8565b505050565b42600e81905550611efb848484846122d1565b611f03611192565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611f3f57611f3e84611d7a565b5b50505050565b6060600b8054611f5490613250565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8090613250565b8015611fcd5780601f10611fa257610100808354040283529160200191611fcd565b820191906000526020600020905b815481529060010190602001808311611fb057829003601f168201915b5050505050905090565b60606000820361201e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612132565b600082905060005b6000821461205057808061203990613f89565b915050600a826120499190614000565b9150612026565b60008167ffffffffffffffff81111561206c5761206b612edd565b5b6040519080825280601f01601f19166020018201604052801561209e5781602001600182028036833780820191505090505b5090505b6000851461212b576001826120b79190613342565b9150600a856120c69190614031565b60306120d29190613f55565b60f81b8183815181106120e8576120e76137e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121249190614000565b94506120a2565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121ac838383612376565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121ee576121e98161237b565b61222d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461222c5761222b83826123c4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361226f5761226a81612531565b6122ae565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122ad576122ac8282612602565b5b5b505050565b6122cd828260405180602001604052806000815250612681565b5050565b60008214612314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230b906140d4565b60405180910390fd5b61232561231f611b17565b836126dc565b612364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235b90614166565b60405180910390fd5b612370848484846127ba565b50505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016123d184610fa1565b6123db9190613342565b90506000600860008481526020019081526020016000205490508181146124c0576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506125459190613342565b90506000600a6000848152602001908152602001600020549050600060098381548110612575576125746137e0565b5b906000526020600020015490508060098381548110612597576125966137e0565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806125e6576125e5614186565b5b6001900381819060005260206000200160009055905550505050565b600061260d83610fa1565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b61268b8383612816565b61269860008484846129e3565b6126d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ce90614227565b60405180910390fd5b505050565b60006126e782611da3565b612726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271d906142b9565b60405180910390fd5b600061273183610e62565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127a057508373ffffffffffffffffffffffffffffffffffffffff1661278884610a4a565b73ffffffffffffffffffffffffffffffffffffffff16145b806127b157506127b081856117a8565b5b91505092915050565b6127c5848484611b1f565b6127d1848484846129e3565b612810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280790614227565b60405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287c90614325565b60405180910390fd5b61288e81611da3565b156128ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c590614391565b60405180910390fd5b6128da600083836121a1565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461292a9190613f55565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612a048473ffffffffffffffffffffffffffffffffffffffff16612b6a565b15612b5d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a2d611b17565b8786866040518563ffffffff1660e01b8152600401612a4f9493929190614406565b6020604051808303816000875af1925050508015612a8b57506040513d601f19601f82011682018060405250810190612a889190614467565b60015b612b0d573d8060008114612abb576040519150601f19603f3d011682016040523d82523d6000602084013e612ac0565b606091505b506000815103612b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afc90614227565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b62565b600190505b949350505050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612bc681612b91565b8114612bd157600080fd5b50565b600081359050612be381612bbd565b92915050565b600060208284031215612bff57612bfe612b87565b5b6000612c0d84828501612bd4565b91505092915050565b60008115159050919050565b612c2b81612c16565b82525050565b6000602082019050612c466000830184612c22565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c86578082015181840152602081019050612c6b565b60008484015250505050565b6000601f19601f8301169050919050565b6000612cae82612c4c565b612cb88185612c57565b9350612cc8818560208601612c68565b612cd181612c92565b840191505092915050565b60006020820190508181036000830152612cf68184612ca3565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d2982612cfe565b9050919050565b612d3981612d1e565b8114612d4457600080fd5b50565b600081359050612d5681612d30565b92915050565b600060208284031215612d7257612d71612b87565b5b6000612d8084828501612d47565b91505092915050565b6000819050919050565b612d9c81612d89565b8114612da757600080fd5b50565b600081359050612db981612d93565b92915050565b600060208284031215612dd557612dd4612b87565b5b6000612de384828501612daa565b91505092915050565b612df581612d1e565b82525050565b6000602082019050612e106000830184612dec565b92915050565b60008060408385031215612e2d57612e2c612b87565b5b6000612e3b85828601612d47565b9250506020612e4c85828601612daa565b9150509250929050565b612e5f81612d89565b82525050565b6000602082019050612e7a6000830184612e56565b92915050565b600080600060608486031215612e9957612e98612b87565b5b6000612ea786828701612d47565b9350506020612eb886828701612d47565b9250506040612ec986828701612daa565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f1582612c92565b810181811067ffffffffffffffff82111715612f3457612f33612edd565b5b80604052505050565b6000612f47612b7d565b9050612f538282612f0c565b919050565b600067ffffffffffffffff821115612f7357612f72612edd565b5b612f7c82612c92565b9050602081019050919050565b82818337600083830152505050565b6000612fab612fa684612f58565b612f3d565b905082815260208101848484011115612fc757612fc6612ed8565b5b612fd2848285612f89565b509392505050565b600082601f830112612fef57612fee612ed3565b5b8135612fff848260208601612f98565b91505092915050565b60006020828403121561301e5761301d612b87565b5b600082013567ffffffffffffffff81111561303c5761303b612b8c565b5b61304884828501612fda565b91505092915050565b61305a81612c16565b811461306557600080fd5b50565b60008135905061307781613051565b92915050565b6000806040838503121561309457613093612b87565b5b60006130a285828601612d47565b92505060206130b385828601613068565b9150509250929050565b600067ffffffffffffffff8211156130d8576130d7612edd565b5b6130e182612c92565b9050602081019050919050565b60006131016130fc846130bd565b612f3d565b90508281526020810184848401111561311d5761311c612ed8565b5b613128848285612f89565b509392505050565b600082601f83011261314557613144612ed3565b5b81356131558482602086016130ee565b91505092915050565b6000806000806080858703121561317857613177612b87565b5b600061318687828801612d47565b945050602061319787828801612d47565b93505060406131a887828801612daa565b925050606085013567ffffffffffffffff8111156131c9576131c8612b8c565b5b6131d587828801613130565b91505092959194509250565b600080604083850312156131f8576131f7612b87565b5b600061320685828601612d47565b925050602061321785828601612d47565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061326857607f821691505b60208210810361327b5761327a613221565b5b50919050565b7f494e56414c49443a2054617267657420616464726573732063616e6e6f74206260008201527f65207a65726f0000000000000000000000000000000000000000000000000000602082015250565b60006132dd602683612c57565b91506132e882613281565b604082019050919050565b6000602082019050818103600083015261330c816132d0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061334d82612d89565b915061335883612d89565b92508282039050818111156133705761336f613313565b5b92915050565b7f544f4f20534f4f4e3a206e6f7420656e6f7567682074696d652068617320706160008201527f737365642073696e636520746865206c617374207472616e7366657200000000602082015250565b60006133d2603c83612c57565b91506133dd82613376565b604082019050919050565b60006020820190508181036000830152613401816133c5565b9050919050565b7f464f5242494444454e3a2063616e6e6f7420796f696e6b2066726f6d2074686560008201527f20636f6e7472616374206f776e65720000000000000000000000000000000000602082015250565b6000613464602f83612c57565b915061346f82613408565b604082019050919050565b6000602082019050818103600083015261349381613457565b9050919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006134f6602c83612c57565b91506135018261349a565b604082019050919050565b60006020820190508181036000830152613525816134e9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613562602083612c57565b915061356d8261352c565b602082019050919050565b6000602082019050818103600083015261359181613555565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006135f4602183612c57565b91506135ff82613598565b604082019050919050565b60006020820190508181036000830152613623816135e7565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613686603883612c57565b91506136918261362a565b604082019050919050565b600060208201905081810360008301526136b581613679565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613718602b83612c57565b9150613723826136bc565b604082019050919050565b600060208201905081810360008301526137478161370b565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006137aa602c83612c57565b91506137b58261374e565b604082019050919050565b600060208201905081810360008301526137d98161379d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138717fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613834565b61387b8683613834565b95508019841693508086168417925050509392505050565b6000819050919050565b60006138b86138b36138ae84612d89565b613893565b612d89565b9050919050565b6000819050919050565b6138d28361389d565b6138e66138de826138bf565b848454613841565b825550505050565b600090565b6138fb6138ee565b6139068184846138c9565b505050565b5b8181101561392a5761391f6000826138f3565b60018101905061390c565b5050565b601f82111561396f576139408161380f565b61394984613824565b81016020851015613958578190505b61396c61396485613824565b83018261390b565b50505b505050565b600082821c905092915050565b600061399260001984600802613974565b1980831691505092915050565b60006139ab8383613981565b9150826002028217905092915050565b6139c482612c4c565b67ffffffffffffffff8111156139dd576139dc612edd565b5b6139e78254613250565b6139f282828561392e565b600060209050601f831160018114613a255760008415613a13578287015190505b613a1d858261399f565b865550613a85565b601f198416613a338661380f565b60005b82811015613a5b57848901518255600182019150602085019450602081019050613a36565b86831015613a785784890151613a74601f891682613981565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613ae9602983612c57565b9150613af482613a8d565b604082019050919050565b60006020820190508181036000830152613b1881613adc565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613b7b602a83612c57565b9150613b8682613b1f565b604082019050919050565b60006020820190508181036000830152613baa81613b6e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613be7601983612c57565b9150613bf282613bb1565b602082019050919050565b60006020820190508181036000830152613c1681613bda565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613c79602f83612c57565b9150613c8482613c1d565b604082019050919050565b60006020820190508181036000830152613ca881613c6c565b9050919050565b600081905092915050565b6000613cc582612c4c565b613ccf8185613caf565b9350613cdf818560208601612c68565b80840191505092915050565b60008154613cf881613250565b613d028186613caf565b94506001821660008114613d1d5760018114613d3257613d65565b60ff1983168652811515820286019350613d65565b613d3b8561380f565b60005b83811015613d5d57815481890152600182019150602081019050613d3e565b838801955050505b50505092915050565b6000613d7a8286613cba565b9150613d868285613cba565b9150613d928284613ceb565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613dfb602683612c57565b9150613e0682613d9f565b604082019050919050565b60006020820190508181036000830152613e2a81613dee565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000613e8d602983612c57565b9150613e9882613e31565b604082019050919050565b60006020820190508181036000830152613ebc81613e80565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613f1f602483612c57565b9150613f2a82613ec3565b604082019050919050565b60006020820190508181036000830152613f4e81613f12565b9050919050565b6000613f6082612d89565b9150613f6b83612d89565b9250828201905080821115613f8357613f82613313565b5b92915050565b6000613f9482612d89565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613fc657613fc5613313565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061400b82612d89565b915061401683612d89565b92508261402657614025613fd1565b5b828204905092915050565b600061403c82612d89565b915061404783612d89565b92508261405757614056613fd1565b5b828206905092915050565b7f544f4f204241443a206f6e6c79207468652030726967696e616c2063616e206260008201527f65207472616e7366657272656400000000000000000000000000000000000000602082015250565b60006140be602d83612c57565b91506140c982614062565b604082019050919050565b600060208201905081810360008301526140ed816140b1565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614150603183612c57565b915061415b826140f4565b604082019050919050565b6000602082019050818103600083015261417f81614143565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614211603283612c57565b915061421c826141b5565b604082019050919050565b6000602082019050818103600083015261424081614204565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006142a3602c83612c57565b91506142ae82614247565b604082019050919050565b600060208201905081810360008301526142d281614296565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061430f602083612c57565b915061431a826142d9565b602082019050919050565b6000602082019050818103600083015261433e81614302565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061437b601c83612c57565b915061438682614345565b602082019050919050565b600060208201905081810360008301526143aa8161436e565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006143d8826143b1565b6143e281856143bc565b93506143f2818560208601612c68565b6143fb81612c92565b840191505092915050565b600060808201905061441b6000830187612dec565b6144286020830186612dec565b6144356040830185612e56565b818103606083015261444781846143cd565b905095945050505050565b60008151905061446181612bbd565b92915050565b60006020828403121561447d5761447c612b87565b5b600061448b84828501614452565b9150509291505056fea2646970667358221220e1e72bdc079c29a9fec18fc792973094003330211de32dba912b076dcea94d9464736f6c63430008130033
Deployed Bytecode Sourcemap
44309:4979:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35652:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23966:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48094:614;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25426:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48716:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24963:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36305:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44473:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46009:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35973:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44588:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46203:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44663:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36495:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45434:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23660:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44401:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23390:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43438:148;;;;;;;;;;;;;:::i;:::-;;42787:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24135:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47564:522;;;;;;;;;;;;;:::i;:::-;;25719:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46401:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44429:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44874:552;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49127:121;;;:::i;:::-;;45546:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26085:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48846:273;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45909:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43741:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35652:237;35754:4;35793:35;35778:50;;;:11;:50;;;;:103;;;;35845:36;35869:11;35845:23;:36::i;:::-;35778:103;35771:110;;35652:237;;;:::o;23966:100::-;24020:13;24053:5;24046:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23966:100;:::o;48094:614::-;48171:1;48153:20;;:6;:20;;;48145:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;48247:7;:5;:7::i;:::-;48231:23;;:12;:10;:12::i;:::-;:23;;;48227:380;;48340:14;;48315:21;;48297:15;:39;;;;:::i;:::-;:57;;48271:179;;;;;;;;;;;;:::i;:::-;;;;;;;;;48505:7;:5;:7::i;:::-;48491:21;;:10;48499:1;48491:7;:10::i;:::-;:21;;;48465:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;48227:380;48617:12;48632:10;48640:1;48632:7;:10::i;:::-;48617:25;;48653:26;48663:4;48669:6;48677:1;48653:9;:26::i;:::-;48690:10;48695:4;48690;:10::i;:::-;48134:574;48094:614;:::o;25426:221::-;25502:7;25530:16;25538:7;25530;:16::i;:::-;25522:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25615:15;:24;25631:7;25615:24;;;;;;;;;;;;;;;;;;;;;25608:31;;25426:221;;;:::o;48716:122::-;43018:12;:10;:12::i;:::-;43007:23;;:7;:5;:7::i;:::-;:23;;;42999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48815:15:::1;48798:14;:32;;;;48716:122:::0;:::o;24963:397::-;25044:13;25060:23;25075:7;25060:14;:23::i;:::-;25044:39;;25108:5;25102:11;;:2;:11;;;25094:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25188:5;25172:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25197:37;25214:5;25221:12;:10;:12::i;:::-;25197:16;:37::i;:::-;25172:62;25164:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;25331:21;25340:2;25344:7;25331:8;:21::i;:::-;25033:327;24963:397;;:::o;36305:113::-;36366:7;36393:10;:17;;;;36386:24;;36305:113;:::o;44473:55::-;;;;;;;;;;;;;;;;;:::o;46009:186::-;46152:35;46169:4;46175:2;46179:7;46152:16;:35::i;:::-;46009:186;;;:::o;35973:256::-;36070:7;36106:23;36123:5;36106:16;:23::i;:::-;36098:5;:31;36090:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36195:12;:19;36208:5;36195:19;;;;;;;;;;;;;;;:26;36215:5;36195:26;;;;;;;;;;;;36188:33;;35973:256;;;;:::o;44588:36::-;;;;:::o;46203:190::-;46350:35;46367:4;46373:2;46377:7;46350:16;:35::i;:::-;46203:190;;;:::o;44663:40::-;;;;:::o;36495:233::-;36570:7;36606:30;:28;:30::i;:::-;36598:5;:38;36590:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36703:10;36714:5;36703:17;;;;;;;;:::i;:::-;;;;;;;;;;36696:24;;36495:233;;;:::o;45434:104::-;43018:12;:10;:12::i;:::-;43007:23;;:7;:5;:7::i;:::-;:23;;;42999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45519:11:::1;45509:7;:21;;;;;;:::i;:::-;;45434:104:::0;:::o;23660:239::-;23732:7;23752:13;23768:7;:16;23776:7;23768:16;;;;;;;;;;;;;;;;;;;;;23752:32;;23820:1;23803:19;;:5;:19;;;23795:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23886:5;23879:12;;;23660:239;;;:::o;44401:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23390:208::-;23462:7;23507:1;23490:19;;:5;:19;;;23482:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23574:9;:16;23584:5;23574:16;;;;;;;;;;;;;;;;23567:23;;23390:208;;;:::o;43438:148::-;43018:12;:10;:12::i;:::-;43007:23;;:7;:5;:7::i;:::-;:23;;;42999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43545:1:::1;43508:40;;43529:6;::::0;::::1;;;;;;;;43508:40;;;;;;;;;;;;43576:1;43559:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;43438:148::o:0;42787:87::-;42833:7;42860:6;;;;;;;;;;;42853:13;;42787:87;:::o;24135:104::-;24191:13;24224:7;24217:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24135:104;:::o;47564:522::-;47619:7;:5;:7::i;:::-;47603:23;;:12;:10;:12::i;:::-;:23;;;47599:380;;47712:14;;47687:21;;47669:15;:39;;;;:::i;:::-;:57;;47643:179;;;;;;;;;;;;:::i;:::-;;;;;;;;;47877:7;:5;:7::i;:::-;47863:21;;:10;47871:1;47863:7;:10::i;:::-;:21;;;47837:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;47599:380;47989:12;48004:10;48012:1;48004:7;:10::i;:::-;47989:25;;48025:32;48035:4;48041:12;:10;:12::i;:::-;48055:1;48025:9;:32::i;:::-;48068:10;48073:4;48068;:10::i;:::-;47588:498;47564:522::o;25719:295::-;25834:12;:10;:12::i;:::-;25822:24;;:8;:24;;;25814:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25934:8;25889:18;:32;25908:12;:10;:12::i;:::-;25889:32;;;;;;;;;;;;;;;:42;25922:8;25889:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25987:8;25958:48;;25973:12;:10;:12::i;:::-;25958:48;;;25997:8;25958:48;;;;;;:::i;:::-;;;;;;;;25719:295;;:::o;46401:226::-;46577:42;46594:4;46600:2;46604:7;46613:5;46577:16;:42::i;:::-;46401:226;;;;:::o;44429:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44874:552::-;45000:13;45053:16;45061:7;45053;:16::i;:::-;45031:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;45157:28;45188:10;:8;:10::i;:::-;45157:41;;45260:1;45235:14;45229:28;:32;:189;;;;;;;;;;;;;;;;;45327:14;45343:18;:7;:16;:18::i;:::-;45363:13;45310:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45229:189;45209:209;;;44874:552;;;:::o;49127:121::-;43018:12;:10;:12::i;:::-;43007:23;;:7;:5;:7::i;:::-;:23;;;42999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49198:12:::1;:10;:12::i;:::-;49190:26;;:49;49217:21;49190:49;;;;;;;;;;;;;;;;;;;;;;;49182:58;;;::::0;::::1;;49127:121::o:0;45546:128::-;43018:12;:10;:12::i;:::-;43007:23;;:7;:5;:7::i;:::-;:23;;;42999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45649:17:::1;45633:13;:33;;;;;;:::i;:::-;;45546:128:::0;:::o;26085:164::-;26182:4;26206:18;:25;26225:5;26206:25;;;;;;;;;;;;;;;:35;26232:8;26206:35;;;;;;;;;;;;;;;;;;;;;;;;;26199:42;;26085:164;;;;:::o;48846:273::-;48897:7;48964:14;;48939:21;;48921:15;:39;;;;:::i;:::-;:57;48917:119;;49002:1;48995:8;;;;48917:119;49089:21;;49071:15;:39;;;;:::i;:::-;49053:14;;:58;;;;:::i;:::-;49046:65;;48846:273;;:::o;45909:92::-;45958:35;45975:10;45987:2;45991:1;45958:16;:35::i;:::-;45909:92;:::o;43741:244::-;43018:12;:10;:12::i;:::-;43007:23;;:7;:5;:7::i;:::-;:23;;;42999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43850:1:::1;43830:22;;:8;:22;;::::0;43822:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;43940:8;43911:38;;43932:6;::::0;::::1;;;;;;;;43911:38;;;;;;;;;;;;43969:8;43960:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;43741:244:::0;:::o;23034:292::-;23136:4;23175:25;23160:40;;;:11;:40;;;;:105;;;;23232:33;23217:48;;;:11;:48;;;;23160:105;:158;;;;23282:36;23306:11;23282:23;:36::i;:::-;23160:158;23153:165;;23034:292;;;:::o;20587:98::-;20640:7;20667:10;20660:17;;20587:98;:::o;31881:544::-;32006:4;31979:31;;:23;31994:7;31979:14;:23::i;:::-;:31;;;31971:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32089:1;32075:16;;:2;:16;;;32067:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32145:39;32166:4;32172:2;32176:7;32145:20;:39::i;:::-;32249:29;32266:1;32270:7;32249:8;:29::i;:::-;32310:1;32291:9;:15;32301:4;32291:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32339:1;32322:9;:13;32332:2;32322:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32370:2;32351:7;:16;32359:7;32351:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32409:7;32405:2;32390:27;;32399:4;32390:27;;;;;;;;;;;;31881:544;;;:::o;45682:103::-;45728:24;45738:2;45742:9;;45728;:24::i;:::-;45776:1;45763:9;;:14;;;;;;;:::i;:::-;;;;;;;;45682:103;:::o;28666:127::-;28731:4;28783:1;28755:30;;:7;:16;28763:7;28755:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28748:37;;28666:127;;;:::o;32543:174::-;32645:2;32618:15;:24;32634:7;32618:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32701:7;32697:2;32663:46;;32672:23;32687:7;32672:14;:23::i;:::-;32663:46;;;;;;;;;;;;32543:174;;:::o;46635:170::-;46758:39;46775:4;46781:2;46785:7;46758:39;;;;;;;;;;;;:16;:39::i;:::-;46635:170;;;:::o;46813:312::-;46989:15;46965:21;:39;;;;47015:34;47024:4;47030:2;47034:7;47043:5;47015:8;:34::i;:::-;47072:7;:5;:7::i;:::-;47064:15;;:4;:15;;;47060:58;;47096:10;47101:4;47096;:10::i;:::-;47060:58;46813:312;;;;:::o;45793:108::-;45853:13;45886:7;45879:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45793:108;:::o;15979:723::-;16035:13;16265:1;16256:5;:10;16252:53;;16283:10;;;;;;;;;;;;;;;;;;;;;16252:53;16315:12;16330:5;16315:20;;16346:14;16371:78;16386:1;16378:4;:9;16371:78;;16404:8;;;;;:::i;:::-;;;;16435:2;16427:10;;;;;:::i;:::-;;;16371:78;;;16459:19;16491:6;16481:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16459:39;;16509:154;16525:1;16516:5;:10;16509:154;;16553:1;16543:11;;;;;:::i;:::-;;;16620:2;16612:5;:10;;;;:::i;:::-;16599:2;:24;;;;:::i;:::-;16586:39;;16569:6;16576;16569:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;16649:2;16640:11;;;;;:::i;:::-;;;16509:154;;;16687:6;16673:21;;;;;15979:723;;;;:::o;21635:157::-;21720:4;21759:25;21744:40;;;:11;:40;;;;21737:47;;21635:157;;;:::o;37341:555::-;37451:45;37478:4;37484:2;37488:7;37451:26;:45::i;:::-;37529:1;37513:18;;:4;:18;;;37509:187;;37548:40;37580:7;37548:31;:40::i;:::-;37509:187;;;37618:2;37610:10;;:4;:10;;;37606:90;;37637:47;37670:4;37676:7;37637:32;:47::i;:::-;37606:90;37509:187;37724:1;37710:16;;:2;:16;;;37706:183;;37743:45;37780:7;37743:36;:45::i;:::-;37706:183;;;37816:4;37810:10;;:2;:10;;;37806:83;;37837:40;37865:2;37869:7;37837:27;:40::i;:::-;37806:83;37706:183;37341:555;;;:::o;29650:110::-;29726:26;29736:2;29740:7;29726:26;;;;;;;;;;;;:9;:26::i;:::-;29650:110;;:::o;47133:423::-;47296:1;47285:7;:12;47277:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;47380:41;47399:12;:10;:12::i;:::-;47413:7;47380:18;:41::i;:::-;47358:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;47509:39;47523:4;47529:2;47533:7;47542:5;47509:13;:39::i;:::-;47133:423;;;;:::o;34738:93::-;;;;:::o;38619:164::-;38723:10;:17;;;;38696:15;:24;38712:7;38696:24;;;;;;;;;;;:44;;;;38751:10;38767:7;38751:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38619:164;:::o;39410:988::-;39676:22;39726:1;39701:22;39718:4;39701:16;:22::i;:::-;:26;;;;:::i;:::-;39676:51;;39738:18;39759:17;:26;39777:7;39759:26;;;;;;;;;;;;39738:47;;39906:14;39892:10;:28;39888:328;;39937:19;39959:12;:18;39972:4;39959:18;;;;;;;;;;;;;;;:34;39978:14;39959:34;;;;;;;;;;;;39937:56;;40043:11;40010:12;:18;40023:4;40010:18;;;;;;;;;;;;;;;:30;40029:10;40010:30;;;;;;;;;;;:44;;;;40160:10;40127:17;:30;40145:11;40127:30;;;;;;;;;;;:43;;;;39922:294;39888:328;40312:17;:26;40330:7;40312:26;;;;;;;;;;;40305:33;;;40356:12;:18;40369:4;40356:18;;;;;;;;;;;;;;;:34;40375:14;40356:34;;;;;;;;;;;40349:41;;;39491:907;;39410:988;;:::o;40693:1079::-;40946:22;40991:1;40971:10;:17;;;;:21;;;;:::i;:::-;40946:46;;41003:18;41024:15;:24;41040:7;41024:24;;;;;;;;;;;;41003:45;;41375:19;41397:10;41408:14;41397:26;;;;;;;;:::i;:::-;;;;;;;;;;41375:48;;41461:11;41436:10;41447;41436:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;41572:10;41541:15;:28;41557:11;41541:28;;;;;;;;;;;:41;;;;41713:15;:24;41729:7;41713:24;;;;;;;;;;;41706:31;;;41748:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40764:1008;;;40693:1079;:::o;38197:221::-;38282:14;38299:20;38316:2;38299:16;:20::i;:::-;38282:37;;38357:7;38330:12;:16;38343:2;38330:16;;;;;;;;;;;;;;;:24;38347:6;38330:24;;;;;;;;;;;:34;;;;38404:6;38375:17;:26;38393:7;38375:26;;;;;;;;;;;:35;;;;38271:147;38197:221;;:::o;29987:250::-;30083:18;30089:2;30093:7;30083:5;:18::i;:::-;30120:54;30151:1;30155:2;30159:7;30168:5;30120:22;:54::i;:::-;30112:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;29987:250;;;:::o;28960:348::-;29053:4;29078:16;29086:7;29078;:16::i;:::-;29070:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29154:13;29170:23;29185:7;29170:14;:23::i;:::-;29154:39;;29223:5;29212:16;;:7;:16;;;:51;;;;29256:7;29232:31;;:20;29244:7;29232:11;:20::i;:::-;:31;;;29212:51;:87;;;;29267:32;29284:5;29291:7;29267:16;:32::i;:::-;29212:87;29204:96;;;28960:348;;;;:::o;28081:272::-;28195:28;28205:4;28211:2;28215:7;28195:9;:28::i;:::-;28242:48;28265:4;28271:2;28275:7;28284:5;28242:22;:48::i;:::-;28234:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28081:272;;;;:::o;30573:382::-;30667:1;30653:16;;:2;:16;;;30645:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30726:16;30734:7;30726;:16::i;:::-;30725:17;30717:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30788:45;30817:1;30821:2;30825:7;30788:20;:45::i;:::-;30863:1;30846:9;:13;30856:2;30846:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30894:2;30875:7;:16;30883:7;30875:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30939:7;30935:2;30914:33;;30931:1;30914:33;;;;;;;;;;;;30573:382;;:::o;33282:843::-;33403:4;33429:15;:2;:13;;;:15::i;:::-;33425:693;;;33481:2;33465:36;;;33502:12;:10;:12::i;:::-;33516:4;33522:7;33531:5;33465:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33461:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33728:1;33711:6;:13;:18;33707:341;;33754:60;;;;;;;;;;:::i;:::-;;;;;;;;33707:341;33998:6;33992:13;33983:6;33979:2;33975:15;33968:38;33461:602;33598:45;;;33588:55;;;:6;:55;;;;33581:62;;;;;33425:693;34102:4;34095:11;;33282:843;;;;;;;:::o;8496:422::-;8556:4;8764:12;8875:7;8863:20;8855:28;;8909:1;8902:4;:8;8895:15;;;8496:422;;;:::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:126::-;2897:7;2937:42;2930:5;2926:54;2915:65;;2860:126;;;:::o;2992:96::-;3029:7;3058:24;3076:5;3058:24;:::i;:::-;3047:35;;2992:96;;;:::o;3094:122::-;3167:24;3185:5;3167:24;:::i;:::-;3160:5;3157:35;3147:63;;3206:1;3203;3196:12;3147:63;3094:122;:::o;3222:139::-;3268:5;3306:6;3293:20;3284:29;;3322:33;3349:5;3322:33;:::i;:::-;3222:139;;;;:::o;3367:329::-;3426:6;3475:2;3463:9;3454:7;3450:23;3446:32;3443:119;;;3481:79;;:::i;:::-;3443:119;3601:1;3626:53;3671:7;3662:6;3651:9;3647:22;3626:53;:::i;:::-;3616:63;;3572:117;3367:329;;;;:::o;3702:77::-;3739:7;3768:5;3757:16;;3702:77;;;:::o;3785:122::-;3858:24;3876:5;3858:24;:::i;:::-;3851:5;3848:35;3838:63;;3897:1;3894;3887:12;3838:63;3785:122;:::o;3913:139::-;3959:5;3997:6;3984:20;3975:29;;4013:33;4040:5;4013:33;:::i;:::-;3913:139;;;;:::o;4058:329::-;4117:6;4166:2;4154:9;4145:7;4141:23;4137:32;4134:119;;;4172:79;;:::i;:::-;4134:119;4292:1;4317:53;4362:7;4353:6;4342:9;4338:22;4317:53;:::i;:::-;4307:63;;4263:117;4058:329;;;;:::o;4393:118::-;4480:24;4498:5;4480:24;:::i;:::-;4475:3;4468:37;4393:118;;:::o;4517:222::-;4610:4;4648:2;4637:9;4633:18;4625:26;;4661:71;4729:1;4718:9;4714:17;4705:6;4661:71;:::i;:::-;4517:222;;;;:::o;4745:474::-;4813:6;4821;4870:2;4858:9;4849:7;4845:23;4841:32;4838:119;;;4876:79;;:::i;:::-;4838:119;4996:1;5021:53;5066:7;5057:6;5046:9;5042:22;5021:53;:::i;:::-;5011:63;;4967:117;5123:2;5149:53;5194:7;5185:6;5174:9;5170:22;5149:53;:::i;:::-;5139:63;;5094:118;4745:474;;;;;:::o;5225:118::-;5312:24;5330:5;5312:24;:::i;:::-;5307:3;5300:37;5225:118;;:::o;5349:222::-;5442:4;5480:2;5469:9;5465:18;5457:26;;5493:71;5561:1;5550:9;5546:17;5537:6;5493:71;:::i;:::-;5349:222;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:117;6434:1;6431;6424:12;6448:180;6496:77;6493:1;6486:88;6593:4;6590:1;6583:15;6617:4;6614:1;6607:15;6634:281;6717:27;6739:4;6717:27;:::i;:::-;6709:6;6705:40;6847:6;6835:10;6832:22;6811:18;6799:10;6796:34;6793:62;6790:88;;;6858:18;;:::i;:::-;6790:88;6898:10;6894:2;6887:22;6677:238;6634:281;;:::o;6921:129::-;6955:6;6982:20;;:::i;:::-;6972:30;;7011:33;7039:4;7031:6;7011:33;:::i;:::-;6921:129;;;:::o;7056:308::-;7118:4;7208:18;7200:6;7197:30;7194:56;;;7230:18;;:::i;:::-;7194:56;7268:29;7290:6;7268:29;:::i;:::-;7260:37;;7352:4;7346;7342:15;7334:23;;7056:308;;;:::o;7370:146::-;7467:6;7462:3;7457;7444:30;7508:1;7499:6;7494:3;7490:16;7483:27;7370:146;;;:::o;7522:425::-;7600:5;7625:66;7641:49;7683:6;7641:49;:::i;:::-;7625:66;:::i;:::-;7616:75;;7714:6;7707:5;7700:21;7752:4;7745:5;7741:16;7790:3;7781:6;7776:3;7772:16;7769:25;7766:112;;;7797:79;;:::i;:::-;7766:112;7887:54;7934:6;7929:3;7924;7887:54;:::i;:::-;7606:341;7522:425;;;;;:::o;7967:340::-;8023:5;8072:3;8065:4;8057:6;8053:17;8049:27;8039:122;;8080:79;;:::i;:::-;8039:122;8197:6;8184:20;8222:79;8297:3;8289:6;8282:4;8274:6;8270:17;8222:79;:::i;:::-;8213:88;;8029:278;7967:340;;;;:::o;8313:509::-;8382:6;8431:2;8419:9;8410:7;8406:23;8402:32;8399:119;;;8437:79;;:::i;:::-;8399:119;8585:1;8574:9;8570:17;8557:31;8615:18;8607:6;8604:30;8601:117;;;8637:79;;:::i;:::-;8601:117;8742:63;8797:7;8788:6;8777:9;8773:22;8742:63;:::i;:::-;8732:73;;8528:287;8313:509;;;;:::o;8828:116::-;8898:21;8913:5;8898:21;:::i;:::-;8891:5;8888:32;8878:60;;8934:1;8931;8924:12;8878:60;8828:116;:::o;8950:133::-;8993:5;9031:6;9018:20;9009:29;;9047:30;9071:5;9047:30;:::i;:::-;8950:133;;;;:::o;9089:468::-;9154:6;9162;9211:2;9199:9;9190:7;9186:23;9182:32;9179:119;;;9217:79;;:::i;:::-;9179:119;9337:1;9362:53;9407:7;9398:6;9387:9;9383:22;9362:53;:::i;:::-;9352:63;;9308:117;9464:2;9490:50;9532:7;9523:6;9512:9;9508:22;9490:50;:::i;:::-;9480:60;;9435:115;9089:468;;;;;:::o;9563:307::-;9624:4;9714:18;9706:6;9703:30;9700:56;;;9736:18;;:::i;:::-;9700:56;9774:29;9796:6;9774:29;:::i;:::-;9766:37;;9858:4;9852;9848:15;9840:23;;9563:307;;;:::o;9876:423::-;9953:5;9978:65;9994:48;10035:6;9994:48;:::i;:::-;9978:65;:::i;:::-;9969:74;;10066:6;10059:5;10052:21;10104:4;10097:5;10093:16;10142:3;10133:6;10128:3;10124:16;10121:25;10118:112;;;10149:79;;:::i;:::-;10118:112;10239:54;10286:6;10281:3;10276;10239:54;:::i;:::-;9959:340;9876:423;;;;;:::o;10318:338::-;10373:5;10422:3;10415:4;10407:6;10403:17;10399:27;10389:122;;10430:79;;:::i;:::-;10389:122;10547:6;10534:20;10572:78;10646:3;10638:6;10631:4;10623:6;10619:17;10572:78;:::i;:::-;10563:87;;10379:277;10318:338;;;;:::o;10662:943::-;10757:6;10765;10773;10781;10830:3;10818:9;10809:7;10805:23;10801:33;10798:120;;;10837:79;;:::i;:::-;10798:120;10957:1;10982:53;11027:7;11018:6;11007:9;11003:22;10982:53;:::i;:::-;10972:63;;10928:117;11084:2;11110:53;11155:7;11146:6;11135:9;11131:22;11110:53;:::i;:::-;11100:63;;11055:118;11212:2;11238:53;11283:7;11274:6;11263:9;11259:22;11238:53;:::i;:::-;11228:63;;11183:118;11368:2;11357:9;11353:18;11340:32;11399:18;11391:6;11388:30;11385:117;;;11421:79;;:::i;:::-;11385:117;11526:62;11580:7;11571:6;11560:9;11556:22;11526:62;:::i;:::-;11516:72;;11311:287;10662:943;;;;;;;:::o;11611:474::-;11679:6;11687;11736:2;11724:9;11715:7;11711:23;11707:32;11704:119;;;11742:79;;:::i;:::-;11704:119;11862:1;11887:53;11932:7;11923:6;11912:9;11908:22;11887:53;:::i;:::-;11877:63;;11833:117;11989:2;12015:53;12060:7;12051:6;12040:9;12036:22;12015:53;:::i;:::-;12005:63;;11960:118;11611:474;;;;;:::o;12091:180::-;12139:77;12136:1;12129:88;12236:4;12233:1;12226:15;12260:4;12257:1;12250:15;12277:320;12321:6;12358:1;12352:4;12348:12;12338:22;;12405:1;12399:4;12395:12;12426:18;12416:81;;12482:4;12474:6;12470:17;12460:27;;12416:81;12544:2;12536:6;12533:14;12513:18;12510:38;12507:84;;12563:18;;:::i;:::-;12507:84;12328:269;12277:320;;;:::o;12603:225::-;12743:34;12739:1;12731:6;12727:14;12720:58;12812:8;12807:2;12799:6;12795:15;12788:33;12603:225;:::o;12834:366::-;12976:3;12997:67;13061:2;13056:3;12997:67;:::i;:::-;12990:74;;13073:93;13162:3;13073:93;:::i;:::-;13191:2;13186:3;13182:12;13175:19;;12834:366;;;:::o;13206:419::-;13372:4;13410:2;13399:9;13395:18;13387:26;;13459:9;13453:4;13449:20;13445:1;13434:9;13430:17;13423:47;13487:131;13613:4;13487:131;:::i;:::-;13479:139;;13206:419;;;:::o;13631:180::-;13679:77;13676:1;13669:88;13776:4;13773:1;13766:15;13800:4;13797:1;13790:15;13817:194;13857:4;13877:20;13895:1;13877:20;:::i;:::-;13872:25;;13911:20;13929:1;13911:20;:::i;:::-;13906:25;;13955:1;13952;13948:9;13940:17;;13979:1;13973:4;13970:11;13967:37;;;13984:18;;:::i;:::-;13967:37;13817:194;;;;:::o;14017:247::-;14157:34;14153:1;14145:6;14141:14;14134:58;14226:30;14221:2;14213:6;14209:15;14202:55;14017:247;:::o;14270:366::-;14412:3;14433:67;14497:2;14492:3;14433:67;:::i;:::-;14426:74;;14509:93;14598:3;14509:93;:::i;:::-;14627:2;14622:3;14618:12;14611:19;;14270:366;;;:::o;14642:419::-;14808:4;14846:2;14835:9;14831:18;14823:26;;14895:9;14889:4;14885:20;14881:1;14870:9;14866:17;14859:47;14923:131;15049:4;14923:131;:::i;:::-;14915:139;;14642:419;;;:::o;15067:234::-;15207:34;15203:1;15195:6;15191:14;15184:58;15276:17;15271:2;15263:6;15259:15;15252:42;15067:234;:::o;15307:366::-;15449:3;15470:67;15534:2;15529:3;15470:67;:::i;:::-;15463:74;;15546:93;15635:3;15546:93;:::i;:::-;15664:2;15659:3;15655:12;15648:19;;15307:366;;;:::o;15679:419::-;15845:4;15883:2;15872:9;15868:18;15860:26;;15932:9;15926:4;15922:20;15918:1;15907:9;15903:17;15896:47;15960:131;16086:4;15960:131;:::i;:::-;15952:139;;15679:419;;;:::o;16104:231::-;16244:34;16240:1;16232:6;16228:14;16221:58;16313:14;16308:2;16300:6;16296:15;16289:39;16104:231;:::o;16341:366::-;16483:3;16504:67;16568:2;16563:3;16504:67;:::i;:::-;16497:74;;16580:93;16669:3;16580:93;:::i;:::-;16698:2;16693:3;16689:12;16682:19;;16341:366;;;:::o;16713:419::-;16879:4;16917:2;16906:9;16902:18;16894:26;;16966:9;16960:4;16956:20;16952:1;16941:9;16937:17;16930:47;16994:131;17120:4;16994:131;:::i;:::-;16986:139;;16713:419;;;:::o;17138:182::-;17278:34;17274:1;17266:6;17262:14;17255:58;17138:182;:::o;17326:366::-;17468:3;17489:67;17553:2;17548:3;17489:67;:::i;:::-;17482:74;;17565:93;17654:3;17565:93;:::i;:::-;17683:2;17678:3;17674:12;17667:19;;17326:366;;;:::o;17698:419::-;17864:4;17902:2;17891:9;17887:18;17879:26;;17951:9;17945:4;17941:20;17937:1;17926:9;17922:17;17915:47;17979:131;18105:4;17979:131;:::i;:::-;17971:139;;17698:419;;;:::o;18123:220::-;18263:34;18259:1;18251:6;18247:14;18240:58;18332:3;18327:2;18319:6;18315:15;18308:28;18123:220;:::o;18349:366::-;18491:3;18512:67;18576:2;18571:3;18512:67;:::i;:::-;18505:74;;18588:93;18677:3;18588:93;:::i;:::-;18706:2;18701:3;18697:12;18690:19;;18349:366;;;:::o;18721:419::-;18887:4;18925:2;18914:9;18910:18;18902:26;;18974:9;18968:4;18964:20;18960:1;18949:9;18945:17;18938:47;19002:131;19128:4;19002:131;:::i;:::-;18994:139;;18721:419;;;:::o;19146:243::-;19286:34;19282:1;19274:6;19270:14;19263:58;19355:26;19350:2;19342:6;19338:15;19331:51;19146:243;:::o;19395:366::-;19537:3;19558:67;19622:2;19617:3;19558:67;:::i;:::-;19551:74;;19634:93;19723:3;19634:93;:::i;:::-;19752:2;19747:3;19743:12;19736:19;;19395:366;;;:::o;19767:419::-;19933:4;19971:2;19960:9;19956:18;19948:26;;20020:9;20014:4;20010:20;20006:1;19995:9;19991:17;19984:47;20048:131;20174:4;20048:131;:::i;:::-;20040:139;;19767:419;;;:::o;20192:230::-;20332:34;20328:1;20320:6;20316:14;20309:58;20401:13;20396:2;20388:6;20384:15;20377:38;20192:230;:::o;20428:366::-;20570:3;20591:67;20655:2;20650:3;20591:67;:::i;:::-;20584:74;;20667:93;20756:3;20667:93;:::i;:::-;20785:2;20780:3;20776:12;20769:19;;20428:366;;;:::o;20800:419::-;20966:4;21004:2;20993:9;20989:18;20981:26;;21053:9;21047:4;21043:20;21039:1;21028:9;21024:17;21017:47;21081:131;21207:4;21081:131;:::i;:::-;21073:139;;20800:419;;;:::o;21225:231::-;21365:34;21361:1;21353:6;21349:14;21342:58;21434:14;21429:2;21421:6;21417:15;21410:39;21225:231;:::o;21462:366::-;21604:3;21625:67;21689:2;21684:3;21625:67;:::i;:::-;21618:74;;21701:93;21790:3;21701:93;:::i;:::-;21819:2;21814:3;21810:12;21803:19;;21462:366;;;:::o;21834:419::-;22000:4;22038:2;22027:9;22023:18;22015:26;;22087:9;22081:4;22077:20;22073:1;22062:9;22058:17;22051:47;22115:131;22241:4;22115:131;:::i;:::-;22107:139;;21834:419;;;:::o;22259:180::-;22307:77;22304:1;22297:88;22404:4;22401:1;22394:15;22428:4;22425:1;22418:15;22445:141;22494:4;22517:3;22509:11;;22540:3;22537:1;22530:14;22574:4;22571:1;22561:18;22553:26;;22445:141;;;:::o;22592:93::-;22629:6;22676:2;22671;22664:5;22660:14;22656:23;22646:33;;22592:93;;;:::o;22691:107::-;22735:8;22785:5;22779:4;22775:16;22754:37;;22691:107;;;;:::o;22804:393::-;22873:6;22923:1;22911:10;22907:18;22946:97;22976:66;22965:9;22946:97;:::i;:::-;23064:39;23094:8;23083:9;23064:39;:::i;:::-;23052:51;;23136:4;23132:9;23125:5;23121:21;23112:30;;23185:4;23175:8;23171:19;23164:5;23161:30;23151:40;;22880:317;;22804:393;;;;;:::o;23203:60::-;23231:3;23252:5;23245:12;;23203:60;;;:::o;23269:142::-;23319:9;23352:53;23370:34;23379:24;23397:5;23379:24;:::i;:::-;23370:34;:::i;:::-;23352:53;:::i;:::-;23339:66;;23269:142;;;:::o;23417:75::-;23460:3;23481:5;23474:12;;23417:75;;;:::o;23498:269::-;23608:39;23639:7;23608:39;:::i;:::-;23669:91;23718:41;23742:16;23718:41;:::i;:::-;23710:6;23703:4;23697:11;23669:91;:::i;:::-;23663:4;23656:105;23574:193;23498:269;;;:::o;23773:73::-;23818:3;23773:73;:::o;23852:189::-;23929:32;;:::i;:::-;23970:65;24028:6;24020;24014:4;23970:65;:::i;:::-;23905:136;23852:189;;:::o;24047:186::-;24107:120;24124:3;24117:5;24114:14;24107:120;;;24178:39;24215:1;24208:5;24178:39;:::i;:::-;24151:1;24144:5;24140:13;24131:22;;24107:120;;;24047:186;;:::o;24239:543::-;24340:2;24335:3;24332:11;24329:446;;;24374:38;24406:5;24374:38;:::i;:::-;24458:29;24476:10;24458:29;:::i;:::-;24448:8;24444:44;24641:2;24629:10;24626:18;24623:49;;;24662:8;24647:23;;24623:49;24685:80;24741:22;24759:3;24741:22;:::i;:::-;24731:8;24727:37;24714:11;24685:80;:::i;:::-;24344:431;;24329:446;24239:543;;;:::o;24788:117::-;24842:8;24892:5;24886:4;24882:16;24861:37;;24788:117;;;;:::o;24911:169::-;24955:6;24988:51;25036:1;25032:6;25024:5;25021:1;25017:13;24988:51;:::i;:::-;24984:56;25069:4;25063;25059:15;25049:25;;24962:118;24911:169;;;;:::o;25085:295::-;25161:4;25307:29;25332:3;25326:4;25307:29;:::i;:::-;25299:37;;25369:3;25366:1;25362:11;25356:4;25353:21;25345:29;;25085:295;;;;:::o;25385:1395::-;25502:37;25535:3;25502:37;:::i;:::-;25604:18;25596:6;25593:30;25590:56;;;25626:18;;:::i;:::-;25590:56;25670:38;25702:4;25696:11;25670:38;:::i;:::-;25755:67;25815:6;25807;25801:4;25755:67;:::i;:::-;25849:1;25873:4;25860:17;;25905:2;25897:6;25894:14;25922:1;25917:618;;;;26579:1;26596:6;26593:77;;;26645:9;26640:3;26636:19;26630:26;26621:35;;26593:77;26696:67;26756:6;26749:5;26696:67;:::i;:::-;26690:4;26683:81;26552:222;25887:887;;25917:618;25969:4;25965:9;25957:6;25953:22;26003:37;26035:4;26003:37;:::i;:::-;26062:1;26076:208;26090:7;26087:1;26084:14;26076:208;;;26169:9;26164:3;26160:19;26154:26;26146:6;26139:42;26220:1;26212:6;26208:14;26198:24;;26267:2;26256:9;26252:18;26239:31;;26113:4;26110:1;26106:12;26101:17;;26076:208;;;26312:6;26303:7;26300:19;26297:179;;;26370:9;26365:3;26361:19;26355:26;26413:48;26455:4;26447:6;26443:17;26432:9;26413:48;:::i;:::-;26405:6;26398:64;26320:156;26297:179;26522:1;26518;26510:6;26506:14;26502:22;26496:4;26489:36;25924:611;;;25887:887;;25477:1303;;;25385:1395;;:::o;26786:228::-;26926:34;26922:1;26914:6;26910:14;26903:58;26995:11;26990:2;26982:6;26978:15;26971:36;26786:228;:::o;27020:366::-;27162:3;27183:67;27247:2;27242:3;27183:67;:::i;:::-;27176:74;;27259:93;27348:3;27259:93;:::i;:::-;27377:2;27372:3;27368:12;27361:19;;27020:366;;;:::o;27392:419::-;27558:4;27596:2;27585:9;27581:18;27573:26;;27645:9;27639:4;27635:20;27631:1;27620:9;27616:17;27609:47;27673:131;27799:4;27673:131;:::i;:::-;27665:139;;27392:419;;;:::o;27817:229::-;27957:34;27953:1;27945:6;27941:14;27934:58;28026:12;28021:2;28013:6;28009:15;28002:37;27817:229;:::o;28052:366::-;28194:3;28215:67;28279:2;28274:3;28215:67;:::i;:::-;28208:74;;28291:93;28380:3;28291:93;:::i;:::-;28409:2;28404:3;28400:12;28393:19;;28052:366;;;:::o;28424:419::-;28590:4;28628:2;28617:9;28613:18;28605:26;;28677:9;28671:4;28667:20;28663:1;28652:9;28648:17;28641:47;28705:131;28831:4;28705:131;:::i;:::-;28697:139;;28424:419;;;:::o;28849:175::-;28989:27;28985:1;28977:6;28973:14;28966:51;28849:175;:::o;29030:366::-;29172:3;29193:67;29257:2;29252:3;29193:67;:::i;:::-;29186:74;;29269:93;29358:3;29269:93;:::i;:::-;29387:2;29382:3;29378:12;29371:19;;29030:366;;;:::o;29402:419::-;29568:4;29606:2;29595:9;29591:18;29583:26;;29655:9;29649:4;29645:20;29641:1;29630:9;29626:17;29619:47;29683:131;29809:4;29683:131;:::i;:::-;29675:139;;29402:419;;;:::o;29827:234::-;29967:34;29963:1;29955:6;29951:14;29944:58;30036:17;30031:2;30023:6;30019:15;30012:42;29827:234;:::o;30067:366::-;30209:3;30230:67;30294:2;30289:3;30230:67;:::i;:::-;30223:74;;30306:93;30395:3;30306:93;:::i;:::-;30424:2;30419:3;30415:12;30408:19;;30067:366;;;:::o;30439:419::-;30605:4;30643:2;30632:9;30628:18;30620:26;;30692:9;30686:4;30682:20;30678:1;30667:9;30663:17;30656:47;30720:131;30846:4;30720:131;:::i;:::-;30712:139;;30439:419;;;:::o;30864:148::-;30966:11;31003:3;30988:18;;30864:148;;;;:::o;31018:390::-;31124:3;31152:39;31185:5;31152:39;:::i;:::-;31207:89;31289:6;31284:3;31207:89;:::i;:::-;31200:96;;31305:65;31363:6;31358:3;31351:4;31344:5;31340:16;31305:65;:::i;:::-;31395:6;31390:3;31386:16;31379:23;;31128:280;31018:390;;;;:::o;31438:874::-;31541:3;31578:5;31572:12;31607:36;31633:9;31607:36;:::i;:::-;31659:89;31741:6;31736:3;31659:89;:::i;:::-;31652:96;;31779:1;31768:9;31764:17;31795:1;31790:166;;;;31970:1;31965:341;;;;31757:549;;31790:166;31874:4;31870:9;31859;31855:25;31850:3;31843:38;31936:6;31929:14;31922:22;31914:6;31910:35;31905:3;31901:45;31894:52;;31790:166;;31965:341;32032:38;32064:5;32032:38;:::i;:::-;32092:1;32106:154;32120:6;32117:1;32114:13;32106:154;;;32194:7;32188:14;32184:1;32179:3;32175:11;32168:35;32244:1;32235:7;32231:15;32220:26;;32142:4;32139:1;32135:12;32130:17;;32106:154;;;32289:6;32284:3;32280:16;32273:23;;31972:334;;31757:549;;31545:767;;31438:874;;;;:::o;32318:589::-;32543:3;32565:95;32656:3;32647:6;32565:95;:::i;:::-;32558:102;;32677:95;32768:3;32759:6;32677:95;:::i;:::-;32670:102;;32789:92;32877:3;32868:6;32789:92;:::i;:::-;32782:99;;32898:3;32891:10;;32318:589;;;;;;:::o;32913:225::-;33053:34;33049:1;33041:6;33037:14;33030:58;33122:8;33117:2;33109:6;33105:15;33098:33;32913:225;:::o;33144:366::-;33286:3;33307:67;33371:2;33366:3;33307:67;:::i;:::-;33300:74;;33383:93;33472:3;33383:93;:::i;:::-;33501:2;33496:3;33492:12;33485:19;;33144:366;;;:::o;33516:419::-;33682:4;33720:2;33709:9;33705:18;33697:26;;33769:9;33763:4;33759:20;33755:1;33744:9;33740:17;33733:47;33797:131;33923:4;33797:131;:::i;:::-;33789:139;;33516:419;;;:::o;33941:228::-;34081:34;34077:1;34069:6;34065:14;34058:58;34150:11;34145:2;34137:6;34133:15;34126:36;33941:228;:::o;34175:366::-;34317:3;34338:67;34402:2;34397:3;34338:67;:::i;:::-;34331:74;;34414:93;34503:3;34414:93;:::i;:::-;34532:2;34527:3;34523:12;34516:19;;34175:366;;;:::o;34547:419::-;34713:4;34751:2;34740:9;34736:18;34728:26;;34800:9;34794:4;34790:20;34786:1;34775:9;34771:17;34764:47;34828:131;34954:4;34828:131;:::i;:::-;34820:139;;34547:419;;;:::o;34972:223::-;35112:34;35108:1;35100:6;35096:14;35089:58;35181:6;35176:2;35168:6;35164:15;35157:31;34972:223;:::o;35201:366::-;35343:3;35364:67;35428:2;35423:3;35364:67;:::i;:::-;35357:74;;35440:93;35529:3;35440:93;:::i;:::-;35558:2;35553:3;35549:12;35542:19;;35201:366;;;:::o;35573:419::-;35739:4;35777:2;35766:9;35762:18;35754:26;;35826:9;35820:4;35816:20;35812:1;35801:9;35797:17;35790:47;35854:131;35980:4;35854:131;:::i;:::-;35846:139;;35573:419;;;:::o;35998:191::-;36038:3;36057:20;36075:1;36057:20;:::i;:::-;36052:25;;36091:20;36109:1;36091:20;:::i;:::-;36086:25;;36134:1;36131;36127:9;36120:16;;36155:3;36152:1;36149:10;36146:36;;;36162:18;;:::i;:::-;36146:36;35998:191;;;;:::o;36195:233::-;36234:3;36257:24;36275:5;36257:24;:::i;:::-;36248:33;;36303:66;36296:5;36293:77;36290:103;;36373:18;;:::i;:::-;36290:103;36420:1;36413:5;36409:13;36402:20;;36195:233;;;:::o;36434:180::-;36482:77;36479:1;36472:88;36579:4;36576:1;36569:15;36603:4;36600:1;36593:15;36620:185;36660:1;36677:20;36695:1;36677:20;:::i;:::-;36672:25;;36711:20;36729:1;36711:20;:::i;:::-;36706:25;;36750:1;36740:35;;36755:18;;:::i;:::-;36740:35;36797:1;36794;36790:9;36785:14;;36620:185;;;;:::o;36811:176::-;36843:1;36860:20;36878:1;36860:20;:::i;:::-;36855:25;;36894:20;36912:1;36894:20;:::i;:::-;36889:25;;36933:1;36923:35;;36938:18;;:::i;:::-;36923:35;36979:1;36976;36972:9;36967:14;;36811:176;;;;:::o;36993:232::-;37133:34;37129:1;37121:6;37117:14;37110:58;37202:15;37197:2;37189:6;37185:15;37178:40;36993:232;:::o;37231:366::-;37373:3;37394:67;37458:2;37453:3;37394:67;:::i;:::-;37387:74;;37470:93;37559:3;37470:93;:::i;:::-;37588:2;37583:3;37579:12;37572:19;;37231:366;;;:::o;37603:419::-;37769:4;37807:2;37796:9;37792:18;37784:26;;37856:9;37850:4;37846:20;37842:1;37831:9;37827:17;37820:47;37884:131;38010:4;37884:131;:::i;:::-;37876:139;;37603:419;;;:::o;38028:236::-;38168:34;38164:1;38156:6;38152:14;38145:58;38237:19;38232:2;38224:6;38220:15;38213:44;38028:236;:::o;38270:366::-;38412:3;38433:67;38497:2;38492:3;38433:67;:::i;:::-;38426:74;;38509:93;38598:3;38509:93;:::i;:::-;38627:2;38622:3;38618:12;38611:19;;38270:366;;;:::o;38642:419::-;38808:4;38846:2;38835:9;38831:18;38823:26;;38895:9;38889:4;38885:20;38881:1;38870:9;38866:17;38859:47;38923:131;39049:4;38923:131;:::i;:::-;38915:139;;38642:419;;;:::o;39067:180::-;39115:77;39112:1;39105:88;39212:4;39209:1;39202:15;39236:4;39233:1;39226:15;39253:237;39393:34;39389:1;39381:6;39377:14;39370:58;39462:20;39457:2;39449:6;39445:15;39438:45;39253:237;:::o;39496:366::-;39638:3;39659:67;39723:2;39718:3;39659:67;:::i;:::-;39652:74;;39735:93;39824:3;39735:93;:::i;:::-;39853:2;39848:3;39844:12;39837:19;;39496:366;;;:::o;39868:419::-;40034:4;40072:2;40061:9;40057:18;40049:26;;40121:9;40115:4;40111:20;40107:1;40096:9;40092:17;40085:47;40149:131;40275:4;40149:131;:::i;:::-;40141:139;;39868:419;;;:::o;40293:231::-;40433:34;40429:1;40421:6;40417:14;40410:58;40502:14;40497:2;40489:6;40485:15;40478:39;40293:231;:::o;40530:366::-;40672:3;40693:67;40757:2;40752:3;40693:67;:::i;:::-;40686:74;;40769:93;40858:3;40769:93;:::i;:::-;40887:2;40882:3;40878:12;40871:19;;40530:366;;;:::o;40902:419::-;41068:4;41106:2;41095:9;41091:18;41083:26;;41155:9;41149:4;41145:20;41141:1;41130:9;41126:17;41119:47;41183:131;41309:4;41183:131;:::i;:::-;41175:139;;40902:419;;;:::o;41327:182::-;41467:34;41463:1;41455:6;41451:14;41444:58;41327:182;:::o;41515:366::-;41657:3;41678:67;41742:2;41737:3;41678:67;:::i;:::-;41671:74;;41754:93;41843:3;41754:93;:::i;:::-;41872:2;41867:3;41863:12;41856:19;;41515:366;;;:::o;41887:419::-;42053:4;42091:2;42080:9;42076:18;42068:26;;42140:9;42134:4;42130:20;42126:1;42115:9;42111:17;42104:47;42168:131;42294:4;42168:131;:::i;:::-;42160:139;;41887:419;;;:::o;42312:178::-;42452:30;42448:1;42440:6;42436:14;42429:54;42312:178;:::o;42496:366::-;42638:3;42659:67;42723:2;42718:3;42659:67;:::i;:::-;42652:74;;42735:93;42824:3;42735:93;:::i;:::-;42853:2;42848:3;42844:12;42837:19;;42496:366;;;:::o;42868:419::-;43034:4;43072:2;43061:9;43057:18;43049:26;;43121:9;43115:4;43111:20;43107:1;43096:9;43092:17;43085:47;43149:131;43275:4;43149:131;:::i;:::-;43141:139;;42868:419;;;:::o;43293:98::-;43344:6;43378:5;43372:12;43362:22;;43293:98;;;:::o;43397:168::-;43480:11;43514:6;43509:3;43502:19;43554:4;43549:3;43545:14;43530:29;;43397:168;;;;:::o;43571:373::-;43657:3;43685:38;43717:5;43685:38;:::i;:::-;43739:70;43802:6;43797:3;43739:70;:::i;:::-;43732:77;;43818:65;43876:6;43871:3;43864:4;43857:5;43853:16;43818:65;:::i;:::-;43908:29;43930:6;43908:29;:::i;:::-;43903:3;43899:39;43892:46;;43661:283;43571:373;;;;:::o;43950:640::-;44145:4;44183:3;44172:9;44168:19;44160:27;;44197:71;44265:1;44254:9;44250:17;44241:6;44197:71;:::i;:::-;44278:72;44346:2;44335:9;44331:18;44322:6;44278:72;:::i;:::-;44360;44428:2;44417:9;44413:18;44404:6;44360:72;:::i;:::-;44479:9;44473:4;44469:20;44464:2;44453:9;44449:18;44442:48;44507:76;44578:4;44569:6;44507:76;:::i;:::-;44499:84;;43950:640;;;;;;;:::o;44596:141::-;44652:5;44683:6;44677:13;44668:22;;44699:32;44725:5;44699:32;:::i;:::-;44596:141;;;;:::o;44743:349::-;44812:6;44861:2;44849:9;44840:7;44836:23;44832:32;44829:119;;;44867:79;;:::i;:::-;44829:119;44987:1;45012:63;45067:7;45058:6;45047:9;45043:22;45012:63;:::i;:::-;45002:73;;44958:127;44743:349;;;;:::o
Swarm Source
ipfs://e1e72bdc079c29a9fec18fc792973094003330211de32dba912b076dcea94d94
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.