Token Flaming Phenix Club
Overview CRC721
Total Supply:
6,666 FPC
Holders:
931 addresses
Contract:
Balance
14 FPC
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FlamingPhenixClubNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-06-06 */ // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require( owner != address(0), "ERC721: balance query for the zero address" ); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require( owner != address(0), "ERC721: owner query for nonexistent token" ); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require( _exists(tokenId), "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require( ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own" ); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721: transfer to non ERC721Receiver implementer" ); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require( index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds" ); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require( index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds" ); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/token/ERC1155/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle( address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value ); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll( address indexed account, address indexed operator, bool approved ); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File @openzeppelin/contracts/utils/escrow/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/escrow/Escrow.sol) pragma solidity ^0.8.0; /** * @title Escrow * @dev Base escrow contract, holds funds designated for a payee until they * withdraw them. * * Intended usage: This contract (and derived escrow contracts) should be a * standalone contract, that only interacts with the contract that instantiated * it. That way, it is guaranteed that all Ether will be handled according to * the `Escrow` rules, and there is no need to check for payable functions or * transfers in the inheritance tree. The contract that uses the escrow as its * payment method should be its owner, and provide public methods redirecting * to the escrow's deposit and withdraw. */ contract Escrow is Ownable { using Address for address payable; event Deposited(address indexed payee, uint256 weiAmount); event Withdrawn(address indexed payee, uint256 weiAmount); mapping(address => uint256) private _deposits; function depositsOf(address payee) public view returns (uint256) { return _deposits[payee]; } /** * @dev Stores the sent amount as credit to be withdrawn. * @param payee The destination address of the funds. */ function deposit(address payee) public payable virtual onlyOwner { uint256 amount = msg.value; _deposits[payee] += amount; emit Deposited(payee, amount); } /** * @dev Withdraw accumulated balance for a payee, forwarding all gas to the * recipient. * * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities. * Make sure you trust the recipient, or are either following the * checks-effects-interactions pattern or using {ReentrancyGuard}. * * @param payee The address whose funds will be withdrawn and transferred to. */ function withdraw(address payable payee) public virtual onlyOwner { uint256 payment = _deposits[payee]; _deposits[payee] = 0; payee.sendValue(payment); emit Withdrawn(payee, payment); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/PullPayment.sol) pragma solidity ^0.8.0; /** * @dev Simple implementation of a * https://consensys.github.io/smart-contract-best-practices/recommendations/#favor-pull-over-push-for-external-calls[pull-payment] * strategy, where the paying contract doesn't interact directly with the * receiver account, which must withdraw its payments itself. * * Pull-payments are often considered the best practice when it comes to sending * Ether, security-wise. It prevents recipients from blocking execution, and * eliminates reentrancy concerns. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. * * To use, derive from the `PullPayment` contract, and use {_asyncTransfer} * instead of Solidity's `transfer` function. Payees can query their due * payments with {payments}, and retrieve them with {withdrawPayments}. */ abstract contract PullPayment { Escrow private immutable _escrow; constructor() { _escrow = new Escrow(); } /** * @dev Withdraw accumulated payments, forwarding all gas to the recipient. * * Note that _any_ account can call this function, not just the `payee`. * This means that contracts unaware of the `PullPayment` protocol can still * receive funds this way, by having a separate account call * {withdrawPayments}. * * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities. * Make sure you trust the recipient, or are either following the * checks-effects-interactions pattern or using {ReentrancyGuard}. * * @param payee Whose payments will be withdrawn. */ function withdrawPayments(address payable payee) public virtual { _escrow.withdraw(payee); } /** * @dev Returns the payments owed to an address. * @param dest The creditor's address. */ function payments(address dest) public view returns (uint256) { return _escrow.depositsOf(dest); } /** * @dev Called by the payer to store the sent amount as credit to be pulled. * Funds sent in this way are stored in an intermediate {Escrow} contract, so * there is no danger of them being spent before withdrawal. * * @param dest The destination address of the funds. * @param amount The amount to transfer. */ function _asyncTransfer(address dest, uint256 amount) internal virtual { _escrow.deposit{value: amount}(dest); } } // File contracts/FlamingPhenixClubNFT.sol //SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IDrop { struct Info { uint256 regularCost; uint256 memberCost; uint256 whitelistCost; uint256 maxSupply; uint256 totalSupply; uint256 maxMintPerAddress; uint256 maxMintPerTx; } function mintCost(address _minter) external view returns (uint256); function canMint(address _minter) external view returns (uint256); function mint(uint256 _amount) external payable; function maxSupply() external view returns (uint256); function getInfo() external view returns (Info memory); } interface IMarket { function isMember(address user) external view returns (bool); function addToEscrow(address _address) external payable; } contract FlamingPhenixClubNFT is ERC721Enumerable, Ownable, IDrop, PullPayment { uint256 constant MAX_MINT = 6666; uint256 constant MAX_MINT_PER_TRANSACTION = 10; uint256 constant FXP_BASE = 100000; address constant MARKET_ADDRESS = 0x7a3CdB2364f92369a602CAE81167d0679087e6a3; address constant MARKET_SHARE_ADDRESS = 0x454cfAa623A629CC0b4017aEb85d54C42e91479d; mapping(address => bool) public whitelist; address public treasuryAddress; uint256 public normalMintCost; uint256 public memberMintCost; uint256 public whitelistMintCost; uint256 public payableERC20TokenMintCost; address public payableERC20Token; uint256 public marketShareFee; IMarket market; string baseURI; bool public mintEnabled; bool public whitelistOnly; bool public canMintWithERC20; bool public isRevealed; modifier onlyMintEnabled() { require(mintEnabled, "Mint Disabled"); _; } modifier onlyWhitelisted() { if (whitelistOnly) { require(isWhitelisted(msg.sender), "Not Whitelisted"); } _; } modifier ERC20MintingAllowed() { require(canMintWithERC20 == true, "ERC20 Token Minting is disabled"); _; } constructor(string memory _nftBaseURI, uint256 _initialTeamReserve) ERC721("Flaming Phenix Club", "FPC") { market = IMarket(MARKET_ADDRESS); baseURI = _nftBaseURI; // PHNX Token (CR20) payableERC20Token = 0x57d06bB1e3B60C875cD3A4445a53217F9B44d390; // Phenix Owner Address treasuryAddress = 0xcf322B554b6CfB668221D5b1979B6e4E58AB4DbC; normalMintCost = 290 ether; memberMintCost = 260 ether; whitelistMintCost = 240 ether; payableERC20TokenMintCost = 5000 ether; // 10% of every mint via marketplace drop page marketShareFee = (FXP_BASE * 10) / 100; // Mint initial team reserve if (_initialTeamReserve > 0) { for (uint256 i = 0; i < _initialTeamReserve; i++) { uint256 index = totalSupply() + 1; _safeMint(msg.sender, index); } } //Transfer contract to developers account transferOwnership(msg.sender); } function setRevealed() external onlyOwner { isRevealed = true; } //Update Base URL function updateBaseURI(string memory _newURI) external onlyOwner { baseURI = _newURI; } //Update Mintable function setMintEnabled(bool _mintEnabled) external onlyOwner { mintEnabled = _mintEnabled; } //Update Whitelist Only function setWhitelistOnly(bool _whitelistOnly) external onlyOwner { whitelistOnly = _whitelistOnly; } //Update Can Mint With ERC20 Tokens function setCanMintWithERC20(bool _canMintWithERC20) external onlyOwner { canMintWithERC20 = _canMintWithERC20; } //Update Market Share Fee function setMarketShareFee(uint256 _fee, uint256 _denominator) external onlyOwner { marketShareFee = (FXP_BASE * _fee) / _denominator; } // Updates Payble ERC20 Token address (PHXN Token) function setPayableERC20Token(address _payableERC20Token) external onlyOwner { payableERC20Token = _payableERC20Token; } // Updates Treasury Address function setTreasuryAddress(address _treasuryAddress) external onlyOwner { treasuryAddress = _treasuryAddress; } // updates mint costs function setMintCosts( uint256 _normalMintCost, uint256 _memberMintCost, uint256 _whitelistMintCost, uint256 _payableERC20TokenMintCost ) external onlyOwner { normalMintCost = _normalMintCost; memberMintCost = _memberMintCost; whitelistMintCost = _whitelistMintCost; payableERC20TokenMintCost = _payableERC20TokenMintCost; } //Mint with Native Token From Marketplace function mint(uint256 _amount) external payable override onlyMintEnabled onlyWhitelisted { _mintNFT(_amount); // FXP_BASE = 100000; // marketShareFee = (FXP_BASE * 10) / 100; uint256 marketShare = (msg.value * marketShareFee) / FXP_BASE; uint256 ownerShare = msg.value - marketShare; market.addToEscrow{value: marketShare}(MARKET_SHARE_ADDRESS); market.addToEscrow{value: ownerShare}(treasuryAddress); } //Mint with Native Token function mintExternal(uint256 _amount) external payable onlyMintEnabled onlyWhitelisted { _mintNFT(_amount); _asyncTransfer(treasuryAddress, msg.value); } //Mint with ERC20 Token function mintExternalWithERC20Token(uint256 _amount) external onlyMintEnabled onlyWhitelisted ERC20MintingAllowed { require(_amount <= MAX_MINT_PER_TRANSACTION, "Invalid mint amount"); require(_amount > 0, "Invalid mint amount"); require( totalSupply() + _amount <= MAX_MINT, "Exceeding Max Mint Count" ); uint256 requiredAmount = payableERC20TokenMintCost * _amount; // send tokens to owner IERC20(payableERC20Token).transferFrom( msg.sender, treasuryAddress, requiredAmount ); for (uint256 i = 0; i < _amount; i++) { uint256 index = totalSupply() + 1; _safeMint(msg.sender, index); } } //Private Mint Function function _mintNFT(uint256 _amount) internal { require(_amount <= MAX_MINT_PER_TRANSACTION, "Invalid mint amount"); require(_amount > 0, "Invalid mint amount"); require( totalSupply() + _amount <= MAX_MINT, "Exceeding Max Mint Count" ); uint256 requiredAmount = mintCost(msg.sender) * _amount; require( requiredAmount == msg.value || msg.sender == owner(), "Incorrect Payment" ); for (uint256 i = 0; i < _amount; i++) { uint256 index = totalSupply() + 1; _safeMint(msg.sender, index); } } //Add Whitelist function addWhitelist(address[] calldata _addresses) external onlyOwner { for (uint256 index = 0; index < _addresses.length; index++) { whitelist[_addresses[index]] = true; } } //Remove Whitelist function removeWhitelist(address[] calldata _addresses) external onlyOwner { for (uint256 index = 0; index < _addresses.length; index++) { whitelist[_addresses[index]] = false; } } //NEVER RENOUNCE OWNERSHIP function renounceOwnership() public override onlyOwner {} //Returns mint cost - IDrop function mintCost(address _minter) public view override returns (uint256) { uint256 _mintCost = normalMintCost; if (whitelist[_minter] == true) { _mintCost = whitelistMintCost; } else if (market.isMember(_minter) == true) { _mintCost = memberMintCost; } return _mintCost; } //Returns how many more wallet can mint - IDrop function canMint(address _minter) external view override returns (uint256) { if (mintEnabled == false) { return 0; } if (whitelistOnly == true && isWhitelisted(_minter) == false) { return 0; } if (totalSupply() >= MAX_MINT) { return 0; } return MAX_MINT_PER_TRANSACTION; } //Returns Max Supply - IDrop function maxSupply() external view override returns (uint256) { return MAX_MINT; } //Returns Marketplace Data - IDrop function getInfo() external view override returns (Info memory) { return Info({ regularCost: normalMintCost, memberCost: memberMintCost, whitelistCost: whitelistMintCost, maxSupply: MAX_MINT, totalSupply: totalSupply(), maxMintPerAddress: 0, maxMintPerTx: MAX_MINT_PER_TRANSACTION }); } //Returns if address is Whitelisted function isWhitelisted(address _address) public view returns (bool) { return whitelist[_address] || market.isMember(_address); } //////////////////// // VIEW ETC // //////////////////// //Override baseURI function from ERC721 function _baseURI() internal view override returns (string memory) { return baseURI; } function tokenURI(uint256 tokenID) public view virtual override returns (string memory) { if (isRevealed != true) { return string(abi.encodePacked(baseURI, "notRevealed")); } return string(abi.encodePacked(super.tokenURI(tokenID))); } //Returns owned id list of an address function ownedNFTIdList(address _ownerAddress) public view returns (uint256[] memory) { uint256 balance = balanceOf(_ownerAddress); uint256[] memory allIndexes = new uint256[](balance); for (uint256 i = 0; i < balance; i++) { uint256 tokenIndex = tokenOfOwnerByIndex(_ownerAddress, i); allIndexes[i] = tokenIndex; } return allIndexes; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_nftBaseURI","type":"string"},{"internalType":"uint256","name":"_initialTeamReserve","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"canMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canMintWithERC20","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInfo","outputs":[{"components":[{"internalType":"uint256","name":"regularCost","type":"uint256"},{"internalType":"uint256","name":"memberCost","type":"uint256"},{"internalType":"uint256","name":"whitelistCost","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"maxMintPerAddress","type":"uint256"},{"internalType":"uint256","name":"maxMintPerTx","type":"uint256"}],"internalType":"struct IDrop.Info","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketShareFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"memberMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintExternal","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintExternalWithERC20Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"normalMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ownerAddress","type":"address"}],"name":"ownedNFTIdList","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"payableERC20Token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payableERC20TokenMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dest","type":"address"}],"name":"payments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_canMintWithERC20","type":"bool"}],"name":"setCanMintWithERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_denominator","type":"uint256"}],"name":"setMarketShareFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_normalMintCost","type":"uint256"},{"internalType":"uint256","name":"_memberMintCost","type":"uint256"},{"internalType":"uint256","name":"_whitelistMintCost","type":"uint256"},{"internalType":"uint256","name":"_payableERC20TokenMintCost","type":"uint256"}],"name":"setMintCosts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_mintEnabled","type":"bool"}],"name":"setMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_payableERC20Token","type":"address"}],"name":"setPayableERC20Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddress","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_whitelistOnly","type":"bool"}],"name":"setWhitelistOnly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"updateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"payee","type":"address"}],"name":"withdrawPayments","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b506040516200839a3803806200839a8339818101604052810190620000379190620010f3565b6040518060400160405280601381526020017f466c616d696e67205068656e697820436c7562000000000000000000000000008152506040518060400160405280600381526020017f46504300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb92919062000f57565b508060019080519060200190620000d492919062000f57565b505050620000f7620000eb6200035460201b60201c565b6200035c60201b60201c565b604051620001059062000fe8565b604051809103906000f08015801562000122573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050737a3cdb2364f92369a602cae81167d0679087e6a3601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160149080519060200190620001c692919062000f57565b507357d06bb1e3b60c875cd3a4445a53217f9b44d390601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073cf322b554b6cfb668221d5b1979b6e4e58ab4dbc600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550680fb88ef7839f480000600d81905550680e18398e7601900000600e81905550680d02ab486cedc00000600f8190555069010f0cf064dd592000006010819055506064600a620186a0620002c69190620014e7565b620002d29190620014af565b60128190555060008111156200033b5760005b81811015620003395760006001620003026200042260201b60201c565b6200030e919062001452565b90506200032233826200042f60201b60201c565b50808062000330906200168f565b915050620002e5565b505b6200034c336200045560201b60201c565b5050620019b8565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600880549050905090565b620004518282604051806020016040528060008152506200056b60201b60201c565b5050565b620004656200035460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200048b620005d960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004e4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004db90620013a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000557576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200054e906200131c565b60405180910390fd5b62000568816200035c60201b60201c565b50565b6200057d83836200060360201b60201c565b620005926000848484620007e960201b60201c565b620005d4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005cb90620012fa565b60405180910390fd5b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000676576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200066d9062001382565b60405180910390fd5b6200068781620009a360201b60201c565b15620006ca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006c1906200133e565b60405180910390fd5b620006de6000838362000a0f60201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000730919062001452565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620008178473ffffffffffffffffffffffffffffffffffffffff1662000b5660201b62002a0f1760201c565b1562000996578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620008496200035460201b60201c565b8786866040518563ffffffff1660e01b81526004016200086d9493929190620012a6565b602060405180830381600087803b1580156200088857600080fd5b505af1925050508015620008bc57506040513d601f19601f82011682018060405250810190620008b99190620010c1565b60015b62000945573d8060008114620008ef576040519150601f19603f3d011682016040523d82523d6000602084013e620008f4565b606091505b506000815114156200093d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200093490620012fa565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506200099b565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b62000a2783838362000b6960201b62002a221760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000a745762000a6e8162000b6e60201b60201c565b62000abc565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000abb5762000aba838262000bb760201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000b095762000b038162000d3460201b60201c565b62000b51565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000b505762000b4f828262000e1060201b60201c565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000bd18462000e9c60201b62001c051760201c565b62000bdd919062001548565b905060006007600084815260200190815260200160002054905081811462000cc3576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000d4a919062001548565b905060006009600084815260200190815260200160002054905060006008838154811062000d7d5762000d7c62001799565b5b90600052602060002001549050806008838154811062000da25762000da162001799565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000df45762000df36200176a565b5b6001900381819060005260206000200160009055905550505050565b600062000e288362000e9c60201b62001c051760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000f10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f079062001360565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000f659062001623565b90600052602060002090601f01602090048101928262000f89576000855562000fd5565b82601f1062000fa457805160ff191683800117855562000fd5565b8280016001018555821562000fd5579182015b8281111562000fd457825182559160200191906001019062000fb7565b5b50905062000fe4919062000ff6565b5090565b610d16806200768483390190565b5b808211156200101157600081600090555060010162000ff7565b5090565b60006200102c6200102684620013ef565b620013c6565b9050828152602081018484840111156200104b576200104a620017fc565b5b62001058848285620015ed565b509392505050565b600081519050620010718162001984565b92915050565b600082601f8301126200108f576200108e620017f7565b5b8151620010a184826020860162001015565b91505092915050565b600081519050620010bb816200199e565b92915050565b600060208284031215620010da57620010d962001806565b5b6000620010ea8482850162001060565b91505092915050565b600080604083850312156200110d576200110c62001806565b5b600083015167ffffffffffffffff8111156200112e576200112d62001801565b5b6200113c8582860162001077565b92505060206200114f85828601620010aa565b9150509250929050565b620011648162001583565b82525050565b6000620011778262001425565b62001183818562001430565b935062001195818560208601620015ed565b620011a0816200180b565b840191505092915050565b6000620011ba60328362001441565b9150620011c7826200181c565b604082019050919050565b6000620011e160268362001441565b9150620011ee826200186b565b604082019050919050565b600062001208601c8362001441565b91506200121582620018ba565b602082019050919050565b60006200122f602a8362001441565b91506200123c82620018e3565b604082019050919050565b60006200125660208362001441565b9150620012638262001932565b602082019050919050565b60006200127d60208362001441565b91506200128a826200195b565b602082019050919050565b620012a081620015e3565b82525050565b6000608082019050620012bd600083018762001159565b620012cc602083018662001159565b620012db604083018562001295565b8181036060830152620012ef81846200116a565b905095945050505050565b600060208201905081810360008301526200131581620011ab565b9050919050565b600060208201905081810360008301526200133781620011d2565b9050919050565b600060208201905081810360008301526200135981620011f9565b9050919050565b600060208201905081810360008301526200137b8162001220565b9050919050565b600060208201905081810360008301526200139d8162001247565b9050919050565b60006020820190508181036000830152620013bf816200126e565b9050919050565b6000620013d2620013e5565b9050620013e0828262001659565b919050565b6000604051905090565b600067ffffffffffffffff8211156200140d576200140c620017c8565b5b62001418826200180b565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006200145f82620015e3565b91506200146c83620015e3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620014a457620014a3620016dd565b5b828201905092915050565b6000620014bc82620015e3565b9150620014c983620015e3565b925082620014dc57620014db6200170c565b5b828204905092915050565b6000620014f482620015e3565b91506200150183620015e3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200153d576200153c620016dd565b5b828202905092915050565b60006200155582620015e3565b91506200156283620015e3565b925082821015620015785762001577620016dd565b5b828203905092915050565b60006200159082620015c3565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200160d578082015181840152602081019050620015f0565b838111156200161d576000848401525b50505050565b600060028204905060018216806200163c57607f821691505b602082108114156200165357620016526200173b565b5b50919050565b62001664826200180b565b810181811067ffffffffffffffff82111715620016865762001685620017c8565b5b80604052505050565b60006200169c82620015e3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620016d257620016d1620016dd565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6200198f8162001597565b81146200199b57600080fd5b50565b620019a981620015e3565b8114620019b557600080fd5b50565b60805160601c615c9f620019e56000396000818161165a01528181612444015261314b0152615c9f6000f3fe60806040526004361061031a5760003560e01c80636a795732116101ab578063b88d4fde116100f7578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b14610bf4578063f30e60e314610c1d578063f46a04eb14610c46578063f53a0b1d14610c6f5761031a565b8063e985e9c514610b65578063ea05a8c614610ba2578063edac985b14610bcb5761031a565b8063c87b56dd116100d1578063c87b56dd14610a95578063d123973014610ad2578063d5abeb0114610afd578063e2982c2114610b285761031a565b8063b88d4fde14610a04578063c2ba474414610a2d578063c5f956af14610a6a5761031a565b806395d89b4111610164578063a0712d681161013e578063a0712d6814610969578063a22cb46514610985578063b0d356e5146109ae578063b12dab6e146109d95761031a565b806395d89b41146108d857806399f7e45f146109035780639b19251a1461092c5761031a565b80636a795732146107c857806370a08231146107f3578063715018a614610830578063839ad1d3146108475780638da5cb5b14610884578063931688cb146108af5761031a565b806331b3eb941161026a5780634b4687b5116102235780635a9b0b89116101fd5780635a9b0b891461071b5780636352211e1461074657806363be7533146107835780636605bfda1461079f5761031a565b80634b4687b5146106885780634f6ccce7146106b357806354214f69146106f05761031a565b806331b3eb941461058c5780633af32abf146105b55780633b71275d146105f25780633bd649681461061d578063413fa8e31461063457806342842e0e1461065f5761031a565b806318160ddd116102d7578063288d9faf116102b1578063288d9faf146104be5780632acc659e146104e95780632f745c59146105265780633096b9e8146105635761031a565b806318160ddd14610441578063232452161461046c57806323b872dd146104955761031a565b806301ffc9a71461031f57806306fdde031461035c578063081812fc14610387578063095ea7b3146103c45780630fa4e43e146103ed57806312e179e914610416575b600080fd5b34801561032b57600080fd5b506103466004803603810190610341919061449b565b610c98565b6040516103539190614d53565b60405180910390f35b34801561036857600080fd5b50610371610d12565b60405161037e9190614d6e565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a9919061453e565b610da4565b6040516103bb9190614c78565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e691906143b4565b610e29565b005b3480156103f957600080fd5b50610414600480360381019061040f919061453e565b610f41565b005b34801561042257600080fd5b5061042b61124e565b60405161043891906150ab565b60405180910390f35b34801561044d57600080fd5b50610456611254565b60405161046391906150ab565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e91906143f4565b611261565b005b3480156104a157600080fd5b506104bc60048036038101906104b7919061429e565b611382565b005b3480156104ca57600080fd5b506104d36113e2565b6040516104e091906150ab565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b9190614204565b6113e8565b60405161051d91906150ab565b60405180910390f35b34801561053257600080fd5b5061054d600480360381019061054891906143b4565b61151a565b60405161055a91906150ab565b60405180910390f35b34801561056f57600080fd5b5061058a60048036038101906105859190614441565b6115bf565b005b34801561059857600080fd5b506105b360048036038101906105ae9190614231565b611658565b005b3480156105c157600080fd5b506105dc60048036038101906105d79190614204565b6116e6565b6040516105e99190614d53565b60405180910390f35b3480156105fe57600080fd5b506106076117ee565b6040516106149190614d53565b60405180910390f35b34801561062957600080fd5b50610632611801565b005b34801561064057600080fd5b5061064961189a565b60405161065691906150ab565b60405180910390f35b34801561066b57600080fd5b506106866004803603810190610681919061429e565b6118a0565b005b34801561069457600080fd5b5061069d6118c0565b6040516106aa9190614d53565b60405180910390f35b3480156106bf57600080fd5b506106da60048036038101906106d5919061453e565b6118d3565b6040516106e791906150ab565b60405180910390f35b3480156106fc57600080fd5b50610705611944565b6040516107129190614d53565b60405180910390f35b34801561072757600080fd5b50610730611957565b60405161073d9190615090565b60405180910390f35b34801561075257600080fd5b5061076d6004803603810190610768919061453e565b6119a8565b60405161077a9190614c78565b60405180910390f35b61079d6004803603810190610798919061453e565b611a5a565b005b3480156107ab57600080fd5b506107c660048036038101906107c19190614204565b611b3f565b005b3480156107d457600080fd5b506107dd611bff565b6040516107ea91906150ab565b60405180910390f35b3480156107ff57600080fd5b5061081a60048036038101906108159190614204565b611c05565b60405161082791906150ab565b60405180910390f35b34801561083c57600080fd5b50610845611cbd565b005b34801561085357600080fd5b5061086e60048036038101906108699190614204565b611d3b565b60405161087b9190614d31565b60405180910390f35b34801561089057600080fd5b50610899611def565b6040516108a69190614c78565b60405180910390f35b3480156108bb57600080fd5b506108d660048036038101906108d191906144f5565b611e19565b005b3480156108e457600080fd5b506108ed611eaf565b6040516108fa9190614d6e565b60405180910390f35b34801561090f57600080fd5b5061092a60048036038101906109259190614204565b611f41565b005b34801561093857600080fd5b50610953600480360381019061094e9190614204565b612001565b6040516109609190614d53565b60405180910390f35b610983600480360381019061097e919061453e565b612021565b005b34801561099157600080fd5b506109ac60048036038101906109a79190614374565b61225e565b005b3480156109ba57600080fd5b506109c3612274565b6040516109d09190614c78565b60405180910390f35b3480156109e557600080fd5b506109ee61229a565b6040516109fb91906150ab565b60405180910390f35b348015610a1057600080fd5b50610a2b6004803603810190610a2691906142f1565b6122a0565b005b348015610a3957600080fd5b50610a546004803603810190610a4f9190614204565b612302565b604051610a6191906150ab565b60405180910390f35b348015610a7657600080fd5b50610a7f612388565b604051610a8c9190614c78565b60405180910390f35b348015610aa157600080fd5b50610abc6004803603810190610ab7919061453e565b6123ae565b604051610ac99190614d6e565b60405180910390f35b348015610ade57600080fd5b50610ae7612423565b604051610af49190614d53565b60405180910390f35b348015610b0957600080fd5b50610b12612436565b604051610b1f91906150ab565b60405180910390f35b348015610b3457600080fd5b50610b4f6004803603810190610b4a9190614204565b612440565b604051610b5c91906150ab565b60405180910390f35b348015610b7157600080fd5b50610b8c6004803603810190610b87919061425e565b6124f2565b604051610b999190614d53565b60405180910390f35b348015610bae57600080fd5b50610bc96004803603810190610bc49190614441565b612586565b005b348015610bd757600080fd5b50610bf26004803603810190610bed91906143f4565b61261f565b005b348015610c0057600080fd5b50610c1b6004803603810190610c169190614204565b612740565b005b348015610c2957600080fd5b50610c446004803603810190610c3f9190614598565b612838565b005b348015610c5257600080fd5b50610c6d6004803603810190610c689190614441565b6128d8565b005b348015610c7b57600080fd5b50610c966004803603810190610c9191906145d8565b612971565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d0b5750610d0a82612a27565b5b9050919050565b606060008054610d21906153bb565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4d906153bb565b8015610d9a5780601f10610d6f57610100808354040283529160200191610d9a565b820191906000526020600020905b815481529060010190602001808311610d7d57829003601f168201915b5050505050905090565b6000610daf82612b09565b610dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de590614f10565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e34826119a8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c90614fd0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ec4612b75565b73ffffffffffffffffffffffffffffffffffffffff161480610ef35750610ef281610eed612b75565b6124f2565b5b610f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2990614e70565b60405180910390fd5b610f3c8383612b7d565b505050565b601560009054906101000a900460ff16610f90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8790614fb0565b60405180910390fd5b601560019054906101000a900460ff1615610fee57610fae336116e6565b610fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe490615050565b60405180910390fd5b5b60011515601560029054906101000a900460ff16151514611044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103b90614f90565b60405180910390fd5b600a811115611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f90615010565b60405180910390fd5b600081116110cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c290615010565b60405180910390fd5b611a0a816110d7611254565b6110e191906151de565b1115611122576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111990614ed0565b60405180910390fd5b6000816010546111329190615265565b9050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b81526004016111b593929190614cae565b602060405180830381600087803b1580156111cf57600080fd5b505af11580156111e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611207919061446e565b5060005b82811015611249576000600161121f611254565b61122991906151de565b90506112353382612c36565b5080806112419061541e565b91505061120b565b505050565b60125481565b6000600880549050905090565b611269612b75565b73ffffffffffffffffffffffffffffffffffffffff16611287611def565b73ffffffffffffffffffffffffffffffffffffffff16146112dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d490614f30565b60405180910390fd5b60005b8282905081101561137d576000600b600085858581811061130457611303615554565b5b90506020020160208101906113199190614204565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806113759061541e565b9150506112e0565b505050565b61139361138d612b75565b82612c54565b6113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c990614ff0565b60405180910390fd5b6113dd838383612d32565b505050565b600e5481565b600080600d54905060011515600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561145357600f549050611511565b60011515601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a230c524856040518263ffffffff1660e01b81526004016114b29190614c78565b60206040518083038186803b1580156114ca57600080fd5b505afa1580156114de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611502919061446e565b1515141561151057600e5490505b5b80915050919050565b600061152583611c05565b8210611566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155d90614d90565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6115c7612b75565b73ffffffffffffffffffffffffffffffffffffffff166115e5611def565b73ffffffffffffffffffffffffffffffffffffffff161461163b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163290614f30565b60405180910390fd5b80601560026101000a81548160ff02191690831515021790555050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166351cff8d9826040518263ffffffff1660e01b81526004016116b19190614c93565b600060405180830381600087803b1580156116cb57600080fd5b505af11580156116df573d6000803e3d6000fd5b5050505050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806117e75750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a230c524836040518263ffffffff1660e01b81526004016117969190614c78565b60206040518083038186803b1580156117ae57600080fd5b505afa1580156117c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e6919061446e565b5b9050919050565b601560029054906101000a900460ff1681565b611809612b75565b73ffffffffffffffffffffffffffffffffffffffff16611827611def565b73ffffffffffffffffffffffffffffffffffffffff161461187d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187490614f30565b60405180910390fd5b6001601560036101000a81548160ff021916908315150217905550565b60105481565b6118bb838383604051806020016040528060008152506122a0565b505050565b601560019054906101000a900460ff1681565b60006118dd611254565b821061191e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191590615030565b60405180910390fd5b6008828154811061193257611931615554565b5b90600052602060002001549050919050565b601560039054906101000a900460ff1681565b61195f613f46565b6040518060e00160405280600d548152602001600e548152602001600f548152602001611a0a8152602001611992611254565b815260200160008152602001600a815250905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4890614eb0565b60405180910390fd5b80915050919050565b601560009054906101000a900460ff16611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa090614fb0565b60405180910390fd5b601560019054906101000a900460ff1615611b0757611ac7336116e6565b611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd90615050565b60405180910390fd5b5b611b1081612f8e565b611b3c600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1634613149565b50565b611b47612b75565b73ffffffffffffffffffffffffffffffffffffffff16611b65611def565b73ffffffffffffffffffffffffffffffffffffffff1614611bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb290614f30565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6d90614e90565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611cc5612b75565b73ffffffffffffffffffffffffffffffffffffffff16611ce3611def565b73ffffffffffffffffffffffffffffffffffffffff1614611d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3090614f30565b60405180910390fd5b565b60606000611d4883611c05565b905060008167ffffffffffffffff811115611d6657611d65615583565b5b604051908082528060200260200182016040528015611d945781602001602082028036833780820191505090505b50905060005b82811015611de4576000611dae868361151a565b905080838381518110611dc457611dc3615554565b5b602002602001018181525050508080611ddc9061541e565b915050611d9a565b508092505050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e21612b75565b73ffffffffffffffffffffffffffffffffffffffff16611e3f611def565b73ffffffffffffffffffffffffffffffffffffffff1614611e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8c90614f30565b60405180910390fd5b8060149080519060200190611eab929190613f83565b5050565b606060018054611ebe906153bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611eea906153bb565b8015611f375780601f10611f0c57610100808354040283529160200191611f37565b820191906000526020600020905b815481529060010190602001808311611f1a57829003601f168201915b5050505050905090565b611f49612b75565b73ffffffffffffffffffffffffffffffffffffffff16611f67611def565b73ffffffffffffffffffffffffffffffffffffffff1614611fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb490614f30565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b6020528060005260406000206000915054906101000a900460ff1681565b601560009054906101000a900460ff16612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206790614fb0565b60405180910390fd5b601560019054906101000a900460ff16156120ce5761208e336116e6565b6120cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c490615050565b60405180910390fd5b5b6120d781612f8e565b6000620186a0601254346120eb9190615265565b6120f59190615234565b90506000813461210591906152bf565b9050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634065da638373454cfaa623a629cc0b4017aeb85d54c42e91479d6040518363ffffffff1660e01b81526004016121779190614c78565b6000604051808303818588803b15801561219057600080fd5b505af11580156121a4573d6000803e3d6000fd5b5050505050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634065da6382600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016122279190614c78565b6000604051808303818588803b15801561224057600080fd5b505af1158015612254573d6000803e3d6000fd5b5050505050505050565b612270612269612b75565b83836131d9565b5050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b6122b16122ab612b75565b83612c54565b6122f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e790614ff0565b60405180910390fd5b6122fc84848484613346565b50505050565b6000801515601560009054906101000a900460ff16151514156123285760009050612383565b60011515601560019054906101000a900460ff161515148015612357575060001515612353836116e6565b1515145b156123655760009050612383565b611a0a612370611254565b1061237e5760009050612383565b600a90505b919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060011515601560039054906101000a900460ff161515146123f35760146040516020016123dd9190614c56565b604051602081830303815290604052905061241e565b6123fc826133a2565b60405160200161240c9190614c1b565b60405160208183030381529060405290505b919050565b601560009054906101000a900460ff1681565b6000611a0a905090565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e3a9db1a836040518263ffffffff1660e01b815260040161249b9190614c78565b60206040518083038186803b1580156124b357600080fd5b505afa1580156124c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124eb919061456b565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61258e612b75565b73ffffffffffffffffffffffffffffffffffffffff166125ac611def565b73ffffffffffffffffffffffffffffffffffffffff1614612602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f990614f30565b60405180910390fd5b80601560016101000a81548160ff02191690831515021790555050565b612627612b75565b73ffffffffffffffffffffffffffffffffffffffff16612645611def565b73ffffffffffffffffffffffffffffffffffffffff161461269b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269290614f30565b60405180910390fd5b60005b8282905081101561273b576001600b60008585858181106126c2576126c1615554565b5b90506020020160208101906126d79190614204565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806127339061541e565b91505061269e565b505050565b612748612b75565b73ffffffffffffffffffffffffffffffffffffffff16612766611def565b73ffffffffffffffffffffffffffffffffffffffff16146127bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b390614f30565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561282c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282390614dd0565b60405180910390fd5b61283581613449565b50565b612840612b75565b73ffffffffffffffffffffffffffffffffffffffff1661285e611def565b73ffffffffffffffffffffffffffffffffffffffff16146128b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ab90614f30565b60405180910390fd5b8082620186a06128c49190615265565b6128ce9190615234565b6012819055505050565b6128e0612b75565b73ffffffffffffffffffffffffffffffffffffffff166128fe611def565b73ffffffffffffffffffffffffffffffffffffffff1614612954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294b90614f30565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b612979612b75565b73ffffffffffffffffffffffffffffffffffffffff16612997611def565b73ffffffffffffffffffffffffffffffffffffffff16146129ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e490614f30565b60405180910390fd5b83600d8190555082600e8190555081600f819055508060108190555050505050565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612af257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b025750612b018261350f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612bf0836119a8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612c50828260405180602001604052806000815250613579565b5050565b6000612c5f82612b09565b612c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9590614e50565b60405180910390fd5b6000612ca9836119a8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612d1857508373ffffffffffffffffffffffffffffffffffffffff16612d0084610da4565b73ffffffffffffffffffffffffffffffffffffffff16145b80612d295750612d2881856124f2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612d52826119a8565b73ffffffffffffffffffffffffffffffffffffffff1614612da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9f90614f50565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0f90614e10565b60405180910390fd5b612e238383836135d4565b612e2e600082612b7d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e7e91906152bf565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ed591906151de565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600a811115612fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc990615010565b60405180910390fd5b60008111613015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300c90615010565b60405180910390fd5b611a0a81613021611254565b61302b91906151de565b111561306c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306390614ed0565b60405180910390fd5b600081613078336113e8565b6130829190615265565b9050348114806130c45750613095611def565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b613103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130fa90615070565b60405180910390fd5b60005b82811015613144576000600161311a611254565b61312491906151de565b90506131303382612c36565b50808061313c9061541e565b915050613106565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f340fa0182846040518363ffffffff1660e01b81526004016131a39190614c78565b6000604051808303818588803b1580156131bc57600080fd5b505af11580156131d0573d6000803e3d6000fd5b50505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323f90614e30565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516133399190614d53565b60405180910390a3505050565b613351848484612d32565b61335d848484846136e8565b61339c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339390614db0565b60405180910390fd5b50505050565b60606133ad82612b09565b6133ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e390614f70565b60405180910390fd5b60006133f661387f565b905060008151116134165760405180602001604052806000815250613441565b8061342084613911565b604051602001613431929190614c32565b6040516020818303038152906040525b915050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6135838383613a72565b61359060008484846136e8565b6135cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c690614db0565b60405180910390fd5b505050565b6135df838383612a22565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156136225761361d81613c40565b613661565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146136605761365f8382613c89565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136a45761369f81613df6565b6136e3565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146136e2576136e18282613ec7565b5b5b505050565b60006137098473ffffffffffffffffffffffffffffffffffffffff16612a0f565b15613872578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613732612b75565b8786866040518563ffffffff1660e01b81526004016137549493929190614ce5565b602060405180830381600087803b15801561376e57600080fd5b505af192505050801561379f57506040513d601f19601f8201168201806040525081019061379c91906144c8565b60015b613822573d80600081146137cf576040519150601f19603f3d011682016040523d82523d6000602084013e6137d4565b606091505b5060008151141561381a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161381190614db0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613877565b600190505b949350505050565b60606014805461388e906153bb565b80601f01602080910402602001604051908101604052809291908181526020018280546138ba906153bb565b80156139075780601f106138dc57610100808354040283529160200191613907565b820191906000526020600020905b8154815290600101906020018083116138ea57829003601f168201915b5050505050905090565b60606000821415613959576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613a6d565b600082905060005b6000821461398b5780806139749061541e565b915050600a826139849190615234565b9150613961565b60008167ffffffffffffffff8111156139a7576139a6615583565b5b6040519080825280601f01601f1916602001820160405280156139d95781602001600182028036833780820191505090505b5090505b60008514613a66576001826139f291906152bf565b9150600a85613a019190615467565b6030613a0d91906151de565b60f81b818381518110613a2357613a22615554565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613a5f9190615234565b94506139dd565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ad990614ef0565b60405180910390fd5b613aeb81612b09565b15613b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2290614df0565b60405180910390fd5b613b37600083836135d4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b8791906151de565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613c9684611c05565b613ca091906152bf565b9050600060076000848152602001908152602001600020549050818114613d85576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613e0a91906152bf565b9050600060096000848152602001908152602001600020549050600060088381548110613e3a57613e39615554565b5b906000526020600020015490508060088381548110613e5c57613e5b615554565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613eab57613eaa615525565b5b6001900381819060005260206000200160009055905550505050565b6000613ed283611c05565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054613f8f906153bb565b90600052602060002090601f016020900481019282613fb15760008555613ff8565b82601f10613fca57805160ff1916838001178555613ff8565b82800160010185558215613ff8579182015b82811115613ff7578251825591602001919060010190613fdc565b5b5090506140059190614009565b5090565b5b8082111561402257600081600090555060010161400a565b5090565b6000614039614034846150eb565b6150c6565b905082815260208101848484011115614055576140546155c1565b5b614060848285615379565b509392505050565b600061407b6140768461511c565b6150c6565b905082815260208101848484011115614097576140966155c1565b5b6140a2848285615379565b509392505050565b6000813590506140b981615bf6565b92915050565b6000813590506140ce81615c0d565b92915050565b60008083601f8401126140ea576140e96155b7565b5b8235905067ffffffffffffffff811115614107576141066155b2565b5b602083019150836020820283011115614123576141226155bc565b5b9250929050565b60008135905061413981615c24565b92915050565b60008151905061414e81615c24565b92915050565b60008135905061416381615c3b565b92915050565b60008151905061417881615c3b565b92915050565b600082601f830112614193576141926155b7565b5b81356141a3848260208601614026565b91505092915050565b600082601f8301126141c1576141c06155b7565b5b81356141d1848260208601614068565b91505092915050565b6000813590506141e981615c52565b92915050565b6000815190506141fe81615c52565b92915050565b60006020828403121561421a576142196155cb565b5b6000614228848285016140aa565b91505092915050565b600060208284031215614247576142466155cb565b5b6000614255848285016140bf565b91505092915050565b60008060408385031215614275576142746155cb565b5b6000614283858286016140aa565b9250506020614294858286016140aa565b9150509250929050565b6000806000606084860312156142b7576142b66155cb565b5b60006142c5868287016140aa565b93505060206142d6868287016140aa565b92505060406142e7868287016141da565b9150509250925092565b6000806000806080858703121561430b5761430a6155cb565b5b6000614319878288016140aa565b945050602061432a878288016140aa565b935050604061433b878288016141da565b925050606085013567ffffffffffffffff81111561435c5761435b6155c6565b5b6143688782880161417e565b91505092959194509250565b6000806040838503121561438b5761438a6155cb565b5b6000614399858286016140aa565b92505060206143aa8582860161412a565b9150509250929050565b600080604083850312156143cb576143ca6155cb565b5b60006143d9858286016140aa565b92505060206143ea858286016141da565b9150509250929050565b6000806020838503121561440b5761440a6155cb565b5b600083013567ffffffffffffffff811115614429576144286155c6565b5b614435858286016140d4565b92509250509250929050565b600060208284031215614457576144566155cb565b5b60006144658482850161412a565b91505092915050565b600060208284031215614484576144836155cb565b5b60006144928482850161413f565b91505092915050565b6000602082840312156144b1576144b06155cb565b5b60006144bf84828501614154565b91505092915050565b6000602082840312156144de576144dd6155cb565b5b60006144ec84828501614169565b91505092915050565b60006020828403121561450b5761450a6155cb565b5b600082013567ffffffffffffffff811115614529576145286155c6565b5b614535848285016141ac565b91505092915050565b600060208284031215614554576145536155cb565b5b6000614562848285016141da565b91505092915050565b600060208284031215614581576145806155cb565b5b600061458f848285016141ef565b91505092915050565b600080604083850312156145af576145ae6155cb565b5b60006145bd858286016141da565b92505060206145ce858286016141da565b9150509250929050565b600080600080608085870312156145f2576145f16155cb565b5b6000614600878288016141da565b9450506020614611878288016141da565b9350506040614622878288016141da565b9250506060614633878288016141da565b91505092959194509250565b600061464b8383614bfd565b60208301905092915050565b61466081615305565b82525050565b61466f816152f3565b82525050565b600061468082615172565b61468a81856151a0565b93506146958361514d565b8060005b838110156146c65781516146ad888261463f565b97506146b883615193565b925050600181019050614699565b5085935050505092915050565b6146dc81615317565b82525050565b60006146ed8261517d565b6146f781856151b1565b9350614707818560208601615388565b614710816155d0565b840191505092915050565b600061472682615188565b61473081856151c2565b9350614740818560208601615388565b614749816155d0565b840191505092915050565b600061475f82615188565b61476981856151d3565b9350614779818560208601615388565b80840191505092915050565b60008154614792816153bb565b61479c81866151d3565b945060018216600081146147b757600181146147c8576147fb565b60ff198316865281860193506147fb565b6147d18561515d565b60005b838110156147f3578154818901526001820191506020810190506147d4565b838801955050505b50505092915050565b6000614811602b836151c2565b915061481c826155e1565b604082019050919050565b60006148346032836151c2565b915061483f82615630565b604082019050919050565b60006148576026836151c2565b91506148628261567f565b604082019050919050565b600061487a601c836151c2565b9150614885826156ce565b602082019050919050565b600061489d6024836151c2565b91506148a8826156f7565b604082019050919050565b60006148c06019836151c2565b91506148cb82615746565b602082019050919050565b60006148e3602c836151c2565b91506148ee8261576f565b604082019050919050565b60006149066038836151c2565b9150614911826157be565b604082019050919050565b6000614929602a836151c2565b91506149348261580d565b604082019050919050565b600061494c6029836151c2565b91506149578261585c565b604082019050919050565b600061496f6018836151c2565b915061497a826158ab565b602082019050919050565b60006149926020836151c2565b915061499d826158d4565b602082019050919050565b60006149b5602c836151c2565b91506149c0826158fd565b604082019050919050565b60006149d86020836151c2565b91506149e38261594c565b602082019050919050565b60006149fb6029836151c2565b9150614a0682615975565b604082019050919050565b6000614a1e602f836151c2565b9150614a29826159c4565b604082019050919050565b6000614a41601f836151c2565b9150614a4c82615a13565b602082019050919050565b6000614a64600b836151d3565b9150614a6f82615a3c565b600b82019050919050565b6000614a87600d836151c2565b9150614a9282615a65565b602082019050919050565b6000614aaa6021836151c2565b9150614ab582615a8e565b604082019050919050565b6000614acd6031836151c2565b9150614ad882615add565b604082019050919050565b6000614af06013836151c2565b9150614afb82615b2c565b602082019050919050565b6000614b13602c836151c2565b9150614b1e82615b55565b604082019050919050565b6000614b36600f836151c2565b9150614b4182615ba4565b602082019050919050565b6000614b596011836151c2565b9150614b6482615bcd565b602082019050919050565b60e082016000820151614b856000850182614bfd565b506020820151614b986020850182614bfd565b506040820151614bab6040850182614bfd565b506060820151614bbe6060850182614bfd565b506080820151614bd16080850182614bfd565b5060a0820151614be460a0850182614bfd565b5060c0820151614bf760c0850182614bfd565b50505050565b614c068161536f565b82525050565b614c158161536f565b82525050565b6000614c278284614754565b915081905092915050565b6000614c3e8285614754565b9150614c4a8284614754565b91508190509392505050565b6000614c628284614785565b9150614c6d82614a57565b915081905092915050565b6000602082019050614c8d6000830184614666565b92915050565b6000602082019050614ca86000830184614657565b92915050565b6000606082019050614cc36000830186614666565b614cd06020830185614666565b614cdd6040830184614c0c565b949350505050565b6000608082019050614cfa6000830187614666565b614d076020830186614666565b614d146040830185614c0c565b8181036060830152614d2681846146e2565b905095945050505050565b60006020820190508181036000830152614d4b8184614675565b905092915050565b6000602082019050614d6860008301846146d3565b92915050565b60006020820190508181036000830152614d88818461471b565b905092915050565b60006020820190508181036000830152614da981614804565b9050919050565b60006020820190508181036000830152614dc981614827565b9050919050565b60006020820190508181036000830152614de98161484a565b9050919050565b60006020820190508181036000830152614e098161486d565b9050919050565b60006020820190508181036000830152614e2981614890565b9050919050565b60006020820190508181036000830152614e49816148b3565b9050919050565b60006020820190508181036000830152614e69816148d6565b9050919050565b60006020820190508181036000830152614e89816148f9565b9050919050565b60006020820190508181036000830152614ea98161491c565b9050919050565b60006020820190508181036000830152614ec98161493f565b9050919050565b60006020820190508181036000830152614ee981614962565b9050919050565b60006020820190508181036000830152614f0981614985565b9050919050565b60006020820190508181036000830152614f29816149a8565b9050919050565b60006020820190508181036000830152614f49816149cb565b9050919050565b60006020820190508181036000830152614f69816149ee565b9050919050565b60006020820190508181036000830152614f8981614a11565b9050919050565b60006020820190508181036000830152614fa981614a34565b9050919050565b60006020820190508181036000830152614fc981614a7a565b9050919050565b60006020820190508181036000830152614fe981614a9d565b9050919050565b6000602082019050818103600083015261500981614ac0565b9050919050565b6000602082019050818103600083015261502981614ae3565b9050919050565b6000602082019050818103600083015261504981614b06565b9050919050565b6000602082019050818103600083015261506981614b29565b9050919050565b6000602082019050818103600083015261508981614b4c565b9050919050565b600060e0820190506150a56000830184614b6f565b92915050565b60006020820190506150c06000830184614c0c565b92915050565b60006150d06150e1565b90506150dc82826153ed565b919050565b6000604051905090565b600067ffffffffffffffff82111561510657615105615583565b5b61510f826155d0565b9050602081019050919050565b600067ffffffffffffffff82111561513757615136615583565b5b615140826155d0565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006151e98261536f565b91506151f48361536f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561522957615228615498565b5b828201905092915050565b600061523f8261536f565b915061524a8361536f565b92508261525a576152596154c7565b5b828204905092915050565b60006152708261536f565b915061527b8361536f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152b4576152b3615498565b5b828202905092915050565b60006152ca8261536f565b91506152d58361536f565b9250828210156152e8576152e7615498565b5b828203905092915050565b60006152fe8261534f565b9050919050565b60006153108261534f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156153a657808201518184015260208101905061538b565b838111156153b5576000848401525b50505050565b600060028204905060018216806153d357607f821691505b602082108114156153e7576153e66154f6565b5b50919050565b6153f6826155d0565b810181811067ffffffffffffffff8211171561541557615414615583565b5b80604052505050565b60006154298261536f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561545c5761545b615498565b5b600182019050919050565b60006154728261536f565b915061547d8361536f565b92508261548d5761548c6154c7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f457863656564696e67204d6178204d696e7420436f756e740000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243323020546f6b656e204d696e74696e672069732064697361626c656400600082015250565b7f6e6f7452657665616c6564000000000000000000000000000000000000000000600082015250565b7f4d696e742044697361626c656400000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f742057686974656c69737465640000000000000000000000000000000000600082015250565b7f496e636f7272656374205061796d656e74000000000000000000000000000000600082015250565b615bff816152f3565b8114615c0a57600080fd5b50565b615c1681615305565b8114615c2157600080fd5b50565b615c2d81615317565b8114615c3857600080fd5b50565b615c4481615323565b8114615c4f57600080fd5b50565b615c5b8161536f565b8114615c6657600080fd5b5056fea2646970667358221220a59645fa8ac3ef5ae8a33999899e074e5b850eb2590f28ea805094b309e678d464736f6c63430008070033608060405234801561001057600080fd5b5061002d61002261003260201b60201c565b61003a60201b60201c565b6100fe565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610c098061010d6000396000f3fe6080604052600436106100555760003560e01c806351cff8d91461005a578063715018a6146100835780638da5cb5b1461009a578063e3a9db1a146100c5578063f2fde38b14610102578063f340fa011461012b575b600080fd5b34801561006657600080fd5b50610081600480360381019061007c91906107f9565b610147565b005b34801561008f57600080fd5b506100986102c7565b005b3480156100a657600080fd5b506100af61034f565b6040516100bc9190610908565b60405180910390f35b3480156100d157600080fd5b506100ec60048036038101906100e791906107cc565b610378565b6040516100f991906109a3565b60405180910390f35b34801561010e57600080fd5b50610129600480360381019061012491906107cc565b6103c1565b005b610145600480360381019061014091906107cc565b6104b9565b005b61014f6105e2565b73ffffffffffffffffffffffffffffffffffffffff1661016d61034f565b73ffffffffffffffffffffffffffffffffffffffff16146101c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ba90610983565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610275818373ffffffffffffffffffffffffffffffffffffffff166105ea90919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5826040516102bb91906109a3565b60405180910390a25050565b6102cf6105e2565b73ffffffffffffffffffffffffffffffffffffffff166102ed61034f565b73ffffffffffffffffffffffffffffffffffffffff1614610343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033a90610983565b60405180910390fd5b61034d60006106de565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6103c96105e2565b73ffffffffffffffffffffffffffffffffffffffff166103e761034f565b73ffffffffffffffffffffffffffffffffffffffff161461043d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043490610983565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156104ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104a490610923565b60405180910390fd5b6104b6816106de565b50565b6104c16105e2565b73ffffffffffffffffffffffffffffffffffffffff166104df61034f565b73ffffffffffffffffffffffffffffffffffffffff1614610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052c90610983565b60405180910390fd5b600034905080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461058991906109da565b925050819055508173ffffffffffffffffffffffffffffffffffffffff167f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4826040516105d691906109a3565b60405180910390a25050565b600033905090565b8047101561062d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062490610963565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051610653906108f3565b60006040518083038185875af1925050503d8060008114610690576040519150601f19603f3d011682016040523d82523d6000602084013e610695565b606091505b50509050806106d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d090610943565b60405180910390fd5b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000813590506107b181610ba5565b92915050565b6000813590506107c681610bbc565b92915050565b6000602082840312156107e2576107e1610aad565b5b60006107f0848285016107a2565b91505092915050565b60006020828403121561080f5761080e610aad565b5b600061081d848285016107b7565b91505092915050565b61082f81610a30565b82525050565b60006108426026836109c9565b915061084d82610ab2565b604082019050919050565b6000610865603a836109c9565b915061087082610b01565b604082019050919050565b6000610888601d836109c9565b915061089382610b50565b602082019050919050565b60006108ab6020836109c9565b91506108b682610b79565b602082019050919050565b60006108ce6000836109be565b91506108d982610ba2565b600082019050919050565b6108ed81610a74565b82525050565b60006108fe826108c1565b9150819050919050565b600060208201905061091d6000830184610826565b92915050565b6000602082019050818103600083015261093c81610835565b9050919050565b6000602082019050818103600083015261095c81610858565b9050919050565b6000602082019050818103600083015261097c8161087b565b9050919050565b6000602082019050818103600083015261099c8161089e565b9050919050565b60006020820190506109b860008301846108e4565b92915050565b600081905092915050565b600082825260208201905092915050565b60006109e582610a74565b91506109f083610a74565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610a2557610a24610a7e565b5b828201905092915050565b6000610a3b82610a54565b9050919050565b6000610a4d82610a54565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b610bae81610a30565b8114610bb957600080fd5b50565b610bc581610a42565b8114610bd057600080fd5b5056fea264697066735822122016134557b1e9088c0f50882bd65b2f8bd2d736d71b71ebfd2e0721bf273045da64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d66485632793174764657655332347031785454734876685454624c6633744267706242646232617a7876694a2f00000000000000000000
Deployed Bytecode
0x60806040526004361061031a5760003560e01c80636a795732116101ab578063b88d4fde116100f7578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b14610bf4578063f30e60e314610c1d578063f46a04eb14610c46578063f53a0b1d14610c6f5761031a565b8063e985e9c514610b65578063ea05a8c614610ba2578063edac985b14610bcb5761031a565b8063c87b56dd116100d1578063c87b56dd14610a95578063d123973014610ad2578063d5abeb0114610afd578063e2982c2114610b285761031a565b8063b88d4fde14610a04578063c2ba474414610a2d578063c5f956af14610a6a5761031a565b806395d89b4111610164578063a0712d681161013e578063a0712d6814610969578063a22cb46514610985578063b0d356e5146109ae578063b12dab6e146109d95761031a565b806395d89b41146108d857806399f7e45f146109035780639b19251a1461092c5761031a565b80636a795732146107c857806370a08231146107f3578063715018a614610830578063839ad1d3146108475780638da5cb5b14610884578063931688cb146108af5761031a565b806331b3eb941161026a5780634b4687b5116102235780635a9b0b89116101fd5780635a9b0b891461071b5780636352211e1461074657806363be7533146107835780636605bfda1461079f5761031a565b80634b4687b5146106885780634f6ccce7146106b357806354214f69146106f05761031a565b806331b3eb941461058c5780633af32abf146105b55780633b71275d146105f25780633bd649681461061d578063413fa8e31461063457806342842e0e1461065f5761031a565b806318160ddd116102d7578063288d9faf116102b1578063288d9faf146104be5780632acc659e146104e95780632f745c59146105265780633096b9e8146105635761031a565b806318160ddd14610441578063232452161461046c57806323b872dd146104955761031a565b806301ffc9a71461031f57806306fdde031461035c578063081812fc14610387578063095ea7b3146103c45780630fa4e43e146103ed57806312e179e914610416575b600080fd5b34801561032b57600080fd5b506103466004803603810190610341919061449b565b610c98565b6040516103539190614d53565b60405180910390f35b34801561036857600080fd5b50610371610d12565b60405161037e9190614d6e565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a9919061453e565b610da4565b6040516103bb9190614c78565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e691906143b4565b610e29565b005b3480156103f957600080fd5b50610414600480360381019061040f919061453e565b610f41565b005b34801561042257600080fd5b5061042b61124e565b60405161043891906150ab565b60405180910390f35b34801561044d57600080fd5b50610456611254565b60405161046391906150ab565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e91906143f4565b611261565b005b3480156104a157600080fd5b506104bc60048036038101906104b7919061429e565b611382565b005b3480156104ca57600080fd5b506104d36113e2565b6040516104e091906150ab565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b9190614204565b6113e8565b60405161051d91906150ab565b60405180910390f35b34801561053257600080fd5b5061054d600480360381019061054891906143b4565b61151a565b60405161055a91906150ab565b60405180910390f35b34801561056f57600080fd5b5061058a60048036038101906105859190614441565b6115bf565b005b34801561059857600080fd5b506105b360048036038101906105ae9190614231565b611658565b005b3480156105c157600080fd5b506105dc60048036038101906105d79190614204565b6116e6565b6040516105e99190614d53565b60405180910390f35b3480156105fe57600080fd5b506106076117ee565b6040516106149190614d53565b60405180910390f35b34801561062957600080fd5b50610632611801565b005b34801561064057600080fd5b5061064961189a565b60405161065691906150ab565b60405180910390f35b34801561066b57600080fd5b506106866004803603810190610681919061429e565b6118a0565b005b34801561069457600080fd5b5061069d6118c0565b6040516106aa9190614d53565b60405180910390f35b3480156106bf57600080fd5b506106da60048036038101906106d5919061453e565b6118d3565b6040516106e791906150ab565b60405180910390f35b3480156106fc57600080fd5b50610705611944565b6040516107129190614d53565b60405180910390f35b34801561072757600080fd5b50610730611957565b60405161073d9190615090565b60405180910390f35b34801561075257600080fd5b5061076d6004803603810190610768919061453e565b6119a8565b60405161077a9190614c78565b60405180910390f35b61079d6004803603810190610798919061453e565b611a5a565b005b3480156107ab57600080fd5b506107c660048036038101906107c19190614204565b611b3f565b005b3480156107d457600080fd5b506107dd611bff565b6040516107ea91906150ab565b60405180910390f35b3480156107ff57600080fd5b5061081a60048036038101906108159190614204565b611c05565b60405161082791906150ab565b60405180910390f35b34801561083c57600080fd5b50610845611cbd565b005b34801561085357600080fd5b5061086e60048036038101906108699190614204565b611d3b565b60405161087b9190614d31565b60405180910390f35b34801561089057600080fd5b50610899611def565b6040516108a69190614c78565b60405180910390f35b3480156108bb57600080fd5b506108d660048036038101906108d191906144f5565b611e19565b005b3480156108e457600080fd5b506108ed611eaf565b6040516108fa9190614d6e565b60405180910390f35b34801561090f57600080fd5b5061092a60048036038101906109259190614204565b611f41565b005b34801561093857600080fd5b50610953600480360381019061094e9190614204565b612001565b6040516109609190614d53565b60405180910390f35b610983600480360381019061097e919061453e565b612021565b005b34801561099157600080fd5b506109ac60048036038101906109a79190614374565b61225e565b005b3480156109ba57600080fd5b506109c3612274565b6040516109d09190614c78565b60405180910390f35b3480156109e557600080fd5b506109ee61229a565b6040516109fb91906150ab565b60405180910390f35b348015610a1057600080fd5b50610a2b6004803603810190610a2691906142f1565b6122a0565b005b348015610a3957600080fd5b50610a546004803603810190610a4f9190614204565b612302565b604051610a6191906150ab565b60405180910390f35b348015610a7657600080fd5b50610a7f612388565b604051610a8c9190614c78565b60405180910390f35b348015610aa157600080fd5b50610abc6004803603810190610ab7919061453e565b6123ae565b604051610ac99190614d6e565b60405180910390f35b348015610ade57600080fd5b50610ae7612423565b604051610af49190614d53565b60405180910390f35b348015610b0957600080fd5b50610b12612436565b604051610b1f91906150ab565b60405180910390f35b348015610b3457600080fd5b50610b4f6004803603810190610b4a9190614204565b612440565b604051610b5c91906150ab565b60405180910390f35b348015610b7157600080fd5b50610b8c6004803603810190610b87919061425e565b6124f2565b604051610b999190614d53565b60405180910390f35b348015610bae57600080fd5b50610bc96004803603810190610bc49190614441565b612586565b005b348015610bd757600080fd5b50610bf26004803603810190610bed91906143f4565b61261f565b005b348015610c0057600080fd5b50610c1b6004803603810190610c169190614204565b612740565b005b348015610c2957600080fd5b50610c446004803603810190610c3f9190614598565b612838565b005b348015610c5257600080fd5b50610c6d6004803603810190610c689190614441565b6128d8565b005b348015610c7b57600080fd5b50610c966004803603810190610c9191906145d8565b612971565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d0b5750610d0a82612a27565b5b9050919050565b606060008054610d21906153bb565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4d906153bb565b8015610d9a5780601f10610d6f57610100808354040283529160200191610d9a565b820191906000526020600020905b815481529060010190602001808311610d7d57829003601f168201915b5050505050905090565b6000610daf82612b09565b610dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de590614f10565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e34826119a8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c90614fd0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ec4612b75565b73ffffffffffffffffffffffffffffffffffffffff161480610ef35750610ef281610eed612b75565b6124f2565b5b610f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2990614e70565b60405180910390fd5b610f3c8383612b7d565b505050565b601560009054906101000a900460ff16610f90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8790614fb0565b60405180910390fd5b601560019054906101000a900460ff1615610fee57610fae336116e6565b610fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe490615050565b60405180910390fd5b5b60011515601560029054906101000a900460ff16151514611044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103b90614f90565b60405180910390fd5b600a811115611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f90615010565b60405180910390fd5b600081116110cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c290615010565b60405180910390fd5b611a0a816110d7611254565b6110e191906151de565b1115611122576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111990614ed0565b60405180910390fd5b6000816010546111329190615265565b9050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b81526004016111b593929190614cae565b602060405180830381600087803b1580156111cf57600080fd5b505af11580156111e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611207919061446e565b5060005b82811015611249576000600161121f611254565b61122991906151de565b90506112353382612c36565b5080806112419061541e565b91505061120b565b505050565b60125481565b6000600880549050905090565b611269612b75565b73ffffffffffffffffffffffffffffffffffffffff16611287611def565b73ffffffffffffffffffffffffffffffffffffffff16146112dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d490614f30565b60405180910390fd5b60005b8282905081101561137d576000600b600085858581811061130457611303615554565b5b90506020020160208101906113199190614204565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806113759061541e565b9150506112e0565b505050565b61139361138d612b75565b82612c54565b6113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c990614ff0565b60405180910390fd5b6113dd838383612d32565b505050565b600e5481565b600080600d54905060011515600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561145357600f549050611511565b60011515601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a230c524856040518263ffffffff1660e01b81526004016114b29190614c78565b60206040518083038186803b1580156114ca57600080fd5b505afa1580156114de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611502919061446e565b1515141561151057600e5490505b5b80915050919050565b600061152583611c05565b8210611566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155d90614d90565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6115c7612b75565b73ffffffffffffffffffffffffffffffffffffffff166115e5611def565b73ffffffffffffffffffffffffffffffffffffffff161461163b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163290614f30565b60405180910390fd5b80601560026101000a81548160ff02191690831515021790555050565b7f0000000000000000000000004bc264eaeed941116681e303a3debd7e649ea3b873ffffffffffffffffffffffffffffffffffffffff166351cff8d9826040518263ffffffff1660e01b81526004016116b19190614c93565b600060405180830381600087803b1580156116cb57600080fd5b505af11580156116df573d6000803e3d6000fd5b5050505050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806117e75750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a230c524836040518263ffffffff1660e01b81526004016117969190614c78565b60206040518083038186803b1580156117ae57600080fd5b505afa1580156117c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e6919061446e565b5b9050919050565b601560029054906101000a900460ff1681565b611809612b75565b73ffffffffffffffffffffffffffffffffffffffff16611827611def565b73ffffffffffffffffffffffffffffffffffffffff161461187d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187490614f30565b60405180910390fd5b6001601560036101000a81548160ff021916908315150217905550565b60105481565b6118bb838383604051806020016040528060008152506122a0565b505050565b601560019054906101000a900460ff1681565b60006118dd611254565b821061191e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191590615030565b60405180910390fd5b6008828154811061193257611931615554565b5b90600052602060002001549050919050565b601560039054906101000a900460ff1681565b61195f613f46565b6040518060e00160405280600d548152602001600e548152602001600f548152602001611a0a8152602001611992611254565b815260200160008152602001600a815250905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4890614eb0565b60405180910390fd5b80915050919050565b601560009054906101000a900460ff16611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa090614fb0565b60405180910390fd5b601560019054906101000a900460ff1615611b0757611ac7336116e6565b611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd90615050565b60405180910390fd5b5b611b1081612f8e565b611b3c600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1634613149565b50565b611b47612b75565b73ffffffffffffffffffffffffffffffffffffffff16611b65611def565b73ffffffffffffffffffffffffffffffffffffffff1614611bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb290614f30565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6d90614e90565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611cc5612b75565b73ffffffffffffffffffffffffffffffffffffffff16611ce3611def565b73ffffffffffffffffffffffffffffffffffffffff1614611d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3090614f30565b60405180910390fd5b565b60606000611d4883611c05565b905060008167ffffffffffffffff811115611d6657611d65615583565b5b604051908082528060200260200182016040528015611d945781602001602082028036833780820191505090505b50905060005b82811015611de4576000611dae868361151a565b905080838381518110611dc457611dc3615554565b5b602002602001018181525050508080611ddc9061541e565b915050611d9a565b508092505050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e21612b75565b73ffffffffffffffffffffffffffffffffffffffff16611e3f611def565b73ffffffffffffffffffffffffffffffffffffffff1614611e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8c90614f30565b60405180910390fd5b8060149080519060200190611eab929190613f83565b5050565b606060018054611ebe906153bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611eea906153bb565b8015611f375780601f10611f0c57610100808354040283529160200191611f37565b820191906000526020600020905b815481529060010190602001808311611f1a57829003601f168201915b5050505050905090565b611f49612b75565b73ffffffffffffffffffffffffffffffffffffffff16611f67611def565b73ffffffffffffffffffffffffffffffffffffffff1614611fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb490614f30565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b6020528060005260406000206000915054906101000a900460ff1681565b601560009054906101000a900460ff16612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206790614fb0565b60405180910390fd5b601560019054906101000a900460ff16156120ce5761208e336116e6565b6120cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c490615050565b60405180910390fd5b5b6120d781612f8e565b6000620186a0601254346120eb9190615265565b6120f59190615234565b90506000813461210591906152bf565b9050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634065da638373454cfaa623a629cc0b4017aeb85d54c42e91479d6040518363ffffffff1660e01b81526004016121779190614c78565b6000604051808303818588803b15801561219057600080fd5b505af11580156121a4573d6000803e3d6000fd5b5050505050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634065da6382600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016122279190614c78565b6000604051808303818588803b15801561224057600080fd5b505af1158015612254573d6000803e3d6000fd5b5050505050505050565b612270612269612b75565b83836131d9565b5050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b6122b16122ab612b75565b83612c54565b6122f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e790614ff0565b60405180910390fd5b6122fc84848484613346565b50505050565b6000801515601560009054906101000a900460ff16151514156123285760009050612383565b60011515601560019054906101000a900460ff161515148015612357575060001515612353836116e6565b1515145b156123655760009050612383565b611a0a612370611254565b1061237e5760009050612383565b600a90505b919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060011515601560039054906101000a900460ff161515146123f35760146040516020016123dd9190614c56565b604051602081830303815290604052905061241e565b6123fc826133a2565b60405160200161240c9190614c1b565b60405160208183030381529060405290505b919050565b601560009054906101000a900460ff1681565b6000611a0a905090565b60007f0000000000000000000000004bc264eaeed941116681e303a3debd7e649ea3b873ffffffffffffffffffffffffffffffffffffffff1663e3a9db1a836040518263ffffffff1660e01b815260040161249b9190614c78565b60206040518083038186803b1580156124b357600080fd5b505afa1580156124c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124eb919061456b565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61258e612b75565b73ffffffffffffffffffffffffffffffffffffffff166125ac611def565b73ffffffffffffffffffffffffffffffffffffffff1614612602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f990614f30565b60405180910390fd5b80601560016101000a81548160ff02191690831515021790555050565b612627612b75565b73ffffffffffffffffffffffffffffffffffffffff16612645611def565b73ffffffffffffffffffffffffffffffffffffffff161461269b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269290614f30565b60405180910390fd5b60005b8282905081101561273b576001600b60008585858181106126c2576126c1615554565b5b90506020020160208101906126d79190614204565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806127339061541e565b91505061269e565b505050565b612748612b75565b73ffffffffffffffffffffffffffffffffffffffff16612766611def565b73ffffffffffffffffffffffffffffffffffffffff16146127bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b390614f30565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561282c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282390614dd0565b60405180910390fd5b61283581613449565b50565b612840612b75565b73ffffffffffffffffffffffffffffffffffffffff1661285e611def565b73ffffffffffffffffffffffffffffffffffffffff16146128b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ab90614f30565b60405180910390fd5b8082620186a06128c49190615265565b6128ce9190615234565b6012819055505050565b6128e0612b75565b73ffffffffffffffffffffffffffffffffffffffff166128fe611def565b73ffffffffffffffffffffffffffffffffffffffff1614612954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294b90614f30565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b612979612b75565b73ffffffffffffffffffffffffffffffffffffffff16612997611def565b73ffffffffffffffffffffffffffffffffffffffff16146129ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e490614f30565b60405180910390fd5b83600d8190555082600e8190555081600f819055508060108190555050505050565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612af257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b025750612b018261350f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612bf0836119a8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612c50828260405180602001604052806000815250613579565b5050565b6000612c5f82612b09565b612c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9590614e50565b60405180910390fd5b6000612ca9836119a8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612d1857508373ffffffffffffffffffffffffffffffffffffffff16612d0084610da4565b73ffffffffffffffffffffffffffffffffffffffff16145b80612d295750612d2881856124f2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612d52826119a8565b73ffffffffffffffffffffffffffffffffffffffff1614612da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9f90614f50565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0f90614e10565b60405180910390fd5b612e238383836135d4565b612e2e600082612b7d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e7e91906152bf565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ed591906151de565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600a811115612fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc990615010565b60405180910390fd5b60008111613015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300c90615010565b60405180910390fd5b611a0a81613021611254565b61302b91906151de565b111561306c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306390614ed0565b60405180910390fd5b600081613078336113e8565b6130829190615265565b9050348114806130c45750613095611def565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b613103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130fa90615070565b60405180910390fd5b60005b82811015613144576000600161311a611254565b61312491906151de565b90506131303382612c36565b50808061313c9061541e565b915050613106565b505050565b7f0000000000000000000000004bc264eaeed941116681e303a3debd7e649ea3b873ffffffffffffffffffffffffffffffffffffffff1663f340fa0182846040518363ffffffff1660e01b81526004016131a39190614c78565b6000604051808303818588803b1580156131bc57600080fd5b505af11580156131d0573d6000803e3d6000fd5b50505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323f90614e30565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516133399190614d53565b60405180910390a3505050565b613351848484612d32565b61335d848484846136e8565b61339c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339390614db0565b60405180910390fd5b50505050565b60606133ad82612b09565b6133ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e390614f70565b60405180910390fd5b60006133f661387f565b905060008151116134165760405180602001604052806000815250613441565b8061342084613911565b604051602001613431929190614c32565b6040516020818303038152906040525b915050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6135838383613a72565b61359060008484846136e8565b6135cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c690614db0565b60405180910390fd5b505050565b6135df838383612a22565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156136225761361d81613c40565b613661565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146136605761365f8382613c89565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136a45761369f81613df6565b6136e3565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146136e2576136e18282613ec7565b5b5b505050565b60006137098473ffffffffffffffffffffffffffffffffffffffff16612a0f565b15613872578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613732612b75565b8786866040518563ffffffff1660e01b81526004016137549493929190614ce5565b602060405180830381600087803b15801561376e57600080fd5b505af192505050801561379f57506040513d601f19601f8201168201806040525081019061379c91906144c8565b60015b613822573d80600081146137cf576040519150601f19603f3d011682016040523d82523d6000602084013e6137d4565b606091505b5060008151141561381a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161381190614db0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613877565b600190505b949350505050565b60606014805461388e906153bb565b80601f01602080910402602001604051908101604052809291908181526020018280546138ba906153bb565b80156139075780601f106138dc57610100808354040283529160200191613907565b820191906000526020600020905b8154815290600101906020018083116138ea57829003601f168201915b5050505050905090565b60606000821415613959576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613a6d565b600082905060005b6000821461398b5780806139749061541e565b915050600a826139849190615234565b9150613961565b60008167ffffffffffffffff8111156139a7576139a6615583565b5b6040519080825280601f01601f1916602001820160405280156139d95781602001600182028036833780820191505090505b5090505b60008514613a66576001826139f291906152bf565b9150600a85613a019190615467565b6030613a0d91906151de565b60f81b818381518110613a2357613a22615554565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613a5f9190615234565b94506139dd565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ad990614ef0565b60405180910390fd5b613aeb81612b09565b15613b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2290614df0565b60405180910390fd5b613b37600083836135d4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b8791906151de565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613c9684611c05565b613ca091906152bf565b9050600060076000848152602001908152602001600020549050818114613d85576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613e0a91906152bf565b9050600060096000848152602001908152602001600020549050600060088381548110613e3a57613e39615554565b5b906000526020600020015490508060088381548110613e5c57613e5b615554565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613eab57613eaa615525565b5b6001900381819060005260206000200160009055905550505050565b6000613ed283611c05565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054613f8f906153bb565b90600052602060002090601f016020900481019282613fb15760008555613ff8565b82601f10613fca57805160ff1916838001178555613ff8565b82800160010185558215613ff8579182015b82811115613ff7578251825591602001919060010190613fdc565b5b5090506140059190614009565b5090565b5b8082111561402257600081600090555060010161400a565b5090565b6000614039614034846150eb565b6150c6565b905082815260208101848484011115614055576140546155c1565b5b614060848285615379565b509392505050565b600061407b6140768461511c565b6150c6565b905082815260208101848484011115614097576140966155c1565b5b6140a2848285615379565b509392505050565b6000813590506140b981615bf6565b92915050565b6000813590506140ce81615c0d565b92915050565b60008083601f8401126140ea576140e96155b7565b5b8235905067ffffffffffffffff811115614107576141066155b2565b5b602083019150836020820283011115614123576141226155bc565b5b9250929050565b60008135905061413981615c24565b92915050565b60008151905061414e81615c24565b92915050565b60008135905061416381615c3b565b92915050565b60008151905061417881615c3b565b92915050565b600082601f830112614193576141926155b7565b5b81356141a3848260208601614026565b91505092915050565b600082601f8301126141c1576141c06155b7565b5b81356141d1848260208601614068565b91505092915050565b6000813590506141e981615c52565b92915050565b6000815190506141fe81615c52565b92915050565b60006020828403121561421a576142196155cb565b5b6000614228848285016140aa565b91505092915050565b600060208284031215614247576142466155cb565b5b6000614255848285016140bf565b91505092915050565b60008060408385031215614275576142746155cb565b5b6000614283858286016140aa565b9250506020614294858286016140aa565b9150509250929050565b6000806000606084860312156142b7576142b66155cb565b5b60006142c5868287016140aa565b93505060206142d6868287016140aa565b92505060406142e7868287016141da565b9150509250925092565b6000806000806080858703121561430b5761430a6155cb565b5b6000614319878288016140aa565b945050602061432a878288016140aa565b935050604061433b878288016141da565b925050606085013567ffffffffffffffff81111561435c5761435b6155c6565b5b6143688782880161417e565b91505092959194509250565b6000806040838503121561438b5761438a6155cb565b5b6000614399858286016140aa565b92505060206143aa8582860161412a565b9150509250929050565b600080604083850312156143cb576143ca6155cb565b5b60006143d9858286016140aa565b92505060206143ea858286016141da565b9150509250929050565b6000806020838503121561440b5761440a6155cb565b5b600083013567ffffffffffffffff811115614429576144286155c6565b5b614435858286016140d4565b92509250509250929050565b600060208284031215614457576144566155cb565b5b60006144658482850161412a565b91505092915050565b600060208284031215614484576144836155cb565b5b60006144928482850161413f565b91505092915050565b6000602082840312156144b1576144b06155cb565b5b60006144bf84828501614154565b91505092915050565b6000602082840312156144de576144dd6155cb565b5b60006144ec84828501614169565b91505092915050565b60006020828403121561450b5761450a6155cb565b5b600082013567ffffffffffffffff811115614529576145286155c6565b5b614535848285016141ac565b91505092915050565b600060208284031215614554576145536155cb565b5b6000614562848285016141da565b91505092915050565b600060208284031215614581576145806155cb565b5b600061458f848285016141ef565b91505092915050565b600080604083850312156145af576145ae6155cb565b5b60006145bd858286016141da565b92505060206145ce858286016141da565b9150509250929050565b600080600080608085870312156145f2576145f16155cb565b5b6000614600878288016141da565b9450506020614611878288016141da565b9350506040614622878288016141da565b9250506060614633878288016141da565b91505092959194509250565b600061464b8383614bfd565b60208301905092915050565b61466081615305565b82525050565b61466f816152f3565b82525050565b600061468082615172565b61468a81856151a0565b93506146958361514d565b8060005b838110156146c65781516146ad888261463f565b97506146b883615193565b925050600181019050614699565b5085935050505092915050565b6146dc81615317565b82525050565b60006146ed8261517d565b6146f781856151b1565b9350614707818560208601615388565b614710816155d0565b840191505092915050565b600061472682615188565b61473081856151c2565b9350614740818560208601615388565b614749816155d0565b840191505092915050565b600061475f82615188565b61476981856151d3565b9350614779818560208601615388565b80840191505092915050565b60008154614792816153bb565b61479c81866151d3565b945060018216600081146147b757600181146147c8576147fb565b60ff198316865281860193506147fb565b6147d18561515d565b60005b838110156147f3578154818901526001820191506020810190506147d4565b838801955050505b50505092915050565b6000614811602b836151c2565b915061481c826155e1565b604082019050919050565b60006148346032836151c2565b915061483f82615630565b604082019050919050565b60006148576026836151c2565b91506148628261567f565b604082019050919050565b600061487a601c836151c2565b9150614885826156ce565b602082019050919050565b600061489d6024836151c2565b91506148a8826156f7565b604082019050919050565b60006148c06019836151c2565b91506148cb82615746565b602082019050919050565b60006148e3602c836151c2565b91506148ee8261576f565b604082019050919050565b60006149066038836151c2565b9150614911826157be565b604082019050919050565b6000614929602a836151c2565b91506149348261580d565b604082019050919050565b600061494c6029836151c2565b91506149578261585c565b604082019050919050565b600061496f6018836151c2565b915061497a826158ab565b602082019050919050565b60006149926020836151c2565b915061499d826158d4565b602082019050919050565b60006149b5602c836151c2565b91506149c0826158fd565b604082019050919050565b60006149d86020836151c2565b91506149e38261594c565b602082019050919050565b60006149fb6029836151c2565b9150614a0682615975565b604082019050919050565b6000614a1e602f836151c2565b9150614a29826159c4565b604082019050919050565b6000614a41601f836151c2565b9150614a4c82615a13565b602082019050919050565b6000614a64600b836151d3565b9150614a6f82615a3c565b600b82019050919050565b6000614a87600d836151c2565b9150614a9282615a65565b602082019050919050565b6000614aaa6021836151c2565b9150614ab582615a8e565b604082019050919050565b6000614acd6031836151c2565b9150614ad882615add565b604082019050919050565b6000614af06013836151c2565b9150614afb82615b2c565b602082019050919050565b6000614b13602c836151c2565b9150614b1e82615b55565b604082019050919050565b6000614b36600f836151c2565b9150614b4182615ba4565b602082019050919050565b6000614b596011836151c2565b9150614b6482615bcd565b602082019050919050565b60e082016000820151614b856000850182614bfd565b506020820151614b986020850182614bfd565b506040820151614bab6040850182614bfd565b506060820151614bbe6060850182614bfd565b506080820151614bd16080850182614bfd565b5060a0820151614be460a0850182614bfd565b5060c0820151614bf760c0850182614bfd565b50505050565b614c068161536f565b82525050565b614c158161536f565b82525050565b6000614c278284614754565b915081905092915050565b6000614c3e8285614754565b9150614c4a8284614754565b91508190509392505050565b6000614c628284614785565b9150614c6d82614a57565b915081905092915050565b6000602082019050614c8d6000830184614666565b92915050565b6000602082019050614ca86000830184614657565b92915050565b6000606082019050614cc36000830186614666565b614cd06020830185614666565b614cdd6040830184614c0c565b949350505050565b6000608082019050614cfa6000830187614666565b614d076020830186614666565b614d146040830185614c0c565b8181036060830152614d2681846146e2565b905095945050505050565b60006020820190508181036000830152614d4b8184614675565b905092915050565b6000602082019050614d6860008301846146d3565b92915050565b60006020820190508181036000830152614d88818461471b565b905092915050565b60006020820190508181036000830152614da981614804565b9050919050565b60006020820190508181036000830152614dc981614827565b9050919050565b60006020820190508181036000830152614de98161484a565b9050919050565b60006020820190508181036000830152614e098161486d565b9050919050565b60006020820190508181036000830152614e2981614890565b9050919050565b60006020820190508181036000830152614e49816148b3565b9050919050565b60006020820190508181036000830152614e69816148d6565b9050919050565b60006020820190508181036000830152614e89816148f9565b9050919050565b60006020820190508181036000830152614ea98161491c565b9050919050565b60006020820190508181036000830152614ec98161493f565b9050919050565b60006020820190508181036000830152614ee981614962565b9050919050565b60006020820190508181036000830152614f0981614985565b9050919050565b60006020820190508181036000830152614f29816149a8565b9050919050565b60006020820190508181036000830152614f49816149cb565b9050919050565b60006020820190508181036000830152614f69816149ee565b9050919050565b60006020820190508181036000830152614f8981614a11565b9050919050565b60006020820190508181036000830152614fa981614a34565b9050919050565b60006020820190508181036000830152614fc981614a7a565b9050919050565b60006020820190508181036000830152614fe981614a9d565b9050919050565b6000602082019050818103600083015261500981614ac0565b9050919050565b6000602082019050818103600083015261502981614ae3565b9050919050565b6000602082019050818103600083015261504981614b06565b9050919050565b6000602082019050818103600083015261506981614b29565b9050919050565b6000602082019050818103600083015261508981614b4c565b9050919050565b600060e0820190506150a56000830184614b6f565b92915050565b60006020820190506150c06000830184614c0c565b92915050565b60006150d06150e1565b90506150dc82826153ed565b919050565b6000604051905090565b600067ffffffffffffffff82111561510657615105615583565b5b61510f826155d0565b9050602081019050919050565b600067ffffffffffffffff82111561513757615136615583565b5b615140826155d0565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006151e98261536f565b91506151f48361536f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561522957615228615498565b5b828201905092915050565b600061523f8261536f565b915061524a8361536f565b92508261525a576152596154c7565b5b828204905092915050565b60006152708261536f565b915061527b8361536f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152b4576152b3615498565b5b828202905092915050565b60006152ca8261536f565b91506152d58361536f565b9250828210156152e8576152e7615498565b5b828203905092915050565b60006152fe8261534f565b9050919050565b60006153108261534f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156153a657808201518184015260208101905061538b565b838111156153b5576000848401525b50505050565b600060028204905060018216806153d357607f821691505b602082108114156153e7576153e66154f6565b5b50919050565b6153f6826155d0565b810181811067ffffffffffffffff8211171561541557615414615583565b5b80604052505050565b60006154298261536f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561545c5761545b615498565b5b600182019050919050565b60006154728261536f565b915061547d8361536f565b92508261548d5761548c6154c7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f457863656564696e67204d6178204d696e7420436f756e740000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243323020546f6b656e204d696e74696e672069732064697361626c656400600082015250565b7f6e6f7452657665616c6564000000000000000000000000000000000000000000600082015250565b7f4d696e742044697361626c656400000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f742057686974656c69737465640000000000000000000000000000000000600082015250565b7f496e636f7272656374205061796d656e74000000000000000000000000000000600082015250565b615bff816152f3565b8114615c0a57600080fd5b50565b615c1681615305565b8114615c2157600080fd5b50565b615c2d81615317565b8114615c3857600080fd5b50565b615c4481615323565b8114615c4f57600080fd5b50565b615c5b8161536f565b8114615c6657600080fd5b5056fea2646970667358221220a59645fa8ac3ef5ae8a33999899e074e5b850eb2590f28ea805094b309e678d464736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d66485632793174764657655332347031785454734876685454624c6633744267706242646232617a7876694a2f00000000000000000000
-----Decoded View---------------
Arg [0] : _nftBaseURI (string): ipfs://QmfHV2y1tvFWeS24p1xTTsHvhTTbLf3tBgpbBdb2azxviJ/
Arg [1] : _initialTeamReserve (uint256): 50
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d6648563279317476465765533234703178545473487668
Arg [4] : 5454624c6633744267706242646232617a7876694a2f00000000000000000000
Deployed ByteCode Sourcemap
59460:9792:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42919:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28575:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30268:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29791:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64418:820;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60157:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43722:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66203:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31187:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59992:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66557:353;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43303:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62375:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57759:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68036:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60301:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61826:78;;;;;;;;;;;;;:::i;:::-;;60069:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31634:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60269:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43912:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60336:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67542:445;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28182:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64163:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62976:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59956:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27825:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66459:57;;;;;;;;;;;;;:::i;:::-;;68801:448;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1986:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61935:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28744:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62778:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59871:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63598:527;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30648:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60116:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60028;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31890:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66971:385;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59919:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68419:331;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60239:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67398:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57989:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30906:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62211:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65959:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2895:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62541:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62067:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63137:406;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42919:300;43066:4;43123:35;43108:50;;;:11;:50;;;;:103;;;;43175:36;43199:11;43175:23;:36::i;:::-;43108:103;43088:123;;42919:300;;;:::o;28575:100::-;28629:13;28662:5;28655:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28575:100;:::o;30268:308::-;30389:7;30436:16;30444:7;30436;:16::i;:::-;30414:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;30544:15;:24;30560:7;30544:24;;;;;;;;;;;;;;;;;;;;;30537:31;;30268:308;;;:::o;29791:411::-;29872:13;29888:23;29903:7;29888:14;:23::i;:::-;29872:39;;29936:5;29930:11;;:2;:11;;;;29922:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;30030:5;30014:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30039:37;30056:5;30063:12;:10;:12::i;:::-;30039:16;:37::i;:::-;30014:62;29992:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;30173:21;30182:2;30186:7;30173:8;:21::i;:::-;29861:341;29791:411;;:::o;64418:820::-;60413:11;;;;;;;;;;;60405:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;60512:13:::1;;;;;;;;;;;60508:99;;;60550:25;60564:10;60550:13;:25::i;:::-;60542:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;60508:99;60704:4:::2;60684:24;;:16;;;;;;;;;;;:24;;;60676:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59629:2:::3;64592:7;:35;;64584:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;64680:1;64670:7;:11;64662:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;59574:4;64754:7;64738:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:35;;64716:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;64838:22;64891:7;64863:25;;:35;;;;:::i;:::-;64838:60;;64951:17;;;;;;;;;;;64944:38;;;64997:10;65022:15;;;;;;;;;;;65052:14;64944:133;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;65095:9;65090:141;65114:7;65110:1;:11;65090:141;;;65143:13;65175:1;65159:13;:11;:13::i;:::-;:17;;;;:::i;:::-;65143:33;;65191:28;65201:10;65213:5;65191:9;:28::i;:::-;65128:103;65123:3;;;;;:::i;:::-;;;;65090:141;;;;64573:665;64418:820:::0;:::o;60157:29::-;;;;:::o;43722:113::-;43783:7;43810:10;:17;;;;43803:24;;43722:113;:::o;66203:216::-;2217:12;:10;:12::i;:::-;2206:23;;:7;:5;:7::i;:::-;:23;;;2198:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66294:13:::1;66289:123;66321:10;;:17;;66313:5;:25;66289:123;;;66395:5;66364:9;:28;66374:10;;66385:5;66374:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;66364:28;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;66340:7;;;;;:::i;:::-;;;;66289:123;;;;66203:216:::0;;:::o;31187:376::-;31396:41;31415:12;:10;:12::i;:::-;31429:7;31396:18;:41::i;:::-;31374:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;31527:28;31537:4;31543:2;31547:7;31527:9;:28::i;:::-;31187:376;;;:::o;59992:29::-;;;;:::o;66557:353::-;66622:7;66642:17;66662:14;;66642:34;;66715:4;66693:26;;:9;:18;66703:7;66693:18;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;66689:185;;;66748:17;;66736:29;;66689:185;;;66815:4;66787:32;;:6;;;;;;;;;;;:15;;;66803:7;66787:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;;;66783:91;;;66848:14;;66836:26;;66783:91;66689:185;66893:9;66886:16;;;66557:353;;;:::o;43303:343::-;43445:7;43500:23;43517:5;43500:16;:23::i;:::-;43492:5;:31;43470:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;43612:12;:19;43625:5;43612:19;;;;;;;;;;;;;;;:26;43632:5;43612:26;;;;;;;;;;;;43605:33;;43303:343;;;;:::o;62375:127::-;2217:12;:10;:12::i;:::-;2206:23;;:7;:5;:7::i;:::-;:23;;;2198:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62477:17:::1;62458:16;;:36;;;;;;;;;;;;;;;;;;62375:127:::0;:::o;57759:106::-;57834:7;:16;;;57851:5;57834:23;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57759:106;:::o;68036:142::-;68098:4;68122:9;:19;68132:8;68122:19;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;68145:6;;;;;;;;;;;:15;;;68161:8;68145:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68122:48;68115:55;;68036:142;;;:::o;60301:28::-;;;;;;;;;;;;;:::o;61826:78::-;2217:12;:10;:12::i;:::-;2206:23;;:7;:5;:7::i;:::-;:23;;;2198:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61892:4:::1;61879:10;;:17;;;;;;;;;;;;;;;;;;61826:78::o:0;60069:40::-;;;;:::o;31634:185::-;31772:39;31789:4;31795:2;31799:7;31772:39;;;;;;;;;;;;:16;:39::i;:::-;31634:185;;;:::o;60269:25::-;;;;;;;;;;;;;:::o;43912:320::-;44032:7;44087:30;:28;:30::i;:::-;44079:5;:38;44057:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;44207:10;44218:5;44207:17;;;;;;;;:::i;:::-;;;;;;;;;;44200:24;;43912:320;;;:::o;60336:22::-;;;;;;;;;;;;;:::o;67542:445::-;67593:11;;:::i;:::-;67637:342;;;;;;;;67674:14;;67637:342;;;;67719:14;;67637:342;;;;67767:17;;67637:342;;;;59574:4;67637:342;;;;67854:13;:11;:13::i;:::-;67637:342;;;;67905:1;67637:342;;;;59629:2;67637:342;;;67617:362;;67542:445;:::o;28182:326::-;28299:7;28324:13;28340:7;:16;28348:7;28340:16;;;;;;;;;;;;;;;;;;;;;28324:32;;28406:1;28389:19;;:5;:19;;;;28367:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;28495:5;28488:12;;;28182:326;;;:::o;64163:218::-;60413:11;;;;;;;;;;;60405:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;60512:13:::1;;;;;;;;;;;60508:99;;;60550:25;60564:10;60550:13;:25::i;:::-;60542:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;60508:99;64303:17:::2;64312:7;64303:8;:17::i;:::-;64331:42;64346:15;;;;;;;;;;;64363:9;64331:14;:42::i;:::-;64163:218:::0;:::o;62976:126::-;2217:12;:10;:12::i;:::-;2206:23;;:7;:5;:7::i;:::-;:23;;;2198:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63078:16:::1;63060:15;;:34;;;;;;;;;;;;;;;;;;62976:126:::0;:::o;59956:29::-;;;;:::o;27825:295::-;27942:7;28006:1;27989:19;;:5;:19;;;;27967:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28096:9;:16;28106:5;28096:16;;;;;;;;;;;;;;;;28089:23;;27825:295;;;:::o;66459:57::-;2217:12;:10;:12::i;:::-;2206:23;;:7;:5;:7::i;:::-;:23;;;2198:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66459:57::o;68801:448::-;68896:16;68930:15;68948:24;68958:13;68948:9;:24::i;:::-;68930:42;;68985:27;69029:7;69015:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68985:52;;69053:9;69048:164;69072:7;69068:1;:11;69048:164;;;69101:18;69122:37;69142:13;69157:1;69122:19;:37::i;:::-;69101:58;;69190:10;69174;69185:1;69174:13;;;;;;;;:::i;:::-;;;;;;;:26;;;;;69086:126;69081:3;;;;;:::i;:::-;;;;69048:164;;;;69231:10;69224:17;;;;68801:448;;;:::o;1986:87::-;2032:7;2059:6;;;;;;;;;;;2052:13;;1986:87;:::o;61935:101::-;2217:12;:10;:12::i;:::-;2206:23;;:7;:5;:7::i;:::-;:23;;;2198:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62021:7:::1;62011;:17;;;;;;;;;;;;:::i;:::-;;61935:101:::0;:::o;28744:104::-;28800:13;28833:7;28826:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28744:104;:::o;62778:157::-;2217:12;:10;:12::i;:::-;2206:23;;:7;:5;:7::i;:::-;:23;;;2198:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62909:18:::1;62889:17;;:38;;;;;;;;;;;;;;;;;;62778:157:::0;:::o;59871:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;63598:527::-;60413:11;;;;;;;;;;;60405:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;60512:13:::1;;;;;;;;;;;60508:99;;;60550:25;60564:10;60550:13;:25::i;:::-;60542:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;60508:99;63748:17:::2;63757:7;63748:8;:17::i;:::-;63863:19;59666:6;63898:14;;63886:9;:26;;;;:::i;:::-;63885:39;;;;:::i;:::-;63863:61;;63935:18;63968:11;63956:9;:23;;;;:::i;:::-;63935:44;;63992:6;;;;;;;;;;;:18;;;64018:11;59820:42;63992:60;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;64063:6;;;;;;;;;;;:18;;;64089:10;64101:15;;;;;;;;;;;64063:54;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;63737:388;;63598:527:::0;:::o;30648:187::-;30775:52;30794:12;:10;:12::i;:::-;30808:8;30818;30775:18;:52::i;:::-;30648:187;;:::o;60116:32::-;;;;;;;;;;;;;:::o;60028:::-;;;;:::o;31890:365::-;32079:41;32098:12;:10;:12::i;:::-;32112:7;32079:18;:41::i;:::-;32057:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;32208:39;32222:4;32228:2;32232:7;32241:5;32208:13;:39::i;:::-;31890:365;;;;:::o;66971:385::-;67037:7;67076:5;67061:20;;:11;;;;;;;;;;;:20;;;67057:61;;;67105:1;67098:8;;;;67057:61;67151:4;67134:21;;:13;;;;;;;;;;;:21;;;:56;;;;;67185:5;67159:31;;:22;67173:7;67159:13;:22::i;:::-;:31;;;67134:56;67130:97;;;67214:1;67207:8;;;;67130:97;59574:4;67243:13;:11;:13::i;:::-;:25;67239:66;;67292:1;67285:8;;;;67239:66;59629:2;67317:31;;66971:385;;;;:::o;59919:30::-;;;;;;;;;;;;;:::o;68419:331::-;68537:13;68586:4;68572:18;;:10;;;;;;;;;;;:18;;;68568:106;;68638:7;68621:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;68607:55;;;;68568:106;68717:23;68732:7;68717:14;:23::i;:::-;68700:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;68686:56;;68419:331;;;;:::o;60239:23::-;;;;;;;;;;;;;:::o;67398:96::-;67451:7;59574:4;67471:15;;67398:96;:::o;57989:112::-;58042:7;58069;:18;;;58088:4;58069:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58062:31;;57989:112;;;:::o;30906:214::-;31048:4;31077:18;:25;31096:5;31077:25;;;;;;;;;;;;;;;:35;31103:8;31077:35;;;;;;;;;;;;;;;;;;;;;;;;;31070:42;;30906:214;;;;:::o;62211:115::-;2217:12;:10;:12::i;:::-;2206:23;;:7;:5;:7::i;:::-;:23;;;2198:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62304:14:::1;62288:13;;:30;;;;;;;;;;;;;;;;;;62211:115:::0;:::o;65959:212::-;2217:12;:10;:12::i;:::-;2206:23;;:7;:5;:7::i;:::-;:23;;;2198:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66047:13:::1;66042:122;66074:10;;:17;;66066:5;:25;66042:122;;;66148:4;66117:9;:28;66127:10;;66138:5;66127:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;66117:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;66093:7;;;;;:::i;:::-;;;;66042:122;;;;65959:212:::0;;:::o;2895:238::-;2217:12;:10;:12::i;:::-;2206:23;;:7;:5;:7::i;:::-;:23;;;2198:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3018:1:::1;2998:22;;:8;:22;;;;2976:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;3097:28;3116:8;3097:18;:28::i;:::-;2895:238:::0;:::o;62541:173::-;2217:12;:10;:12::i;:::-;2206:23;;:7;:5;:7::i;:::-;:23;;;2198:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62694:12:::1;62686:4;59666:6;62675:15;;;;:::i;:::-;62674:32;;;;:::i;:::-;62657:14;:49;;;;62541:173:::0;;:::o;62067:107::-;2217:12;:10;:12::i;:::-;2206:23;;:7;:5;:7::i;:::-;:23;;;2198:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62154:12:::1;62140:11;;:26;;;;;;;;;;;;;;;;;;62067:107:::0;:::o;63137:406::-;2217:12;:10;:12::i;:::-;2206:23;;:7;:5;:7::i;:::-;:23;;;2198:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63363:15:::1;63346:14;:32;;;;63406:15;63389:14;:32;;;;63452:18;63432:17;:38;;;;63509:26;63481:25;:54;;;;63137:406:::0;;;;:::o;14985:387::-;15045:4;15253:12;15320:7;15308:20;15300:28;;15363:1;15356:4;:8;15349:15;;;14985:387;;;:::o;40673:126::-;;;;:::o;27406:355::-;27553:4;27610:25;27595:40;;;:11;:40;;;;:105;;;;27667:33;27652:48;;;:11;:48;;;;27595:105;:158;;;;27717:36;27741:11;27717:23;:36::i;:::-;27595:158;27575:178;;27406:355;;;:::o;33802:127::-;33867:4;33919:1;33891:30;;:7;:16;33899:7;33891:16;;;;;;;;;;;;;;;;;;;;;:30;;;;33884:37;;33802:127;;;:::o;683:98::-;736:7;763:10;756:17;;683:98;:::o;37925:174::-;38027:2;38000:15;:24;38016:7;38000:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38083:7;38079:2;38045:46;;38054:23;38069:7;38054:14;:23::i;:::-;38045:46;;;;;;;;;;;;37925:174;;:::o;34890:110::-;34966:26;34976:2;34980:7;34966:26;;;;;;;;;;;;:9;:26::i;:::-;34890:110;;:::o;34096:452::-;34225:4;34269:16;34277:7;34269;:16::i;:::-;34247:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;34368:13;34384:23;34399:7;34384:14;:23::i;:::-;34368:39;;34437:5;34426:16;;:7;:16;;;:64;;;;34483:7;34459:31;;:20;34471:7;34459:11;:20::i;:::-;:31;;;34426:64;:113;;;;34507:32;34524:5;34531:7;34507:16;:32::i;:::-;34426:113;34418:122;;;34096:452;;;;:::o;37192:615::-;37365:4;37338:31;;:23;37353:7;37338:14;:23::i;:::-;:31;;;37316:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;37471:1;37457:16;;:2;:16;;;;37449:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37527:39;37548:4;37554:2;37558:7;37527:20;:39::i;:::-;37631:29;37648:1;37652:7;37631:8;:29::i;:::-;37692:1;37673:9;:15;37683:4;37673:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;37721:1;37704:9;:13;37714:2;37704:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37752:2;37733:7;:16;37741:7;37733:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37791:7;37787:2;37772:27;;37781:4;37772:27;;;;;;;;;;;;37192:615;;;:::o;65275:655::-;59629:2;65338:7;:35;;65330:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;65426:1;65416:7;:11;65408:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;59574:4;65500:7;65484:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:35;;65462:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;65584:22;65632:7;65609:20;65618:10;65609:8;:20::i;:::-;:30;;;;:::i;:::-;65584:55;;65690:9;65672:14;:27;:52;;;;65717:7;:5;:7::i;:::-;65703:21;;:10;:21;;;65672:52;65650:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;65787:9;65782:141;65806:7;65802:1;:11;65782:141;;;65835:13;65867:1;65851:13;:11;:13::i;:::-;:17;;;;:::i;:::-;65835:33;;65883:28;65893:10;65905:5;65883:9;:28::i;:::-;65820:103;65815:3;;;;;:::i;:::-;;;;65782:141;;;;65319:611;65275:655;:::o;58470:126::-;58552:7;:15;;;58575:6;58583:4;58552:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58470:126;;:::o;38241:315::-;38396:8;38387:17;;:5;:17;;;;38379:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;38483:8;38445:18;:25;38464:5;38445:25;;;;;;;;;;;;;;;:35;38471:8;38445:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;38529:8;38507:41;;38522:5;38507:41;;;38539:8;38507:41;;;;;;:::i;:::-;;;;;;;;38241:315;;;:::o;33137:352::-;33294:28;33304:4;33310:2;33314:7;33294:9;:28::i;:::-;33355:48;33378:4;33384:2;33388:7;33397:5;33355:22;:48::i;:::-;33333:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;33137:352;;;;:::o;28919:468::-;29037:13;29090:16;29098:7;29090;:16::i;:::-;29068:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;29194:21;29218:10;:8;:10::i;:::-;29194:34;;29283:1;29265:7;29259:21;:25;:120;;;;;;;;;;;;;;;;;29328:7;29337:18;:7;:16;:18::i;:::-;29311:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29259:120;29239:140;;;28919:468;;;:::o;3293:191::-;3367:16;3386:6;;;;;;;;;;;3367:25;;3412:8;3403:6;;:17;;;;;;;;;;;;;;;;;;3467:8;3436:40;;3457:8;3436:40;;;;;;;;;;;;3356:128;3293:191;:::o;25810:207::-;25940:4;25984:25;25969:40;;;:11;:40;;;;25962:47;;25810:207;;;:::o;35227:321::-;35357:18;35363:2;35367:7;35357:5;:18::i;:::-;35408:54;35439:1;35443:2;35447:7;35456:5;35408:22;:54::i;:::-;35386:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;35227:321;;;:::o;44845:589::-;44989:45;45016:4;45022:2;45026:7;44989:26;:45::i;:::-;45067:1;45051:18;;:4;:18;;;45047:187;;;45086:40;45118:7;45086:31;:40::i;:::-;45047:187;;;45156:2;45148:10;;:4;:10;;;45144:90;;45175:47;45208:4;45214:7;45175:32;:47::i;:::-;45144:90;45047:187;45262:1;45248:16;;:2;:16;;;45244:183;;;45281:45;45318:7;45281:36;:45::i;:::-;45244:183;;;45354:4;45348:10;;:2;:10;;;45344:83;;45375:40;45403:2;45407:7;45375:27;:40::i;:::-;45344:83;45244:183;44845:589;;;:::o;39121:980::-;39276:4;39297:15;:2;:13;;;:15::i;:::-;39293:801;;;39366:2;39350:36;;;39409:12;:10;:12::i;:::-;39444:4;39471:7;39501:5;39350:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39329:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39725:1;39708:6;:13;:18;39704:320;;;39751:108;;;;;;;;;;:::i;:::-;;;;;;;;39704:320;39974:6;39968:13;39959:6;39955:2;39951:15;39944:38;39329:710;39599:41;;;39589:51;;;:6;:51;;;;39582:58;;;;;39293:801;40078:4;40071:11;;39121:980;;;;;;;:::o;68311:100::-;68363:13;68396:7;68389:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68311:100;:::o;23152:723::-;23208:13;23438:1;23429:5;:10;23425:53;;;23456:10;;;;;;;;;;;;;;;;;;;;;23425:53;23488:12;23503:5;23488:20;;23519:14;23544:78;23559:1;23551:4;:9;23544:78;;23577:8;;;;;:::i;:::-;;;;23608:2;23600:10;;;;;:::i;:::-;;;23544:78;;;23632:19;23664:6;23654:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23632:39;;23682:154;23698:1;23689:5;:10;23682:154;;23726:1;23716:11;;;;;:::i;:::-;;;23793:2;23785:5;:10;;;;:::i;:::-;23772:2;:24;;;;:::i;:::-;23759:39;;23742:6;23749;23742:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;23822:2;23813:11;;;;;:::i;:::-;;;23682:154;;;23860:6;23846:21;;;;;23152:723;;;;:::o;35884:382::-;35978:1;35964:16;;:2;:16;;;;35956:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;36037:16;36045:7;36037;:16::i;:::-;36036:17;36028:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36099:45;36128:1;36132:2;36136:7;36099:20;:45::i;:::-;36174:1;36157:9;:13;36167:2;36157:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36205:2;36186:7;:16;36194:7;36186:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36250:7;36246:2;36225:33;;36242:1;36225:33;;;;;;;;;;;;35884:382;;:::o;46157:164::-;46261:10;:17;;;;46234:15;:24;46250:7;46234:24;;;;;;;;;;;:44;;;;46289:10;46305:7;46289:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46157:164;:::o;46948:1002::-;47228:22;47278:1;47253:22;47270:4;47253:16;:22::i;:::-;:26;;;;:::i;:::-;47228:51;;47290:18;47311:17;:26;47329:7;47311:26;;;;;;;;;;;;47290:47;;47458:14;47444:10;:28;47440:328;;47489:19;47511:12;:18;47524:4;47511:18;;;;;;;;;;;;;;;:34;47530:14;47511:34;;;;;;;;;;;;47489:56;;47595:11;47562:12;:18;47575:4;47562:18;;;;;;;;;;;;;;;:30;47581:10;47562:30;;;;;;;;;;;:44;;;;47712:10;47679:17;:30;47697:11;47679:30;;;;;;;;;;;:43;;;;47474:294;47440:328;47864:17;:26;47882:7;47864:26;;;;;;;;;;;47857:33;;;47908:12;:18;47921:4;47908:18;;;;;;;;;;;;;;;:34;47927:14;47908:34;;;;;;;;;;;47901:41;;;47043:907;;46948:1002;;:::o;48245:1079::-;48498:22;48543:1;48523:10;:17;;;;:21;;;;:::i;:::-;48498:46;;48555:18;48576:15;:24;48592:7;48576:24;;;;;;;;;;;;48555:45;;48927:19;48949:10;48960:14;48949:26;;;;;;;;:::i;:::-;;;;;;;;;;48927:48;;49013:11;48988:10;48999;48988:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;49124:10;49093:15;:28;49109:11;49093:28;;;;;;;;;;;:41;;;;49265:15;:24;49281:7;49265:24;;;;;;;;;;;49258:31;;;49300:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48316:1008;;;48245:1079;:::o;45735:221::-;45820:14;45837:20;45854:2;45837:16;:20::i;:::-;45820:37;;45895:7;45868:12;:16;45881:2;45868:16;;;;;;;;;;;;;;;:24;45885:6;45868:24;;;;;;;;;;;:34;;;;45942:6;45913:17;:26;45931:7;45913:26;;;;;;;;;;;:35;;;;45809:147;45735:221;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:155::-;1040:5;1078:6;1065:20;1056:29;;1094:41;1129:5;1094:41;:::i;:::-;986:155;;;;:::o;1164:568::-;1237:8;1247:6;1297:3;1290:4;1282:6;1278:17;1274:27;1264:122;;1305:79;;:::i;:::-;1264:122;1418:6;1405:20;1395:30;;1448:18;1440:6;1437:30;1434:117;;;1470:79;;:::i;:::-;1434:117;1584:4;1576:6;1572:17;1560:29;;1638:3;1630:4;1622:6;1618:17;1608:8;1604:32;1601:41;1598:128;;;1645:79;;:::i;:::-;1598:128;1164:568;;;;;:::o;1738:133::-;1781:5;1819:6;1806:20;1797:29;;1835:30;1859:5;1835:30;:::i;:::-;1738:133;;;;:::o;1877:137::-;1931:5;1962:6;1956:13;1947:22;;1978:30;2002:5;1978:30;:::i;:::-;1877:137;;;;:::o;2020:::-;2065:5;2103:6;2090:20;2081:29;;2119:32;2145:5;2119:32;:::i;:::-;2020:137;;;;:::o;2163:141::-;2219:5;2250:6;2244:13;2235:22;;2266:32;2292:5;2266:32;:::i;:::-;2163:141;;;;:::o;2323:338::-;2378:5;2427:3;2420:4;2412:6;2408:17;2404:27;2394:122;;2435:79;;:::i;:::-;2394:122;2552:6;2539:20;2577:78;2651:3;2643:6;2636:4;2628:6;2624:17;2577:78;:::i;:::-;2568:87;;2384:277;2323:338;;;;:::o;2681:340::-;2737:5;2786:3;2779:4;2771:6;2767:17;2763:27;2753:122;;2794:79;;:::i;:::-;2753:122;2911:6;2898:20;2936:79;3011:3;3003:6;2996:4;2988:6;2984:17;2936:79;:::i;:::-;2927:88;;2743:278;2681:340;;;;:::o;3027:139::-;3073:5;3111:6;3098:20;3089:29;;3127:33;3154:5;3127:33;:::i;:::-;3027:139;;;;:::o;3172:143::-;3229:5;3260:6;3254:13;3245:22;;3276:33;3303:5;3276:33;:::i;:::-;3172:143;;;;:::o;3321:329::-;3380:6;3429:2;3417:9;3408:7;3404:23;3400:32;3397:119;;;3435:79;;:::i;:::-;3397:119;3555:1;3580:53;3625:7;3616:6;3605:9;3601:22;3580:53;:::i;:::-;3570:63;;3526:117;3321:329;;;;:::o;3656:345::-;3723:6;3772:2;3760:9;3751:7;3747:23;3743:32;3740:119;;;3778:79;;:::i;:::-;3740:119;3898:1;3923:61;3976:7;3967:6;3956:9;3952:22;3923:61;:::i;:::-;3913:71;;3869:125;3656:345;;;;:::o;4007:474::-;4075:6;4083;4132:2;4120:9;4111:7;4107:23;4103:32;4100:119;;;4138:79;;:::i;:::-;4100:119;4258:1;4283:53;4328:7;4319:6;4308:9;4304:22;4283:53;:::i;:::-;4273:63;;4229:117;4385:2;4411:53;4456:7;4447:6;4436:9;4432:22;4411:53;:::i;:::-;4401:63;;4356:118;4007:474;;;;;:::o;4487:619::-;4564:6;4572;4580;4629:2;4617:9;4608:7;4604:23;4600:32;4597:119;;;4635:79;;:::i;:::-;4597:119;4755:1;4780:53;4825:7;4816:6;4805:9;4801:22;4780:53;:::i;:::-;4770:63;;4726:117;4882:2;4908:53;4953:7;4944:6;4933:9;4929:22;4908:53;:::i;:::-;4898:63;;4853:118;5010:2;5036:53;5081:7;5072:6;5061:9;5057:22;5036:53;:::i;:::-;5026:63;;4981:118;4487:619;;;;;:::o;5112:943::-;5207:6;5215;5223;5231;5280:3;5268:9;5259:7;5255:23;5251:33;5248:120;;;5287:79;;:::i;:::-;5248:120;5407:1;5432:53;5477:7;5468:6;5457:9;5453:22;5432:53;:::i;:::-;5422:63;;5378:117;5534:2;5560:53;5605:7;5596:6;5585:9;5581:22;5560:53;:::i;:::-;5550:63;;5505:118;5662:2;5688:53;5733:7;5724:6;5713:9;5709:22;5688:53;:::i;:::-;5678:63;;5633:118;5818:2;5807:9;5803:18;5790:32;5849:18;5841:6;5838:30;5835:117;;;5871:79;;:::i;:::-;5835:117;5976:62;6030:7;6021:6;6010:9;6006:22;5976:62;:::i;:::-;5966:72;;5761:287;5112:943;;;;;;;:::o;6061:468::-;6126:6;6134;6183:2;6171:9;6162:7;6158:23;6154:32;6151:119;;;6189:79;;:::i;:::-;6151:119;6309:1;6334:53;6379:7;6370:6;6359:9;6355:22;6334:53;:::i;:::-;6324:63;;6280:117;6436:2;6462:50;6504:7;6495:6;6484:9;6480:22;6462:50;:::i;:::-;6452:60;;6407:115;6061:468;;;;;:::o;6535:474::-;6603:6;6611;6660:2;6648:9;6639:7;6635:23;6631:32;6628:119;;;6666:79;;:::i;:::-;6628:119;6786:1;6811:53;6856:7;6847:6;6836:9;6832:22;6811:53;:::i;:::-;6801:63;;6757:117;6913:2;6939:53;6984:7;6975:6;6964:9;6960:22;6939:53;:::i;:::-;6929:63;;6884:118;6535:474;;;;;:::o;7015:559::-;7101:6;7109;7158:2;7146:9;7137:7;7133:23;7129:32;7126:119;;;7164:79;;:::i;:::-;7126:119;7312:1;7301:9;7297:17;7284:31;7342:18;7334:6;7331:30;7328:117;;;7364:79;;:::i;:::-;7328:117;7477:80;7549:7;7540:6;7529:9;7525:22;7477:80;:::i;:::-;7459:98;;;;7255:312;7015:559;;;;;:::o;7580:323::-;7636:6;7685:2;7673:9;7664:7;7660:23;7656:32;7653:119;;;7691:79;;:::i;:::-;7653:119;7811:1;7836:50;7878:7;7869:6;7858:9;7854:22;7836:50;:::i;:::-;7826:60;;7782:114;7580:323;;;;:::o;7909:345::-;7976:6;8025:2;8013:9;8004:7;8000:23;7996:32;7993:119;;;8031:79;;:::i;:::-;7993:119;8151:1;8176:61;8229:7;8220:6;8209:9;8205:22;8176:61;:::i;:::-;8166:71;;8122:125;7909:345;;;;:::o;8260:327::-;8318:6;8367:2;8355:9;8346:7;8342:23;8338:32;8335:119;;;8373:79;;:::i;:::-;8335:119;8493:1;8518:52;8562:7;8553:6;8542:9;8538:22;8518:52;:::i;:::-;8508:62;;8464:116;8260:327;;;;:::o;8593:349::-;8662:6;8711:2;8699:9;8690:7;8686:23;8682:32;8679:119;;;8717:79;;:::i;:::-;8679:119;8837:1;8862:63;8917:7;8908:6;8897:9;8893:22;8862:63;:::i;:::-;8852:73;;8808:127;8593:349;;;;:::o;8948:509::-;9017:6;9066:2;9054:9;9045:7;9041:23;9037:32;9034:119;;;9072:79;;:::i;:::-;9034:119;9220:1;9209:9;9205:17;9192:31;9250:18;9242:6;9239:30;9236:117;;;9272:79;;:::i;:::-;9236:117;9377:63;9432:7;9423:6;9412:9;9408:22;9377:63;:::i;:::-;9367:73;;9163:287;8948:509;;;;:::o;9463:329::-;9522:6;9571:2;9559:9;9550:7;9546:23;9542:32;9539:119;;;9577:79;;:::i;:::-;9539:119;9697:1;9722:53;9767:7;9758:6;9747:9;9743:22;9722:53;:::i;:::-;9712:63;;9668:117;9463:329;;;;:::o;9798:351::-;9868:6;9917:2;9905:9;9896:7;9892:23;9888:32;9885:119;;;9923:79;;:::i;:::-;9885:119;10043:1;10068:64;10124:7;10115:6;10104:9;10100:22;10068:64;:::i;:::-;10058:74;;10014:128;9798:351;;;;:::o;10155:474::-;10223:6;10231;10280:2;10268:9;10259:7;10255:23;10251:32;10248:119;;;10286:79;;:::i;:::-;10248:119;10406:1;10431:53;10476:7;10467:6;10456:9;10452:22;10431:53;:::i;:::-;10421:63;;10377:117;10533:2;10559:53;10604:7;10595:6;10584:9;10580:22;10559:53;:::i;:::-;10549:63;;10504:118;10155:474;;;;;:::o;10635:765::-;10721:6;10729;10737;10745;10794:3;10782:9;10773:7;10769:23;10765:33;10762:120;;;10801:79;;:::i;:::-;10762:120;10921:1;10946:53;10991:7;10982:6;10971:9;10967:22;10946:53;:::i;:::-;10936:63;;10892:117;11048:2;11074:53;11119:7;11110:6;11099:9;11095:22;11074:53;:::i;:::-;11064:63;;11019:118;11176:2;11202:53;11247:7;11238:6;11227:9;11223:22;11202:53;:::i;:::-;11192:63;;11147:118;11304:2;11330:53;11375:7;11366:6;11355:9;11351:22;11330:53;:::i;:::-;11320:63;;11275:118;10635:765;;;;;;;:::o;11406:179::-;11475:10;11496:46;11538:3;11530:6;11496:46;:::i;:::-;11574:4;11569:3;11565:14;11551:28;;11406:179;;;;:::o;11591:142::-;11694:32;11720:5;11694:32;:::i;:::-;11689:3;11682:45;11591:142;;:::o;11739:118::-;11826:24;11844:5;11826:24;:::i;:::-;11821:3;11814:37;11739:118;;:::o;11893:732::-;12012:3;12041:54;12089:5;12041:54;:::i;:::-;12111:86;12190:6;12185:3;12111:86;:::i;:::-;12104:93;;12221:56;12271:5;12221:56;:::i;:::-;12300:7;12331:1;12316:284;12341:6;12338:1;12335:13;12316:284;;;12417:6;12411:13;12444:63;12503:3;12488:13;12444:63;:::i;:::-;12437:70;;12530:60;12583:6;12530:60;:::i;:::-;12520:70;;12376:224;12363:1;12360;12356:9;12351:14;;12316:284;;;12320:14;12616:3;12609:10;;12017:608;;;11893:732;;;;:::o;12631:109::-;12712:21;12727:5;12712:21;:::i;:::-;12707:3;12700:34;12631:109;;:::o;12746:360::-;12832:3;12860:38;12892:5;12860:38;:::i;:::-;12914:70;12977:6;12972:3;12914:70;:::i;:::-;12907:77;;12993:52;13038:6;13033:3;13026:4;13019:5;13015:16;12993:52;:::i;:::-;13070:29;13092:6;13070:29;:::i;:::-;13065:3;13061:39;13054:46;;12836:270;12746:360;;;;:::o;13112:364::-;13200:3;13228:39;13261:5;13228:39;:::i;:::-;13283:71;13347:6;13342:3;13283:71;:::i;:::-;13276:78;;13363:52;13408:6;13403:3;13396:4;13389:5;13385:16;13363:52;:::i;:::-;13440:29;13462:6;13440:29;:::i;:::-;13435:3;13431:39;13424:46;;13204:272;13112:364;;;;:::o;13482:377::-;13588:3;13616:39;13649:5;13616:39;:::i;:::-;13671:89;13753:6;13748:3;13671:89;:::i;:::-;13664:96;;13769:52;13814:6;13809:3;13802:4;13795:5;13791:16;13769:52;:::i;:::-;13846:6;13841:3;13837:16;13830:23;;13592:267;13482:377;;;;:::o;13889:845::-;13992:3;14029:5;14023:12;14058:36;14084:9;14058:36;:::i;:::-;14110:89;14192:6;14187:3;14110:89;:::i;:::-;14103:96;;14230:1;14219:9;14215:17;14246:1;14241:137;;;;14392:1;14387:341;;;;14208:520;;14241:137;14325:4;14321:9;14310;14306:25;14301:3;14294:38;14361:6;14356:3;14352:16;14345:23;;14241:137;;14387:341;14454:38;14486:5;14454:38;:::i;:::-;14514:1;14528:154;14542:6;14539:1;14536:13;14528:154;;;14616:7;14610:14;14606:1;14601:3;14597:11;14590:35;14666:1;14657:7;14653:15;14642:26;;14564:4;14561:1;14557:12;14552:17;;14528:154;;;14711:6;14706:3;14702:16;14695:23;;14394:334;;14208:520;;13996:738;;13889:845;;;;:::o;14740:366::-;14882:3;14903:67;14967:2;14962:3;14903:67;:::i;:::-;14896:74;;14979:93;15068:3;14979:93;:::i;:::-;15097:2;15092:3;15088:12;15081:19;;14740:366;;;:::o;15112:::-;15254:3;15275:67;15339:2;15334:3;15275:67;:::i;:::-;15268:74;;15351:93;15440:3;15351:93;:::i;:::-;15469:2;15464:3;15460:12;15453:19;;15112:366;;;:::o;15484:::-;15626:3;15647:67;15711:2;15706:3;15647:67;:::i;:::-;15640:74;;15723:93;15812:3;15723:93;:::i;:::-;15841:2;15836:3;15832:12;15825:19;;15484:366;;;:::o;15856:::-;15998:3;16019:67;16083:2;16078:3;16019:67;:::i;:::-;16012:74;;16095:93;16184:3;16095:93;:::i;:::-;16213:2;16208:3;16204:12;16197:19;;15856:366;;;:::o;16228:::-;16370:3;16391:67;16455:2;16450:3;16391:67;:::i;:::-;16384:74;;16467:93;16556:3;16467:93;:::i;:::-;16585:2;16580:3;16576:12;16569:19;;16228:366;;;:::o;16600:::-;16742:3;16763:67;16827:2;16822:3;16763:67;:::i;:::-;16756:74;;16839:93;16928:3;16839:93;:::i;:::-;16957:2;16952:3;16948:12;16941:19;;16600:366;;;:::o;16972:::-;17114:3;17135:67;17199:2;17194:3;17135:67;:::i;:::-;17128:74;;17211:93;17300:3;17211:93;:::i;:::-;17329:2;17324:3;17320:12;17313:19;;16972:366;;;:::o;17344:::-;17486:3;17507:67;17571:2;17566:3;17507:67;:::i;:::-;17500:74;;17583:93;17672:3;17583:93;:::i;:::-;17701:2;17696:3;17692:12;17685:19;;17344:366;;;:::o;17716:::-;17858:3;17879:67;17943:2;17938:3;17879:67;:::i;:::-;17872:74;;17955:93;18044:3;17955:93;:::i;:::-;18073:2;18068:3;18064:12;18057:19;;17716:366;;;:::o;18088:::-;18230:3;18251:67;18315:2;18310:3;18251:67;:::i;:::-;18244:74;;18327:93;18416:3;18327:93;:::i;:::-;18445:2;18440:3;18436:12;18429:19;;18088:366;;;:::o;18460:::-;18602:3;18623:67;18687:2;18682:3;18623:67;:::i;:::-;18616:74;;18699:93;18788:3;18699:93;:::i;:::-;18817:2;18812:3;18808:12;18801:19;;18460:366;;;:::o;18832:::-;18974:3;18995:67;19059:2;19054:3;18995:67;:::i;:::-;18988:74;;19071:93;19160:3;19071:93;:::i;:::-;19189:2;19184:3;19180:12;19173:19;;18832:366;;;:::o;19204:::-;19346:3;19367:67;19431:2;19426:3;19367:67;:::i;:::-;19360:74;;19443:93;19532:3;19443:93;:::i;:::-;19561:2;19556:3;19552:12;19545:19;;19204:366;;;:::o;19576:::-;19718:3;19739:67;19803:2;19798:3;19739:67;:::i;:::-;19732:74;;19815:93;19904:3;19815:93;:::i;:::-;19933:2;19928:3;19924:12;19917:19;;19576:366;;;:::o;19948:::-;20090:3;20111:67;20175:2;20170:3;20111:67;:::i;:::-;20104:74;;20187:93;20276:3;20187:93;:::i;:::-;20305:2;20300:3;20296:12;20289:19;;19948:366;;;:::o;20320:::-;20462:3;20483:67;20547:2;20542:3;20483:67;:::i;:::-;20476:74;;20559:93;20648:3;20559:93;:::i;:::-;20677:2;20672:3;20668:12;20661:19;;20320:366;;;:::o;20692:::-;20834:3;20855:67;20919:2;20914:3;20855:67;:::i;:::-;20848:74;;20931:93;21020:3;20931:93;:::i;:::-;21049:2;21044:3;21040:12;21033:19;;20692:366;;;:::o;21064:402::-;21224:3;21245:85;21327:2;21322:3;21245:85;:::i;:::-;21238:92;;21339:93;21428:3;21339:93;:::i;:::-;21457:2;21452:3;21448:12;21441:19;;21064:402;;;:::o;21472:366::-;21614:3;21635:67;21699:2;21694:3;21635:67;:::i;:::-;21628:74;;21711:93;21800:3;21711:93;:::i;:::-;21829:2;21824:3;21820:12;21813:19;;21472:366;;;:::o;21844:::-;21986:3;22007:67;22071:2;22066:3;22007:67;:::i;:::-;22000:74;;22083:93;22172:3;22083:93;:::i;:::-;22201:2;22196:3;22192:12;22185:19;;21844:366;;;:::o;22216:::-;22358:3;22379:67;22443:2;22438:3;22379:67;:::i;:::-;22372:74;;22455:93;22544:3;22455:93;:::i;:::-;22573:2;22568:3;22564:12;22557:19;;22216:366;;;:::o;22588:::-;22730:3;22751:67;22815:2;22810:3;22751:67;:::i;:::-;22744:74;;22827:93;22916:3;22827:93;:::i;:::-;22945:2;22940:3;22936:12;22929:19;;22588:366;;;:::o;22960:::-;23102:3;23123:67;23187:2;23182:3;23123:67;:::i;:::-;23116:74;;23199:93;23288:3;23199:93;:::i;:::-;23317:2;23312:3;23308:12;23301:19;;22960:366;;;:::o;23332:::-;23474:3;23495:67;23559:2;23554:3;23495:67;:::i;:::-;23488:74;;23571:93;23660:3;23571:93;:::i;:::-;23689:2;23684:3;23680:12;23673:19;;23332:366;;;:::o;23704:::-;23846:3;23867:67;23931:2;23926:3;23867:67;:::i;:::-;23860:74;;23943:93;24032:3;23943:93;:::i;:::-;24061:2;24056:3;24052:12;24045:19;;23704:366;;;:::o;24122:1426::-;24263:4;24258:3;24254:14;24357:4;24350:5;24346:16;24340:23;24376:63;24433:4;24428:3;24424:14;24410:12;24376:63;:::i;:::-;24278:171;24537:4;24530:5;24526:16;24520:23;24556:63;24613:4;24608:3;24604:14;24590:12;24556:63;:::i;:::-;24459:170;24720:4;24713:5;24709:16;24703:23;24739:63;24796:4;24791:3;24787:14;24773:12;24739:63;:::i;:::-;24639:173;24899:4;24892:5;24888:16;24882:23;24918:63;24975:4;24970:3;24966:14;24952:12;24918:63;:::i;:::-;24822:169;25080:4;25073:5;25069:16;25063:23;25099:63;25156:4;25151:3;25147:14;25133:12;25099:63;:::i;:::-;25001:171;25267:4;25260:5;25256:16;25250:23;25286:63;25343:4;25338:3;25334:14;25320:12;25286:63;:::i;:::-;25182:177;25449:4;25442:5;25438:16;25432:23;25468:63;25525:4;25520:3;25516:14;25502:12;25468:63;:::i;:::-;25369:172;24232:1316;24122:1426;;:::o;25554:108::-;25631:24;25649:5;25631:24;:::i;:::-;25626:3;25619:37;25554:108;;:::o;25668:118::-;25755:24;25773:5;25755:24;:::i;:::-;25750:3;25743:37;25668:118;;:::o;25792:275::-;25924:3;25946:95;26037:3;26028:6;25946:95;:::i;:::-;25939:102;;26058:3;26051:10;;25792:275;;;;:::o;26073:435::-;26253:3;26275:95;26366:3;26357:6;26275:95;:::i;:::-;26268:102;;26387:95;26478:3;26469:6;26387:95;:::i;:::-;26380:102;;26499:3;26492:10;;26073:435;;;;;:::o;26514:535::-;26744:3;26766:92;26854:3;26845:6;26766:92;:::i;:::-;26759:99;;26875:148;27019:3;26875:148;:::i;:::-;26868:155;;27040:3;27033:10;;26514:535;;;;:::o;27055:222::-;27148:4;27186:2;27175:9;27171:18;27163:26;;27199:71;27267:1;27256:9;27252:17;27243:6;27199:71;:::i;:::-;27055:222;;;;:::o;27283:254::-;27392:4;27430:2;27419:9;27415:18;27407:26;;27443:87;27527:1;27516:9;27512:17;27503:6;27443:87;:::i;:::-;27283:254;;;;:::o;27543:442::-;27692:4;27730:2;27719:9;27715:18;27707:26;;27743:71;27811:1;27800:9;27796:17;27787:6;27743:71;:::i;:::-;27824:72;27892:2;27881:9;27877:18;27868:6;27824:72;:::i;:::-;27906;27974:2;27963:9;27959:18;27950:6;27906:72;:::i;:::-;27543:442;;;;;;:::o;27991:640::-;28186:4;28224:3;28213:9;28209:19;28201:27;;28238:71;28306:1;28295:9;28291:17;28282:6;28238:71;:::i;:::-;28319:72;28387:2;28376:9;28372:18;28363:6;28319:72;:::i;:::-;28401;28469:2;28458:9;28454:18;28445:6;28401:72;:::i;:::-;28520:9;28514:4;28510:20;28505:2;28494:9;28490:18;28483:48;28548:76;28619:4;28610:6;28548:76;:::i;:::-;28540:84;;27991:640;;;;;;;:::o;28637:373::-;28780:4;28818:2;28807:9;28803:18;28795:26;;28867:9;28861:4;28857:20;28853:1;28842:9;28838:17;28831:47;28895:108;28998:4;28989:6;28895:108;:::i;:::-;28887:116;;28637:373;;;;:::o;29016:210::-;29103:4;29141:2;29130:9;29126:18;29118:26;;29154:65;29216:1;29205:9;29201:17;29192:6;29154:65;:::i;:::-;29016:210;;;;:::o;29232:313::-;29345:4;29383:2;29372:9;29368:18;29360:26;;29432:9;29426:4;29422:20;29418:1;29407:9;29403:17;29396:47;29460:78;29533:4;29524:6;29460:78;:::i;:::-;29452:86;;29232:313;;;;:::o;29551:419::-;29717:4;29755:2;29744:9;29740:18;29732:26;;29804:9;29798:4;29794:20;29790:1;29779:9;29775:17;29768:47;29832:131;29958:4;29832:131;:::i;:::-;29824:139;;29551:419;;;:::o;29976:::-;30142:4;30180:2;30169:9;30165:18;30157:26;;30229:9;30223:4;30219:20;30215:1;30204:9;30200:17;30193:47;30257:131;30383:4;30257:131;:::i;:::-;30249:139;;29976:419;;;:::o;30401:::-;30567:4;30605:2;30594:9;30590:18;30582:26;;30654:9;30648:4;30644:20;30640:1;30629:9;30625:17;30618:47;30682:131;30808:4;30682:131;:::i;:::-;30674:139;;30401:419;;;:::o;30826:::-;30992:4;31030:2;31019:9;31015:18;31007:26;;31079:9;31073:4;31069:20;31065:1;31054:9;31050:17;31043:47;31107:131;31233:4;31107:131;:::i;:::-;31099:139;;30826:419;;;:::o;31251:::-;31417:4;31455:2;31444:9;31440:18;31432:26;;31504:9;31498:4;31494:20;31490:1;31479:9;31475:17;31468:47;31532:131;31658:4;31532:131;:::i;:::-;31524:139;;31251:419;;;:::o;31676:::-;31842:4;31880:2;31869:9;31865:18;31857:26;;31929:9;31923:4;31919:20;31915:1;31904:9;31900:17;31893:47;31957:131;32083:4;31957:131;:::i;:::-;31949:139;;31676:419;;;:::o;32101:::-;32267:4;32305:2;32294:9;32290:18;32282:26;;32354:9;32348:4;32344:20;32340:1;32329:9;32325:17;32318:47;32382:131;32508:4;32382:131;:::i;:::-;32374:139;;32101:419;;;:::o;32526:::-;32692:4;32730:2;32719:9;32715:18;32707:26;;32779:9;32773:4;32769:20;32765:1;32754:9;32750:17;32743:47;32807:131;32933:4;32807:131;:::i;:::-;32799:139;;32526:419;;;:::o;32951:::-;33117:4;33155:2;33144:9;33140:18;33132:26;;33204:9;33198:4;33194:20;33190:1;33179:9;33175:17;33168:47;33232:131;33358:4;33232:131;:::i;:::-;33224:139;;32951:419;;;:::o;33376:::-;33542:4;33580:2;33569:9;33565:18;33557:26;;33629:9;33623:4;33619:20;33615:1;33604:9;33600:17;33593:47;33657:131;33783:4;33657:131;:::i;:::-;33649:139;;33376:419;;;:::o;33801:::-;33967:4;34005:2;33994:9;33990:18;33982:26;;34054:9;34048:4;34044:20;34040:1;34029:9;34025:17;34018:47;34082:131;34208:4;34082:131;:::i;:::-;34074:139;;33801:419;;;:::o;34226:::-;34392:4;34430:2;34419:9;34415:18;34407:26;;34479:9;34473:4;34469:20;34465:1;34454:9;34450:17;34443:47;34507:131;34633:4;34507:131;:::i;:::-;34499:139;;34226:419;;;:::o;34651:::-;34817:4;34855:2;34844:9;34840:18;34832:26;;34904:9;34898:4;34894:20;34890:1;34879:9;34875:17;34868:47;34932:131;35058:4;34932:131;:::i;:::-;34924:139;;34651:419;;;:::o;35076:::-;35242:4;35280:2;35269:9;35265:18;35257:26;;35329:9;35323:4;35319:20;35315:1;35304:9;35300:17;35293:47;35357:131;35483:4;35357:131;:::i;:::-;35349:139;;35076:419;;;:::o;35501:::-;35667:4;35705:2;35694:9;35690:18;35682:26;;35754:9;35748:4;35744:20;35740:1;35729:9;35725:17;35718:47;35782:131;35908:4;35782:131;:::i;:::-;35774:139;;35501:419;;;:::o;35926:::-;36092:4;36130:2;36119:9;36115:18;36107:26;;36179:9;36173:4;36169:20;36165:1;36154:9;36150:17;36143:47;36207:131;36333:4;36207:131;:::i;:::-;36199:139;;35926:419;;;:::o;36351:::-;36517:4;36555:2;36544:9;36540:18;36532:26;;36604:9;36598:4;36594:20;36590:1;36579:9;36575:17;36568:47;36632:131;36758:4;36632:131;:::i;:::-;36624:139;;36351:419;;;:::o;36776:::-;36942:4;36980:2;36969:9;36965:18;36957:26;;37029:9;37023:4;37019:20;37015:1;37004:9;37000:17;36993:47;37057:131;37183:4;37057:131;:::i;:::-;37049:139;;36776:419;;;:::o;37201:::-;37367:4;37405:2;37394:9;37390:18;37382:26;;37454:9;37448:4;37444:20;37440:1;37429:9;37425:17;37418:47;37482:131;37608:4;37482:131;:::i;:::-;37474:139;;37201:419;;;:::o;37626:::-;37792:4;37830:2;37819:9;37815:18;37807:26;;37879:9;37873:4;37869:20;37865:1;37854:9;37850:17;37843:47;37907:131;38033:4;37907:131;:::i;:::-;37899:139;;37626:419;;;:::o;38051:::-;38217:4;38255:2;38244:9;38240:18;38232:26;;38304:9;38298:4;38294:20;38290:1;38279:9;38275:17;38268:47;38332:131;38458:4;38332:131;:::i;:::-;38324:139;;38051:419;;;:::o;38476:::-;38642:4;38680:2;38669:9;38665:18;38657:26;;38729:9;38723:4;38719:20;38715:1;38704:9;38700:17;38693:47;38757:131;38883:4;38757:131;:::i;:::-;38749:139;;38476:419;;;:::o;38901:::-;39067:4;39105:2;39094:9;39090:18;39082:26;;39154:9;39148:4;39144:20;39140:1;39129:9;39125:17;39118:47;39182:131;39308:4;39182:131;:::i;:::-;39174:139;;38901:419;;;:::o;39326:::-;39492:4;39530:2;39519:9;39515:18;39507:26;;39579:9;39573:4;39569:20;39565:1;39554:9;39550:17;39543:47;39607:131;39733:4;39607:131;:::i;:::-;39599:139;;39326:419;;;:::o;39751:311::-;39888:4;39926:3;39915:9;39911:19;39903:27;;39940:115;40052:1;40041:9;40037:17;40028:6;39940:115;:::i;:::-;39751:311;;;;:::o;40068:222::-;40161:4;40199:2;40188:9;40184:18;40176:26;;40212:71;40280:1;40269:9;40265:17;40256:6;40212:71;:::i;:::-;40068:222;;;;:::o;40296:129::-;40330:6;40357:20;;:::i;:::-;40347:30;;40386:33;40414:4;40406:6;40386:33;:::i;:::-;40296:129;;;:::o;40431:75::-;40464:6;40497:2;40491:9;40481:19;;40431:75;:::o;40512:307::-;40573:4;40663:18;40655:6;40652:30;40649:56;;;40685:18;;:::i;:::-;40649:56;40723:29;40745:6;40723:29;:::i;:::-;40715:37;;40807:4;40801;40797:15;40789:23;;40512:307;;;:::o;40825:308::-;40887:4;40977:18;40969:6;40966:30;40963:56;;;40999:18;;:::i;:::-;40963:56;41037:29;41059:6;41037:29;:::i;:::-;41029:37;;41121:4;41115;41111:15;41103:23;;40825:308;;;:::o;41139:132::-;41206:4;41229:3;41221:11;;41259:4;41254:3;41250:14;41242:22;;41139:132;;;:::o;41277:141::-;41326:4;41349:3;41341:11;;41372:3;41369:1;41362:14;41406:4;41403:1;41393:18;41385:26;;41277:141;;;:::o;41424:114::-;41491:6;41525:5;41519:12;41509:22;;41424:114;;;:::o;41544:98::-;41595:6;41629:5;41623:12;41613:22;;41544:98;;;:::o;41648:99::-;41700:6;41734:5;41728:12;41718:22;;41648:99;;;:::o;41753:113::-;41823:4;41855;41850:3;41846:14;41838:22;;41753:113;;;:::o;41872:184::-;41971:11;42005:6;42000:3;41993:19;42045:4;42040:3;42036:14;42021:29;;41872:184;;;;:::o;42062:168::-;42145:11;42179:6;42174:3;42167:19;42219:4;42214:3;42210:14;42195:29;;42062:168;;;;:::o;42236:169::-;42320:11;42354:6;42349:3;42342:19;42394:4;42389:3;42385:14;42370:29;;42236:169;;;;:::o;42411:148::-;42513:11;42550:3;42535:18;;42411:148;;;;:::o;42565:305::-;42605:3;42624:20;42642:1;42624:20;:::i;:::-;42619:25;;42658:20;42676:1;42658:20;:::i;:::-;42653:25;;42812:1;42744:66;42740:74;42737:1;42734:81;42731:107;;;42818:18;;:::i;:::-;42731:107;42862:1;42859;42855:9;42848:16;;42565:305;;;;:::o;42876:185::-;42916:1;42933:20;42951:1;42933:20;:::i;:::-;42928:25;;42967:20;42985:1;42967:20;:::i;:::-;42962:25;;43006:1;42996:35;;43011:18;;:::i;:::-;42996:35;43053:1;43050;43046:9;43041:14;;42876:185;;;;:::o;43067:348::-;43107:7;43130:20;43148:1;43130:20;:::i;:::-;43125:25;;43164:20;43182:1;43164:20;:::i;:::-;43159:25;;43352:1;43284:66;43280:74;43277:1;43274:81;43269:1;43262:9;43255:17;43251:105;43248:131;;;43359:18;;:::i;:::-;43248:131;43407:1;43404;43400:9;43389:20;;43067:348;;;;:::o;43421:191::-;43461:4;43481:20;43499:1;43481:20;:::i;:::-;43476:25;;43515:20;43533:1;43515:20;:::i;:::-;43510:25;;43554:1;43551;43548:8;43545:34;;;43559:18;;:::i;:::-;43545:34;43604:1;43601;43597:9;43589:17;;43421:191;;;;:::o;43618:96::-;43655:7;43684:24;43702:5;43684:24;:::i;:::-;43673:35;;43618:96;;;:::o;43720:104::-;43765:7;43794:24;43812:5;43794:24;:::i;:::-;43783:35;;43720:104;;;:::o;43830:90::-;43864:7;43907:5;43900:13;43893:21;43882:32;;43830:90;;;:::o;43926:149::-;43962:7;44002:66;43995:5;43991:78;43980:89;;43926:149;;;:::o;44081:126::-;44118:7;44158:42;44151:5;44147:54;44136:65;;44081:126;;;:::o;44213:77::-;44250:7;44279:5;44268:16;;44213:77;;;:::o;44296:154::-;44380:6;44375:3;44370;44357:30;44442:1;44433:6;44428:3;44424:16;44417:27;44296:154;;;:::o;44456:307::-;44524:1;44534:113;44548:6;44545:1;44542:13;44534:113;;;44633:1;44628:3;44624:11;44618:18;44614:1;44609:3;44605:11;44598:39;44570:2;44567:1;44563:10;44558:15;;44534:113;;;44665:6;44662:1;44659:13;44656:101;;;44745:1;44736:6;44731:3;44727:16;44720:27;44656:101;44505:258;44456:307;;;:::o;44769:320::-;44813:6;44850:1;44844:4;44840:12;44830:22;;44897:1;44891:4;44887:12;44918:18;44908:81;;44974:4;44966:6;44962:17;44952:27;;44908:81;45036:2;45028:6;45025:14;45005:18;45002:38;44999:84;;;45055:18;;:::i;:::-;44999:84;44820:269;44769:320;;;:::o;45095:281::-;45178:27;45200:4;45178:27;:::i;:::-;45170:6;45166:40;45308:6;45296:10;45293:22;45272:18;45260:10;45257:34;45254:62;45251:88;;;45319:18;;:::i;:::-;45251:88;45359:10;45355:2;45348:22;45138:238;45095:281;;:::o;45382:233::-;45421:3;45444:24;45462:5;45444:24;:::i;:::-;45435:33;;45490:66;45483:5;45480:77;45477:103;;;45560:18;;:::i;:::-;45477:103;45607:1;45600:5;45596:13;45589:20;;45382:233;;;:::o;45621:176::-;45653:1;45670:20;45688:1;45670:20;:::i;:::-;45665:25;;45704:20;45722:1;45704:20;:::i;:::-;45699:25;;45743:1;45733:35;;45748:18;;:::i;:::-;45733:35;45789:1;45786;45782:9;45777:14;;45621:176;;;;:::o;45803:180::-;45851:77;45848:1;45841:88;45948:4;45945:1;45938:15;45972:4;45969:1;45962:15;45989:180;46037:77;46034:1;46027:88;46134:4;46131:1;46124:15;46158:4;46155:1;46148:15;46175:180;46223:77;46220:1;46213:88;46320:4;46317:1;46310:15;46344:4;46341:1;46334:15;46361:180;46409:77;46406:1;46399:88;46506:4;46503:1;46496:15;46530:4;46527:1;46520:15;46547:180;46595:77;46592:1;46585:88;46692:4;46689:1;46682:15;46716:4;46713:1;46706:15;46733:180;46781:77;46778:1;46771:88;46878:4;46875:1;46868:15;46902:4;46899:1;46892:15;46919:117;47028:1;47025;47018:12;47042:117;47151:1;47148;47141:12;47165:117;47274:1;47271;47264:12;47288:117;47397:1;47394;47387:12;47411:117;47520:1;47517;47510:12;47534:117;47643:1;47640;47633:12;47657:102;47698:6;47749:2;47745:7;47740:2;47733:5;47729:14;47725:28;47715:38;;47657:102;;;:::o;47765:230::-;47905:34;47901:1;47893:6;47889:14;47882:58;47974:13;47969:2;47961:6;47957:15;47950:38;47765:230;:::o;48001:237::-;48141:34;48137:1;48129:6;48125:14;48118:58;48210:20;48205:2;48197:6;48193:15;48186:45;48001:237;:::o;48244:225::-;48384:34;48380:1;48372:6;48368:14;48361:58;48453:8;48448:2;48440:6;48436:15;48429:33;48244:225;:::o;48475:178::-;48615:30;48611:1;48603:6;48599:14;48592:54;48475:178;:::o;48659:223::-;48799:34;48795:1;48787:6;48783:14;48776:58;48868:6;48863:2;48855:6;48851:15;48844:31;48659:223;:::o;48888:175::-;49028:27;49024:1;49016:6;49012:14;49005:51;48888:175;:::o;49069:231::-;49209:34;49205:1;49197:6;49193:14;49186:58;49278:14;49273:2;49265:6;49261:15;49254:39;49069:231;:::o;49306:243::-;49446:34;49442:1;49434:6;49430:14;49423:58;49515:26;49510:2;49502:6;49498:15;49491:51;49306:243;:::o;49555:229::-;49695:34;49691:1;49683:6;49679:14;49672:58;49764:12;49759:2;49751:6;49747:15;49740:37;49555:229;:::o;49790:228::-;49930:34;49926:1;49918:6;49914:14;49907:58;49999:11;49994:2;49986:6;49982:15;49975:36;49790:228;:::o;50024:174::-;50164:26;50160:1;50152:6;50148:14;50141:50;50024:174;:::o;50204:182::-;50344:34;50340:1;50332:6;50328:14;50321:58;50204:182;:::o;50392:231::-;50532:34;50528:1;50520:6;50516:14;50509:58;50601:14;50596:2;50588:6;50584:15;50577:39;50392:231;:::o;50629:182::-;50769:34;50765:1;50757:6;50753:14;50746:58;50629:182;:::o;50817:228::-;50957:34;50953:1;50945:6;50941:14;50934:58;51026:11;51021:2;51013:6;51009:15;51002:36;50817:228;:::o;51051:234::-;51191:34;51187:1;51179:6;51175:14;51168:58;51260:17;51255:2;51247:6;51243:15;51236:42;51051:234;:::o;51291:181::-;51431:33;51427:1;51419:6;51415:14;51408:57;51291:181;:::o;51478:161::-;51618:13;51614:1;51606:6;51602:14;51595:37;51478:161;:::o;51645:163::-;51785:15;51781:1;51773:6;51769:14;51762:39;51645:163;:::o;51814:220::-;51954:34;51950:1;51942:6;51938:14;51931:58;52023:3;52018:2;52010:6;52006:15;51999:28;51814:220;:::o;52040:236::-;52180:34;52176:1;52168:6;52164:14;52157:58;52249:19;52244:2;52236:6;52232:15;52225:44;52040:236;:::o;52282:169::-;52422:21;52418:1;52410:6;52406:14;52399:45;52282:169;:::o;52457:231::-;52597:34;52593:1;52585:6;52581:14;52574:58;52666:14;52661:2;52653:6;52649:15;52642:39;52457:231;:::o;52694:165::-;52834:17;52830:1;52822:6;52818:14;52811:41;52694:165;:::o;52865:167::-;53005:19;53001:1;52993:6;52989:14;52982:43;52865:167;:::o;53038:122::-;53111:24;53129:5;53111:24;:::i;:::-;53104:5;53101:35;53091:63;;53150:1;53147;53140:12;53091:63;53038:122;:::o;53166:138::-;53247:32;53273:5;53247:32;:::i;:::-;53240:5;53237:43;53227:71;;53294:1;53291;53284:12;53227:71;53166:138;:::o;53310:116::-;53380:21;53395:5;53380:21;:::i;:::-;53373:5;53370:32;53360:60;;53416:1;53413;53406:12;53360:60;53310:116;:::o;53432:120::-;53504:23;53521:5;53504:23;:::i;:::-;53497:5;53494:34;53484:62;;53542:1;53539;53532:12;53484:62;53432:120;:::o;53558:122::-;53631:24;53649:5;53631:24;:::i;:::-;53624:5;53621:35;53611:63;;53670:1;53667;53660:12;53611:63;53558:122;:::o
Swarm Source
ipfs://16134557b1e9088c0f50882bd65b2f8bd2d736d71b71ebfd2e0721bf273045da