Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 16829081 | 619 days ago | IN | 0 ETH | 0.09263839 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
PlanetDegen
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-03-14 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.7; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } // File: contracts/OperatorFilterer.sol /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); function __initialize_OperatorFilterer(address subscriptionOrRegistrantToCopy, bool subscribe) internal { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from == msg.sender) { _; return; } if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) { revert OperatorNotAllowed(msg.sender); } } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } _; } } // File: contracts/DefaultOperatorFilterer.sol /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); function __initialize_DefaultOperatorFilterer() internal {__initialize_OperatorFilterer(DEFAULT_SUBSCRIPTION, true);} } // File: contracts/Ownable.sol /** * @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. * * Source: openzeppelin */ abstract contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @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() == msg.sender, "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() external virtual onlyOwner { _setOwner(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) external virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) internal { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: Strings.sol /** * Source: Openzeppelin */ /** * @dev String operations. */ library Strings { /** * @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); } } // File: ECDSA.sol // OpenZeppelin Contracts v4.4.0 (utils/cryptography/ECDSA.sol) /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } } // File: Address.sol0 /** * Source: Openzeppelin */ /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } } // File: IERC721Receiver.sol /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: IERC165.sol // https://eips.ethereum.org/EIPS/eip-165 interface IERC165 { /// @notice Query if a contract implements an interface /// @param interfaceID The interface identifier, as specified in ERC-165 /// @dev Interface identification is specified in ERC-165. This function /// uses less than 30,000 gas. /// @return `true` if the contract implements `interfaceID` and /// `interfaceID` is not 0xffffffff, `false` otherwise function supportsInterface(bytes4 interfaceID) external view returns (bool); } // File: IERC2981.sol /** * Source: Openzeppelin */ /** * @dev Interface for the NFT Royalty Standard */ interface IERC2981 is IERC165 { /** * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: ERC165.sol /** * Source: Openzeppelin */ /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: IERC721.sol // https://eips.ethereum.org/EIPS/eip-721, http://erc721.org/ /// @title ERC-721 Non-Fungible Token Standard /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x80ac58cd. interface IERC721 is IERC165 { /// @dev This emits when ownership of any NFT changes by any mechanism. /// This event emits when NFTs are created (`from` == 0) and destroyed /// (`to` == 0). Exception: during contract creation, any number of NFTs /// may be created and assigned without emitting Transfer. At the time of /// any transfer, the approved address for that NFT (if any) is reset to none. event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); /// @dev This emits when the approved address for an NFT is changed or /// reaffirmed. The zero address indicates there is no approved address. /// When a Transfer event emits, this also indicates that the approved /// address for that NFT (if any) is reset to none. event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); /// @dev This emits when an operator is enabled or disabled for an owner. /// The operator can manage all NFTs of the owner. event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); /// @notice Count all NFTs assigned to an owner /// @dev NFTs assigned to the zero address are considered invalid, and this /// function throws for queries about the zero address. /// @param _owner An address for whom to query the balance /// @return The number of NFTs owned by `_owner`, possibly zero function balanceOf(address _owner) external view returns (uint256); /// @notice Find the owner of an NFT /// @dev NFTs assigned to zero address are considered invalid, and queries /// about them do throw. /// @param _tokenId The identifier for an NFT /// @return The address of the owner of the NFT function ownerOf(uint256 _tokenId) external view returns (address); /// @notice Transfers the ownership of an NFT from one address to another address /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. When transfer is complete, this function /// checks if `_to` is a smart contract (code size > 0). If so, it calls /// `onERC721Received` on `_to` and throws if the return value is not /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer /// @param data Additional data with no specified format, sent in call to `_to` function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) external; /// @notice Transfers the ownership of an NFT from one address to another address /// @dev This works identically to the other function with an extra data parameter, /// except this function just sets data to "". /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function safeTransferFrom(address _from, address _to, uint256 _tokenId) external; /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE /// THEY MAY BE PERMANENTLY LOST /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function transferFrom(address _from, address _to, uint256 _tokenId) external; /// @notice Change or reaffirm the approved address for an NFT /// @dev The zero address indicates there is no approved address. /// Throws unless `msg.sender` is the current NFT owner, or an authorized /// operator of the current owner. /// @param _approved The new approved NFT controller /// @param _tokenId The NFT to approve function approve(address _approved, uint256 _tokenId) external; /// @notice Enable or disable approval for a third party ("operator") to manage /// all of `msg.sender`'s assets /// @dev Emits the ApprovalForAll event. The contract MUST allow /// multiple operators per owner. /// @param _operator Address to add to the set of authorized operators /// @param _approved True if the operator is approved, false to revoke approval function setApprovalForAll(address _operator, bool _approved) external; /// @notice Get the approved address for a single NFT /// @dev Throws if `_tokenId` is not a valid NFT. /// @param _tokenId The NFT to find the approved address for /// @return The approved address for this NFT, or the zero address if there is none function getApproved(uint256 _tokenId) external view returns (address); /// @notice Query if an address is an authorized operator for another address /// @param _owner The address that owns the NFTs /// @param _operator The address that acts on behalf of the owner /// @return True if `_operator` is an approved operator for `_owner`, false otherwise function isApprovedForAll(address _owner, address _operator) external view returns (bool); } // File: IERC721Metadata.sol /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: ERC721.sol /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension * Made for efficiancy! */ contract ERC721 is ERC165, IERC721, IERC721Metadata, Ownable, DefaultOperatorFilterer { using Address for address; using Strings for uint256; bool public initialized; uint16 public totalSupply; string public baseURI; // Mapping from token ID to owner address mapping(uint256 => address) internal _owners; // Mapping owner address to token count mapping(address => uint256) internal _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 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) external view 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 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() external pure override returns (string memory) { return "Planet Degen"; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() external pure override returns (string memory) { return "PDEGEN"; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) external view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return string(abi.encodePacked(baseURI, tokenId.toString(), ".json")); } function setBaseURI(string memory uri) external onlyOwner { baseURI = uri; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) external override onlyAllowedOperatorApproval(to) { address owner = _owners[tokenId]; require(to != owner, "ERC721: approval to current owner"); require( msg.sender == owner || isApprovedForAll(owner, msg.sender), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view 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) external override onlyAllowedOperatorApproval(operator) { _setApprovalForAll(msg.sender, operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) external override onlyAllowedOperator(from) { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(msg.sender, 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 ) external override { // modifier already executed by the called contract safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override onlyAllowedOperator(from) { require(_isApprovedOrOwner(msg.sender, 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 */ 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 = _owners[tokenId]; return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @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(uint256 amount, address to, uint tokenId) internal { for (uint i; i < amount;) { unchecked { ++tokenId; ++i; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } unchecked { _balances[to] += amount; totalSupply += uint16(amount); } require( _checkOnERC721Received(address(0), to, tokenId, ""), "ERC721: transfer to non ERC721Receiver implementer" ); // checking it once will make sure that the address can recieve NFTs } /** * @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(_owners[tokenId] == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); // Clear approvals from the previous owner _approve(address(0), tokenId); unchecked { --_balances[from]; ++_balances[to]; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) internal returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } } // File: PlanetDegen.sol contract PlanetDegen is Ownable, IERC2981, ERC721 { bool private _mintingEnabled; uint16 public ogRes; uint private EIP2981RoyaltyPercent; mapping (address => uint8) private amountMinted; function initialize( uint _royalty, uint16 _ogReserve, string memory _baseURI ) external { require(!initialized, "contract already initialized"); _setOwner(msg.sender); __initialize_DefaultOperatorFilterer(); EIP2981RoyaltyPercent = _royalty; baseURI = _baseURI; ogRes = _ogReserve; initialized = true; } function mintFromReserve(uint amount, address to) external onlyOwner { uint tokenId = totalSupply; require(amount + tokenId < 3334); _mint(amount, to, tokenId); } function batchMintFromReserve(uint[] memory amount, address[] memory to) external onlyOwner { uint length = amount.length; require(length == to.length, "array length missmatch"); uint tokenId = totalSupply; uint total; uint cAmount; address cTo; for (uint i; i < length;) { assembly { cAmount := mload(add(add(amount, 0x20), mul(i, 0x20))) cTo := mload(add(add(to, 0x20), mul(i, 0x20))) } unchecked { _balances[cTo] += cAmount; total += cAmount; ++i; } for (uint f; f < cAmount;) { unchecked { ++tokenId; ++f; } _owners[tokenId] = cTo; emit Transfer(address(0), cTo, tokenId); _checkOnERC721Received(address(this), cTo, tokenId, ""); } } require(tokenId < 3334, "Exceeds max supply!"); unchecked { totalSupply += uint16(total); } } function mint(uint amount) external payable { require(_mintingEnabled, "minting disabled"); uint tokenId = totalSupply; require(amount + tokenId < 3334, "Request exceeds max supply!"); require(amount < 3 && amount != 0, "Request exceeds max per txn!"); require(msg.value == amount * 19e15, "ETH Amount is not correct!"); _mint(amount, msg.sender, tokenId); } function wlMint(bytes calldata sig) external payable { require(_mintingEnabled, "minting disabled"); require(_checkSigWL(msg.sender, sig), "User not whitelisted!"); uint tokenId = totalSupply; require(tokenId < uint16(3333) - ogRes, "Request exceeds max supply!"); require(msg.value == 19e15, "ETH Amount is not correct!"); require(amountMinted[msg.sender] == 0); ++amountMinted[msg.sender]; _mint(1, msg.sender, tokenId); } function ogMint(bytes calldata sig, uint256 amount) external payable { require(_mintingEnabled, "minting disabled"); require(_checkSigOG(msg.sender, sig), "User not whitelisted!"); uint tokenId = totalSupply; require(amount + tokenId < 3334, "Request exceeds max supply!"); require(amount + amountMinted[msg.sender] < 3 && amount != 0, "Request exceeds max per wallet!"); require(msg.value == amount * 19e15, "ETH Amount is not correct!"); amountMinted[msg.sender] += uint8(amount); _mint(amount, msg.sender, tokenId); } function _checkSigOG(address _wallet, bytes memory _signature) private view returns(bool) { return ECDSA.recover( ECDSA.toEthSignedMessageHash(_getMsgOG(_wallet)), _signature ) == owner(); } function _checkSigWL(address _wallet, bytes memory _signature) private view returns(bool) { return ECDSA.recover( ECDSA.toEthSignedMessageHash(_getMsgWL(_wallet)), _signature ) == owner(); } function getMsgOG(address _wallet) external pure returns(bytes32) { return _getMsgOG(_wallet); } function getMsgWL(address _wallet) external pure returns(bytes32) { return _getMsgWL(_wallet); } function _getMsgOG(address _wallet) private pure returns(bytes32) { return keccak256(abi.encodePacked(_wallet, uint256(0))); } function _getMsgWL(address _wallet) private pure returns(bytes32) { return keccak256(abi.encodePacked(_wallet, uint256(1))); } function getSalesStatus() external view returns(bool mintingEnabled) { mintingEnabled = _mintingEnabled; } /** * @notice returns royalty info for EIP2981 supporting marketplaces * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint tokenId, uint salePrice) external view override returns(address receiver, uint256 royaltyAmount) { require(_exists(tokenId), "Royality querry for non-existant token!"); return(owner(), salePrice * EIP2981RoyaltyPercent / 10000); } /** * @notice sets the royalty percentage for EIP2981 supporting marketplaces * @dev percentage is in bassis points (parts per 10,000). Example: 5% = 500, 0.5% = 50 * @param amount - percent amount */ function setRoyaltyPercent(uint256 amount) external onlyOwner { EIP2981RoyaltyPercent = amount; } function setOgReserve(uint amount) external onlyOwner { ogRes = uint16(amount); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } function withdraw() onlyOwner external { uint bal = address(this).balance; bool success; (success, ) = payable(0xcFc3166fe136ee2F381e117F61d12621A83a3da3).call{value:bal, gas: 3000}(""); require(success, "Transfer to contract owner failed!"); } function toggleSale() external onlyOwner { _mintingEnabled = !_mintingEnabled; } function tokensOfOwner(address owner) external view returns(uint[] memory) { uint[] memory tokens = new uint[](_balances[owner]); uint y = totalSupply + 1; uint x; for (uint i = 1; i < y;) { if (ownerOf(i) == owner) { tokens[x] = i; unchecked{ ++x; } } unchecked{ ++i; } } return tokens; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amount","type":"uint256[]"},{"internalType":"address[]","name":"to","type":"address[]"}],"name":"batchMintFromReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getMsgOG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getMsgWL","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getSalesStatus","outputs":[{"internalType":"bool","name":"mintingEnabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_royalty","type":"uint256"},{"internalType":"uint16","name":"_ogReserve","type":"uint16"},{"internalType":"string","name":"_baseURI","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mintFromReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ogMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"ogRes","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setOgReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setRoyaltyPercent","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":"pure","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"wlMint","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613fa7806100206000396000f3fe60806040526004361061026a5760003560e01c8063715018a6116101535780639ad5db26116100cb578063c1cfda211161007f578063e985e9c511610064578063e985e9c51461074b578063f2fde38b14610794578063f6d33bcd146107b457600080fd5b8063c1cfda211461070b578063c87b56dd1461072b57600080fd5b8063a22cb465116100b0578063a22cb465146106ab578063adb03e4f146106cb578063b88d4fde146106eb57600080fd5b80639ad5db2614610678578063a0712d681461069857600080fd5b80638b2c92ab1161012257806395d89b411161010757806395d89b41146105f2578063984f3913146106385780639a4fc6401461065857600080fd5b80638b2c92ab146105bc5780638da5cb5b146105d457600080fd5b8063715018a6146105525780637d8966e4146105675780638462151c1461057c57806384ec43c0146105a957600080fd5b80633ccfd60b116101e6578063579665d7116101b55780636352211e1161019a5780636352211e146104fd5780636c0360eb1461051d57806370a082311461053257600080fd5b8063579665d7146104ca578063607019b9146104ea57600080fd5b80633ccfd60b1461045357806341f434341461046857806342842e0e1461048a57806355f804b3146104aa57600080fd5b8063158ef93e1161023d57806323b872dd1161022257806323b872dd146103c65780632a55205a146103e657806334aae2651461042557600080fd5b8063158ef93e1461034d57806318160ddd1461037f57600080fd5b806301ffc9a71461026f57806306fdde03146102a4578063081812fc146102f3578063095ea7b31461032b575b600080fd5b34801561027b57600080fd5b5061028f61028a366004613485565b6107d4565b60405190151581526020015b60405180910390f35b3480156102b057600080fd5b5060408051808201909152600c81527f506c616e657420446567656e000000000000000000000000000000000000000060208201525b60405161029b91906134f9565b3480156102ff57600080fd5b5061031361030e36600461350c565b610830565b6040516001600160a01b03909116815260200161029b565b34801561033757600080fd5b5061034b610346366004613541565b6108db565b005b34801561035957600080fd5b5060005461028f9074010000000000000000000000000000000000000000900460ff1681565b34801561038b57600080fd5b506000546103b3907501000000000000000000000000000000000000000000900461ffff1681565b60405161ffff909116815260200161029b565b3480156103d257600080fd5b5061034b6103e136600461356b565b610b15565b3480156103f257600080fd5b506104066104013660046135a7565b610d12565b604080516001600160a01b03909316835260208301919091520161029b565b34801561043157600080fd5b506104456104403660046135c9565b610dd1565b60405190815260200161029b565b34801561045f57600080fd5b5061034b610ddc565b34801561047457600080fd5b506103136daaeb6d7670e522a718067333cd4e81565b34801561049657600080fd5b5061034b6104a536600461356b565b610f24565b3480156104b657600080fd5b5061034b6104c53660046136bc565b610f44565b3480156104d657600080fd5b506104456104e53660046135c9565b610fb9565b61034b6104f8366004613733565b610fc4565b34801561050957600080fd5b5061031361051836600461350c565b611238565b34801561052957600080fd5b506102e66112c3565b34801561053e57600080fd5b5061044561054d3660046135c9565b611351565b34801561055e57600080fd5b5061034b6113eb565b34801561057357600080fd5b5061034b611460565b34801561058857600080fd5b5061059c6105973660046135c9565b6114fb565b60405161029b919061377f565b61034b6105b73660046137c3565b6115f6565b3480156105c857600080fd5b5060065460ff1661028f565b3480156105e057600080fd5b506000546001600160a01b0316610313565b3480156105fe57600080fd5b5060408051808201909152600681527f50444547454e000000000000000000000000000000000000000000000000000060208201526102e6565b34801561064457600080fd5b5061034b61065336600461389b565b611815565b34801561066457600080fd5b5061034b61067336600461350c565b611a95565b34801561068457600080fd5b5061034b61069336600461350c565b611b03565b61034b6106a636600461350c565b611ba6565b3480156106b757600080fd5b5061034b6106c6366004613962565b611d37565b3480156106d757600080fd5b5061034b6106e6366004613999565b611e2e565b3480156106f757600080fd5b5061034b6107063660046139c5565b611ed9565b34801561071757600080fd5b5061034b610726366004613a41565b6120df565b34801561073757600080fd5b506102e661074636600461350c565b6121e8565b34801561075757600080fd5b5061028f610766366004613aa1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107a057600080fd5b5061034b6107af3660046135c9565b6122a7565b3480156107c057600080fd5b506006546103b390610100900461ffff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061082a575061082a82612398565b92915050565b6000818152600260205260408120546001600160a01b03166108bf5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b156109c7576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610962573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109869190613acb565b6109c7576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108b6565b6000828152600260205260409020546001600160a01b03908116908416819003610a595760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016108b6565b336001600160a01b0382161480610a9357506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b610b055760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108b6565b610b0f848461247b565b50505050565b826daaeb6d7670e522a718067333cd4e3b15610c8b57336001600160a01b03821603610bc757610b453383612501565b610bb75760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108b6565b610bc2848484612606565b610b0f565b6040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610c2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c539190613acb565b610c8b576040517fede71dcc0000000000000000000000000000000000000000000000000000000081523360048201526024016108b6565b610c953383612501565b610d075760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108b6565b610b0f848484612606565b60008281526002602052604081205481906001600160a01b0316610d9e5760405162461bcd60e51b815260206004820152602760248201527f526f79616c6974792071756572727920666f72206e6f6e2d6578697374616e7460448201527f20746f6b656e210000000000000000000000000000000000000000000000000060648201526084016108b6565b6000546001600160a01b031661271060075485610dbb9190613b17565b610dc59190613b5d565b915091505b9250929050565b600061082a826127ce565b33610def6000546001600160a01b031690565b6001600160a01b031614610e455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b6565b604051479060009073cfc3166fe136ee2f381e117f61d12621a83a3da390610bb890849084818181858888f193505050503d8060008114610ea2576040519150601f19603f3d011682016040523d82523d6000602084013e610ea7565b606091505b50508091505080610f205760405162461bcd60e51b815260206004820152602260248201527f5472616e7366657220746f20636f6e7472616374206f776e6572206661696c6560448201527f642100000000000000000000000000000000000000000000000000000000000060648201526084016108b6565b5050565b610f3f83838360405180602001604052806000815250611ed9565b505050565b33610f576000546001600160a01b031690565b6001600160a01b031614610fad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b6565b6001610f208282613c0a565b600061082a82612828565b60065460ff166110165760405162461bcd60e51b815260206004820152601060248201527f6d696e74696e672064697361626c65640000000000000000000000000000000060448201526064016108b6565b6110563384848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061286992505050565b6110a25760405162461bcd60e51b815260206004820152601560248201527f55736572206e6f742077686974656c697374656421000000000000000000000060448201526064016108b6565b6000547501000000000000000000000000000000000000000000900461ffff16610d066110cf8284613d06565b1061111c5760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c7921000000000060448201526064016108b6565b3360009081526008602052604090205460039061113c9060ff1684613d06565b10801561114857508115155b6111945760405162461bcd60e51b815260206004820152601f60248201527f526571756573742065786365656473206d6178207065722077616c6c6574210060448201526064016108b6565b6111a582664380663abb8000613b17565b34146111f35760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f72726563742100000000000060448201526064016108b6565b336000908152600860205260408120805484929061121590849060ff16613d19565b92506101000a81548160ff021916908360ff160217905550610b0f8233836128a1565b6000818152600260205260408120546001600160a01b03168061082a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016108b6565b600180546112d090613b71565b80601f01602080910402602001604051908101604052809291908181526020018280546112fc90613b71565b80156113495780601f1061131e57610100808354040283529160200191611349565b820191906000526020600020905b81548152906001019060200180831161132c57829003601f168201915b505050505081565b60006001600160a01b0382166113cf5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016108b6565b506001600160a01b031660009081526003602052604090205490565b336113fe6000546001600160a01b031690565b6001600160a01b0316146114545760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b6565b61145e6000612a26565b565b336114736000546001600160a01b031690565b6001600160a01b0316146114c95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b6565b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6001600160a01b0381166000908152600360205260408120546060919067ffffffffffffffff811115611530576115306135e4565b604051908082528060200260200182016040528015611559578160200160208202803683370190505b50600080549192509061158a907501000000000000000000000000000000000000000000900461ffff166001613d32565b61ffff169050600060015b828110156115ec57856001600160a01b03166115b082611238565b6001600160a01b0316036115e457808483815181106115d1576115d1613d54565b6020026020010181815250508160010191505b600101611595565b5091949350505050565b60065460ff166116485760405162461bcd60e51b815260206004820152601060248201527f6d696e74696e672064697361626c65640000000000000000000000000000000060448201526064016108b6565b6116883383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a8e92505050565b6116d45760405162461bcd60e51b815260206004820152601560248201527f55736572206e6f742077686974656c697374656421000000000000000000000060448201526064016108b6565b60005460065461ffff750100000000000000000000000000000000000000000090920482169161170c91610100900416610d05613d83565b61ffff16811061175e5760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c7921000000000060448201526064016108b6565b34664380663abb8000146117b45760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f72726563742100000000000060448201526064016108b6565b3360009081526008602052604090205460ff16156117d157600080fd5b33600090815260086020526040812080549091906117f19060ff16613d9e565b91906101000a81548160ff021916908360ff160217905550610f3f600133836128a1565b336118286000546001600160a01b031690565b6001600160a01b03161461187e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b6565b8151815181146118d05760405162461bcd60e51b815260206004820152601660248201527f6172726179206c656e677468206d6973736d617463680000000000000000000060448201526064016108b6565b600080547501000000000000000000000000000000000000000000900461ffff16908080805b858110156119e75760208181028981018201519089018201516001600160a01b03811660009081526003909352604083208054830190559581019590945092506001909101905b838110156119e157600195860160008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03881690811790915590519298939093019288929091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46119db30848860405180602001604052806000815250612aaa565b5061193d565b506118f6565b50610d068410611a395760405162461bcd60e51b815260206004820152601360248201527f45786365656473206d617820737570706c79210000000000000000000000000060448201526064016108b6565b50506000805461ffff75010000000000000000000000000000000000000000008083048216909401169092027fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff90921691909117905550505050565b33611aa86000546001600160a01b031690565b6001600160a01b031614611afe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b6565b600755565b33611b166000546001600160a01b031690565b6001600160a01b031614611b6c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b6565b6006805461ffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff909216919091179055565b60065460ff16611bf85760405162461bcd60e51b815260206004820152601060248201527f6d696e74696e672064697361626c65640000000000000000000000000000000060448201526064016108b6565b6000547501000000000000000000000000000000000000000000900461ffff16610d06611c258284613d06565b10611c725760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c7921000000000060448201526064016108b6565b600382108015611c8157508115155b611ccd5760405162461bcd60e51b815260206004820152601c60248201527f526571756573742065786365656473206d6178207065722074786e210000000060448201526064016108b6565b611cde82664380663abb8000613b17565b3414611d2c5760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f72726563742100000000000060448201526064016108b6565b610f208233836128a1565b816daaeb6d7670e522a718067333cd4e3b15611e23576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de29190613acb565b611e23576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108b6565b610f3f338484612c4b565b33611e416000546001600160a01b031690565b6001600160a01b031614611e975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b6565b6000547501000000000000000000000000000000000000000000900461ffff16610d06611ec48285613d06565b10611ece57600080fd5b610f3f8383836128a1565b836daaeb6d7670e522a718067333cd4e3b1561205057336001600160a01b03821603611f8c57611f093384612501565b611f7b5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108b6565b611f8785858585612d37565b6120d8565b6040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611ff4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120189190613acb565b612050576040517fede71dcc0000000000000000000000000000000000000000000000000000000081523360048201526024016108b6565b61205a3384612501565b6120cc5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108b6565b6120d885858585612d37565b5050505050565b60005474010000000000000000000000000000000000000000900460ff161561214a5760405162461bcd60e51b815260206004820152601c60248201527f636f6e747261637420616c726561647920696e697469616c697a65640000000060448201526064016108b6565b61215333612a26565b61215b612dc0565b6007839055600161216c8282613c0a565b50506006805461ffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff90921691909117905550600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055565b6000818152600260205260409020546060906001600160a01b03166122755760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016108b6565b600161228083612ddf565b604051602001612291929190613dbd565b6040516020818303038152906040529050919050565b336122ba6000546001600160a01b031690565b6001600160a01b0316146123105760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b6565b6001600160a01b03811661238c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108b6565b61239581612a26565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061242b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061082a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461082a565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915581906124c882611238565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661258b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016108b6565b6000828152600260205260409020546001600160a01b039081169084168114806125ce5750836001600160a01b03166125c384610830565b6001600160a01b0316145b806125fe57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b6000818152600260205260409020546001600160a01b038481169116146126955760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016108b6565b6001600160a01b0382166127105760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016108b6565b61271b60008261247b565b6001600160a01b03808416600081815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01905593861680835284832080546001019055858352600290915283822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016821790559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b166020820152600060348201819052906054015b604051602081830303815290604052805190602001209050919050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b1660208201526001603482015260009060540161280b565b600080546001600160a01b031661289061288a612885866127ce565b612f14565b84612f4f565b6001600160a01b0316149392505050565b60005b8381101561292c57600191820160008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03881690811790915590519294939093019284929091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46128a4565b506001600160a01b0382166000908152600360209081526040808320805487019055825461ffff750100000000000000000000000000000000000000000080830482168901909116027fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff909116178355805191820190528181526129b4919084908490612aaa565b610f3f5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108b6565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080546001600160a01b031661289061288a61288586612828565b60006001600160a01b0384163b15612c40576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612b07903390899088908890600401613e8a565b6020604051808303816000875af1925050508015612b42575060408051601f3d908101601f19168201909252612b3f91810190613ec6565b60015b612bf5573d808015612b70576040519150601f19603f3d011682016040523d82523d6000602084013e612b75565b606091505b508051600003612bed5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108b6565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506125fe565b506001949350505050565b816001600160a01b0316836001600160a01b031603612cac5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108b6565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612d42848484612606565b612d4e84848484612aaa565b610b0f5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108b6565b61145e733cc6cdda760b79bafa08df41ecfa224f810dceb66001612f73565b606081600003612e2257505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612e4c5780612e3681613ee3565b9150612e459050600a83613b5d565b9150612e26565b60008167ffffffffffffffff811115612e6757612e676135e4565b6040519080825280601f01601f191660200182016040528015612e91576020820181803683370190505b5090505b84156125fe57612ea6600183613f1b565b9150612eb3600a86613f2e565b612ebe906030613d06565b60f81b818381518110612ed357612ed3613d54565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612f0d600a86613b5d565b9450612e95565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c0161280b565b6000806000612f5e85856130cb565b91509150612f6b81613136565b509392505050565b6daaeb6d7670e522a718067333cd4e3b15610f20578015613019576040517f7d3e3dbe0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015612ffd57600080fd5b505af1158015613011573d6000803e3d6000fd5b505050505050565b6001600160a01b03821615613081576040517fa0af29030000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401612fe3565b6040517f4420e4860000000000000000000000000000000000000000000000000000000081523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401612fe3565b60008082516041036131015760208301516040840151606085015160001a6130f587828585613322565b94509450505050610dca565b825160400361312a576020830151604084015161311f86838361340f565b935093505050610dca565b50600090506002610dca565b600081600481111561314a5761314a613f42565b036131525750565b600181600481111561316657613166613f42565b036131b35760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108b6565b60028160048111156131c7576131c7613f42565b036132145760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108b6565b600381600481111561322857613228613f42565b0361329b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016108b6565b60048160048111156132af576132af613f42565b036123955760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016108b6565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156133595750600090506003613406565b8460ff16601b1415801561337157508460ff16601c14155b156133825750600090506004613406565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156133d6573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166133ff57600060019250925050613406565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b0161344987828885613322565b935093505050935093915050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461239557600080fd5b60006020828403121561349757600080fd5b81356134a281613457565b9392505050565b60005b838110156134c45781810151838201526020016134ac565b50506000910152565b600081518084526134e58160208601602086016134a9565b601f01601f19169290920160200192915050565b6020815260006134a260208301846134cd565b60006020828403121561351e57600080fd5b5035919050565b80356001600160a01b038116811461353c57600080fd5b919050565b6000806040838503121561355457600080fd5b61355d83613525565b946020939093013593505050565b60008060006060848603121561358057600080fd5b61358984613525565b925061359760208501613525565b9150604084013590509250925092565b600080604083850312156135ba57600080fd5b50508035926020909101359150565b6000602082840312156135db57600080fd5b6134a282613525565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561363c5761363c6135e4565b604052919050565b600067ffffffffffffffff83111561365e5761365e6135e4565b6136716020601f19601f86011601613613565b905082815283838301111561368557600080fd5b828260208301376000602084830101529392505050565b600082601f8301126136ad57600080fd5b6134a283833560208501613644565b6000602082840312156136ce57600080fd5b813567ffffffffffffffff8111156136e557600080fd5b6125fe8482850161369c565b60008083601f84011261370357600080fd5b50813567ffffffffffffffff81111561371b57600080fd5b602083019150836020828501011115610dca57600080fd5b60008060006040848603121561374857600080fd5b833567ffffffffffffffff81111561375f57600080fd5b61376b868287016136f1565b909790965060209590950135949350505050565b6020808252825182820181905260009190848201906040850190845b818110156137b75783518352928401929184019160010161379b565b50909695505050505050565b600080602083850312156137d657600080fd5b823567ffffffffffffffff8111156137ed57600080fd5b6137f9858286016136f1565b90969095509350505050565b600067ffffffffffffffff82111561381f5761381f6135e4565b5060051b60200190565b600082601f83011261383a57600080fd5b8135602061384f61384a83613805565b613613565b82815260059290921b8401810191818101908684111561386e57600080fd5b8286015b848110156138905761388381613525565b8352918301918301613872565b509695505050505050565b600080604083850312156138ae57600080fd5b823567ffffffffffffffff808211156138c657600080fd5b818501915085601f8301126138da57600080fd5b813560206138ea61384a83613805565b82815260059290921b8401810191818101908984111561390957600080fd5b948201945b838610156139275785358252948201949082019061390e565b9650508601359250508082111561393d57600080fd5b5061394a85828601613829565b9150509250929050565b801515811461239557600080fd5b6000806040838503121561397557600080fd5b61397e83613525565b9150602083013561398e81613954565b809150509250929050565b600080604083850312156139ac57600080fd5b823591506139bc60208401613525565b90509250929050565b600080600080608085870312156139db57600080fd5b6139e485613525565b93506139f260208601613525565b925060408501359150606085013567ffffffffffffffff811115613a1557600080fd5b8501601f81018713613a2657600080fd5b613a3587823560208401613644565b91505092959194509250565b600080600060608486031215613a5657600080fd5b83359250602084013561ffff81168114613a6f57600080fd5b9150604084013567ffffffffffffffff811115613a8b57600080fd5b613a978682870161369c565b9150509250925092565b60008060408385031215613ab457600080fd5b613abd83613525565b91506139bc60208401613525565b600060208284031215613add57600080fd5b81516134a281613954565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761082a5761082a613ae8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613b6c57613b6c613b2e565b500490565b600181811c90821680613b8557607f821691505b602082108103613bbe577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f821115610f3f57600081815260208120601f850160051c81016020861015613beb5750805b601f850160051c820191505b8181101561301157828155600101613bf7565b815167ffffffffffffffff811115613c2457613c246135e4565b613c3881613c328454613b71565b84613bc4565b602080601f831160018114613c8b5760008415613c555750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613011565b600085815260208120601f198616915b82811015613cba57888601518255948401946001909101908401613c9b565b5085821015613cf657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111561082a5761082a613ae8565b60ff818116838216019081111561082a5761082a613ae8565b61ffff818116838216019080821115613d4d57613d4d613ae8565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b61ffff828116828216039080821115613d4d57613d4d613ae8565b600060ff821660ff8103613db457613db4613ae8565b60010192915050565b6000808454613dcb81613b71565b60018281168015613de35760018114613e1657613e45565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450613e45565b8860005260208060002060005b85811015613e3c5781548a820152908401908201613e23565b50505082870194505b505050508351613e598183602088016134a9565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613ebc60808301846134cd565b9695505050505050565b600060208284031215613ed857600080fd5b81516134a281613457565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f1457613f14613ae8565b5060010190565b8181038181111561082a5761082a613ae8565b600082613f3d57613f3d613b2e565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220fe861f2d515990efe31384c5380f1bb0b6ef6e6913847f3c4dd1c528b15e8fe764736f6c63430008120033
Deployed Bytecode
0x60806040526004361061026a5760003560e01c8063715018a6116101535780639ad5db26116100cb578063c1cfda211161007f578063e985e9c511610064578063e985e9c51461074b578063f2fde38b14610794578063f6d33bcd146107b457600080fd5b8063c1cfda211461070b578063c87b56dd1461072b57600080fd5b8063a22cb465116100b0578063a22cb465146106ab578063adb03e4f146106cb578063b88d4fde146106eb57600080fd5b80639ad5db2614610678578063a0712d681461069857600080fd5b80638b2c92ab1161012257806395d89b411161010757806395d89b41146105f2578063984f3913146106385780639a4fc6401461065857600080fd5b80638b2c92ab146105bc5780638da5cb5b146105d457600080fd5b8063715018a6146105525780637d8966e4146105675780638462151c1461057c57806384ec43c0146105a957600080fd5b80633ccfd60b116101e6578063579665d7116101b55780636352211e1161019a5780636352211e146104fd5780636c0360eb1461051d57806370a082311461053257600080fd5b8063579665d7146104ca578063607019b9146104ea57600080fd5b80633ccfd60b1461045357806341f434341461046857806342842e0e1461048a57806355f804b3146104aa57600080fd5b8063158ef93e1161023d57806323b872dd1161022257806323b872dd146103c65780632a55205a146103e657806334aae2651461042557600080fd5b8063158ef93e1461034d57806318160ddd1461037f57600080fd5b806301ffc9a71461026f57806306fdde03146102a4578063081812fc146102f3578063095ea7b31461032b575b600080fd5b34801561027b57600080fd5b5061028f61028a366004613485565b6107d4565b60405190151581526020015b60405180910390f35b3480156102b057600080fd5b5060408051808201909152600c81527f506c616e657420446567656e000000000000000000000000000000000000000060208201525b60405161029b91906134f9565b3480156102ff57600080fd5b5061031361030e36600461350c565b610830565b6040516001600160a01b03909116815260200161029b565b34801561033757600080fd5b5061034b610346366004613541565b6108db565b005b34801561035957600080fd5b5060005461028f9074010000000000000000000000000000000000000000900460ff1681565b34801561038b57600080fd5b506000546103b3907501000000000000000000000000000000000000000000900461ffff1681565b60405161ffff909116815260200161029b565b3480156103d257600080fd5b5061034b6103e136600461356b565b610b15565b3480156103f257600080fd5b506104066104013660046135a7565b610d12565b604080516001600160a01b03909316835260208301919091520161029b565b34801561043157600080fd5b506104456104403660046135c9565b610dd1565b60405190815260200161029b565b34801561045f57600080fd5b5061034b610ddc565b34801561047457600080fd5b506103136daaeb6d7670e522a718067333cd4e81565b34801561049657600080fd5b5061034b6104a536600461356b565b610f24565b3480156104b657600080fd5b5061034b6104c53660046136bc565b610f44565b3480156104d657600080fd5b506104456104e53660046135c9565b610fb9565b61034b6104f8366004613733565b610fc4565b34801561050957600080fd5b5061031361051836600461350c565b611238565b34801561052957600080fd5b506102e66112c3565b34801561053e57600080fd5b5061044561054d3660046135c9565b611351565b34801561055e57600080fd5b5061034b6113eb565b34801561057357600080fd5b5061034b611460565b34801561058857600080fd5b5061059c6105973660046135c9565b6114fb565b60405161029b919061377f565b61034b6105b73660046137c3565b6115f6565b3480156105c857600080fd5b5060065460ff1661028f565b3480156105e057600080fd5b506000546001600160a01b0316610313565b3480156105fe57600080fd5b5060408051808201909152600681527f50444547454e000000000000000000000000000000000000000000000000000060208201526102e6565b34801561064457600080fd5b5061034b61065336600461389b565b611815565b34801561066457600080fd5b5061034b61067336600461350c565b611a95565b34801561068457600080fd5b5061034b61069336600461350c565b611b03565b61034b6106a636600461350c565b611ba6565b3480156106b757600080fd5b5061034b6106c6366004613962565b611d37565b3480156106d757600080fd5b5061034b6106e6366004613999565b611e2e565b3480156106f757600080fd5b5061034b6107063660046139c5565b611ed9565b34801561071757600080fd5b5061034b610726366004613a41565b6120df565b34801561073757600080fd5b506102e661074636600461350c565b6121e8565b34801561075757600080fd5b5061028f610766366004613aa1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107a057600080fd5b5061034b6107af3660046135c9565b6122a7565b3480156107c057600080fd5b506006546103b390610100900461ffff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061082a575061082a82612398565b92915050565b6000818152600260205260408120546001600160a01b03166108bf5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b156109c7576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610962573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109869190613acb565b6109c7576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108b6565b6000828152600260205260409020546001600160a01b03908116908416819003610a595760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016108b6565b336001600160a01b0382161480610a9357506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b610b055760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108b6565b610b0f848461247b565b50505050565b826daaeb6d7670e522a718067333cd4e3b15610c8b57336001600160a01b03821603610bc757610b453383612501565b610bb75760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108b6565b610bc2848484612606565b610b0f565b6040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610c2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c539190613acb565b610c8b576040517fede71dcc0000000000000000000000000000000000000000000000000000000081523360048201526024016108b6565b610c953383612501565b610d075760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108b6565b610b0f848484612606565b60008281526002602052604081205481906001600160a01b0316610d9e5760405162461bcd60e51b815260206004820152602760248201527f526f79616c6974792071756572727920666f72206e6f6e2d6578697374616e7460448201527f20746f6b656e210000000000000000000000000000000000000000000000000060648201526084016108b6565b6000546001600160a01b031661271060075485610dbb9190613b17565b610dc59190613b5d565b915091505b9250929050565b600061082a826127ce565b33610def6000546001600160a01b031690565b6001600160a01b031614610e455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b6565b604051479060009073cfc3166fe136ee2f381e117f61d12621a83a3da390610bb890849084818181858888f193505050503d8060008114610ea2576040519150601f19603f3d011682016040523d82523d6000602084013e610ea7565b606091505b50508091505080610f205760405162461bcd60e51b815260206004820152602260248201527f5472616e7366657220746f20636f6e7472616374206f776e6572206661696c6560448201527f642100000000000000000000000000000000000000000000000000000000000060648201526084016108b6565b5050565b610f3f83838360405180602001604052806000815250611ed9565b505050565b33610f576000546001600160a01b031690565b6001600160a01b031614610fad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b6565b6001610f208282613c0a565b600061082a82612828565b60065460ff166110165760405162461bcd60e51b815260206004820152601060248201527f6d696e74696e672064697361626c65640000000000000000000000000000000060448201526064016108b6565b6110563384848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061286992505050565b6110a25760405162461bcd60e51b815260206004820152601560248201527f55736572206e6f742077686974656c697374656421000000000000000000000060448201526064016108b6565b6000547501000000000000000000000000000000000000000000900461ffff16610d066110cf8284613d06565b1061111c5760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c7921000000000060448201526064016108b6565b3360009081526008602052604090205460039061113c9060ff1684613d06565b10801561114857508115155b6111945760405162461bcd60e51b815260206004820152601f60248201527f526571756573742065786365656473206d6178207065722077616c6c6574210060448201526064016108b6565b6111a582664380663abb8000613b17565b34146111f35760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f72726563742100000000000060448201526064016108b6565b336000908152600860205260408120805484929061121590849060ff16613d19565b92506101000a81548160ff021916908360ff160217905550610b0f8233836128a1565b6000818152600260205260408120546001600160a01b03168061082a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016108b6565b600180546112d090613b71565b80601f01602080910402602001604051908101604052809291908181526020018280546112fc90613b71565b80156113495780601f1061131e57610100808354040283529160200191611349565b820191906000526020600020905b81548152906001019060200180831161132c57829003601f168201915b505050505081565b60006001600160a01b0382166113cf5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016108b6565b506001600160a01b031660009081526003602052604090205490565b336113fe6000546001600160a01b031690565b6001600160a01b0316146114545760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b6565b61145e6000612a26565b565b336114736000546001600160a01b031690565b6001600160a01b0316146114c95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b6565b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6001600160a01b0381166000908152600360205260408120546060919067ffffffffffffffff811115611530576115306135e4565b604051908082528060200260200182016040528015611559578160200160208202803683370190505b50600080549192509061158a907501000000000000000000000000000000000000000000900461ffff166001613d32565b61ffff169050600060015b828110156115ec57856001600160a01b03166115b082611238565b6001600160a01b0316036115e457808483815181106115d1576115d1613d54565b6020026020010181815250508160010191505b600101611595565b5091949350505050565b60065460ff166116485760405162461bcd60e51b815260206004820152601060248201527f6d696e74696e672064697361626c65640000000000000000000000000000000060448201526064016108b6565b6116883383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a8e92505050565b6116d45760405162461bcd60e51b815260206004820152601560248201527f55736572206e6f742077686974656c697374656421000000000000000000000060448201526064016108b6565b60005460065461ffff750100000000000000000000000000000000000000000090920482169161170c91610100900416610d05613d83565b61ffff16811061175e5760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c7921000000000060448201526064016108b6565b34664380663abb8000146117b45760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f72726563742100000000000060448201526064016108b6565b3360009081526008602052604090205460ff16156117d157600080fd5b33600090815260086020526040812080549091906117f19060ff16613d9e565b91906101000a81548160ff021916908360ff160217905550610f3f600133836128a1565b336118286000546001600160a01b031690565b6001600160a01b03161461187e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b6565b8151815181146118d05760405162461bcd60e51b815260206004820152601660248201527f6172726179206c656e677468206d6973736d617463680000000000000000000060448201526064016108b6565b600080547501000000000000000000000000000000000000000000900461ffff16908080805b858110156119e75760208181028981018201519089018201516001600160a01b03811660009081526003909352604083208054830190559581019590945092506001909101905b838110156119e157600195860160008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03881690811790915590519298939093019288929091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46119db30848860405180602001604052806000815250612aaa565b5061193d565b506118f6565b50610d068410611a395760405162461bcd60e51b815260206004820152601360248201527f45786365656473206d617820737570706c79210000000000000000000000000060448201526064016108b6565b50506000805461ffff75010000000000000000000000000000000000000000008083048216909401169092027fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff90921691909117905550505050565b33611aa86000546001600160a01b031690565b6001600160a01b031614611afe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b6565b600755565b33611b166000546001600160a01b031690565b6001600160a01b031614611b6c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b6565b6006805461ffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff909216919091179055565b60065460ff16611bf85760405162461bcd60e51b815260206004820152601060248201527f6d696e74696e672064697361626c65640000000000000000000000000000000060448201526064016108b6565b6000547501000000000000000000000000000000000000000000900461ffff16610d06611c258284613d06565b10611c725760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c7921000000000060448201526064016108b6565b600382108015611c8157508115155b611ccd5760405162461bcd60e51b815260206004820152601c60248201527f526571756573742065786365656473206d6178207065722074786e210000000060448201526064016108b6565b611cde82664380663abb8000613b17565b3414611d2c5760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f72726563742100000000000060448201526064016108b6565b610f208233836128a1565b816daaeb6d7670e522a718067333cd4e3b15611e23576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de29190613acb565b611e23576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108b6565b610f3f338484612c4b565b33611e416000546001600160a01b031690565b6001600160a01b031614611e975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b6565b6000547501000000000000000000000000000000000000000000900461ffff16610d06611ec48285613d06565b10611ece57600080fd5b610f3f8383836128a1565b836daaeb6d7670e522a718067333cd4e3b1561205057336001600160a01b03821603611f8c57611f093384612501565b611f7b5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108b6565b611f8785858585612d37565b6120d8565b6040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611ff4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120189190613acb565b612050576040517fede71dcc0000000000000000000000000000000000000000000000000000000081523360048201526024016108b6565b61205a3384612501565b6120cc5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108b6565b6120d885858585612d37565b5050505050565b60005474010000000000000000000000000000000000000000900460ff161561214a5760405162461bcd60e51b815260206004820152601c60248201527f636f6e747261637420616c726561647920696e697469616c697a65640000000060448201526064016108b6565b61215333612a26565b61215b612dc0565b6007839055600161216c8282613c0a565b50506006805461ffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff90921691909117905550600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055565b6000818152600260205260409020546060906001600160a01b03166122755760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016108b6565b600161228083612ddf565b604051602001612291929190613dbd565b6040516020818303038152906040529050919050565b336122ba6000546001600160a01b031690565b6001600160a01b0316146123105760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b6565b6001600160a01b03811661238c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108b6565b61239581612a26565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061242b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061082a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461082a565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915581906124c882611238565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661258b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016108b6565b6000828152600260205260409020546001600160a01b039081169084168114806125ce5750836001600160a01b03166125c384610830565b6001600160a01b0316145b806125fe57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b6000818152600260205260409020546001600160a01b038481169116146126955760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016108b6565b6001600160a01b0382166127105760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016108b6565b61271b60008261247b565b6001600160a01b03808416600081815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01905593861680835284832080546001019055858352600290915283822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016821790559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b166020820152600060348201819052906054015b604051602081830303815290604052805190602001209050919050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b1660208201526001603482015260009060540161280b565b600080546001600160a01b031661289061288a612885866127ce565b612f14565b84612f4f565b6001600160a01b0316149392505050565b60005b8381101561292c57600191820160008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03881690811790915590519294939093019284929091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46128a4565b506001600160a01b0382166000908152600360209081526040808320805487019055825461ffff750100000000000000000000000000000000000000000080830482168901909116027fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff909116178355805191820190528181526129b4919084908490612aaa565b610f3f5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108b6565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080546001600160a01b031661289061288a61288586612828565b60006001600160a01b0384163b15612c40576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612b07903390899088908890600401613e8a565b6020604051808303816000875af1925050508015612b42575060408051601f3d908101601f19168201909252612b3f91810190613ec6565b60015b612bf5573d808015612b70576040519150601f19603f3d011682016040523d82523d6000602084013e612b75565b606091505b508051600003612bed5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108b6565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506125fe565b506001949350505050565b816001600160a01b0316836001600160a01b031603612cac5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108b6565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612d42848484612606565b612d4e84848484612aaa565b610b0f5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108b6565b61145e733cc6cdda760b79bafa08df41ecfa224f810dceb66001612f73565b606081600003612e2257505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612e4c5780612e3681613ee3565b9150612e459050600a83613b5d565b9150612e26565b60008167ffffffffffffffff811115612e6757612e676135e4565b6040519080825280601f01601f191660200182016040528015612e91576020820181803683370190505b5090505b84156125fe57612ea6600183613f1b565b9150612eb3600a86613f2e565b612ebe906030613d06565b60f81b818381518110612ed357612ed3613d54565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612f0d600a86613b5d565b9450612e95565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c0161280b565b6000806000612f5e85856130cb565b91509150612f6b81613136565b509392505050565b6daaeb6d7670e522a718067333cd4e3b15610f20578015613019576040517f7d3e3dbe0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015612ffd57600080fd5b505af1158015613011573d6000803e3d6000fd5b505050505050565b6001600160a01b03821615613081576040517fa0af29030000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401612fe3565b6040517f4420e4860000000000000000000000000000000000000000000000000000000081523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401612fe3565b60008082516041036131015760208301516040840151606085015160001a6130f587828585613322565b94509450505050610dca565b825160400361312a576020830151604084015161311f86838361340f565b935093505050610dca565b50600090506002610dca565b600081600481111561314a5761314a613f42565b036131525750565b600181600481111561316657613166613f42565b036131b35760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108b6565b60028160048111156131c7576131c7613f42565b036132145760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108b6565b600381600481111561322857613228613f42565b0361329b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016108b6565b60048160048111156132af576132af613f42565b036123955760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016108b6565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156133595750600090506003613406565b8460ff16601b1415801561337157508460ff16601c14155b156133825750600090506004613406565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156133d6573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166133ff57600060019250925050613406565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b0161344987828885613322565b935093505050935093915050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461239557600080fd5b60006020828403121561349757600080fd5b81356134a281613457565b9392505050565b60005b838110156134c45781810151838201526020016134ac565b50506000910152565b600081518084526134e58160208601602086016134a9565b601f01601f19169290920160200192915050565b6020815260006134a260208301846134cd565b60006020828403121561351e57600080fd5b5035919050565b80356001600160a01b038116811461353c57600080fd5b919050565b6000806040838503121561355457600080fd5b61355d83613525565b946020939093013593505050565b60008060006060848603121561358057600080fd5b61358984613525565b925061359760208501613525565b9150604084013590509250925092565b600080604083850312156135ba57600080fd5b50508035926020909101359150565b6000602082840312156135db57600080fd5b6134a282613525565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561363c5761363c6135e4565b604052919050565b600067ffffffffffffffff83111561365e5761365e6135e4565b6136716020601f19601f86011601613613565b905082815283838301111561368557600080fd5b828260208301376000602084830101529392505050565b600082601f8301126136ad57600080fd5b6134a283833560208501613644565b6000602082840312156136ce57600080fd5b813567ffffffffffffffff8111156136e557600080fd5b6125fe8482850161369c565b60008083601f84011261370357600080fd5b50813567ffffffffffffffff81111561371b57600080fd5b602083019150836020828501011115610dca57600080fd5b60008060006040848603121561374857600080fd5b833567ffffffffffffffff81111561375f57600080fd5b61376b868287016136f1565b909790965060209590950135949350505050565b6020808252825182820181905260009190848201906040850190845b818110156137b75783518352928401929184019160010161379b565b50909695505050505050565b600080602083850312156137d657600080fd5b823567ffffffffffffffff8111156137ed57600080fd5b6137f9858286016136f1565b90969095509350505050565b600067ffffffffffffffff82111561381f5761381f6135e4565b5060051b60200190565b600082601f83011261383a57600080fd5b8135602061384f61384a83613805565b613613565b82815260059290921b8401810191818101908684111561386e57600080fd5b8286015b848110156138905761388381613525565b8352918301918301613872565b509695505050505050565b600080604083850312156138ae57600080fd5b823567ffffffffffffffff808211156138c657600080fd5b818501915085601f8301126138da57600080fd5b813560206138ea61384a83613805565b82815260059290921b8401810191818101908984111561390957600080fd5b948201945b838610156139275785358252948201949082019061390e565b9650508601359250508082111561393d57600080fd5b5061394a85828601613829565b9150509250929050565b801515811461239557600080fd5b6000806040838503121561397557600080fd5b61397e83613525565b9150602083013561398e81613954565b809150509250929050565b600080604083850312156139ac57600080fd5b823591506139bc60208401613525565b90509250929050565b600080600080608085870312156139db57600080fd5b6139e485613525565b93506139f260208601613525565b925060408501359150606085013567ffffffffffffffff811115613a1557600080fd5b8501601f81018713613a2657600080fd5b613a3587823560208401613644565b91505092959194509250565b600080600060608486031215613a5657600080fd5b83359250602084013561ffff81168114613a6f57600080fd5b9150604084013567ffffffffffffffff811115613a8b57600080fd5b613a978682870161369c565b9150509250925092565b60008060408385031215613ab457600080fd5b613abd83613525565b91506139bc60208401613525565b600060208284031215613add57600080fd5b81516134a281613954565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761082a5761082a613ae8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613b6c57613b6c613b2e565b500490565b600181811c90821680613b8557607f821691505b602082108103613bbe577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f821115610f3f57600081815260208120601f850160051c81016020861015613beb5750805b601f850160051c820191505b8181101561301157828155600101613bf7565b815167ffffffffffffffff811115613c2457613c246135e4565b613c3881613c328454613b71565b84613bc4565b602080601f831160018114613c8b5760008415613c555750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613011565b600085815260208120601f198616915b82811015613cba57888601518255948401946001909101908401613c9b565b5085821015613cf657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111561082a5761082a613ae8565b60ff818116838216019081111561082a5761082a613ae8565b61ffff818116838216019080821115613d4d57613d4d613ae8565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b61ffff828116828216039080821115613d4d57613d4d613ae8565b600060ff821660ff8103613db457613db4613ae8565b60010192915050565b6000808454613dcb81613b71565b60018281168015613de35760018114613e1657613e45565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450613e45565b8860005260208060002060005b85811015613e3c5781548a820152908401908201613e23565b50505082870194505b505050508351613e598183602088016134a9565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613ebc60808301846134cd565b9695505050505050565b600060208284031215613ed857600080fd5b81516134a281613457565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f1457613f14613ae8565b5060010190565b8181038181111561082a5761082a613ae8565b600082613f3d57613f3d613b2e565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220fe861f2d515990efe31384c5380f1bb0b6ef6e6913847f3c4dd1c528b15e8fe764736f6c63430008120033
Deployed Bytecode Sourcemap
38135:7081:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44134:241;;;;;;;;;;-1:-1:-1;44134:241:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;44134:241:0;;;;;;;;28937:103;;;;;;;;;;-1:-1:-1;29011:21:0;;;;;;;;;;;;;;;;;28937:103;;;;;;;:::i;30190:213::-;;;;;;;;;;-1:-1:-1;30190:213:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1802:55:1;;;1784:74;;1772:2;1757:18;30190:213:0;1638:226:1;29698:426:0;;;;;;;;;;-1:-1:-1;29698:426:0;;;;;:::i;:::-;;:::i;:::-;;27403:23;;;;;;;;;;-1:-1:-1;27403:23:0;;;;;;;;;;;27439:25;;;;;;;;;;-1:-1:-1;27439:25:0;;;;;;;;;;;;;;2503:6:1;2491:19;;;2473:38;;2461:2;2446:18;27439:25:0;2329:188:1;30954:357:0;;;;;;;;;;-1:-1:-1;30954:357:0;;;;;:::i;:::-;;:::i;43318:279::-;;;;;;;;;;-1:-1:-1;43318:279:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3300:55:1;;;3282:74;;3387:2;3372:18;;3365:34;;;;3255:18;43318:279:0;3108:297:1;42171:110:0;;;;;;;;;;-1:-1:-1;42171:110:0;;;;;:::i;:::-;;:::i;:::-;;;3747:25:1;;;3735:2;3720:18;42171:110:0;3601:177:1;44383:295:0;;;;;;;;;;;;;:::i;2839:143::-;;;;;;;;;;;;2939:42;2839:143;;31382:231;;;;;;;;;;-1:-1:-1;31382:231:0;;;;;:::i;:::-;;:::i;29546:90::-;;;;;;;;;;-1:-1:-1;29546:90:0;;;;;:::i;:::-;;:::i;42289:110::-;;;;;;;;;;-1:-1:-1;42289:110:0;;;;;:::i;:::-;;:::i;41070:599::-;;;;;;:::i;:::-;;:::i;28639:231::-;;;;;;;;;;-1:-1:-1;28639:231:0;;;;;:::i;:::-;;:::i;27473:21::-;;;;;;;;;;;;;:::i;28375:202::-;;;;;;;;;;-1:-1:-1;28375:202:0;;;;;:::i;:::-;;:::i;7064:96::-;;;;;;;;;;;;;:::i;44686:94::-;;;;;;;;;;;;;:::i;44788:425::-;;;;;;;;;;-1:-1:-1;44788:425:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;40559:503::-;;;;;;:::i;:::-;;:::i;42703:120::-;;;;;;;;;;-1:-1:-1;42800:15:0;;;;42703:120;;6415:87;;;;;;;;;;-1:-1:-1;6461:7:0;6488:6;-1:-1:-1;;;;;6488:6:0;6415:87;;29109:99;;;;;;;;;;-1:-1:-1;29185:15:0;;;;;;;;;;;;;;;;;29109:99;;38970:1152;;;;;;;;;;-1:-1:-1;38970:1152:0;;;;;:::i;:::-;;:::i;43848:111::-;;;;;;;;;;-1:-1:-1;43848:111:0;;;;;:::i;:::-;;:::i;43967:95::-;;;;;;;;;;-1:-1:-1;43967:95:0;;;;;:::i;:::-;;:::i;40130:421::-;;;;;;:::i;:::-;;:::i;30475:185::-;;;;;;;;;;-1:-1:-1;30475:185:0;;;;;:::i;:::-;;:::i;38768:194::-;;;;;;;;;;-1:-1:-1;38768:194:0;;;;;:::i;:::-;;:::i;31684:344::-;;;;;;;;;;-1:-1:-1;31684:344:0;;;;;:::i;:::-;;:::i;38356:404::-;;;;;;;;;;-1:-1:-1;38356:404:0;;;;;:::i;:::-;;:::i;29279:259::-;;;;;;;;;;-1:-1:-1;29279:259:0;;;;;:::i;:::-;;:::i;30731:156::-;;;;;;;;;;-1:-1:-1;30731:156:0;;;;;:::i;:::-;-1:-1:-1;;;;;30844:25:0;;;30820:4;30844:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30731:156;7315:194;;;;;;;;;;-1:-1:-1;7315:194:0;;;;;:::i;:::-;;:::i;38231:19::-;;;;;;;;;;-1:-1:-1;38231:19:0;;;;;;;;;;;44134:241;44236:4;44273:41;;;44288:26;44273:41;;:94;;;44331:36;44355:11;44331:23;:36::i;:::-;44253:114;44134:241;-1:-1:-1;;44134:241:0:o;30190:213::-;30258:7;33558:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33558:16:0;30278:73;;;;-1:-1:-1;;;30278:73:0;;12067:2:1;30278:73:0;;;12049:21:1;12106:2;12086:18;;;12079:30;12145:34;12125:18;;;12118:62;12216:14;12196:18;;;12189:42;12248:19;;30278:73:0;;;;;;;;;-1:-1:-1;30371:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30371:24:0;;30190:213::o;29698:426::-;29790:2;2939:42;4869:45;:49;4865:225;;4940:67;;;;;4991:4;4940:67;;;12513:34:1;-1:-1:-1;;;;;12583:15:1;;12563:18;;;12556:43;2939:42:0;;4940;;12425:18:1;;4940:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4935:144;;5035:28;;;;;-1:-1:-1;;;;;1802:55:1;;5035:28:0;;;1784:74:1;1757:18;;5035:28:0;1638:226:1;4935:144:0;29805:13:::1;29821:16:::0;;;:7:::1;:16;::::0;;;;;-1:-1:-1;;;;;29821:16:0;;::::1;::::0;29856:11;::::1;::::0;;;29848:57:::1;;;::::0;-1:-1:-1;;;29848:57:0;;13062:2:1;29848:57:0::1;::::0;::::1;13044:21:1::0;13101:2;13081:18;;;13074:30;13140:34;13120:18;;;13113:62;13211:3;13191:18;;;13184:31;13232:19;;29848:57:0::1;12860:397:1::0;29848:57:0::1;29940:10;-1:-1:-1::0;;;;;29940:19:0;::::1;;::::0;:58:::1;;-1:-1:-1::0;;;;;;30844:25:0;;30820:4;30844:25;;;:18;:25;;;;;;;;29987:10:::1;30844:35:::0;;;;;;;;;;29963::::1;29918:164;;;::::0;-1:-1:-1;;;29918:164:0;;13464:2:1;29918:164:0::1;::::0;::::1;13446:21:1::0;13503:2;13483:18;;;13476:30;13542:34;13522:18;;;13515:62;13613:26;13593:18;;;13586:54;13657:19;;29918:164:0::1;13262:420:1::0;29918:164:0::1;30095:21;30104:2;30108:7;30095:8;:21::i;:::-;29794:330;29698:426:::0;;;:::o;30954:357::-;31091:4;2939:42;4123:45;:49;4119:539;;4412:10;-1:-1:-1;;;;;4404:18:0;;;4400:85;;31169:39:::1;31188:10;31200:7;31169:18;:39::i;:::-;31161:101;;;::::0;-1:-1:-1;;;31161:101:0;;13889:2:1;31161:101:0::1;::::0;::::1;13871:21:1::0;13928:2;13908:18;;;13901:30;13967:34;13947:18;;;13940:62;14038:19;14018:18;;;14011:47;14075:19;;31161:101:0::1;13687:413:1::0;31161:101:0::1;31275:28;31285:4;31291:2;31295:7;31275:9;:28::i;:::-;4463:7:::0;;4400:85;4504:69;;;;;4555:4;4504:69;;;12513:34:1;4562:10:0;12563:18:1;;;12556:43;2939:42:0;;4504;;12425:18:1;;4504:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4499:148;;4601:30;;;;;4620:10;4601:30;;;1784:74:1;1757:18;;4601:30:0;1638:226:1;4499:148:0;31169:39:::1;31188:10;31200:7;31169:18;:39::i;:::-;31161:101;;;::::0;-1:-1:-1;;;31161:101:0;;13889:2:1;31161:101:0::1;::::0;::::1;13871:21:1::0;13928:2;13908:18;;;13901:30;13967:34;13947:18;;;13940:62;14038:19;14018:18;;;14011:47;14075:19;;31161:101:0::1;13687:413:1::0;31161:101:0::1;31275:28;31285:4;31291:2;31295:7;31275:9;:28::i;43318:279::-:0;43400:16;33558;;;:7;:16;;;;;;43400;;-1:-1:-1;;;;;33558:16:0;43452:68;;;;-1:-1:-1;;;43452:68:0;;14307:2:1;43452:68:0;;;14289:21:1;14346:2;14326:18;;;14319:30;14385:34;14365:18;;;14358:62;14456:9;14436:18;;;14429:37;14483:19;;43452:68:0;14105:403:1;43452:68:0;6461:7;6488:6;-1:-1:-1;;;;;6488:6:0;43583:5;43559:21;;43547:9;:33;;;;:::i;:::-;:41;;;;:::i;:::-;43531:58;;;;43318:279;;;;;;:::o;42171:110::-;42228:7;42255:18;42265:7;42255:9;:18::i;44383:295::-;6646:10;6635:7;6461;6488:6;-1:-1:-1;;;;;6488:6:0;;6415:87;6635:7;-1:-1:-1;;;;;6635:21:0;;6627:66;;;;-1:-1:-1;;;6627:66:0;;15391:2:1;6627:66:0;;;15373:21:1;;;15410:18;;;15403:30;15469:34;15449:18;;;15442:62;15521:18;;6627:66:0;15189:356:1;6627:66:0;44513:82:::1;::::0;44444:21:::1;::::0;44433:8:::1;::::0;44521:42:::1;::::0;44586:4:::1;::::0;44444:21;;44433:8;44513:82;44433:8;44513:82;44444:21;44521:42;44586:4;44513:82:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44499:96;;;;;44614:7;44606:54;;;::::0;-1:-1:-1;;;44606:54:0;;15962:2:1;44606:54:0::1;::::0;::::1;15944:21:1::0;16001:2;15981:18;;;15974:30;16040:34;16020:18;;;16013:62;16111:4;16091:18;;;16084:32;16133:19;;44606:54:0::1;15760:398:1::0;44606:54:0::1;44422:256;;44383:295::o:0;31382:231::-;31566:39;31583:4;31589:2;31593:7;31566:39;;;;;;;;;;;;:16;:39::i;:::-;31382:231;;;:::o;29546:90::-;6646:10;6635:7;6461;6488:6;-1:-1:-1;;;;;6488:6:0;;6415:87;6635:7;-1:-1:-1;;;;;6635:21:0;;6627:66;;;;-1:-1:-1;;;6627:66:0;;15391:2:1;6627:66:0;;;15373:21:1;;;15410:18;;;15403:30;15469:34;15449:18;;;15442:62;15521:18;;6627:66:0;15189:356:1;6627:66:0;29615:7:::1;:13;29625:3:::0;29615:7;:13:::1;:::i;42289:110::-:0;42346:7;42373:18;42383:7;42373:9;:18::i;41070:599::-;41158:15;;;;41150:44;;;;-1:-1:-1;;;41150:44:0;;19190:2:1;41150:44:0;;;19172:21:1;19229:2;19209:18;;;19202:30;19268:18;19248;;;19241:46;19304:18;;41150:44:0;18988:340:1;41150:44:0;41213:28;41225:10;41237:3;;41213:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41213:11:0;;-1:-1:-1;;;41213:28:0:i;:::-;41205:62;;;;-1:-1:-1;;;41205:62:0;;19535:2:1;41205:62:0;;;19517:21:1;19574:2;19554:18;;;19547:30;19613:23;19593:18;;;19586:51;19654:18;;41205:62:0;19333:345:1;41205:62:0;41278:12;41293:11;;;;;;41342:4;41323:16;41293:11;41323:6;:16;:::i;:::-;:23;41315:63;;;;-1:-1:-1;;;41315:63:0;;20015:2:1;41315:63:0;;;19997:21:1;20054:2;20034:18;;;20027:30;20093:29;20073:18;;;20066:57;20140:18;;41315:63:0;19813:351:1;41315:63:0;41419:10;41406:24;;;;:12;:24;;;;;;41433:1;;41397:33;;41406:24;;41397:6;:33;:::i;:::-;:37;:52;;;;-1:-1:-1;41438:11:0;;;41397:52;41389:96;;;;-1:-1:-1;;;41389:96:0;;20371:2:1;41389:96:0;;;20353:21:1;20410:2;20390:18;;;20383:30;20449:33;20429:18;;;20422:61;20500:18;;41389:96:0;20169:355:1;41389:96:0;41517:14;:6;41526:5;41517:14;:::i;:::-;41504:9;:27;41496:66;;;;-1:-1:-1;;;41496:66:0;;20731:2:1;41496:66:0;;;20713:21:1;20770:2;20750:18;;;20743:30;20809:28;20789:18;;;20782:56;20855:18;;41496:66:0;20529:350:1;41496:66:0;41588:10;41575:24;;;;:12;:24;;;;;:41;;41609:6;;41575:24;:41;;41609:6;;41575:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41627:34;41633:6;41641:10;41653:7;41627:5;:34::i;28639:231::-;28703:7;28739:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28739:16:0;;28766:73;;;;-1:-1:-1;;;28766:73:0;;21239:2:1;28766:73:0;;;21221:21:1;21278:2;21258:18;;;21251:30;21317:34;21297:18;;;21290:62;21388:11;21368:18;;;21361:39;21417:19;;28766:73:0;21037:405:1;27473:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28375:202::-;28441:7;-1:-1:-1;;;;;28469:19:0;;28461:74;;;;-1:-1:-1;;;28461:74:0;;21649:2:1;28461:74:0;;;21631:21:1;21688:2;21668:18;;;21661:30;21727:34;21707:18;;;21700:62;21798:12;21778:18;;;21771:40;21828:19;;28461:74:0;21447:406:1;28461:74:0;-1:-1:-1;;;;;;28553:16:0;;;;;:9;:16;;;;;;;28375:202::o;7064:96::-;6646:10;6635:7;6461;6488:6;-1:-1:-1;;;;;6488:6:0;;6415:87;6635:7;-1:-1:-1;;;;;6635:21:0;;6627:66;;;;-1:-1:-1;;;6627:66:0;;15391:2:1;6627:66:0;;;15373:21:1;;;15410:18;;;15403:30;15469:34;15449:18;;;15442:62;15521:18;;6627:66:0;15189:356:1;6627:66:0;7131:21:::1;7149:1;7131:9;:21::i;:::-;7064:96::o:0;44686:94::-;6646:10;6635:7;6461;6488:6;-1:-1:-1;;;;;6488:6:0;;6415:87;6635:7;-1:-1:-1;;;;;6635:21:0;;6627:66;;;;-1:-1:-1;;;6627:66:0;;15391:2:1;6627:66:0;;;15373:21:1;;;15410:18;;;15403:30;15469:34;15449:18;;;15442:62;15521:18;;6627:66:0;15189:356:1;6627:66:0;44757:15:::1;::::0;;44738:34;;::::1;44757:15;::::0;;::::1;44756:16;44738:34;::::0;;44686:94::o;44788:425::-;-1:-1:-1;;;;;44908:16:0;;44874:20;44908:16;;;:9;:16;;;;;;44848:13;;44874:20;44897:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44897:28:0;-1:-1:-1;44936:6:0;44945:11;;44874:51;;-1:-1:-1;44936:6:0;44945:15;;:11;;;;;44959:1;44945:15;:::i;:::-;44936:24;;;-1:-1:-1;44971:6:0;45004:1;44990:190;45011:1;45007;:5;44990:190;;;45048:5;-1:-1:-1;;;;;45034:19:0;:10;45042:1;45034:7;:10::i;:::-;-1:-1:-1;;;;;45034:19:0;;45030:108;;45086:1;45074:6;45081:1;45074:9;;;;;;;;:::i;:::-;;;;;;:13;;;;;45117:3;;;;;45030:108;45163:3;;44990:190;;;-1:-1:-1;45199:6:0;;44788:425;-1:-1:-1;;;;44788:425:0:o;40559:503::-;40631:15;;;;40623:44;;;;-1:-1:-1;;;40623:44:0;;19190:2:1;40623:44:0;;;19172:21:1;19229:2;19209:18;;;19202:30;19268:18;19248;;;19241:46;19304:18;;40623:44:0;18988:340:1;40623:44:0;40686:28;40698:10;40710:3;;40686:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40686:11:0;;-1:-1:-1;;;40686:28:0:i;:::-;40678:62;;;;-1:-1:-1;;;40678:62:0;;19535:2:1;40678:62:0;;;19517:21:1;19574:2;19554:18;;;19547:30;19613:23;19593:18;;;19586:51;19654:18;;40678:62:0;19333:345:1;40678:62:0;40751:12;40766:11;40821:5;;40766:11;;;;;;;;40806:20;;40766:11;40821:5;;;40813:4;40806:20;:::i;:::-;40796:30;;:7;:30;40788:70;;;;-1:-1:-1;;;40788:70:0;;20015:2:1;40788:70:0;;;19997:21:1;20054:2;20034:18;;;20027:30;20093:29;20073:18;;;20066:57;20140:18;;40788:70:0;19813:351:1;40788:70:0;40877:9;40890:5;40877:18;40869:57;;;;-1:-1:-1;;;40869:57:0;;20731:2:1;40869:57:0;;;20713:21:1;20770:2;20750:18;;;20743:30;20809:28;20789:18;;;20782:56;20855:18;;40869:57:0;20529:350:1;40869:57:0;40958:10;40945:24;;;;:12;:24;;;;;;;;:29;40937:38;;;;;;41003:10;40990:24;;;;:12;:24;;;;;40988:26;;40990:24;;;40988:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41025:29;41031:1;41034:10;41046:7;41025:5;:29::i;38970:1152::-;6646:10;6635:7;6461;6488:6;-1:-1:-1;;;;;6488:6:0;;6415:87;6635:7;-1:-1:-1;;;;;6635:21:0;;6627:66;;;;-1:-1:-1;;;6627:66:0;;15391:2:1;6627:66:0;;;15373:21:1;;;15410:18;;;15403:30;15469:34;15449:18;;;15442:62;15521:18;;6627:66:0;15189:356:1;6627:66:0;39087:13;;39129:9;;39119:19;::::1;39111:54;;;::::0;-1:-1:-1;;;39111:54:0;;22778:2:1;39111:54:0::1;::::0;::::1;22760:21:1::0;22817:2;22797:18;;;22790:30;22856:24;22836:18;;;22829:52;22898:18;;39111:54:0::1;22576:346:1::0;39111:54:0::1;39178:12;39193:11:::0;;;;::::1;;;::::0;39178:12;;;39285:716:::1;39302:6;39298:1;:10;39285:716;;;39403:4;39396:12:::0;;::::1;39373:36:::0;;;;;39367:43;39441:32;;;;;39435:39;-1:-1:-1;;;;;39534:14:0;::::1;;::::0;;;:9:::1;:14:::0;;;;;;:25;;;::::1;::::0;;39578:16;;::::1;::::0;39367:43;;-1:-1:-1;39435:39:0;-1:-1:-1;;39613:3:0;;::::1;::::0;39648:342:::1;39665:7;39661:1;:11;39648:342;;;39745:9;::::0;;::::1;39820:16;::::0;;;:7:::1;:16;::::0;;;;;:22;;;::::1;-1:-1:-1::0;;;;;39820:22:0;::::1;::::0;;::::1;::::0;;;39866:34;;39745:9;;39777:3;;;::::1;::::0;39745:9;;39820:22;;:16;39866:34:::1;::::0;39820:16;;39866:34:::1;39919:55;39950:4;39957:3;39962:7;39919:55;;;;;;;;;;;::::0;:22:::1;:55::i;:::-;;39648:342;;;;39285:716;;;;40031:4;40021:7;:14;40013:46;;;::::0;-1:-1:-1;;;40013:46:0;;23129:2:1;40013:46:0::1;::::0;::::1;23111:21:1::0;23168:2;23148:18;;;23141:30;23207:21;23187:18;;;23180:49;23246:18;;40013:46:0::1;22927:343:1::0;40013:46:0::1;-1:-1:-1::0;;40084:11:0::1;:28:::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;38970:1152:0:o;43848:111::-;6646:10;6635:7;6461;6488:6;-1:-1:-1;;;;;6488:6:0;;6415:87;6635:7;-1:-1:-1;;;;;6635:21:0;;6627:66;;;;-1:-1:-1;;;6627:66:0;;15391:2:1;6627:66:0;;;15373:21:1;;;15410:18;;;15403:30;15469:34;15449:18;;;15442:62;15521:18;;6627:66:0;15189:356:1;6627:66:0;43921:21:::1;:30:::0;43848:111::o;43967:95::-;6646:10;6635:7;6461;6488:6;-1:-1:-1;;;;;6488:6:0;;6415:87;6635:7;-1:-1:-1;;;;;6635:21:0;;6627:66;;;;-1:-1:-1;;;6627:66:0;;15391:2:1;6627:66:0;;;15373:21:1;;;15410:18;;;15403:30;15469:34;15449:18;;;15442:62;15521:18;;6627:66:0;15189:356:1;6627:66:0;44032:5:::1;:22:::0;;::::1;::::0;;::::1;;;::::0;;;::::1;::::0;;;::::1;::::0;;43967:95::o;40130:421::-;40193:15;;;;40185:44;;;;-1:-1:-1;;;40185:44:0;;19190:2:1;40185:44:0;;;19172:21:1;19229:2;19209:18;;;19202:30;19268:18;19248;;;19241:46;19304:18;;40185:44:0;18988:340:1;40185:44:0;40240:12;40255:11;;;;;;40304:4;40285:16;40255:11;40285:6;:16;:::i;:::-;:23;40277:63;;;;-1:-1:-1;;;40277:63:0;;20015:2:1;40277:63:0;;;19997:21:1;20054:2;20034:18;;;20027:30;20093:29;20073:18;;;20066:57;20140:18;;40277:63:0;19813:351:1;40277:63:0;40368:1;40359:6;:10;:25;;;;-1:-1:-1;40373:11:0;;;40359:25;40351:66;;;;-1:-1:-1;;;40351:66:0;;23477:2:1;40351:66:0;;;23459:21:1;23516:2;23496:18;;;23489:30;23555;23535:18;;;23528:58;23603:18;;40351:66:0;23275:352:1;40351:66:0;40449:14;:6;40458:5;40449:14;:::i;:::-;40436:9;:27;40428:66;;;;-1:-1:-1;;;40428:66:0;;20731:2:1;40428:66:0;;;20713:21:1;20770:2;20750:18;;;20743:30;20809:28;20789:18;;;20782:56;20855:18;;40428:66:0;20529:350:1;40428:66:0;40507:34;40513:6;40521:10;40533:7;40507:5;:34::i;30475:185::-;30581:8;2939:42;4869:45;:49;4865:225;;4940:67;;;;;4991:4;4940:67;;;12513:34:1;-1:-1:-1;;;;;12583:15:1;;12563:18;;;12556:43;2939:42:0;;4940;;12425:18:1;;4940:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4935:144;;5035:28;;;;;-1:-1:-1;;;;;1802:55:1;;5035:28:0;;;1784:74:1;1757:18;;5035:28:0;1638:226:1;4935:144:0;30602:50:::1;30621:10;30633:8;30643;30602:18;:50::i;38768:194::-:0;6646:10;6635:7;6461;6488:6;-1:-1:-1;;;;;6488:6:0;;6415:87;6635:7;-1:-1:-1;;;;;6635:21:0;;6627:66;;;;-1:-1:-1;;;6627:66:0;;15391:2:1;6627:66:0;;;15373:21:1;;;15410:18;;;15403:30;15469:34;15449:18;;;15442:62;15521:18;;6627:66:0;15189:356:1;6627:66:0;38848:12:::1;38863:11:::0;;;::::1;;;38912:4;38893:16;38863:11:::0;38893:6;:16:::1;:::i;:::-;:23;38885:32;;;::::0;::::1;;38928:26;38934:6;38942:2;38946:7;38928:5;:26::i;31684:344::-:0;31852:4;2939:42;4123:45;:49;4119:539;;4412:10;-1:-1:-1;;;;;4404:18:0;;;4400:85;;31877:39:::1;31896:10;31908:7;31877:18;:39::i;:::-;31869:101;;;::::0;-1:-1:-1;;;31869:101:0;;13889:2:1;31869:101:0::1;::::0;::::1;13871:21:1::0;13928:2;13908:18;;;13901:30;13967:34;13947:18;;;13940:62;14038:19;14018:18;;;14011:47;14075:19;;31869:101:0::1;13687:413:1::0;31869:101:0::1;31981:39;31995:4;32001:2;32005:7;32014:5;31981:13;:39::i;:::-;4463:7:::0;;4400:85;4504:69;;;;;4555:4;4504:69;;;12513:34:1;4562:10:0;12563:18:1;;;12556:43;2939:42:0;;4504;;12425:18:1;;4504:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4499:148;;4601:30;;;;;4620:10;4601:30;;;1784:74:1;1757:18;;4601:30:0;1638:226:1;4499:148:0;31877:39:::1;31896:10;31908:7;31877:18;:39::i;:::-;31869:101;;;::::0;-1:-1:-1;;;31869:101:0;;13889:2:1;31869:101:0::1;::::0;::::1;13871:21:1::0;13928:2;13908:18;;;13901:30;13967:34;13947:18;;;13940:62;14038:19;14018:18;;;14011:47;14075:19;;31869:101:0::1;13687:413:1::0;31869:101:0::1;31981:39;31995:4;32001:2;32005:7;32014:5;31981:13;:39::i;:::-;31684:344:::0;;;;;:::o;38356:404::-;38497:11;;;;;;;38496:12;38488:53;;;;-1:-1:-1;;;38488:53:0;;23834:2:1;38488:53:0;;;23816:21:1;23873:2;23853:18;;;23846:30;23912;23892:18;;;23885:58;23960:18;;38488:53:0;23632:352:1;38488:53:0;38552:21;38562:10;38552:9;:21::i;:::-;38584:38;:36;:38::i;:::-;38633:21;:32;;;38676:7;:18;38686:8;38676:7;:18;:::i;:::-;-1:-1:-1;;38705:5:0;:18;;;;;;;;;;;;;;;;;;-1:-1:-1;;38734:18:0;;;;;;;;38356:404::o;29279:259::-;33534:4;33558:16;;;:7;:16;;;;;;29346:13;;-1:-1:-1;;;;;33558:16:0;29372:76;;;;-1:-1:-1;;;29372:76:0;;24191:2:1;29372:76:0;;;24173:21:1;24230:2;24210:18;;;24203:30;24269:34;24249:18;;;24242:62;24340:17;24320:18;;;24313:45;24375:19;;29372:76:0;23989:411:1;29372:76:0;29492:7;29501:18;:7;:16;:18::i;:::-;29475:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29461:69;;29279:259;;;:::o;7315:194::-;6646:10;6635:7;6461;6488:6;-1:-1:-1;;;;;6488:6:0;;6415:87;6635:7;-1:-1:-1;;;;;6635:21:0;;6627:66;;;;-1:-1:-1;;;6627:66:0;;15391:2:1;6627:66:0;;;15373:21:1;;;15410:18;;;15403:30;15469:34;15449:18;;;15442:62;15521:18;;6627:66:0;15189:356:1;6627:66:0;-1:-1:-1;;;;;7406:22:0;::::1;7398:73;;;::::0;-1:-1:-1;;;7398:73:0;;25857:2:1;7398:73:0::1;::::0;::::1;25839:21:1::0;25896:2;25876:18;;;25869:30;25935:34;25915:18;;;25908:62;26006:8;25986:18;;;25979:36;26032:19;;7398:73:0::1;25655:402:1::0;7398:73:0::1;7482:19;7492:8;7482:9;:19::i;:::-;7315:194:::0;:::o;28006:305::-;28108:4;28145:40;;;28160:25;28145:40;;:105;;-1:-1:-1;28202:48:0;;;28217:33;28202:48;28145:105;:158;;;-1:-1:-1;20467:25:0;20452:40;;;;28267:36;20343:157;36104:174;36179:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;36179:29:0;;;;;;;;:24;;36233:23;36179:24;36233:14;:23::i;:::-;-1:-1:-1;;;;;36224:46:0;;;;;;;;;;;36104:174;;:::o;33763:341::-;33856:4;33558:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33558:16:0;33873:73;;;;-1:-1:-1;;;33873:73:0;;26264:2:1;33873:73:0;;;26246:21:1;26303:2;26283:18;;;26276:30;26342:34;26322:18;;;26315:62;26413:14;26393:18;;;26386:42;26445:19;;33873:73:0;26062:408:1;33873:73:0;33957:13;33973:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33973:16:0;;;;34008;;;;;:51;;;34052:7;-1:-1:-1;;;;;34028:31:0;:20;34040:7;34028:11;:20::i;:::-;-1:-1:-1;;;;;34028:31:0;;34008:51;:87;;;-1:-1:-1;;;;;;30844:25:0;;;30820:4;30844:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;34063:32;34000:96;33763:341;-1:-1:-1;;;;33763:341:0:o;35431:555::-;35563:16;;;;:7;:16;;;;;;-1:-1:-1;;;;;35563:24:0;;;:16;;:24;35555:74;;;;-1:-1:-1;;;35555:74:0;;26677:2:1;35555:74:0;;;26659:21:1;26716:2;26696:18;;;26689:30;26755:34;26735:18;;;26728:62;26826:7;26806:18;;;26799:35;26851:19;;35555:74:0;26475:401:1;35555:74:0;-1:-1:-1;;;;;35648:16:0;;35640:65;;;;-1:-1:-1;;;35640:65:0;;27083:2:1;35640:65:0;;;27065:21:1;27122:2;27102:18;;;27095:30;27161:34;27141:18;;;27134:62;27232:6;27212:18;;;27205:34;27256:19;;35640:65:0;26881:400:1;35640:65:0;35770:29;35787:1;35791:7;35770:8;:29::i;:::-;-1:-1:-1;;;;;35843:15:0;;;;;;;:9;:15;;;;;;;;35841:17;;;;;;35875:13;;;;;;;;;35873:15;;35841:17;35873:15;;;35912:16;;;:7;:16;;;;;;:21;;;;;;;;35951:27;;35920:7;;35875:13;35843:15;35951:27;;;35431:555;;;:::o;42407:140::-;42501:37;;27476:66:1;27463:2;27459:15;;;27455:88;42501:37:0;;;27443:101:1;42464:7:0;27560:12:1;;;27553:28;;;42464:7:0;27597:12:1;;42501:37:0;;;;;;;;;;;;;42491:48;;;;;;42484:55;;42407:140;;;:::o;42555:::-;42649:37;;27476:66:1;27463:2;27459:15;;;27455:88;42649:37:0;;;27443:101:1;42683:1:0;27560:12:1;;;27553:28;42612:7:0;;27597:12:1;;42649:37:0;27286:329:1;41677:239:0;41761:4;6488:6;;-1:-1:-1;;;;;6488:6:0;41785:112;41813:48;41842:18;41852:7;41842:9;:18::i;:::-;41813:28;:48::i;:::-;41876:10;41785:13;:112::i;:::-;-1:-1:-1;;;;;41785:123:0;;;41677:239;-1:-1:-1;;;41677:239:0:o;34440:654::-;34524:6;34519:219;34536:6;34532:1;:10;34519:219;;;34589:9;;;;34652:16;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;34652:21:0;;;;;;;;34693:33;;34589:9;;34617:3;;;;;34589:9;;34652:21;;:16;34693:33;;34652:16;;34693:33;34519:219;;;-1:-1:-1;;;;;;34775:13:0;;;;;;:9;:13;;;;;;;;:23;;;;;;34813:29;;;;;;;;;;;;;;;;;;;;;;34888:51;;;;;;;;;;;;34775:13;34785:2;;34927:7;;34888:22;:51::i;:::-;34866:151;;;;-1:-1:-1;;;34866:151:0;;27822:2:1;34866:151:0;;;27804:21:1;27861:2;27841:18;;;27834:30;27900:34;27880:18;;;27873:62;27971:20;27951:18;;;27944:48;28009:19;;34866:151:0;27620:414:1;7517:174:0;7574:16;7593:6;;-1:-1:-1;;;;;7610:17:0;;;;;;;;;;7643:40;;7593:6;;;;;;;7643:40;;7574:16;7643:40;7563:128;7517:174;:::o;41924:239::-;42008:4;6488:6;;-1:-1:-1;;;;;6488:6:0;42032:112;42060:48;42089:18;42099:7;42089:9;:18::i;37300:798::-;37456:4;-1:-1:-1;;;;;37477:13:0;;17323:20;17371:8;37473:618;;37513:70;;;;;-1:-1:-1;;;;;37513:36:0;;;;;:70;;37550:10;;37562:4;;37568:7;;37577:5;;37513:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37513:70:0;;;;;;;;-1:-1:-1;;37513:70:0;;;;;;;;;;;;:::i;:::-;;;37509:527;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37753:6;:13;37770:1;37753:18;37749:272;;37796:60;;-1:-1:-1;;;37796:60:0;;27822:2:1;37796:60:0;;;27804:21:1;27861:2;27841:18;;;27834:30;27900:34;27880:18;;;27873:62;27971:20;27951:18;;;27944:48;28009:19;;37796:60:0;27620:414:1;37749:272:0;37971:6;37965:13;37956:6;37952:2;37948:15;37941:38;37509:527;37634:51;;37644:41;37634:51;;-1:-1:-1;37627:58:0;;37473:618;-1:-1:-1;38075:4:0;37300:798;;;;;;:::o;36420:315::-;36575:8;-1:-1:-1;;;;;36566:17:0;:5;-1:-1:-1;;;;;36566:17:0;;36558:55;;;;-1:-1:-1;;;36558:55:0;;29012:2:1;36558:55:0;;;28994:21:1;29051:2;29031:18;;;29024:30;29090:27;29070:18;;;29063:55;29135:18;;36558:55:0;28810:349:1;36558:55:0;-1:-1:-1;;;;;36624:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;36686:41;;586::1;;;36686::0;;559:18:1;36686:41:0;;;;;;;36420:315;;;:::o;32910:::-;33067:28;33077:4;33083:2;33087:7;33067:9;:28::i;:::-;33114:48;33137:4;33143:2;33147:7;33156:5;33114:22;:48::i;:::-;33106:111;;;;-1:-1:-1;;;33106:111:0;;27822:2:1;33106:111:0;;;27804:21:1;27861:2;27841:18;;;27834:30;27900:34;27880:18;;;27873:62;27971:20;27951:18;;;27944:48;28009:19;;33106:111:0;27620:414:1;5490:117:0;5548:57;5438:42;5600:4;5548:29;:57::i;7920:723::-;7976:13;8197:5;8206:1;8197:10;8193:53;;-1:-1:-1;;8224:10:0;;;;;;;;;;;;;;;;;;7920:723::o;8193:53::-;8271:5;8256:12;8312:78;8319:9;;8312:78;;8345:8;;;;:::i;:::-;;-1:-1:-1;8368:10:0;;-1:-1:-1;8376:2:0;8368:10;;:::i;:::-;;;8312:78;;;8400:19;8432:6;8422:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8422:17:0;;8400:39;;8450:154;8457:10;;8450:154;;8484:11;8494:1;8484:11;;:::i;:::-;;-1:-1:-1;8553:10:0;8561:2;8553:5;:10;:::i;:::-;8540:24;;:2;:24;:::i;:::-;8527:39;;8510:6;8517;8510:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;8581:11:0;8590:2;8581:11;;:::i;:::-;;;8450:154;;15979:269;16181:58;;29856:66:1;16181:58:0;;;29844:79:1;29939:12;;;29932:28;;;16048:7:0;;29976:12:1;;16181:58:0;29614:380:1;12980:231:0;13058:7;13079:17;13098:18;13120:27;13131:4;13137:9;13120:10;:27::i;:::-;13078:69;;;;13158:18;13170:5;13158:11;:18::i;:::-;-1:-1:-1;13194:9:0;12980:231;-1:-1:-1;;;12980:231:0:o;2991:952::-;2939:42;3393:45;:49;3389:547;;3463:9;3459:466;;;3493:92;;;;;3547:4;3493:92;;;12513:34:1;-1:-1:-1;;;;;12583:15:1;;12563:18;;;12556:43;2939:42:0;;3493:45;;12425:18:1;;3493:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44422:256:::1;;44383:295::o:0;3459:466::-;-1:-1:-1;;;;;3630:44:0;;;3626:284;;3699:94;;;;;3755:4;3699:94;;;12513:34:1;-1:-1:-1;;;;;12583:15:1;;12563:18;;;12556:43;2939:42:0;;3699:47;;12425:18:1;;3699:94:0;12278:327:1;3626:284:0;3842:48;;;;;3884:4;3842:48;;;1784:74:1;2939:42:0;;3842:33;;1757:18:1;;3842:48:0;1638:226:1;10870:1308:0;10951:7;10960:12;11185:9;:16;11205:2;11185:22;11181:990;;11481:4;11466:20;;11460:27;11531:4;11516:20;;11510:27;11589:4;11574:20;;11568:27;11224:9;11560:36;11632:25;11643:4;11560:36;11460:27;11510;11632:10;:25::i;:::-;11625:32;;;;;;;;;11181:990;11679:9;:16;11699:2;11679:22;11675:496;;11954:4;11939:20;;11933:27;12005:4;11990:20;;11984:27;12047:23;12058:4;11933:27;11984;12047:10;:23::i;:::-;12040:30;;;;;;;;11675:496;-1:-1:-1;12119:1:0;;-1:-1:-1;12123:35:0;12103:56;;9141:643;9219:20;9210:5;:29;;;;;;;;:::i;:::-;;9206:571;;9141:643;:::o;9206:571::-;9317:29;9308:5;:38;;;;;;;;:::i;:::-;;9304:473;;9363:34;;-1:-1:-1;;;9363:34:0;;30390:2:1;9363:34:0;;;30372:21:1;30429:2;30409:18;;;30402:30;30468:26;30448:18;;;30441:54;30512:18;;9363:34:0;30188:348:1;9304:473:0;9428:35;9419:5;:44;;;;;;;;:::i;:::-;;9415:362;;9480:41;;-1:-1:-1;;;9480:41:0;;30743:2:1;9480:41:0;;;30725:21:1;30782:2;30762:18;;;30755:30;30821:33;30801:18;;;30794:61;30872:18;;9480:41:0;30541:355:1;9415:362:0;9552:30;9543:5;:39;;;;;;;;:::i;:::-;;9539:238;;9599:44;;-1:-1:-1;;;9599:44:0;;31103:2:1;9599:44:0;;;31085:21:1;31142:2;31122:18;;;31115:30;31181:34;31161:18;;;31154:62;31252:4;31232:18;;;31225:32;31274:19;;9599:44:0;30901:398:1;9539:238:0;9674:30;9665:5;:39;;;;;;;;:::i;:::-;;9661:116;;9721:44;;-1:-1:-1;;;9721:44:0;;31506:2:1;9721:44:0;;;31488:21:1;31545:2;31525:18;;;31518:30;31584:34;31564:18;;;31557:62;31655:4;31635:18;;;31628:32;31677:19;;9721:44:0;31304:398:1;14047:1632:0;14178:7;;15112:66;15099:79;;15095:163;;;-1:-1:-1;15211:1:0;;-1:-1:-1;15215:30:0;15195:51;;15095:163;15272:1;:7;;15277:2;15272:7;;:18;;;;;15283:1;:7;;15288:2;15283:7;;15272:18;15268:102;;;-1:-1:-1;15323:1:0;;-1:-1:-1;15327:30:0;15307:51;;15268:102;15484:24;;;15467:14;15484:24;;;;;;;;;31934:25:1;;;32007:4;31995:17;;31975:18;;;31968:45;;;;32029:18;;;32022:34;;;32072:18;;;32065:34;;;15484:24:0;;31906:19:1;;15484:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15484:24:0;;-1:-1:-1;;15484:24:0;;;-1:-1:-1;;;;;;;15523:20:0;;15519:103;;15576:1;15580:29;15560:50;;;;;;;15519:103;15642:6;-1:-1:-1;15650:20:0;;-1:-1:-1;14047:1632:0;;;;;;;;:::o;13474:391::-;13588:7;;13697:66;13689:75;;13791:3;13787:12;;;13801:2;13783:21;13832:25;13843:4;13783:21;13852:1;13689:75;13832:10;:25::i;:::-;13825:32;;;;;;13474:391;;;;;;:::o;14:177:1:-;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;:::-;430:5;196:245;-1:-1:-1;;;196:245:1:o;638:250::-;723:1;733:113;747:6;744:1;741:13;733:113;;;823:11;;;817:18;804:11;;;797:39;769:2;762:10;733:113;;;-1:-1:-1;;880:1:1;862:16;;855:27;638:250::o;893:330::-;935:3;973:5;967:12;1000:6;995:3;988:19;1016:76;1085:6;1078:4;1073:3;1069:14;1062:4;1055:5;1051:16;1016:76;:::i;:::-;1137:2;1125:15;-1:-1:-1;;1121:88:1;1112:98;;;;1212:4;1108:109;;893:330;-1:-1:-1;;893:330:1:o;1228:220::-;1377:2;1366:9;1359:21;1340:4;1397:45;1438:2;1427:9;1423:18;1415:6;1397:45;:::i;1453:180::-;1512:6;1565:2;1553:9;1544:7;1540:23;1536:32;1533:52;;;1581:1;1578;1571:12;1533:52;-1:-1:-1;1604:23:1;;1453:180;-1:-1:-1;1453:180:1:o;1869:196::-;1937:20;;-1:-1:-1;;;;;1986:54:1;;1976:65;;1966:93;;2055:1;2052;2045:12;1966:93;1869:196;;;:::o;2070:254::-;2138:6;2146;2199:2;2187:9;2178:7;2174:23;2170:32;2167:52;;;2215:1;2212;2205:12;2167:52;2238:29;2257:9;2238:29;:::i;:::-;2228:39;2314:2;2299:18;;;;2286:32;;-1:-1:-1;;;2070:254:1:o;2522:328::-;2599:6;2607;2615;2668:2;2656:9;2647:7;2643:23;2639:32;2636:52;;;2684:1;2681;2674:12;2636:52;2707:29;2726:9;2707:29;:::i;:::-;2697:39;;2755:38;2789:2;2778:9;2774:18;2755:38;:::i;:::-;2745:48;;2840:2;2829:9;2825:18;2812:32;2802:42;;2522:328;;;;;:::o;2855:248::-;2923:6;2931;2984:2;2972:9;2963:7;2959:23;2955:32;2952:52;;;3000:1;2997;2990:12;2952:52;-1:-1:-1;;3023:23:1;;;3093:2;3078:18;;;3065:32;;-1:-1:-1;2855:248:1:o;3410:186::-;3469:6;3522:2;3510:9;3501:7;3497:23;3493:32;3490:52;;;3538:1;3535;3528:12;3490:52;3561:29;3580:9;3561:29;:::i;4045:184::-;4097:77;4094:1;4087:88;4194:4;4191:1;4184:15;4218:4;4215:1;4208:15;4234:334;4305:2;4299:9;4361:2;4351:13;;-1:-1:-1;;4347:86:1;4335:99;;4464:18;4449:34;;4485:22;;;4446:62;4443:88;;;4511:18;;:::i;:::-;4547:2;4540:22;4234:334;;-1:-1:-1;4234:334:1:o;4573:466::-;4638:5;4672:18;4664:6;4661:30;4658:56;;;4694:18;;:::i;:::-;4732:116;4842:4;-1:-1:-1;;4768:2:1;4760:6;4756:15;4752:88;4748:99;4732:116;:::i;:::-;4723:125;;4871:6;4864:5;4857:21;4911:3;4902:6;4897:3;4893:16;4890:25;4887:45;;;4928:1;4925;4918:12;4887:45;4977:6;4972:3;4965:4;4958:5;4954:16;4941:43;5031:1;5024:4;5015:6;5008:5;5004:18;5000:29;4993:40;4573:466;;;;;:::o;5044:222::-;5087:5;5140:3;5133:4;5125:6;5121:17;5117:27;5107:55;;5158:1;5155;5148:12;5107:55;5180:80;5256:3;5247:6;5234:20;5227:4;5219:6;5215:17;5180:80;:::i;5271:322::-;5340:6;5393:2;5381:9;5372:7;5368:23;5364:32;5361:52;;;5409:1;5406;5399:12;5361:52;5449:9;5436:23;5482:18;5474:6;5471:30;5468:50;;;5514:1;5511;5504:12;5468:50;5537;5579:7;5570:6;5559:9;5555:22;5537:50;:::i;5598:347::-;5649:8;5659:6;5713:3;5706:4;5698:6;5694:17;5690:27;5680:55;;5731:1;5728;5721:12;5680:55;-1:-1:-1;5754:20:1;;5797:18;5786:30;;5783:50;;;5829:1;5826;5819:12;5783:50;5866:4;5858:6;5854:17;5842:29;;5918:3;5911:4;5902:6;5894;5890:19;5886:30;5883:39;5880:59;;;5935:1;5932;5925:12;5950:477;6029:6;6037;6045;6098:2;6086:9;6077:7;6073:23;6069:32;6066:52;;;6114:1;6111;6104:12;6066:52;6154:9;6141:23;6187:18;6179:6;6176:30;6173:50;;;6219:1;6216;6209:12;6173:50;6258:58;6308:7;6299:6;6288:9;6284:22;6258:58;:::i;:::-;6335:8;;6232:84;;-1:-1:-1;6417:2:1;6402:18;;;;6389:32;;5950:477;-1:-1:-1;;;;5950:477:1:o;6614:632::-;6785:2;6837:21;;;6907:13;;6810:18;;;6929:22;;;6756:4;;6785:2;7008:15;;;;6982:2;6967:18;;;6756:4;7051:169;7065:6;7062:1;7059:13;7051:169;;;7126:13;;7114:26;;7195:15;;;;7160:12;;;;7087:1;7080:9;7051:169;;;-1:-1:-1;7237:3:1;;6614:632;-1:-1:-1;;;;;;6614:632:1:o;7251:409::-;7321:6;7329;7382:2;7370:9;7361:7;7357:23;7353:32;7350:52;;;7398:1;7395;7388:12;7350:52;7438:9;7425:23;7471:18;7463:6;7460:30;7457:50;;;7503:1;7500;7493:12;7457:50;7542:58;7592:7;7583:6;7572:9;7568:22;7542:58;:::i;:::-;7619:8;;7516:84;;-1:-1:-1;7251:409:1;-1:-1:-1;;;;7251:409:1:o;7665:183::-;7725:4;7758:18;7750:6;7747:30;7744:56;;;7780:18;;:::i;:::-;-1:-1:-1;7825:1:1;7821:14;7837:4;7817:25;;7665:183::o;7853:668::-;7907:5;7960:3;7953:4;7945:6;7941:17;7937:27;7927:55;;7978:1;7975;7968:12;7927:55;8014:6;8001:20;8040:4;8064:60;8080:43;8120:2;8080:43;:::i;:::-;8064:60;:::i;:::-;8158:15;;;8244:1;8240:10;;;;8228:23;;8224:32;;;8189:12;;;;8268:15;;;8265:35;;;8296:1;8293;8286:12;8265:35;8332:2;8324:6;8320:15;8344:148;8360:6;8355:3;8352:15;8344:148;;;8426:23;8445:3;8426:23;:::i;:::-;8414:36;;8470:12;;;;8377;;8344:148;;;-1:-1:-1;8510:5:1;7853:668;-1:-1:-1;;;;;;7853:668:1:o;8526:1140::-;8644:6;8652;8705:2;8693:9;8684:7;8680:23;8676:32;8673:52;;;8721:1;8718;8711:12;8673:52;8761:9;8748:23;8790:18;8831:2;8823:6;8820:14;8817:34;;;8847:1;8844;8837:12;8817:34;8885:6;8874:9;8870:22;8860:32;;8930:7;8923:4;8919:2;8915:13;8911:27;8901:55;;8952:1;8949;8942:12;8901:55;8988:2;8975:16;9010:4;9034:60;9050:43;9090:2;9050:43;:::i;9034:60::-;9128:15;;;9210:1;9206:10;;;;9198:19;;9194:28;;;9159:12;;;;9234:19;;;9231:39;;;9266:1;9263;9256:12;9231:39;9290:11;;;;9310:142;9326:6;9321:3;9318:15;9310:142;;;9392:17;;9380:30;;9343:12;;;;9430;;;;9310:142;;;9471:5;-1:-1:-1;;9514:18:1;;9501:32;;-1:-1:-1;;9545:16:1;;;9542:36;;;9574:1;9571;9564:12;9542:36;;9597:63;9652:7;9641:8;9630:9;9626:24;9597:63;:::i;:::-;9587:73;;;8526:1140;;;;;:::o;9671:118::-;9757:5;9750:13;9743:21;9736:5;9733:32;9723:60;;9779:1;9776;9769:12;9794:315;9859:6;9867;9920:2;9908:9;9899:7;9895:23;9891:32;9888:52;;;9936:1;9933;9926:12;9888:52;9959:29;9978:9;9959:29;:::i;:::-;9949:39;;10038:2;10027:9;10023:18;10010:32;10051:28;10073:5;10051:28;:::i;:::-;10098:5;10088:15;;;9794:315;;;;;:::o;10114:254::-;10182:6;10190;10243:2;10231:9;10222:7;10218:23;10214:32;10211:52;;;10259:1;10256;10249:12;10211:52;10295:9;10282:23;10272:33;;10324:38;10358:2;10347:9;10343:18;10324:38;:::i;:::-;10314:48;;10114:254;;;;;:::o;10373:667::-;10468:6;10476;10484;10492;10545:3;10533:9;10524:7;10520:23;10516:33;10513:53;;;10562:1;10559;10552:12;10513:53;10585:29;10604:9;10585:29;:::i;:::-;10575:39;;10633:38;10667:2;10656:9;10652:18;10633:38;:::i;:::-;10623:48;;10718:2;10707:9;10703:18;10690:32;10680:42;;10773:2;10762:9;10758:18;10745:32;10800:18;10792:6;10789:30;10786:50;;;10832:1;10829;10822:12;10786:50;10855:22;;10908:4;10900:13;;10896:27;-1:-1:-1;10886:55:1;;10937:1;10934;10927:12;10886:55;10960:74;11026:7;11021:2;11008:16;11003:2;10999;10995:11;10960:74;:::i;:::-;10950:84;;;10373:667;;;;;;;:::o;11045:550::-;11131:6;11139;11147;11200:2;11188:9;11179:7;11175:23;11171:32;11168:52;;;11216:1;11213;11206:12;11168:52;11252:9;11239:23;11229:33;;11312:2;11301:9;11297:18;11284:32;11356:6;11349:5;11345:18;11338:5;11335:29;11325:57;;11378:1;11375;11368:12;11325:57;11401:5;-1:-1:-1;11457:2:1;11442:18;;11429:32;11484:18;11473:30;;11470:50;;;11516:1;11513;11506:12;11470:50;11539;11581:7;11572:6;11561:9;11557:22;11539:50;:::i;:::-;11529:60;;;11045:550;;;;;:::o;11600:260::-;11668:6;11676;11729:2;11717:9;11708:7;11704:23;11700:32;11697:52;;;11745:1;11742;11735:12;11697:52;11768:29;11787:9;11768:29;:::i;:::-;11758:39;;11816:38;11850:2;11839:9;11835:18;11816:38;:::i;12610:245::-;12677:6;12730:2;12718:9;12709:7;12705:23;12701:32;12698:52;;;12746:1;12743;12736:12;12698:52;12778:9;12772:16;12797:28;12819:5;12797:28;:::i;14513:184::-;14565:77;14562:1;14555:88;14662:4;14659:1;14652:15;14686:4;14683:1;14676:15;14702:168;14775:9;;;14806;;14823:15;;;14817:22;;14803:37;14793:71;;14844:18;;:::i;14875:184::-;14927:77;14924:1;14917:88;15024:4;15021:1;15014:15;15048:4;15045:1;15038:15;15064:120;15104:1;15130;15120:35;;15135:18;;:::i;:::-;-1:-1:-1;15169:9:1;;15064:120::o;16163:437::-;16242:1;16238:12;;;;16285;;;16306:61;;16360:4;16352:6;16348:17;16338:27;;16306:61;16413:2;16405:6;16402:14;16382:18;16379:38;16376:218;;16450:77;16447:1;16440:88;16551:4;16548:1;16541:15;16579:4;16576:1;16569:15;16376:218;;16163:437;;;:::o;16731:545::-;16833:2;16828:3;16825:11;16822:448;;;16869:1;16894:5;16890:2;16883:17;16939:4;16935:2;16925:19;17009:2;16997:10;16993:19;16990:1;16986:27;16980:4;16976:38;17045:4;17033:10;17030:20;17027:47;;;-1:-1:-1;17068:4:1;17027:47;17123:2;17118:3;17114:12;17111:1;17107:20;17101:4;17097:31;17087:41;;17178:82;17196:2;17189:5;17186:13;17178:82;;;17241:17;;;17222:1;17211:13;17178:82;;17512:1471;17638:3;17632:10;17665:18;17657:6;17654:30;17651:56;;;17687:18;;:::i;:::-;17716:97;17806:6;17766:38;17798:4;17792:11;17766:38;:::i;:::-;17760:4;17716:97;:::i;:::-;17868:4;;17932:2;17921:14;;17949:1;17944:782;;;;18770:1;18787:6;18784:89;;;-1:-1:-1;18839:19:1;;;18833:26;18784:89;17418:66;17409:1;17405:11;;;17401:84;17397:89;17387:100;17493:1;17489:11;;;17384:117;18886:81;;17914:1063;;17944:782;16678:1;16671:14;;;16715:4;16702:18;;-1:-1:-1;;17980:79:1;;;18157:236;18171:7;18168:1;18165:14;18157:236;;;18260:19;;;18254:26;18239:42;;18352:27;;;;18320:1;18308:14;;;;18187:19;;18157:236;;;18161:3;18421:6;18412:7;18409:19;18406:261;;;18482:19;;;18476:26;18583:66;18565:1;18561:14;;;18577:3;18557:24;18553:97;18549:102;18534:118;18519:134;;18406:261;-1:-1:-1;;;;;18713:1:1;18697:14;;;18693:22;18680:36;;-1:-1:-1;17512:1471:1:o;19683:125::-;19748:9;;;19769:10;;;19766:36;;;19782:18;;:::i;20884:148::-;20972:4;20951:12;;;20965;;;20947:31;;20990:13;;20987:39;;;21006:18;;:::i;21858:168::-;21925:6;21951:10;;;21963;;;21947:27;;21986:11;;;21983:37;;;22000:18;;:::i;:::-;21983:37;21858:168;;;;:::o;22031:184::-;22083:77;22080:1;22073:88;22180:4;22177:1;22170:15;22204:4;22201:1;22194:15;22220:171;22288:6;22327:10;;;22315;;;22311:27;;22350:12;;;22347:38;;;22365:18;;:::i;22396:175::-;22433:3;22477:4;22470:5;22466:16;22506:4;22497:7;22494:17;22491:43;;22514:18;;:::i;:::-;22563:1;22550:15;;22396:175;-1:-1:-1;;22396:175:1:o;24405:1245::-;24682:3;24711:1;24744:6;24738:13;24774:36;24800:9;24774:36;:::i;:::-;24829:1;24846:18;;;24873:191;;;;25078:1;25073:356;;;;24839:590;;24873:191;24921:66;24910:9;24906:82;24901:3;24894:95;25044:6;25037:14;25030:22;25022:6;25018:35;25013:3;25009:45;25002:52;;24873:191;;25073:356;25104:6;25101:1;25094:17;25134:4;25179:2;25176:1;25166:16;25204:1;25218:165;25232:6;25229:1;25226:13;25218:165;;;25310:14;;25297:11;;;25290:35;25353:16;;;;25247:10;;25218:165;;;25222:3;;;25412:6;25407:3;25403:16;25396:23;;24839:590;;;;;25460:6;25454:13;25476:68;25535:8;25530:3;25523:4;25515:6;25511:17;25476:68;:::i;:::-;25607:7;25566:18;;25593:22;;;25642:1;25631:13;;24405:1245;-1:-1:-1;;;;24405:1245:1:o;28039:512::-;28233:4;-1:-1:-1;;;;;28343:2:1;28335:6;28331:15;28320:9;28313:34;28395:2;28387:6;28383:15;28378:2;28367:9;28363:18;28356:43;;28435:6;28430:2;28419:9;28415:18;28408:34;28478:3;28473:2;28462:9;28458:18;28451:31;28499:46;28540:3;28529:9;28525:19;28517:6;28499:46;:::i;:::-;28491:54;28039:512;-1:-1:-1;;;;;;28039:512:1:o;28556:249::-;28625:6;28678:2;28666:9;28657:7;28653:23;28649:32;28646:52;;;28694:1;28691;28684:12;28646:52;28726:9;28720:16;28745:30;28769:5;28745:30;:::i;29164:195::-;29203:3;29234:66;29227:5;29224:77;29221:103;;29304:18;;:::i;:::-;-1:-1:-1;29351:1:1;29340:13;;29164:195::o;29364:128::-;29431:9;;;29452:11;;;29449:37;;;29466:18;;:::i;29497:112::-;29529:1;29555;29545:35;;29560:18;;:::i;:::-;-1:-1:-1;29594:9:1;;29497:112::o;29999:184::-;30051:77;30048:1;30041:88;30148:4;30145:1;30138:15;30172:4;30169:1;30162:15
Swarm Source
ipfs://fe861f2d515990efe31384c5380f1bb0b6ef6e6913847f3c4dd1c528b15e8fe7
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
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.