Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
214 gm
Holders
93
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 gmLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
gm
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-04 */ // SPDX-License-Identifier: MIT /* gm @@@@@@@@@ gm @@@@@@@@@@@@@@@ gm gm @@@@@@@@@@@@@@@@@@ gm gm @@@@@@@@@@@@@@@@@@@@ ~~~~ ~~ ~~~~~ ~~~~~~~~ ~~ &&&&&&&&&&&&&&&&&&&& ~~~~~~~ ~~~~~~~~~~~ ~~~ ~ ~~ ~ ~ ~~~~~~~~~~~~~~~~~~~~ ~ ~~ ~~ ~ ~ ~~ ~~ ~~ ~~ ~~~~~~~~~~~~~ ~~~~ ~ ~~~ ~ ~~~ ~ ~~ ~ ~~ ~ ~ ~~~~~~ ~~ ~~~ ~~ ~ ~~ ~~ ~ ~ ~ ~ ~ ~ ~~ ~~~~~~ ~ ~~ ~ ~~ ~ ~ ~ ~ ~~ ~ ~ "say it back" a loot ripoff by dexter @houses */ pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @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); } } /* * @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; } } /** * @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() { _setOwner(_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 { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * 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]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @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); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. 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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { 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 {} } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @dev 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(); } } contract gm is ERC721Enumerable, ReentrancyGuard, Ownable { string[] private weapons = [ "gm" ]; string[] private chestArmor = [ "gm", "gm", "gm", "gm", "gm", "gm", "gm", "gm", "gm", "gm", "divine gm" ]; string[] private headArmor = [ "gm" ]; string[] private waistArmor = [ "gm" ]; string[] private footArmor = [ "gm" ]; string[] private handArmor = [ "gm" ]; string[] private necklaces = [ "gm" ]; string[] private rings = [ "gm" ]; string[] private suffixes = [ "!" ]; string[] private namePrefixes = [ "" ]; string[] private nameSuffixes = [ "divine" ]; function random(string memory input) internal pure returns (uint256) { return uint256(keccak256(abi.encodePacked(input))); } function getWeapon(uint256 tokenId) private view returns (string memory) { return pluck(tokenId, "WEAPON", weapons); } function getChest(uint256 tokenId) private view returns (string memory) { return pluck(tokenId, "CHEST", chestArmor); } function getHead(uint256 tokenId) private view returns (string memory) { return pluck(tokenId, "HEAD", headArmor); } function getWaist(uint256 tokenId) private view returns (string memory) { return pluck(tokenId, "WAIST", waistArmor); } function getFoot(uint256 tokenId) private view returns (string memory) { return pluck(tokenId, "FOOT", footArmor); } function getHand(uint256 tokenId) private view returns (string memory) { return pluck(tokenId, "HAND", handArmor); } function getNeck(uint256 tokenId) private view returns (string memory) { return pluck(tokenId, "NECK", necklaces); } function getRing(uint256 tokenId) private view returns (string memory) { return pluck(tokenId, "RING", rings); } function pluck(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray) internal view returns (string memory) { uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId)))); string memory output = sourceArray[rand % sourceArray.length]; uint256 greatness = rand % 22; if (greatness >= 20) { output = string(abi.encodePacked(output, "", suffixes[rand % suffixes.length])); } return output; } function tokenURI(uint256 tokenId) override public view returns (string memory) { string[17] memory parts; parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: orange; font-family: sans-serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="yellow" /><text x="10" y="20" class="base">'; parts[1] = getWeapon(tokenId); parts[2] = '</text><text x="10" y="40" class="base">'; parts[3] = getChest(tokenId); parts[4] = '</text><text x="10" y="60" class="base">'; parts[5] = getHead(tokenId); parts[6] = '</text><text x="10" y="80" class="base">'; parts[7] = getWaist(tokenId); parts[8] = '</text><text x="10" y="100" class="base">'; parts[9] = getFoot(tokenId); parts[10] = '</text><text x="10" y="120" class="base">'; parts[11] = getHand(tokenId); parts[12] = '</text><text x="10" y="140" class="base">'; parts[13] = getNeck(tokenId); parts[14] = '</text><text x="10" y="160" class="base">'; parts[15] = getRing(tokenId); parts[16] = '</text></svg>'; string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8])); output = string(abi.encodePacked(output, parts[9], parts[10], parts[11], parts[12], parts[13], parts[14], parts[15], parts[16])); string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "gm #', toString(tokenId), '", "description": "say it back", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}')))); output = string(abi.encodePacked('data:application/json;base64,', json)); return output; } function claim(uint256 tokenId) public nonReentrant { require(tokenId > 0 && tokenId < 1850, "Token ID invalid"); _safeMint(_msgSender(), tokenId); } function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner { require(tokenId > 1850 && tokenId < 2001, "Token ID invalid"); _safeMint(owner(), tokenId); } function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT license // 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); } constructor() ERC721("gm", "gm") Ownable() {} } /// [MIT License] /// @title Base64 /// @notice Provides a function for encoding some bytes in base64 /// @author Brecht Devos <[email protected]> library Base64 { bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /// @notice Encodes some bytes to the base64 representation function encode(bytes memory data) internal pure returns (string memory) { uint256 len = data.length; if (len == 0) return ""; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((len + 2) / 3); // Add some extra buffer at the end bytes memory result = new bytes(encodedLen + 32); bytes memory table = TABLE; assembly { let tablePtr := add(table, 1) let resultPtr := add(result, 32) for { let i := 0 } lt(i, len) { } { i := add(i, 3) let input := and(mload(add(data, i)), 0xffffff) let out := mload(add(tablePtr, and(shr(18, input), 0x3F))) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)) out := shl(224, out) mstore(resultPtr, out) resultPtr := add(resultPtr, 4) } switch mod(len, 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } mstore(result, encodedLen) } return string(result); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"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":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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"}]
Contract Creation Code
608060405260405180602001604052806040518060400160405280600281526020017f676d000000000000000000000000000000000000000000000000000000000000815250815250600c9060016200005a92919062000794565b506040518061016001604052806040518060400160405280600281526020017f676d00000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f676d00000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f676d00000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f676d00000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f676d00000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f676d00000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f676d00000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f676d00000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f676d00000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f676d00000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f646976696e6520676d0000000000000000000000000000000000000000000000815250815250600d90600b62000300929190620007fb565b5060405180602001604052806040518060400160405280600281526020017f676d000000000000000000000000000000000000000000000000000000000000815250815250600e9060016200035792919062000794565b5060405180602001604052806040518060400160405280600281526020017f676d000000000000000000000000000000000000000000000000000000000000815250815250600f906001620003ae92919062000794565b5060405180602001604052806040518060400160405280600281526020017f676d00000000000000000000000000000000000000000000000000000000000081525081525060109060016200040592919062000794565b5060405180602001604052806040518060400160405280600281526020017f676d00000000000000000000000000000000000000000000000000000000000081525081525060119060016200045c92919062000794565b5060405180602001604052806040518060400160405280600281526020017f676d0000000000000000000000000000000000000000000000000000000000008152508152506012906001620004b392919062000794565b5060405180602001604052806040518060400160405280600281526020017f676d00000000000000000000000000000000000000000000000000000000000081525081525060139060016200050a92919062000794565b5060405180602001604052806040518060400160405280600181526020017f210000000000000000000000000000000000000000000000000000000000000081525081525060149060016200056192919062000794565b5060405180602001604052806040518060200160405280600081525081525060159060016200059292919062000794565b5060405180602001604052806040518060400160405280600681526020017f646976696e6500000000000000000000000000000000000000000000000000008152508152506016906001620005e992919062000794565b50348015620005f757600080fd5b506040518060400160405280600281526020017f676d0000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f676d00000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200067c92919062000862565b5080600190805190602001906200069592919062000862565b5050506001600a81905550620006c0620006b4620006c660201b60201c565b620006ce60201b60201c565b620009e5565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054828255906000526020600020908101928215620007e8579160200282015b82811115620007e7578251829080519060200190620007d692919062000862565b5091602001919060010190620007b5565b5b509050620007f79190620008f3565b5090565b8280548282559060005260206000209081019282156200084f579160200282015b828111156200084e5782518290805190602001906200083d92919062000862565b50916020019190600101906200081c565b5b5090506200085e9190620008f3565b5090565b828054620008709062000980565b90600052602060002090601f016020900481019282620008945760008555620008e0565b82601f10620008af57805160ff1916838001178555620008e0565b82800160010185558215620008e0579182015b82811115620008df578251825591602001919060010190620008c2565b5b509050620008ef91906200091b565b5090565b5b808211156200091757600081816200090d91906200093a565b50600101620008f4565b5090565b5b80821115620009365760008160009055506001016200091c565b5090565b508054620009489062000980565b6000825580601f106200095c57506200097d565b601f0160209004906000526020600020908101906200097c91906200091b565b5b50565b600060028204905060018216806200099957607f821691505b60208210811415620009b057620009af620009b6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614b8f80620009f56000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80634f6ccce7116100b857806395d89b411161007c57806395d89b411461034c578063a22cb4651461036a578063b88d4fde14610386578063c87b56dd146103a2578063e985e9c5146103d2578063f2fde38b1461040257610137565b80634f6ccce7146102945780636352211e146102c457806370a08231146102f4578063715018a6146103245780638da5cb5b1461032e57610137565b806323b872dd116100ff57806323b872dd146101f45780632f745c5914610210578063379607f51461024057806342842e0e1461025c578063434f48c41461027857610137565b806301ffc9a71461013c57806306fdde031461016c578063081812fc1461018a578063095ea7b3146101ba57806318160ddd146101d6575b600080fd5b6101566004803603810190610151919061348f565b61041e565b6040516101639190613b64565b60405180910390f35b610174610498565b6040516101819190613b7f565b60405180910390f35b6101a4600480360381019061019f91906134e9565b61052a565b6040516101b19190613afd565b60405180910390f35b6101d460048036038101906101cf919061344f565b6105af565b005b6101de6106c7565b6040516101eb9190613e01565b60405180910390f35b61020e60048036038101906102099190613339565b6106d4565b005b61022a6004803603810190610225919061344f565b610734565b6040516102379190613e01565b60405180910390f35b61025a600480360381019061025591906134e9565b6107d9565b005b61027660048036038101906102719190613339565b610893565b005b610292600480360381019061028d91906134e9565b6108b3565b005b6102ae60048036038101906102a991906134e9565b6109ea565b6040516102bb9190613e01565b60405180910390f35b6102de60048036038101906102d991906134e9565b610a5b565b6040516102eb9190613afd565b60405180910390f35b61030e600480360381019061030991906132cc565b610b0d565b60405161031b9190613e01565b60405180910390f35b61032c610bc5565b005b610336610c4d565b6040516103439190613afd565b60405180910390f35b610354610c77565b6040516103619190613b7f565b60405180910390f35b610384600480360381019061037f919061340f565b610d09565b005b6103a0600480360381019061039b919061338c565b610e8a565b005b6103bc60048036038101906103b791906134e9565b610eec565b6040516103c99190613b7f565b60405180910390f35b6103ec60048036038101906103e791906132f9565b611484565b6040516103f99190613b64565b60405180910390f35b61041c600480360381019061041791906132cc565b611518565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610491575061049082611610565b5b9050919050565b6060600080546104a790614095565b80601f01602080910402602001604051908101604052809291908181526020018280546104d390614095565b80156105205780601f106104f557610100808354040283529160200191610520565b820191906000526020600020905b81548152906001019060200180831161050357829003601f168201915b5050505050905090565b6000610535826116f2565b610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056b90613d01565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105ba82610a5b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561062b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062290613d81565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661064a61175e565b73ffffffffffffffffffffffffffffffffffffffff16148061067957506106788161067361175e565b611484565b5b6106b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106af90613c81565b60405180910390fd5b6106c28383611766565b505050565b6000600880549050905090565b6106e56106df61175e565b8261181f565b610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071b90613da1565b60405180910390fd5b61072f8383836118fd565b505050565b600061073f83610b0d565b8210610780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077790613ba1565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600a54141561081f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081690613de1565b60405180910390fd5b6002600a81905550600081118015610838575061073a81105b610877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086e90613d41565b60405180910390fd5b61088861088261175e565b82611b59565b6001600a8190555050565b6108ae83838360405180602001604052806000815250610e8a565b505050565b6002600a5414156108f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f090613de1565b60405180910390fd5b6002600a8190555061090961175e565b73ffffffffffffffffffffffffffffffffffffffff16610927610c4d565b73ffffffffffffffffffffffffffffffffffffffff161461097d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097490613d21565b60405180910390fd5b61073a8111801561098f57506107d181105b6109ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c590613d41565b60405180910390fd5b6109df6109d9610c4d565b82611b59565b6001600a8190555050565b60006109f46106c7565b8210610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90613dc1565b60405180910390fd5b60088281548110610a4957610a4861422e565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afb90613cc1565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7590613ca1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bcd61175e565b73ffffffffffffffffffffffffffffffffffffffff16610beb610c4d565b73ffffffffffffffffffffffffffffffffffffffff1614610c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3890613d21565b60405180910390fd5b610c4b6000611b77565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610c8690614095565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb290614095565b8015610cff5780601f10610cd457610100808354040283529160200191610cff565b820191906000526020600020905b815481529060010190602001808311610ce257829003601f168201915b5050505050905090565b610d1161175e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7690613c41565b60405180910390fd5b8060056000610d8c61175e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610e3961175e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e7e9190613b64565b60405180910390a35050565b610e9b610e9561175e565b8361181f565b610eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed190613da1565b60405180910390fd5b610ee684848484611c3d565b50505050565b6060610ef66131cb565b60405180610140016040528061010481526020016149ee610104913981600060118110610f2657610f2561422e565b5b6020020181905250610f3783611c99565b81600160118110610f4b57610f4a61422e565b5b6020020181905250604051806060016040528060288152602001614b326028913981600260118110610f8057610f7f61422e565b5b6020020181905250610f9183611db3565b81600360118110610fa557610fa461422e565b5b60200201819052506040518060600160405280602881526020016148fa6028913981600460118110610fda57610fd961422e565b5b6020020181905250610feb83611ecd565b81600560118110610fff57610ffe61422e565b5b602002018190525060405180606001604052806028815260200161497460289139816006601181106110345761103361422e565b5b602002018190525061104583611fe7565b816007601181106110595761105861422e565b5b602002018190525060405180606001604052806029815260200161499c602991398160086011811061108e5761108d61422e565b5b602002018190525061109f83612101565b816009601181106110b3576110b261422e565b5b602002018190525060405180606001604052806029815260200161494b6029913981600a601181106110e8576110e761422e565b5b60200201819052506110f98361221b565b81600b6011811061110d5761110c61422e565b5b60200201819052506040518060600160405280602981526020016149c56029913981600c601181106111425761114161422e565b5b602002018190525061115383612335565b81600d601181106111675761116661422e565b5b60200201819052506040518060600160405280602981526020016149226029913981600e6011811061119c5761119b61422e565b5b60200201819052506111ad8361244f565b81600f601181106111c1576111c061422e565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e00000000000000000000000000000000000000815250816010601181106112135761121261422e565b5b60200201819052506000816000601181106112315761123061422e565b5b60200201518260016011811061124a5761124961422e565b5b6020020151836002601181106112635761126261422e565b5b60200201518460036011811061127c5761127b61422e565b5b6020020151856004601181106112955761129461422e565b5b6020020151866005601181106112ae576112ad61422e565b5b6020020151876006601181106112c7576112c661422e565b5b6020020151886007601181106112e0576112df61422e565b5b6020020151896008601181106112f9576112f861422e565b5b6020020151604051602001611316999897969594939291906139e8565b6040516020818303038152906040529050808260096011811061133c5761133b61422e565b5b602002015183600a601181106113555761135461422e565b5b602002015184600b6011811061136e5761136d61422e565b5b602002015185600c601181106113875761138661422e565b5b602002015186600d601181106113a05761139f61422e565b5b602002015187600e601181106113b9576113b861422e565b5b602002015188600f601181106113d2576113d161422e565b5b6020020151896010601181106113eb576113ea61422e565b5b6020020151604051602001611408999897969594939291906139e8565b6040516020818303038152906040529050600061145561142786612569565b611430846126ca565b604051602001611441929190613a96565b6040516020818303038152906040526126ca565b9050806040516020016114689190613adb565b6040516020818303038152906040529150819350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61152061175e565b73ffffffffffffffffffffffffffffffffffffffff1661153e610c4d565b73ffffffffffffffffffffffffffffffffffffffff1614611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158b90613d21565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fb90613be1565b60405180910390fd5b61160d81611b77565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806116db57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806116eb57506116ea82612862565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166117d983610a5b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061182a826116f2565b611869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186090613c61565b60405180910390fd5b600061187483610a5b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118e357508373ffffffffffffffffffffffffffffffffffffffff166118cb8461052a565b73ffffffffffffffffffffffffffffffffffffffff16145b806118f457506118f38185611484565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661191d82610a5b565b73ffffffffffffffffffffffffffffffffffffffff1614611973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196a90613d61565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90613c21565b60405180910390fd5b6119ee8383836128cc565b6119f9600082611766565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a499190613fab565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611aa09190613eca565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611b738282604051806020016040528060008152506129e0565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c488484846118fd565b611c5484848484612a3b565b611c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8a90613bc1565b60405180910390fd5b50505050565b6060611dac826040518060400160405280600681526020017f574541504f4e0000000000000000000000000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b82821015611da3578382906000526020600020018054611d1690614095565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4290614095565b8015611d8f5780601f10611d6457610100808354040283529160200191611d8f565b820191906000526020600020905b815481529060010190602001808311611d7257829003601f168201915b505050505081526020019060010190611cf7565b50505050612bd2565b9050919050565b6060611ec6826040518060400160405280600581526020017f4348455354000000000000000000000000000000000000000000000000000000815250600d805480602002602001604051908101604052809291908181526020016000905b82821015611ebd578382906000526020600020018054611e3090614095565b80601f0160208091040260200160405190810160405280929190818152602001828054611e5c90614095565b8015611ea95780601f10611e7e57610100808354040283529160200191611ea9565b820191906000526020600020905b815481529060010190602001808311611e8c57829003601f168201915b505050505081526020019060010190611e11565b50505050612bd2565b9050919050565b6060611fe0826040518060400160405280600481526020017f4845414400000000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b82821015611fd7578382906000526020600020018054611f4a90614095565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7690614095565b8015611fc35780601f10611f9857610100808354040283529160200191611fc3565b820191906000526020600020905b815481529060010190602001808311611fa657829003601f168201915b505050505081526020019060010190611f2b565b50505050612bd2565b9050919050565b60606120fa826040518060400160405280600581526020017f5741495354000000000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b828210156120f157838290600052602060002001805461206490614095565b80601f016020809104026020016040519081016040528092919081815260200182805461209090614095565b80156120dd5780601f106120b2576101008083540402835291602001916120dd565b820191906000526020600020905b8154815290600101906020018083116120c057829003601f168201915b505050505081526020019060010190612045565b50505050612bd2565b9050919050565b6060612214826040518060400160405280600481526020017f464f4f54000000000000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b8282101561220b57838290600052602060002001805461217e90614095565b80601f01602080910402602001604051908101604052809291908181526020018280546121aa90614095565b80156121f75780601f106121cc576101008083540402835291602001916121f7565b820191906000526020600020905b8154815290600101906020018083116121da57829003601f168201915b50505050508152602001906001019061215f565b50505050612bd2565b9050919050565b606061232e826040518060400160405280600481526020017f48414e44000000000000000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b8282101561232557838290600052602060002001805461229890614095565b80601f01602080910402602001604051908101604052809291908181526020018280546122c490614095565b80156123115780601f106122e657610100808354040283529160200191612311565b820191906000526020600020905b8154815290600101906020018083116122f457829003601f168201915b505050505081526020019060010190612279565b50505050612bd2565b9050919050565b6060612448826040518060400160405280600481526020017f4e45434b000000000000000000000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020016000905b8282101561243f5783829060005260206000200180546123b290614095565b80601f01602080910402602001604051908101604052809291908181526020018280546123de90614095565b801561242b5780601f106124005761010080835404028352916020019161242b565b820191906000526020600020905b81548152906001019060200180831161240e57829003601f168201915b505050505081526020019060010190612393565b50505050612bd2565b9050919050565b6060612562826040518060400160405280600481526020017f52494e47000000000000000000000000000000000000000000000000000000008152506013805480602002602001604051908101604052809291908181526020016000905b828210156125595783829060005260206000200180546124cc90614095565b80601f01602080910402602001604051908101604052809291908181526020018280546124f890614095565b80156125455780601f1061251a57610100808354040283529160200191612545565b820191906000526020600020905b81548152906001019060200180831161252857829003601f168201915b5050505050815260200190600101906124ad565b50505050612bd2565b9050919050565b606060008214156125b1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126c5565b600082905060005b600082146125e35780806125cc906140f8565b915050600a826125dc9190613f20565b91506125b9565b60008167ffffffffffffffff8111156125ff576125fe61425d565b5b6040519080825280601f01601f1916602001820160405280156126315781602001600182028036833780820191505090505b5090505b600085146126be5760018261264a9190613fab565b9150600a856126599190614141565b60306126659190613eca565b60f81b81838151811061267b5761267a61422e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126b79190613f20565b9450612635565b8093505050505b919050565b606060008251905060008114156126f3576040518060200160405280600081525091505061285d565b600060036002836127049190613eca565b61270e9190613f20565b600461271a9190613f51565b9050600060208261272b9190613eca565b67ffffffffffffffff8111156127445761274361425d565b5b6040519080825280601f01601f1916602001820160405280156127765781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614af2604091399050600181016020830160005b8681101561281a5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b905080845260048401935050506127a1565b50600386066001811461283457600281146128445761284f565b613d3d60f01b600283035261284f565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6128d7838383612cac565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561291a5761291581612cb1565b612959565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612958576129578382612cfa565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561299c5761299781612e67565b6129db565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129da576129d98282612f38565b5b5b505050565b6129ea8383612fb7565b6129f76000848484612a3b565b612a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2d90613bc1565b60405180910390fd5b505050565b6000612a5c8473ffffffffffffffffffffffffffffffffffffffff16613185565b15612bc5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a8561175e565b8786866040518563ffffffff1660e01b8152600401612aa79493929190613b18565b602060405180830381600087803b158015612ac157600080fd5b505af1925050508015612af257506040513d601f19601f82011682018060405250810190612aef91906134bc565b60015b612b75573d8060008114612b22576040519150601f19603f3d011682016040523d82523d6000602084013e612b27565b606091505b50600081511415612b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6490613bc1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bca565b600190505b949350505050565b60606000612c0884612be387612569565b604051602001612bf49291906139c4565b604051602081830303815290604052613198565b9050600083845183612c1a9190614141565b81518110612c2b57612c2a61422e565b5b602002602001015190506000601683612c449190614141565b905060148110612c9f57816014808054905085612c619190614141565b81548110612c7257612c7161422e565b5b90600052602060002001604051602001612c8d929190613a67565b60405160208183030381529060405291505b8193505050509392505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d0784610b0d565b612d119190613fab565b9050600060076000848152602001908152602001600020549050818114612df6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e7b9190613fab565b9050600060096000848152602001908152602001600020549050600060088381548110612eab57612eaa61422e565b5b906000526020600020015490508060088381548110612ecd57612ecc61422e565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612f1c57612f1b6141ff565b5b6001900381819060005260206000200160009055905550505050565b6000612f4383610b0d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301e90613ce1565b60405180910390fd5b613030816116f2565b15613070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306790613c01565b60405180910390fd5b61307c600083836128cc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130cc9190613eca565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6000816040516020016131ab91906139ad565b6040516020818303038152906040528051906020012060001c9050919050565b6040518061022001604052806011905b60608152602001906001900390816131db5790505090565b600061320661320184613e41565b613e1c565b90508281526020810184848401111561322257613221614291565b5b61322d848285614053565b509392505050565b6000813590506132448161489d565b92915050565b600081359050613259816148b4565b92915050565b60008135905061326e816148cb565b92915050565b600081519050613283816148cb565b92915050565b600082601f83011261329e5761329d61428c565b5b81356132ae8482602086016131f3565b91505092915050565b6000813590506132c6816148e2565b92915050565b6000602082840312156132e2576132e161429b565b5b60006132f084828501613235565b91505092915050565b600080604083850312156133105761330f61429b565b5b600061331e85828601613235565b925050602061332f85828601613235565b9150509250929050565b6000806000606084860312156133525761335161429b565b5b600061336086828701613235565b935050602061337186828701613235565b9250506040613382868287016132b7565b9150509250925092565b600080600080608085870312156133a6576133a561429b565b5b60006133b487828801613235565b94505060206133c587828801613235565b93505060406133d6878288016132b7565b925050606085013567ffffffffffffffff8111156133f7576133f6614296565b5b61340387828801613289565b91505092959194509250565b600080604083850312156134265761342561429b565b5b600061343485828601613235565b92505060206134458582860161324a565b9150509250929050565b600080604083850312156134665761346561429b565b5b600061347485828601613235565b9250506020613485858286016132b7565b9150509250929050565b6000602082840312156134a5576134a461429b565b5b60006134b38482850161325f565b91505092915050565b6000602082840312156134d2576134d161429b565b5b60006134e084828501613274565b91505092915050565b6000602082840312156134ff576134fe61429b565b5b600061350d848285016132b7565b91505092915050565b61351f81613fdf565b82525050565b61352e81613ff1565b82525050565b600061353f82613e87565b6135498185613e9d565b9350613559818560208601614062565b613562816142a0565b840191505092915050565b600061357882613e92565b6135828185613eae565b9350613592818560208601614062565b61359b816142a0565b840191505092915050565b60006135b182613e92565b6135bb8185613ebf565b93506135cb818560208601614062565b80840191505092915050565b600081546135e481614095565b6135ee8186613ebf565b94506001821660008114613609576001811461361a5761364d565b60ff1983168652818601935061364d565b61362385613e72565b60005b8381101561364557815481890152600182019150602081019050613626565b838801955050505b50505092915050565b6000613663600e83613ebf565b915061366e826142b1565b600e82019050919050565b6000613686604583613ebf565b9150613691826142da565b604582019050919050565b60006136a9602b83613eae565b91506136b48261434f565b604082019050919050565b60006136cc603283613eae565b91506136d78261439e565b604082019050919050565b60006136ef602683613eae565b91506136fa826143ed565b604082019050919050565b6000613712601c83613eae565b915061371d8261443c565b602082019050919050565b6000613735602483613eae565b915061374082614465565b604082019050919050565b6000613758601983613eae565b9150613763826144b4565b602082019050919050565b600061377b602c83613eae565b9150613786826144dd565b604082019050919050565b600061379e603883613eae565b91506137a98261452c565b604082019050919050565b60006137c1602a83613eae565b91506137cc8261457b565b604082019050919050565b60006137e4602983613eae565b91506137ef826145ca565b604082019050919050565b6000613807600283613ebf565b915061381282614619565b600282019050919050565b600061382a602083613eae565b915061383582614642565b602082019050919050565b600061384d602c83613eae565b91506138588261466b565b604082019050919050565b6000613870602083613eae565b915061387b826146ba565b602082019050919050565b6000613893601083613eae565b915061389e826146e3565b602082019050919050565b60006138b6602983613eae565b91506138c18261470c565b604082019050919050565b60006138d9602183613eae565b91506138e48261475b565b604082019050919050565b60006138fc601d83613ebf565b9150613907826147aa565b601d82019050919050565b600061391f600083613ebf565b915061392a826147d3565b600082019050919050565b6000613942603183613eae565b915061394d826147d6565b604082019050919050565b6000613965602c83613eae565b915061397082614825565b604082019050919050565b6000613988601f83613eae565b915061399382614874565b602082019050919050565b6139a781614049565b82525050565b60006139b982846135a6565b915081905092915050565b60006139d082856135a6565b91506139dc82846135a6565b91508190509392505050565b60006139f4828c6135a6565b9150613a00828b6135a6565b9150613a0c828a6135a6565b9150613a1882896135a6565b9150613a2482886135a6565b9150613a3082876135a6565b9150613a3c82866135a6565b9150613a4882856135a6565b9150613a5482846135a6565b91508190509a9950505050505050505050565b6000613a7382856135a6565b9150613a7e82613912565b9150613a8a82846135d7565b91508190509392505050565b6000613aa182613656565b9150613aad82856135a6565b9150613ab882613679565b9150613ac482846135a6565b9150613acf826137fa565b91508190509392505050565b6000613ae6826138ef565b9150613af282846135a6565b915081905092915050565b6000602082019050613b126000830184613516565b92915050565b6000608082019050613b2d6000830187613516565b613b3a6020830186613516565b613b47604083018561399e565b8181036060830152613b598184613534565b905095945050505050565b6000602082019050613b796000830184613525565b92915050565b60006020820190508181036000830152613b99818461356d565b905092915050565b60006020820190508181036000830152613bba8161369c565b9050919050565b60006020820190508181036000830152613bda816136bf565b9050919050565b60006020820190508181036000830152613bfa816136e2565b9050919050565b60006020820190508181036000830152613c1a81613705565b9050919050565b60006020820190508181036000830152613c3a81613728565b9050919050565b60006020820190508181036000830152613c5a8161374b565b9050919050565b60006020820190508181036000830152613c7a8161376e565b9050919050565b60006020820190508181036000830152613c9a81613791565b9050919050565b60006020820190508181036000830152613cba816137b4565b9050919050565b60006020820190508181036000830152613cda816137d7565b9050919050565b60006020820190508181036000830152613cfa8161381d565b9050919050565b60006020820190508181036000830152613d1a81613840565b9050919050565b60006020820190508181036000830152613d3a81613863565b9050919050565b60006020820190508181036000830152613d5a81613886565b9050919050565b60006020820190508181036000830152613d7a816138a9565b9050919050565b60006020820190508181036000830152613d9a816138cc565b9050919050565b60006020820190508181036000830152613dba81613935565b9050919050565b60006020820190508181036000830152613dda81613958565b9050919050565b60006020820190508181036000830152613dfa8161397b565b9050919050565b6000602082019050613e16600083018461399e565b92915050565b6000613e26613e37565b9050613e3282826140c7565b919050565b6000604051905090565b600067ffffffffffffffff821115613e5c57613e5b61425d565b5b613e65826142a0565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ed582614049565b9150613ee083614049565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f1557613f14614172565b5b828201905092915050565b6000613f2b82614049565b9150613f3683614049565b925082613f4657613f456141a1565b5b828204905092915050565b6000613f5c82614049565b9150613f6783614049565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613fa057613f9f614172565b5b828202905092915050565b6000613fb682614049565b9150613fc183614049565b925082821015613fd457613fd3614172565b5b828203905092915050565b6000613fea82614029565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614080578082015181840152602081019050614065565b8381111561408f576000848401525b50505050565b600060028204905060018216806140ad57607f821691505b602082108114156140c1576140c06141d0565b5b50919050565b6140d0826142a0565b810181811067ffffffffffffffff821117156140ef576140ee61425d565b5b80604052505050565b600061410382614049565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561413657614135614172565b5b600182019050919050565b600061414c82614049565b915061415783614049565b925082614167576141666141a1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f7b226e616d65223a2022676d2023000000000000000000000000000000000000600082015250565b7f222c20226465736372697074696f6e223a2022736179206974206261636b222c60008201527f2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b626160208201527f736536342c000000000000000000000000000000000000000000000000000000604082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6148a681613fdf565b81146148b157600080fd5b50565b6148bd81613ff1565b81146148c857600080fd5b50565b6148d481613ffd565b81146148df57600080fd5b50565b6148eb81614049565b81146148f657600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a206f72616e67653b20666f6e742d66616d696c793a2073616e732d73657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d2279656c6c6f7722202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea2646970667358221220da61337a785d478f26639d613ed457c74082266082608f9599019898840468e464736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101375760003560e01c80634f6ccce7116100b857806395d89b411161007c57806395d89b411461034c578063a22cb4651461036a578063b88d4fde14610386578063c87b56dd146103a2578063e985e9c5146103d2578063f2fde38b1461040257610137565b80634f6ccce7146102945780636352211e146102c457806370a08231146102f4578063715018a6146103245780638da5cb5b1461032e57610137565b806323b872dd116100ff57806323b872dd146101f45780632f745c5914610210578063379607f51461024057806342842e0e1461025c578063434f48c41461027857610137565b806301ffc9a71461013c57806306fdde031461016c578063081812fc1461018a578063095ea7b3146101ba57806318160ddd146101d6575b600080fd5b6101566004803603810190610151919061348f565b61041e565b6040516101639190613b64565b60405180910390f35b610174610498565b6040516101819190613b7f565b60405180910390f35b6101a4600480360381019061019f91906134e9565b61052a565b6040516101b19190613afd565b60405180910390f35b6101d460048036038101906101cf919061344f565b6105af565b005b6101de6106c7565b6040516101eb9190613e01565b60405180910390f35b61020e60048036038101906102099190613339565b6106d4565b005b61022a6004803603810190610225919061344f565b610734565b6040516102379190613e01565b60405180910390f35b61025a600480360381019061025591906134e9565b6107d9565b005b61027660048036038101906102719190613339565b610893565b005b610292600480360381019061028d91906134e9565b6108b3565b005b6102ae60048036038101906102a991906134e9565b6109ea565b6040516102bb9190613e01565b60405180910390f35b6102de60048036038101906102d991906134e9565b610a5b565b6040516102eb9190613afd565b60405180910390f35b61030e600480360381019061030991906132cc565b610b0d565b60405161031b9190613e01565b60405180910390f35b61032c610bc5565b005b610336610c4d565b6040516103439190613afd565b60405180910390f35b610354610c77565b6040516103619190613b7f565b60405180910390f35b610384600480360381019061037f919061340f565b610d09565b005b6103a0600480360381019061039b919061338c565b610e8a565b005b6103bc60048036038101906103b791906134e9565b610eec565b6040516103c99190613b7f565b60405180910390f35b6103ec60048036038101906103e791906132f9565b611484565b6040516103f99190613b64565b60405180910390f35b61041c600480360381019061041791906132cc565b611518565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610491575061049082611610565b5b9050919050565b6060600080546104a790614095565b80601f01602080910402602001604051908101604052809291908181526020018280546104d390614095565b80156105205780601f106104f557610100808354040283529160200191610520565b820191906000526020600020905b81548152906001019060200180831161050357829003601f168201915b5050505050905090565b6000610535826116f2565b610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056b90613d01565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105ba82610a5b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561062b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062290613d81565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661064a61175e565b73ffffffffffffffffffffffffffffffffffffffff16148061067957506106788161067361175e565b611484565b5b6106b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106af90613c81565b60405180910390fd5b6106c28383611766565b505050565b6000600880549050905090565b6106e56106df61175e565b8261181f565b610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071b90613da1565b60405180910390fd5b61072f8383836118fd565b505050565b600061073f83610b0d565b8210610780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077790613ba1565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600a54141561081f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081690613de1565b60405180910390fd5b6002600a81905550600081118015610838575061073a81105b610877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086e90613d41565b60405180910390fd5b61088861088261175e565b82611b59565b6001600a8190555050565b6108ae83838360405180602001604052806000815250610e8a565b505050565b6002600a5414156108f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f090613de1565b60405180910390fd5b6002600a8190555061090961175e565b73ffffffffffffffffffffffffffffffffffffffff16610927610c4d565b73ffffffffffffffffffffffffffffffffffffffff161461097d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097490613d21565b60405180910390fd5b61073a8111801561098f57506107d181105b6109ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c590613d41565b60405180910390fd5b6109df6109d9610c4d565b82611b59565b6001600a8190555050565b60006109f46106c7565b8210610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90613dc1565b60405180910390fd5b60088281548110610a4957610a4861422e565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afb90613cc1565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7590613ca1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bcd61175e565b73ffffffffffffffffffffffffffffffffffffffff16610beb610c4d565b73ffffffffffffffffffffffffffffffffffffffff1614610c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3890613d21565b60405180910390fd5b610c4b6000611b77565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610c8690614095565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb290614095565b8015610cff5780601f10610cd457610100808354040283529160200191610cff565b820191906000526020600020905b815481529060010190602001808311610ce257829003601f168201915b5050505050905090565b610d1161175e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7690613c41565b60405180910390fd5b8060056000610d8c61175e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610e3961175e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e7e9190613b64565b60405180910390a35050565b610e9b610e9561175e565b8361181f565b610eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed190613da1565b60405180910390fd5b610ee684848484611c3d565b50505050565b6060610ef66131cb565b60405180610140016040528061010481526020016149ee610104913981600060118110610f2657610f2561422e565b5b6020020181905250610f3783611c99565b81600160118110610f4b57610f4a61422e565b5b6020020181905250604051806060016040528060288152602001614b326028913981600260118110610f8057610f7f61422e565b5b6020020181905250610f9183611db3565b81600360118110610fa557610fa461422e565b5b60200201819052506040518060600160405280602881526020016148fa6028913981600460118110610fda57610fd961422e565b5b6020020181905250610feb83611ecd565b81600560118110610fff57610ffe61422e565b5b602002018190525060405180606001604052806028815260200161497460289139816006601181106110345761103361422e565b5b602002018190525061104583611fe7565b816007601181106110595761105861422e565b5b602002018190525060405180606001604052806029815260200161499c602991398160086011811061108e5761108d61422e565b5b602002018190525061109f83612101565b816009601181106110b3576110b261422e565b5b602002018190525060405180606001604052806029815260200161494b6029913981600a601181106110e8576110e761422e565b5b60200201819052506110f98361221b565b81600b6011811061110d5761110c61422e565b5b60200201819052506040518060600160405280602981526020016149c56029913981600c601181106111425761114161422e565b5b602002018190525061115383612335565b81600d601181106111675761116661422e565b5b60200201819052506040518060600160405280602981526020016149226029913981600e6011811061119c5761119b61422e565b5b60200201819052506111ad8361244f565b81600f601181106111c1576111c061422e565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e00000000000000000000000000000000000000815250816010601181106112135761121261422e565b5b60200201819052506000816000601181106112315761123061422e565b5b60200201518260016011811061124a5761124961422e565b5b6020020151836002601181106112635761126261422e565b5b60200201518460036011811061127c5761127b61422e565b5b6020020151856004601181106112955761129461422e565b5b6020020151866005601181106112ae576112ad61422e565b5b6020020151876006601181106112c7576112c661422e565b5b6020020151886007601181106112e0576112df61422e565b5b6020020151896008601181106112f9576112f861422e565b5b6020020151604051602001611316999897969594939291906139e8565b6040516020818303038152906040529050808260096011811061133c5761133b61422e565b5b602002015183600a601181106113555761135461422e565b5b602002015184600b6011811061136e5761136d61422e565b5b602002015185600c601181106113875761138661422e565b5b602002015186600d601181106113a05761139f61422e565b5b602002015187600e601181106113b9576113b861422e565b5b602002015188600f601181106113d2576113d161422e565b5b6020020151896010601181106113eb576113ea61422e565b5b6020020151604051602001611408999897969594939291906139e8565b6040516020818303038152906040529050600061145561142786612569565b611430846126ca565b604051602001611441929190613a96565b6040516020818303038152906040526126ca565b9050806040516020016114689190613adb565b6040516020818303038152906040529150819350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61152061175e565b73ffffffffffffffffffffffffffffffffffffffff1661153e610c4d565b73ffffffffffffffffffffffffffffffffffffffff1614611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158b90613d21565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fb90613be1565b60405180910390fd5b61160d81611b77565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806116db57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806116eb57506116ea82612862565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166117d983610a5b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061182a826116f2565b611869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186090613c61565b60405180910390fd5b600061187483610a5b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118e357508373ffffffffffffffffffffffffffffffffffffffff166118cb8461052a565b73ffffffffffffffffffffffffffffffffffffffff16145b806118f457506118f38185611484565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661191d82610a5b565b73ffffffffffffffffffffffffffffffffffffffff1614611973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196a90613d61565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90613c21565b60405180910390fd5b6119ee8383836128cc565b6119f9600082611766565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a499190613fab565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611aa09190613eca565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611b738282604051806020016040528060008152506129e0565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c488484846118fd565b611c5484848484612a3b565b611c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8a90613bc1565b60405180910390fd5b50505050565b6060611dac826040518060400160405280600681526020017f574541504f4e0000000000000000000000000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b82821015611da3578382906000526020600020018054611d1690614095565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4290614095565b8015611d8f5780601f10611d6457610100808354040283529160200191611d8f565b820191906000526020600020905b815481529060010190602001808311611d7257829003601f168201915b505050505081526020019060010190611cf7565b50505050612bd2565b9050919050565b6060611ec6826040518060400160405280600581526020017f4348455354000000000000000000000000000000000000000000000000000000815250600d805480602002602001604051908101604052809291908181526020016000905b82821015611ebd578382906000526020600020018054611e3090614095565b80601f0160208091040260200160405190810160405280929190818152602001828054611e5c90614095565b8015611ea95780601f10611e7e57610100808354040283529160200191611ea9565b820191906000526020600020905b815481529060010190602001808311611e8c57829003601f168201915b505050505081526020019060010190611e11565b50505050612bd2565b9050919050565b6060611fe0826040518060400160405280600481526020017f4845414400000000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b82821015611fd7578382906000526020600020018054611f4a90614095565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7690614095565b8015611fc35780601f10611f9857610100808354040283529160200191611fc3565b820191906000526020600020905b815481529060010190602001808311611fa657829003601f168201915b505050505081526020019060010190611f2b565b50505050612bd2565b9050919050565b60606120fa826040518060400160405280600581526020017f5741495354000000000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b828210156120f157838290600052602060002001805461206490614095565b80601f016020809104026020016040519081016040528092919081815260200182805461209090614095565b80156120dd5780601f106120b2576101008083540402835291602001916120dd565b820191906000526020600020905b8154815290600101906020018083116120c057829003601f168201915b505050505081526020019060010190612045565b50505050612bd2565b9050919050565b6060612214826040518060400160405280600481526020017f464f4f54000000000000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b8282101561220b57838290600052602060002001805461217e90614095565b80601f01602080910402602001604051908101604052809291908181526020018280546121aa90614095565b80156121f75780601f106121cc576101008083540402835291602001916121f7565b820191906000526020600020905b8154815290600101906020018083116121da57829003601f168201915b50505050508152602001906001019061215f565b50505050612bd2565b9050919050565b606061232e826040518060400160405280600481526020017f48414e44000000000000000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b8282101561232557838290600052602060002001805461229890614095565b80601f01602080910402602001604051908101604052809291908181526020018280546122c490614095565b80156123115780601f106122e657610100808354040283529160200191612311565b820191906000526020600020905b8154815290600101906020018083116122f457829003601f168201915b505050505081526020019060010190612279565b50505050612bd2565b9050919050565b6060612448826040518060400160405280600481526020017f4e45434b000000000000000000000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020016000905b8282101561243f5783829060005260206000200180546123b290614095565b80601f01602080910402602001604051908101604052809291908181526020018280546123de90614095565b801561242b5780601f106124005761010080835404028352916020019161242b565b820191906000526020600020905b81548152906001019060200180831161240e57829003601f168201915b505050505081526020019060010190612393565b50505050612bd2565b9050919050565b6060612562826040518060400160405280600481526020017f52494e47000000000000000000000000000000000000000000000000000000008152506013805480602002602001604051908101604052809291908181526020016000905b828210156125595783829060005260206000200180546124cc90614095565b80601f01602080910402602001604051908101604052809291908181526020018280546124f890614095565b80156125455780601f1061251a57610100808354040283529160200191612545565b820191906000526020600020905b81548152906001019060200180831161252857829003601f168201915b5050505050815260200190600101906124ad565b50505050612bd2565b9050919050565b606060008214156125b1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126c5565b600082905060005b600082146125e35780806125cc906140f8565b915050600a826125dc9190613f20565b91506125b9565b60008167ffffffffffffffff8111156125ff576125fe61425d565b5b6040519080825280601f01601f1916602001820160405280156126315781602001600182028036833780820191505090505b5090505b600085146126be5760018261264a9190613fab565b9150600a856126599190614141565b60306126659190613eca565b60f81b81838151811061267b5761267a61422e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126b79190613f20565b9450612635565b8093505050505b919050565b606060008251905060008114156126f3576040518060200160405280600081525091505061285d565b600060036002836127049190613eca565b61270e9190613f20565b600461271a9190613f51565b9050600060208261272b9190613eca565b67ffffffffffffffff8111156127445761274361425d565b5b6040519080825280601f01601f1916602001820160405280156127765781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614af2604091399050600181016020830160005b8681101561281a5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b905080845260048401935050506127a1565b50600386066001811461283457600281146128445761284f565b613d3d60f01b600283035261284f565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6128d7838383612cac565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561291a5761291581612cb1565b612959565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612958576129578382612cfa565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561299c5761299781612e67565b6129db565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129da576129d98282612f38565b5b5b505050565b6129ea8383612fb7565b6129f76000848484612a3b565b612a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2d90613bc1565b60405180910390fd5b505050565b6000612a5c8473ffffffffffffffffffffffffffffffffffffffff16613185565b15612bc5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a8561175e565b8786866040518563ffffffff1660e01b8152600401612aa79493929190613b18565b602060405180830381600087803b158015612ac157600080fd5b505af1925050508015612af257506040513d601f19601f82011682018060405250810190612aef91906134bc565b60015b612b75573d8060008114612b22576040519150601f19603f3d011682016040523d82523d6000602084013e612b27565b606091505b50600081511415612b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6490613bc1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bca565b600190505b949350505050565b60606000612c0884612be387612569565b604051602001612bf49291906139c4565b604051602081830303815290604052613198565b9050600083845183612c1a9190614141565b81518110612c2b57612c2a61422e565b5b602002602001015190506000601683612c449190614141565b905060148110612c9f57816014808054905085612c619190614141565b81548110612c7257612c7161422e565b5b90600052602060002001604051602001612c8d929190613a67565b60405160208183030381529060405291505b8193505050509392505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d0784610b0d565b612d119190613fab565b9050600060076000848152602001908152602001600020549050818114612df6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e7b9190613fab565b9050600060096000848152602001908152602001600020549050600060088381548110612eab57612eaa61422e565b5b906000526020600020015490508060088381548110612ecd57612ecc61422e565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612f1c57612f1b6141ff565b5b6001900381819060005260206000200160009055905550505050565b6000612f4383610b0d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301e90613ce1565b60405180910390fd5b613030816116f2565b15613070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306790613c01565b60405180910390fd5b61307c600083836128cc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130cc9190613eca565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6000816040516020016131ab91906139ad565b6040516020818303038152906040528051906020012060001c9050919050565b6040518061022001604052806011905b60608152602001906001900390816131db5790505090565b600061320661320184613e41565b613e1c565b90508281526020810184848401111561322257613221614291565b5b61322d848285614053565b509392505050565b6000813590506132448161489d565b92915050565b600081359050613259816148b4565b92915050565b60008135905061326e816148cb565b92915050565b600081519050613283816148cb565b92915050565b600082601f83011261329e5761329d61428c565b5b81356132ae8482602086016131f3565b91505092915050565b6000813590506132c6816148e2565b92915050565b6000602082840312156132e2576132e161429b565b5b60006132f084828501613235565b91505092915050565b600080604083850312156133105761330f61429b565b5b600061331e85828601613235565b925050602061332f85828601613235565b9150509250929050565b6000806000606084860312156133525761335161429b565b5b600061336086828701613235565b935050602061337186828701613235565b9250506040613382868287016132b7565b9150509250925092565b600080600080608085870312156133a6576133a561429b565b5b60006133b487828801613235565b94505060206133c587828801613235565b93505060406133d6878288016132b7565b925050606085013567ffffffffffffffff8111156133f7576133f6614296565b5b61340387828801613289565b91505092959194509250565b600080604083850312156134265761342561429b565b5b600061343485828601613235565b92505060206134458582860161324a565b9150509250929050565b600080604083850312156134665761346561429b565b5b600061347485828601613235565b9250506020613485858286016132b7565b9150509250929050565b6000602082840312156134a5576134a461429b565b5b60006134b38482850161325f565b91505092915050565b6000602082840312156134d2576134d161429b565b5b60006134e084828501613274565b91505092915050565b6000602082840312156134ff576134fe61429b565b5b600061350d848285016132b7565b91505092915050565b61351f81613fdf565b82525050565b61352e81613ff1565b82525050565b600061353f82613e87565b6135498185613e9d565b9350613559818560208601614062565b613562816142a0565b840191505092915050565b600061357882613e92565b6135828185613eae565b9350613592818560208601614062565b61359b816142a0565b840191505092915050565b60006135b182613e92565b6135bb8185613ebf565b93506135cb818560208601614062565b80840191505092915050565b600081546135e481614095565b6135ee8186613ebf565b94506001821660008114613609576001811461361a5761364d565b60ff1983168652818601935061364d565b61362385613e72565b60005b8381101561364557815481890152600182019150602081019050613626565b838801955050505b50505092915050565b6000613663600e83613ebf565b915061366e826142b1565b600e82019050919050565b6000613686604583613ebf565b9150613691826142da565b604582019050919050565b60006136a9602b83613eae565b91506136b48261434f565b604082019050919050565b60006136cc603283613eae565b91506136d78261439e565b604082019050919050565b60006136ef602683613eae565b91506136fa826143ed565b604082019050919050565b6000613712601c83613eae565b915061371d8261443c565b602082019050919050565b6000613735602483613eae565b915061374082614465565b604082019050919050565b6000613758601983613eae565b9150613763826144b4565b602082019050919050565b600061377b602c83613eae565b9150613786826144dd565b604082019050919050565b600061379e603883613eae565b91506137a98261452c565b604082019050919050565b60006137c1602a83613eae565b91506137cc8261457b565b604082019050919050565b60006137e4602983613eae565b91506137ef826145ca565b604082019050919050565b6000613807600283613ebf565b915061381282614619565b600282019050919050565b600061382a602083613eae565b915061383582614642565b602082019050919050565b600061384d602c83613eae565b91506138588261466b565b604082019050919050565b6000613870602083613eae565b915061387b826146ba565b602082019050919050565b6000613893601083613eae565b915061389e826146e3565b602082019050919050565b60006138b6602983613eae565b91506138c18261470c565b604082019050919050565b60006138d9602183613eae565b91506138e48261475b565b604082019050919050565b60006138fc601d83613ebf565b9150613907826147aa565b601d82019050919050565b600061391f600083613ebf565b915061392a826147d3565b600082019050919050565b6000613942603183613eae565b915061394d826147d6565b604082019050919050565b6000613965602c83613eae565b915061397082614825565b604082019050919050565b6000613988601f83613eae565b915061399382614874565b602082019050919050565b6139a781614049565b82525050565b60006139b982846135a6565b915081905092915050565b60006139d082856135a6565b91506139dc82846135a6565b91508190509392505050565b60006139f4828c6135a6565b9150613a00828b6135a6565b9150613a0c828a6135a6565b9150613a1882896135a6565b9150613a2482886135a6565b9150613a3082876135a6565b9150613a3c82866135a6565b9150613a4882856135a6565b9150613a5482846135a6565b91508190509a9950505050505050505050565b6000613a7382856135a6565b9150613a7e82613912565b9150613a8a82846135d7565b91508190509392505050565b6000613aa182613656565b9150613aad82856135a6565b9150613ab882613679565b9150613ac482846135a6565b9150613acf826137fa565b91508190509392505050565b6000613ae6826138ef565b9150613af282846135a6565b915081905092915050565b6000602082019050613b126000830184613516565b92915050565b6000608082019050613b2d6000830187613516565b613b3a6020830186613516565b613b47604083018561399e565b8181036060830152613b598184613534565b905095945050505050565b6000602082019050613b796000830184613525565b92915050565b60006020820190508181036000830152613b99818461356d565b905092915050565b60006020820190508181036000830152613bba8161369c565b9050919050565b60006020820190508181036000830152613bda816136bf565b9050919050565b60006020820190508181036000830152613bfa816136e2565b9050919050565b60006020820190508181036000830152613c1a81613705565b9050919050565b60006020820190508181036000830152613c3a81613728565b9050919050565b60006020820190508181036000830152613c5a8161374b565b9050919050565b60006020820190508181036000830152613c7a8161376e565b9050919050565b60006020820190508181036000830152613c9a81613791565b9050919050565b60006020820190508181036000830152613cba816137b4565b9050919050565b60006020820190508181036000830152613cda816137d7565b9050919050565b60006020820190508181036000830152613cfa8161381d565b9050919050565b60006020820190508181036000830152613d1a81613840565b9050919050565b60006020820190508181036000830152613d3a81613863565b9050919050565b60006020820190508181036000830152613d5a81613886565b9050919050565b60006020820190508181036000830152613d7a816138a9565b9050919050565b60006020820190508181036000830152613d9a816138cc565b9050919050565b60006020820190508181036000830152613dba81613935565b9050919050565b60006020820190508181036000830152613dda81613958565b9050919050565b60006020820190508181036000830152613dfa8161397b565b9050919050565b6000602082019050613e16600083018461399e565b92915050565b6000613e26613e37565b9050613e3282826140c7565b919050565b6000604051905090565b600067ffffffffffffffff821115613e5c57613e5b61425d565b5b613e65826142a0565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ed582614049565b9150613ee083614049565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f1557613f14614172565b5b828201905092915050565b6000613f2b82614049565b9150613f3683614049565b925082613f4657613f456141a1565b5b828204905092915050565b6000613f5c82614049565b9150613f6783614049565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613fa057613f9f614172565b5b828202905092915050565b6000613fb682614049565b9150613fc183614049565b925082821015613fd457613fd3614172565b5b828203905092915050565b6000613fea82614029565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614080578082015181840152602081019050614065565b8381111561408f576000848401525b50505050565b600060028204905060018216806140ad57607f821691505b602082108114156140c1576140c06141d0565b5b50919050565b6140d0826142a0565b810181811067ffffffffffffffff821117156140ef576140ee61425d565b5b80604052505050565b600061410382614049565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561413657614135614172565b5b600182019050919050565b600061414c82614049565b915061415783614049565b925082614167576141666141a1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f7b226e616d65223a2022676d2023000000000000000000000000000000000000600082015250565b7f222c20226465736372697074696f6e223a2022736179206974206261636b222c60008201527f2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b626160208201527f736536342c000000000000000000000000000000000000000000000000000000604082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6148a681613fdf565b81146148b157600080fd5b50565b6148bd81613ff1565b81146148c857600080fd5b50565b6148d481613ffd565b81146148df57600080fd5b50565b6148eb81614049565b81146148f657600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a206f72616e67653b20666f6e742d66616d696c793a2073616e732d73657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d2279656c6c6f7722202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea2646970667358221220da61337a785d478f26639d613ed457c74082266082608f9599019898840468e464736f6c63430008070033
Deployed Bytecode Sourcemap
45259:5759:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39109:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26223:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27782:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27305:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39749:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28672:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39417:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49862:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29082:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50046;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39939:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25917:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25647:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10615:94;;;:::i;:::-;;9964:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26392:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28075:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29338:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47980:1874;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28441:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10864:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39109:224;39211:4;39250:35;39235:50;;;:11;:50;;;;:90;;;;39289:36;39313:11;39289:23;:36::i;:::-;39235:90;39228:97;;39109:224;;;:::o;26223:100::-;26277:13;26310:5;26303:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26223:100;:::o;27782:221::-;27858:7;27886:16;27894:7;27886;:16::i;:::-;27878:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27971:15;:24;27987:7;27971:24;;;;;;;;;;;;;;;;;;;;;27964:31;;27782:221;;;:::o;27305:411::-;27386:13;27402:23;27417:7;27402:14;:23::i;:::-;27386:39;;27450:5;27444:11;;:2;:11;;;;27436:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27544:5;27528:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27553:37;27570:5;27577:12;:10;:12::i;:::-;27553:16;:37::i;:::-;27528:62;27506:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27687:21;27696:2;27700:7;27687:8;:21::i;:::-;27375:341;27305:411;;:::o;39749:113::-;39810:7;39837:10;:17;;;;39830:24;;39749:113;:::o;28672:339::-;28867:41;28886:12;:10;:12::i;:::-;28900:7;28867:18;:41::i;:::-;28859:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28975:28;28985:4;28991:2;28995:7;28975:9;:28::i;:::-;28672:339;;;:::o;39417:256::-;39514:7;39550:23;39567:5;39550:16;:23::i;:::-;39542:5;:31;39534:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;39639:12;:19;39652:5;39639:19;;;;;;;;;;;;;;;:26;39659:5;39639:26;;;;;;;;;;;;39632:33;;39417:256;;;;:::o;49862:172::-;12903:1;13499:7;;:19;;13491:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12903:1;13632:7;:18;;;;49943:1:::1;49933:7;:11;:29;;;;;49958:4;49948:7;:14;49933:29;49925:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49994:32;50004:12;:10;:12::i;:::-;50018:7;49994:9;:32::i;:::-;12859:1:::0;13811:7;:22;;;;49862:172;:::o;29082:185::-;29220:39;29237:4;29243:2;29247:7;29220:39;;;;;;;;;;;;:16;:39::i;:::-;29082:185;;;:::o;50046:::-;12903:1;13499:7;;:19;;13491:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12903:1;13632:7;:18;;;;10195:12:::1;:10;:12::i;:::-;10184:23;;:7;:5;:7::i;:::-;:23;;;10176:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50142:4:::2;50132:7;:14;:32;;;;;50160:4;50150:7;:14;50132:32;50124:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;50196:27;50206:7;:5;:7::i;:::-;50215;50196:9;:27::i;:::-;12859:1:::0;13811:7;:22;;;;50046:185;:::o;39939:233::-;40014:7;40050:30;:28;:30::i;:::-;40042:5;:38;40034:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;40147:10;40158:5;40147:17;;;;;;;;:::i;:::-;;;;;;;;;;40140:24;;39939:233;;;:::o;25917:239::-;25989:7;26009:13;26025:7;:16;26033:7;26025:16;;;;;;;;;;;;;;;;;;;;;26009:32;;26077:1;26060:19;;:5;:19;;;;26052:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26143:5;26136:12;;;25917:239;;;:::o;25647:208::-;25719:7;25764:1;25747:19;;:5;:19;;;;25739:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25831:9;:16;25841:5;25831:16;;;;;;;;;;;;;;;;25824:23;;25647:208;;;:::o;10615:94::-;10195:12;:10;:12::i;:::-;10184:23;;:7;:5;:7::i;:::-;:23;;;10176:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10680:21:::1;10698:1;10680:9;:21::i;:::-;10615:94::o:0;9964:87::-;10010:7;10037:6;;;;;;;;;;;10030:13;;9964:87;:::o;26392:104::-;26448:13;26481:7;26474:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26392:104;:::o;28075:295::-;28190:12;:10;:12::i;:::-;28178:24;;:8;:24;;;;28170:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28290:8;28245:18;:32;28264:12;:10;:12::i;:::-;28245:32;;;;;;;;;;;;;;;:42;28278:8;28245:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28343:8;28314:48;;28329:12;:10;:12::i;:::-;28314:48;;;28353:8;28314:48;;;;;;:::i;:::-;;;;;;;;28075:295;;:::o;29338:328::-;29513:41;29532:12;:10;:12::i;:::-;29546:7;29513:18;:41::i;:::-;29505:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29619:39;29633:4;29639:2;29643:7;29652:5;29619:13;:39::i;:::-;29338:328;;;;:::o;47980:1874::-;48045:13;48071:23;;:::i;:::-;48105:273;;;;;;;;;;;;;;;;;:5;48111:1;48105:8;;;;;;;:::i;:::-;;;;;:273;;;;48402:18;48412:7;48402:9;:18::i;:::-;48391:5;48397:1;48391:8;;;;;;;:::i;:::-;;;;;:29;;;;48433:53;;;;;;;;;;;;;;;;;:5;48439:1;48433:8;;;;;;;:::i;:::-;;;;;:53;;;;48510:17;48519:7;48510:8;:17::i;:::-;48499:5;48505:1;48499:8;;;;;;;:::i;:::-;;;;;:28;;;;48540:53;;;;;;;;;;;;;;;;;:5;48546:1;48540:8;;;;;;;:::i;:::-;;;;;:53;;;;48617:16;48625:7;48617;:16::i;:::-;48606:5;48612:1;48606:8;;;;;;;:::i;:::-;;;;;:27;;;;48646:53;;;;;;;;;;;;;;;;;:5;48652:1;48646:8;;;;;;;:::i;:::-;;;;;:53;;;;48723:17;48732:7;48723:8;:17::i;:::-;48712:5;48718:1;48712:8;;;;;;;:::i;:::-;;;;;:28;;;;48753:54;;;;;;;;;;;;;;;;;:5;48759:1;48753:8;;;;;;;:::i;:::-;;;;;:54;;;;48831:16;48839:7;48831;:16::i;:::-;48820:5;48826:1;48820:8;;;;;;;:::i;:::-;;;;;:27;;;;48860:55;;;;;;;;;;;;;;;;;:5;48866:2;48860:9;;;;;;;:::i;:::-;;;;;:55;;;;48940:16;48948:7;48940;:16::i;:::-;48928:5;48934:2;48928:9;;;;;;;:::i;:::-;;;;;:28;;;;48969:55;;;;;;;;;;;;;;;;;:5;48975:2;48969:9;;;;;;;:::i;:::-;;;;;:55;;;;49049:16;49057:7;49049;:16::i;:::-;49037:5;49043:2;49037:9;;;;;;;:::i;:::-;;;;;:28;;;;49078:55;;;;;;;;;;;;;;;;;:5;49084:2;49078:9;;;;;;;:::i;:::-;;;;;:55;;;;49158:16;49166:7;49158;:16::i;:::-;49146:5;49152:2;49146:9;;;;;;;:::i;:::-;;;;;:28;;;;49187:27;;;;;;;;;;;;;;;;;:5;49193:2;49187:9;;;;;;;:::i;:::-;;;;;:27;;;;49227:20;49274:5;49280:1;49274:8;;;;;;;:::i;:::-;;;;;;49284:5;49290:1;49284:8;;;;;;;:::i;:::-;;;;;;49294:5;49300:1;49294:8;;;;;;;:::i;:::-;;;;;;49304:5;49310:1;49304:8;;;;;;;:::i;:::-;;;;;;49314:5;49320:1;49314:8;;;;;;;:::i;:::-;;;;;;49324:5;49330:1;49324:8;;;;;;;:::i;:::-;;;;;;49334:5;49340:1;49334:8;;;;;;;:::i;:::-;;;;;;49344:5;49350:1;49344:8;;;;;;;:::i;:::-;;;;;;49354:5;49360:1;49354:8;;;;;;;:::i;:::-;;;;;;49257:106;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49227:137;;49408:6;49416:5;49422:1;49416:8;;;;;;;:::i;:::-;;;;;;49426:5;49432:2;49426:9;;;;;;;:::i;:::-;;;;;;49437:5;49443:2;49437:9;;;;;;;:::i;:::-;;;;;;49448:5;49454:2;49448:9;;;;;;;:::i;:::-;;;;;;49459:5;49465:2;49459:9;;;;;;;:::i;:::-;;;;;;49470:5;49476:2;49470:9;;;;;;;:::i;:::-;;;;;;49481:5;49487:2;49481:9;;;;;;;:::i;:::-;;;;;;49492:5;49498:2;49492:9;;;;;;;:::i;:::-;;;;;;49391:111;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49375:128;;49524:18;49545:192;49607:17;49616:7;49607:8;:17::i;:::-;49699:28;49719:6;49699:13;:28::i;:::-;49572:162;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49545:13;:192::i;:::-;49524:213;;49814:4;49764:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;49748:72;;49840:6;49833:13;;;;;47980:1874;;;:::o;28441:164::-;28538:4;28562:18;:25;28581:5;28562:25;;;;;;;;;;;;;;;:35;28588:8;28562:35;;;;;;;;;;;;;;;;;;;;;;;;;28555:42;;28441:164;;;;:::o;10864:192::-;10195:12;:10;:12::i;:::-;10184:23;;:7;:5;:7::i;:::-;:23;;;10176:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10973:1:::1;10953:22;;:8;:22;;;;10945:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11029:19;11039:8;11029:9;:19::i;:::-;10864:192:::0;:::o;25278:305::-;25380:4;25432:25;25417:40;;;:11;:40;;;;:105;;;;25489:33;25474:48;;;:11;:48;;;;25417:105;:158;;;;25539:36;25563:11;25539:23;:36::i;:::-;25417:158;25397:178;;25278:305;;;:::o;31176:127::-;31241:4;31293:1;31265:30;;:7;:16;31273:7;31265:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31258:37;;31176:127;;;:::o;8824:98::-;8877:7;8904:10;8897:17;;8824:98;:::o;35158:174::-;35260:2;35233:15;:24;35249:7;35233:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35316:7;35312:2;35278:46;;35287:23;35302:7;35287:14;:23::i;:::-;35278:46;;;;;;;;;;;;35158:174;;:::o;31470:348::-;31563:4;31588:16;31596:7;31588;:16::i;:::-;31580:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31664:13;31680:23;31695:7;31680:14;:23::i;:::-;31664:39;;31733:5;31722:16;;:7;:16;;;:51;;;;31766:7;31742:31;;:20;31754:7;31742:11;:20::i;:::-;:31;;;31722:51;:87;;;;31777:32;31794:5;31801:7;31777:16;:32::i;:::-;31722:87;31714:96;;;31470:348;;;;:::o;34462:578::-;34621:4;34594:31;;:23;34609:7;34594:14;:23::i;:::-;:31;;;34586:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34704:1;34690:16;;:2;:16;;;;34682:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34760:39;34781:4;34787:2;34791:7;34760:20;:39::i;:::-;34864:29;34881:1;34885:7;34864:8;:29::i;:::-;34925:1;34906:9;:15;34916:4;34906:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34954:1;34937:9;:13;34947:2;34937:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34985:2;34966:7;:16;34974:7;34966:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35024:7;35020:2;35005:27;;35014:4;35005:27;;;;;;;;;;;;34462:578;;;:::o;32160:110::-;32236:26;32246:2;32250:7;32236:26;;;;;;;;;;;;:9;:26::i;:::-;32160:110;;:::o;11064:173::-;11120:16;11139:6;;;;;;;;;;;11120:25;;11165:8;11156:6;;:17;;;;;;;;;;;;;;;;;;11220:8;11189:40;;11210:8;11189:40;;;;;;;;;;;;11109:128;11064:173;:::o;30548:315::-;30705:28;30715:4;30721:2;30725:7;30705:9;:28::i;:::-;30752:48;30775:4;30781:2;30785:7;30794:5;30752:22;:48::i;:::-;30744:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30548:315;;;;:::o;46343:132::-;46401:13;46434:33;46440:7;46434:33;;;;;;;;;;;;;;;;;46459:7;46434:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:33::i;:::-;46427:40;;46343:132;;;:::o;46487:133::-;46544:13;46577:35;46583:7;46577:35;;;;;;;;;;;;;;;;;46601:10;46577:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:35::i;:::-;46570:42;;46487:133;;;:::o;46632:130::-;46688:13;46721:33;46727:7;46721:33;;;;;;;;;;;;;;;;;46744:9;46721:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:33::i;:::-;46714:40;;46632:130;;;:::o;46774:133::-;46831:13;46864:35;46870:7;46864:35;;;;;;;;;;;;;;;;;46888:10;46864:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:35::i;:::-;46857:42;;46774:133;;;:::o;46915:130::-;46971:13;47004:33;47010:7;47004:33;;;;;;;;;;;;;;;;;47027:9;47004:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:33::i;:::-;46997:40;;46915:130;;;:::o;47057:::-;47113:13;47146:33;47152:7;47146:33;;;;;;;;;;;;;;;;;47169:9;47146:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:33::i;:::-;47139:40;;47057:130;;;:::o;47199:::-;47255:13;47288:33;47294:7;47288:33;;;;;;;;;;;;;;;;;47311:9;47288:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:33::i;:::-;47281:40;;47199:130;;;:::o;47341:126::-;47397:13;47430:29;47436:7;47430:29;;;;;;;;;;;;;;;;;47453:5;47430:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:29::i;:::-;47423:36;;47341:126;;;:::o;50243:715::-;50299:13;50521:1;50512:5;:10;50508:53;;;50539:10;;;;;;;;;;;;;;;;;;;;;50508:53;50571:12;50586:5;50571:20;;50602:14;50627:78;50642:1;50634:4;:9;50627:78;;50660:8;;;;;:::i;:::-;;;;50691:2;50683:10;;;;;:::i;:::-;;;50627:78;;;50715:19;50747:6;50737:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50715:39;;50765:154;50781:1;50772:5;:10;50765:154;;50809:1;50799:11;;;;;:::i;:::-;;;50876:2;50868:5;:10;;;;:::i;:::-;50855:2;:24;;;;:::i;:::-;50842:39;;50825:6;50832;50825:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;50905:2;50896:11;;;;;:::i;:::-;;;50765:154;;;50943:6;50929:21;;;;;50243:715;;;;:::o;51369:1607::-;51427:13;51453:11;51467:4;:11;51453:25;;51500:1;51493:3;:8;51489:23;;;51503:9;;;;;;;;;;;;;;;;;51489:23;51564:18;51602:1;51597;51591:3;:7;;;;:::i;:::-;51590:13;;;;:::i;:::-;51585:1;:19;;;;:::i;:::-;51564:40;;51662:19;51707:2;51694:10;:15;;;;:::i;:::-;51684:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51662:48;;51723:18;51744:5;;;;;;;;;;;;;;;;;51723:26;;51813:1;51806:5;51802:13;51858:2;51850:6;51846:15;51909:1;51877:777;51932:3;51929:1;51926:10;51877:777;;;51987:1;51984;51980:9;51975:14;;52045:8;52040:1;52034:4;52030:12;52024:19;52020:34;52125:4;52117:5;52113:2;52109:14;52105:25;52095:8;52091:40;52085:47;52164:3;52161:1;52157:11;52150:18;;52255:4;52246;52238:5;52234:2;52230:14;52226:25;52216:8;52212:40;52206:47;52202:58;52197:3;52193:68;52186:75;;52293:3;52290:1;52286:11;52279:18;;52383:4;52374;52366:5;52363:1;52359:13;52355:24;52345:8;52341:39;52335:46;52331:57;52326:3;52322:67;52315:74;;52421:3;52418:1;52414:11;52407:18;;52503:4;52494;52487:5;52483:16;52473:8;52469:31;52463:38;52459:49;52454:3;52450:59;52443:66;;52543:3;52538;52534:13;52527:20;;52585:3;52574:9;52567:22;52637:1;52626:9;52622:17;52609:30;;51956:698;;51877:777;;;51881:44;52686:1;52681:3;52677:11;52707:1;52702:84;;;;52805:1;52800:82;;;;52670:212;;52702:84;52763:6;52758:3;52754:16;52750:1;52739:9;52735:17;52728:43;52702:84;;52800:82;52861:4;52856:3;52852:14;52848:1;52837:9;52833:17;52826:41;52670:212;;52913:10;52905:6;52898:26;51771:1164;;52961:6;52947:21;;;;;;51369:1607;;;;:::o;23885:157::-;23970:4;24009:25;23994:40;;;:11;:40;;;;23987:47;;23885:157;;;:::o;40785:589::-;40929:45;40956:4;40962:2;40966:7;40929:26;:45::i;:::-;41007:1;40991:18;;:4;:18;;;40987:187;;;41026:40;41058:7;41026:31;:40::i;:::-;40987:187;;;41096:2;41088:10;;:4;:10;;;41084:90;;41115:47;41148:4;41154:7;41115:32;:47::i;:::-;41084:90;40987:187;41202:1;41188:16;;:2;:16;;;41184:183;;;41221:45;41258:7;41221:36;:45::i;:::-;41184:183;;;41294:4;41288:10;;:2;:10;;;41284:83;;41315:40;41343:2;41347:7;41315:27;:40::i;:::-;41284:83;41184:183;40785:589;;;:::o;32497:321::-;32627:18;32633:2;32637:7;32627:5;:18::i;:::-;32678:54;32709:1;32713:2;32717:7;32726:5;32678:22;:54::i;:::-;32656:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32497:321;;;:::o;35897:803::-;36052:4;36073:15;:2;:13;;;:15::i;:::-;36069:624;;;36125:2;36109:36;;;36146:12;:10;:12::i;:::-;36160:4;36166:7;36175:5;36109:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36105:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36372:1;36355:6;:13;:18;36351:272;;;36398:60;;;;;;;;;;:::i;:::-;;;;;;;;36351:272;36573:6;36567:13;36558:6;36554:2;36550:15;36543:38;36105:533;36242:45;;;36232:55;;;:6;:55;;;;36225:62;;;;;36069:624;36677:4;36670:11;;35897:803;;;;;;;:::o;47479:493::-;47588:13;47614:12;47629:62;47660:9;47671:17;47680:7;47671:8;:17::i;:::-;47643:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47629:6;:62::i;:::-;47614:77;;47702:20;47725:11;47744;:18;47737:4;:25;;;;:::i;:::-;47725:38;;;;;;;;:::i;:::-;;;;;;;;47702:61;;47774:17;47801:2;47794:4;:9;;;;:::i;:::-;47774:29;;47831:2;47818:9;:15;47814:127;;47883:6;47895:8;47911;:15;;;;47904:4;:22;;;;:::i;:::-;47895:32;;;;;;;;:::i;:::-;;;;;;;;;47866:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47850:79;;47814:127;47958:6;47951:13;;;;;47479:493;;;;;:::o;37272:126::-;;;;:::o;42097:164::-;42201:10;:17;;;;42174:15;:24;42190:7;42174:24;;;;;;;;;;;:44;;;;42229:10;42245:7;42229:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42097:164;:::o;42888:988::-;43154:22;43204:1;43179:22;43196:4;43179:16;:22::i;:::-;:26;;;;:::i;:::-;43154:51;;43216:18;43237:17;:26;43255:7;43237:26;;;;;;;;;;;;43216:47;;43384:14;43370:10;:28;43366:328;;43415:19;43437:12;:18;43450:4;43437:18;;;;;;;;;;;;;;;:34;43456:14;43437:34;;;;;;;;;;;;43415:56;;43521:11;43488:12;:18;43501:4;43488:18;;;;;;;;;;;;;;;:30;43507:10;43488:30;;;;;;;;;;;:44;;;;43638:10;43605:17;:30;43623:11;43605:30;;;;;;;;;;;:43;;;;43400:294;43366:328;43790:17;:26;43808:7;43790:26;;;;;;;;;;;43783:33;;;43834:12;:18;43847:4;43834:18;;;;;;;;;;;;;;;:34;43853:14;43834:34;;;;;;;;;;;43827:41;;;42969:907;;42888:988;;:::o;44171:1079::-;44424:22;44469:1;44449:10;:17;;;;:21;;;;:::i;:::-;44424:46;;44481:18;44502:15;:24;44518:7;44502:24;;;;;;;;;;;;44481:45;;44853:19;44875:10;44886:14;44875:26;;;;;;;;:::i;:::-;;;;;;;;;;44853:48;;44939:11;44914:10;44925;44914:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45050:10;45019:15;:28;45035:11;45019:28;;;;;;;;;;;:41;;;;45191:15;:24;45207:7;45191:24;;;;;;;;;;;45184:31;;;45226:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44242:1008;;;44171:1079;:::o;41675:221::-;41760:14;41777:20;41794:2;41777:16;:20::i;:::-;41760:37;;41835:7;41808:12;:16;41821:2;41808:16;;;;;;;;;;;;;;;:24;41825:6;41808:24;;;;;;;;;;;:34;;;;41882:6;41853:17;:26;41871:7;41853:26;;;;;;;;;;;:35;;;;41749:147;41675:221;;:::o;33154:382::-;33248:1;33234:16;;:2;:16;;;;33226:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33307:16;33315:7;33307;:16::i;:::-;33306:17;33298:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33369:45;33398:1;33402:2;33406:7;33369:20;:45::i;:::-;33444:1;33427:9;:13;33437:2;33427:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33475:2;33456:7;:16;33464:7;33456:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33520:7;33516:2;33495:33;;33512:1;33495:33;;;;;;;;;;;;33154:382;;:::o;16057:387::-;16117:4;16325:12;16392:7;16380:20;16372:28;;16435:1;16428:4;:8;16421:15;;;16057:387;;;:::o;46193:138::-;46253:7;46315:5;46298:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;46288:34;;;;;;46280:43;;46273:50;;46193:138;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1354:139::-;1400:5;1438:6;1425:20;1416:29;;1454:33;1481:5;1454:33;:::i;:::-;1354:139;;;;:::o;1499:329::-;1558:6;1607:2;1595:9;1586:7;1582:23;1578:32;1575:119;;;1613:79;;:::i;:::-;1575:119;1733:1;1758:53;1803:7;1794:6;1783:9;1779:22;1758:53;:::i;:::-;1748:63;;1704:117;1499:329;;;;:::o;1834:474::-;1902:6;1910;1959:2;1947:9;1938:7;1934:23;1930:32;1927:119;;;1965:79;;:::i;:::-;1927:119;2085:1;2110:53;2155:7;2146:6;2135:9;2131:22;2110:53;:::i;:::-;2100:63;;2056:117;2212:2;2238:53;2283:7;2274:6;2263:9;2259:22;2238:53;:::i;:::-;2228:63;;2183:118;1834:474;;;;;:::o;2314:619::-;2391:6;2399;2407;2456:2;2444:9;2435:7;2431:23;2427:32;2424:119;;;2462:79;;:::i;:::-;2424:119;2582:1;2607:53;2652:7;2643:6;2632:9;2628:22;2607:53;:::i;:::-;2597:63;;2553:117;2709:2;2735:53;2780:7;2771:6;2760:9;2756:22;2735:53;:::i;:::-;2725:63;;2680:118;2837:2;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2808:118;2314:619;;;;;:::o;2939:943::-;3034:6;3042;3050;3058;3107:3;3095:9;3086:7;3082:23;3078:33;3075:120;;;3114:79;;:::i;:::-;3075:120;3234:1;3259:53;3304:7;3295:6;3284:9;3280:22;3259:53;:::i;:::-;3249:63;;3205:117;3361:2;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3332:118;3489:2;3515:53;3560:7;3551:6;3540:9;3536:22;3515:53;:::i;:::-;3505:63;;3460:118;3645:2;3634:9;3630:18;3617:32;3676:18;3668:6;3665:30;3662:117;;;3698:79;;:::i;:::-;3662:117;3803:62;3857:7;3848:6;3837:9;3833:22;3803:62;:::i;:::-;3793:72;;3588:287;2939:943;;;;;;;:::o;3888:468::-;3953:6;3961;4010:2;3998:9;3989:7;3985:23;3981:32;3978:119;;;4016:79;;:::i;:::-;3978:119;4136:1;4161:53;4206:7;4197:6;4186:9;4182:22;4161:53;:::i;:::-;4151:63;;4107:117;4263:2;4289:50;4331:7;4322:6;4311:9;4307:22;4289:50;:::i;:::-;4279:60;;4234:115;3888:468;;;;;:::o;4362:474::-;4430:6;4438;4487:2;4475:9;4466:7;4462:23;4458:32;4455:119;;;4493:79;;:::i;:::-;4455:119;4613:1;4638:53;4683:7;4674:6;4663:9;4659:22;4638:53;:::i;:::-;4628:63;;4584:117;4740:2;4766:53;4811:7;4802:6;4791:9;4787:22;4766:53;:::i;:::-;4756:63;;4711:118;4362:474;;;;;:::o;4842:327::-;4900:6;4949:2;4937:9;4928:7;4924:23;4920:32;4917:119;;;4955:79;;:::i;:::-;4917:119;5075:1;5100:52;5144:7;5135:6;5124:9;5120:22;5100:52;:::i;:::-;5090:62;;5046:116;4842:327;;;;:::o;5175:349::-;5244:6;5293:2;5281:9;5272:7;5268:23;5264:32;5261:119;;;5299:79;;:::i;:::-;5261:119;5419:1;5444:63;5499:7;5490:6;5479:9;5475:22;5444:63;:::i;:::-;5434:73;;5390:127;5175:349;;;;:::o;5530:329::-;5589:6;5638:2;5626:9;5617:7;5613:23;5609:32;5606:119;;;5644:79;;:::i;:::-;5606:119;5764:1;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5735:117;5530:329;;;;:::o;5865:118::-;5952:24;5970:5;5952:24;:::i;:::-;5947:3;5940:37;5865:118;;:::o;5989:109::-;6070:21;6085:5;6070:21;:::i;:::-;6065:3;6058:34;5989:109;;:::o;6104:360::-;6190:3;6218:38;6250:5;6218:38;:::i;:::-;6272:70;6335:6;6330:3;6272:70;:::i;:::-;6265:77;;6351:52;6396:6;6391:3;6384:4;6377:5;6373:16;6351:52;:::i;:::-;6428:29;6450:6;6428:29;:::i;:::-;6423:3;6419:39;6412:46;;6194:270;6104:360;;;;:::o;6470:364::-;6558:3;6586:39;6619:5;6586:39;:::i;:::-;6641:71;6705:6;6700:3;6641:71;:::i;:::-;6634:78;;6721:52;6766:6;6761:3;6754:4;6747:5;6743:16;6721:52;:::i;:::-;6798:29;6820:6;6798:29;:::i;:::-;6793:3;6789:39;6782:46;;6562:272;6470:364;;;;:::o;6840:377::-;6946:3;6974:39;7007:5;6974:39;:::i;:::-;7029:89;7111:6;7106:3;7029:89;:::i;:::-;7022:96;;7127:52;7172:6;7167:3;7160:4;7153:5;7149:16;7127:52;:::i;:::-;7204:6;7199:3;7195:16;7188:23;;6950:267;6840:377;;;;:::o;7247:845::-;7350:3;7387:5;7381:12;7416:36;7442:9;7416:36;:::i;:::-;7468:89;7550:6;7545:3;7468:89;:::i;:::-;7461:96;;7588:1;7577:9;7573:17;7604:1;7599:137;;;;7750:1;7745:341;;;;7566:520;;7599:137;7683:4;7679:9;7668;7664:25;7659:3;7652:38;7719:6;7714:3;7710:16;7703:23;;7599:137;;7745:341;7812:38;7844:5;7812:38;:::i;:::-;7872:1;7886:154;7900:6;7897:1;7894:13;7886:154;;;7974:7;7968:14;7964:1;7959:3;7955:11;7948:35;8024:1;8015:7;8011:15;8000:26;;7922:4;7919:1;7915:12;7910:17;;7886:154;;;8069:6;8064:3;8060:16;8053:23;;7752:334;;7566:520;;7354:738;;7247:845;;;;:::o;8098:402::-;8258:3;8279:85;8361:2;8356:3;8279:85;:::i;:::-;8272:92;;8373:93;8462:3;8373:93;:::i;:::-;8491:2;8486:3;8482:12;8475:19;;8098:402;;;:::o;8506:::-;8666:3;8687:85;8769:2;8764:3;8687:85;:::i;:::-;8680:92;;8781:93;8870:3;8781:93;:::i;:::-;8899:2;8894:3;8890:12;8883:19;;8506:402;;;:::o;8914:366::-;9056:3;9077:67;9141:2;9136:3;9077:67;:::i;:::-;9070:74;;9153:93;9242:3;9153:93;:::i;:::-;9271:2;9266:3;9262:12;9255:19;;8914:366;;;:::o;9286:::-;9428:3;9449:67;9513:2;9508:3;9449:67;:::i;:::-;9442:74;;9525:93;9614:3;9525:93;:::i;:::-;9643:2;9638:3;9634:12;9627:19;;9286:366;;;:::o;9658:::-;9800:3;9821:67;9885:2;9880:3;9821:67;:::i;:::-;9814:74;;9897:93;9986:3;9897:93;:::i;:::-;10015:2;10010:3;10006:12;9999:19;;9658:366;;;:::o;10030:::-;10172:3;10193:67;10257:2;10252:3;10193:67;:::i;:::-;10186:74;;10269:93;10358:3;10269:93;:::i;:::-;10387:2;10382:3;10378:12;10371:19;;10030:366;;;:::o;10402:::-;10544:3;10565:67;10629:2;10624:3;10565:67;:::i;:::-;10558:74;;10641:93;10730:3;10641:93;:::i;:::-;10759:2;10754:3;10750:12;10743:19;;10402:366;;;:::o;10774:::-;10916:3;10937:67;11001:2;10996:3;10937:67;:::i;:::-;10930:74;;11013:93;11102:3;11013:93;:::i;:::-;11131:2;11126:3;11122:12;11115:19;;10774:366;;;:::o;11146:::-;11288:3;11309:67;11373:2;11368:3;11309:67;:::i;:::-;11302:74;;11385:93;11474:3;11385:93;:::i;:::-;11503:2;11498:3;11494:12;11487:19;;11146:366;;;:::o;11518:::-;11660:3;11681:67;11745:2;11740:3;11681:67;:::i;:::-;11674:74;;11757:93;11846:3;11757:93;:::i;:::-;11875:2;11870:3;11866:12;11859:19;;11518:366;;;:::o;11890:::-;12032:3;12053:67;12117:2;12112:3;12053:67;:::i;:::-;12046:74;;12129:93;12218:3;12129:93;:::i;:::-;12247:2;12242:3;12238:12;12231:19;;11890:366;;;:::o;12262:::-;12404:3;12425:67;12489:2;12484:3;12425:67;:::i;:::-;12418:74;;12501:93;12590:3;12501:93;:::i;:::-;12619:2;12614:3;12610:12;12603:19;;12262:366;;;:::o;12634:400::-;12794:3;12815:84;12897:1;12892:3;12815:84;:::i;:::-;12808:91;;12908:93;12997:3;12908:93;:::i;:::-;13026:1;13021:3;13017:11;13010:18;;12634:400;;;:::o;13040:366::-;13182:3;13203:67;13267:2;13262:3;13203:67;:::i;:::-;13196:74;;13279:93;13368:3;13279:93;:::i;:::-;13397:2;13392:3;13388:12;13381:19;;13040:366;;;:::o;13412:::-;13554:3;13575:67;13639:2;13634:3;13575:67;:::i;:::-;13568:74;;13651:93;13740:3;13651:93;:::i;:::-;13769:2;13764:3;13760:12;13753:19;;13412:366;;;:::o;13784:::-;13926:3;13947:67;14011:2;14006:3;13947:67;:::i;:::-;13940:74;;14023:93;14112:3;14023:93;:::i;:::-;14141:2;14136:3;14132:12;14125:19;;13784:366;;;:::o;14156:::-;14298:3;14319:67;14383:2;14378:3;14319:67;:::i;:::-;14312:74;;14395:93;14484:3;14395:93;:::i;:::-;14513:2;14508:3;14504:12;14497:19;;14156:366;;;:::o;14528:::-;14670:3;14691:67;14755:2;14750:3;14691:67;:::i;:::-;14684:74;;14767:93;14856:3;14767:93;:::i;:::-;14885:2;14880:3;14876:12;14869:19;;14528:366;;;:::o;14900:::-;15042:3;15063:67;15127:2;15122:3;15063:67;:::i;:::-;15056:74;;15139:93;15228:3;15139:93;:::i;:::-;15257:2;15252:3;15248:12;15241:19;;14900:366;;;:::o;15272:402::-;15432:3;15453:85;15535:2;15530:3;15453:85;:::i;:::-;15446:92;;15547:93;15636:3;15547:93;:::i;:::-;15665:2;15660:3;15656:12;15649:19;;15272:402;;;:::o;15680:400::-;15840:3;15861:84;15943:1;15938:3;15861:84;:::i;:::-;15854:91;;15954:93;16043:3;15954:93;:::i;:::-;16072:1;16067:3;16063:11;16056:18;;15680:400;;;:::o;16086:366::-;16228:3;16249:67;16313:2;16308:3;16249:67;:::i;:::-;16242:74;;16325:93;16414:3;16325:93;:::i;:::-;16443:2;16438:3;16434:12;16427:19;;16086:366;;;:::o;16458:::-;16600:3;16621:67;16685:2;16680:3;16621:67;:::i;:::-;16614:74;;16697:93;16786:3;16697:93;:::i;:::-;16815:2;16810:3;16806:12;16799:19;;16458:366;;;:::o;16830:::-;16972:3;16993:67;17057:2;17052:3;16993:67;:::i;:::-;16986:74;;17069:93;17158:3;17069:93;:::i;:::-;17187:2;17182:3;17178:12;17171:19;;16830:366;;;:::o;17202:118::-;17289:24;17307:5;17289:24;:::i;:::-;17284:3;17277:37;17202:118;;:::o;17326:275::-;17458:3;17480:95;17571:3;17562:6;17480:95;:::i;:::-;17473:102;;17592:3;17585:10;;17326:275;;;;:::o;17607:435::-;17787:3;17809:95;17900:3;17891:6;17809:95;:::i;:::-;17802:102;;17921:95;18012:3;18003:6;17921:95;:::i;:::-;17914:102;;18033:3;18026:10;;17607:435;;;;;:::o;18048:1555::-;18564:3;18586:95;18677:3;18668:6;18586:95;:::i;:::-;18579:102;;18698:95;18789:3;18780:6;18698:95;:::i;:::-;18691:102;;18810:95;18901:3;18892:6;18810:95;:::i;:::-;18803:102;;18922:95;19013:3;19004:6;18922:95;:::i;:::-;18915:102;;19034:95;19125:3;19116:6;19034:95;:::i;:::-;19027:102;;19146:95;19237:3;19228:6;19146:95;:::i;:::-;19139:102;;19258:95;19349:3;19340:6;19258:95;:::i;:::-;19251:102;;19370:95;19461:3;19452:6;19370:95;:::i;:::-;19363:102;;19482:95;19573:3;19564:6;19482:95;:::i;:::-;19475:102;;19594:3;19587:10;;18048:1555;;;;;;;;;;;;:::o;19609:695::-;19887:3;19909:95;20000:3;19991:6;19909:95;:::i;:::-;19902:102;;20021:148;20165:3;20021:148;:::i;:::-;20014:155;;20186:92;20274:3;20265:6;20186:92;:::i;:::-;20179:99;;20295:3;20288:10;;19609:695;;;;;:::o;20310:1233::-;20793:3;20815:148;20959:3;20815:148;:::i;:::-;20808:155;;20980:95;21071:3;21062:6;20980:95;:::i;:::-;20973:102;;21092:148;21236:3;21092:148;:::i;:::-;21085:155;;21257:95;21348:3;21339:6;21257:95;:::i;:::-;21250:102;;21369:148;21513:3;21369:148;:::i;:::-;21362:155;;21534:3;21527:10;;20310:1233;;;;;:::o;21549:541::-;21782:3;21804:148;21948:3;21804:148;:::i;:::-;21797:155;;21969:95;22060:3;22051:6;21969:95;:::i;:::-;21962:102;;22081:3;22074:10;;21549:541;;;;:::o;22096:222::-;22189:4;22227:2;22216:9;22212:18;22204:26;;22240:71;22308:1;22297:9;22293:17;22284:6;22240:71;:::i;:::-;22096:222;;;;:::o;22324:640::-;22519:4;22557:3;22546:9;22542:19;22534:27;;22571:71;22639:1;22628:9;22624:17;22615:6;22571:71;:::i;:::-;22652:72;22720:2;22709:9;22705:18;22696:6;22652:72;:::i;:::-;22734;22802:2;22791:9;22787:18;22778:6;22734:72;:::i;:::-;22853:9;22847:4;22843:20;22838:2;22827:9;22823:18;22816:48;22881:76;22952:4;22943:6;22881:76;:::i;:::-;22873:84;;22324:640;;;;;;;:::o;22970:210::-;23057:4;23095:2;23084:9;23080:18;23072:26;;23108:65;23170:1;23159:9;23155:17;23146:6;23108:65;:::i;:::-;22970:210;;;;:::o;23186:313::-;23299:4;23337:2;23326:9;23322:18;23314:26;;23386:9;23380:4;23376:20;23372:1;23361:9;23357:17;23350:47;23414:78;23487:4;23478:6;23414:78;:::i;:::-;23406:86;;23186:313;;;;:::o;23505:419::-;23671:4;23709:2;23698:9;23694:18;23686:26;;23758:9;23752:4;23748:20;23744:1;23733:9;23729:17;23722:47;23786:131;23912:4;23786:131;:::i;:::-;23778:139;;23505:419;;;:::o;23930:::-;24096:4;24134:2;24123:9;24119:18;24111:26;;24183:9;24177:4;24173:20;24169:1;24158:9;24154:17;24147:47;24211:131;24337:4;24211:131;:::i;:::-;24203:139;;23930:419;;;:::o;24355:::-;24521:4;24559:2;24548:9;24544:18;24536:26;;24608:9;24602:4;24598:20;24594:1;24583:9;24579:17;24572:47;24636:131;24762:4;24636:131;:::i;:::-;24628:139;;24355:419;;;:::o;24780:::-;24946:4;24984:2;24973:9;24969:18;24961:26;;25033:9;25027:4;25023:20;25019:1;25008:9;25004:17;24997:47;25061:131;25187:4;25061:131;:::i;:::-;25053:139;;24780:419;;;:::o;25205:::-;25371:4;25409:2;25398:9;25394:18;25386:26;;25458:9;25452:4;25448:20;25444:1;25433:9;25429:17;25422:47;25486:131;25612:4;25486:131;:::i;:::-;25478:139;;25205:419;;;:::o;25630:::-;25796:4;25834:2;25823:9;25819:18;25811:26;;25883:9;25877:4;25873:20;25869:1;25858:9;25854:17;25847:47;25911:131;26037:4;25911:131;:::i;:::-;25903:139;;25630:419;;;:::o;26055:::-;26221:4;26259:2;26248:9;26244:18;26236:26;;26308:9;26302:4;26298:20;26294:1;26283:9;26279:17;26272:47;26336:131;26462:4;26336:131;:::i;:::-;26328:139;;26055:419;;;:::o;26480:::-;26646:4;26684:2;26673:9;26669:18;26661:26;;26733:9;26727:4;26723:20;26719:1;26708:9;26704:17;26697:47;26761:131;26887:4;26761:131;:::i;:::-;26753:139;;26480:419;;;:::o;26905:::-;27071:4;27109:2;27098:9;27094:18;27086:26;;27158:9;27152:4;27148:20;27144:1;27133:9;27129:17;27122:47;27186:131;27312:4;27186:131;:::i;:::-;27178:139;;26905:419;;;:::o;27330:::-;27496:4;27534:2;27523:9;27519:18;27511:26;;27583:9;27577:4;27573:20;27569:1;27558:9;27554:17;27547:47;27611:131;27737:4;27611:131;:::i;:::-;27603:139;;27330:419;;;:::o;27755:::-;27921:4;27959:2;27948:9;27944:18;27936:26;;28008:9;28002:4;27998:20;27994:1;27983:9;27979:17;27972:47;28036:131;28162:4;28036:131;:::i;:::-;28028:139;;27755:419;;;:::o;28180:::-;28346:4;28384:2;28373:9;28369:18;28361:26;;28433:9;28427:4;28423:20;28419:1;28408:9;28404:17;28397:47;28461:131;28587:4;28461:131;:::i;:::-;28453:139;;28180:419;;;:::o;28605:::-;28771:4;28809:2;28798:9;28794:18;28786:26;;28858:9;28852:4;28848:20;28844:1;28833:9;28829:17;28822:47;28886:131;29012:4;28886:131;:::i;:::-;28878:139;;28605:419;;;:::o;29030:::-;29196:4;29234:2;29223:9;29219:18;29211:26;;29283:9;29277:4;29273:20;29269:1;29258:9;29254:17;29247:47;29311:131;29437:4;29311:131;:::i;:::-;29303:139;;29030:419;;;:::o;29455:::-;29621:4;29659:2;29648:9;29644:18;29636:26;;29708:9;29702:4;29698:20;29694:1;29683:9;29679:17;29672:47;29736:131;29862:4;29736:131;:::i;:::-;29728:139;;29455:419;;;:::o;29880:::-;30046:4;30084:2;30073:9;30069:18;30061:26;;30133:9;30127:4;30123:20;30119:1;30108:9;30104:17;30097:47;30161:131;30287:4;30161:131;:::i;:::-;30153:139;;29880:419;;;:::o;30305:::-;30471:4;30509:2;30498:9;30494:18;30486:26;;30558:9;30552:4;30548:20;30544:1;30533:9;30529:17;30522:47;30586:131;30712:4;30586:131;:::i;:::-;30578:139;;30305:419;;;:::o;30730:::-;30896:4;30934:2;30923:9;30919:18;30911:26;;30983:9;30977:4;30973:20;30969:1;30958:9;30954:17;30947:47;31011:131;31137:4;31011:131;:::i;:::-;31003:139;;30730:419;;;:::o;31155:::-;31321:4;31359:2;31348:9;31344:18;31336:26;;31408:9;31402:4;31398:20;31394:1;31383:9;31379:17;31372:47;31436:131;31562:4;31436:131;:::i;:::-;31428:139;;31155:419;;;:::o;31580:222::-;31673:4;31711:2;31700:9;31696:18;31688:26;;31724:71;31792:1;31781:9;31777:17;31768:6;31724:71;:::i;:::-;31580:222;;;;:::o;31808:129::-;31842:6;31869:20;;:::i;:::-;31859:30;;31898:33;31926:4;31918:6;31898:33;:::i;:::-;31808:129;;;:::o;31943:75::-;31976:6;32009:2;32003:9;31993:19;;31943:75;:::o;32024:307::-;32085:4;32175:18;32167:6;32164:30;32161:56;;;32197:18;;:::i;:::-;32161:56;32235:29;32257:6;32235:29;:::i;:::-;32227:37;;32319:4;32313;32309:15;32301:23;;32024:307;;;:::o;32337:141::-;32386:4;32409:3;32401:11;;32432:3;32429:1;32422:14;32466:4;32463:1;32453:18;32445:26;;32337:141;;;:::o;32484:98::-;32535:6;32569:5;32563:12;32553:22;;32484:98;;;:::o;32588:99::-;32640:6;32674:5;32668:12;32658:22;;32588:99;;;:::o;32693:168::-;32776:11;32810:6;32805:3;32798:19;32850:4;32845:3;32841:14;32826:29;;32693:168;;;;:::o;32867:169::-;32951:11;32985:6;32980:3;32973:19;33025:4;33020:3;33016:14;33001:29;;32867:169;;;;:::o;33042:148::-;33144:11;33181:3;33166:18;;33042:148;;;;:::o;33196:305::-;33236:3;33255:20;33273:1;33255:20;:::i;:::-;33250:25;;33289:20;33307:1;33289:20;:::i;:::-;33284:25;;33443:1;33375:66;33371:74;33368:1;33365:81;33362:107;;;33449:18;;:::i;:::-;33362:107;33493:1;33490;33486:9;33479:16;;33196:305;;;;:::o;33507:185::-;33547:1;33564:20;33582:1;33564:20;:::i;:::-;33559:25;;33598:20;33616:1;33598:20;:::i;:::-;33593:25;;33637:1;33627:35;;33642:18;;:::i;:::-;33627:35;33684:1;33681;33677:9;33672:14;;33507:185;;;;:::o;33698:348::-;33738:7;33761:20;33779:1;33761:20;:::i;:::-;33756:25;;33795:20;33813:1;33795:20;:::i;:::-;33790:25;;33983:1;33915:66;33911:74;33908:1;33905:81;33900:1;33893:9;33886:17;33882:105;33879:131;;;33990:18;;:::i;:::-;33879:131;34038:1;34035;34031:9;34020:20;;33698:348;;;;:::o;34052:191::-;34092:4;34112:20;34130:1;34112:20;:::i;:::-;34107:25;;34146:20;34164:1;34146:20;:::i;:::-;34141:25;;34185:1;34182;34179:8;34176:34;;;34190:18;;:::i;:::-;34176:34;34235:1;34232;34228:9;34220:17;;34052:191;;;;:::o;34249:96::-;34286:7;34315:24;34333:5;34315:24;:::i;:::-;34304:35;;34249:96;;;:::o;34351:90::-;34385:7;34428:5;34421:13;34414:21;34403:32;;34351:90;;;:::o;34447:149::-;34483:7;34523:66;34516:5;34512:78;34501:89;;34447:149;;;:::o;34602:126::-;34639:7;34679:42;34672:5;34668:54;34657:65;;34602:126;;;:::o;34734:77::-;34771:7;34800:5;34789:16;;34734:77;;;:::o;34817:154::-;34901:6;34896:3;34891;34878:30;34963:1;34954:6;34949:3;34945:16;34938:27;34817:154;;;:::o;34977:307::-;35045:1;35055:113;35069:6;35066:1;35063:13;35055:113;;;35154:1;35149:3;35145:11;35139:18;35135:1;35130:3;35126:11;35119:39;35091:2;35088:1;35084:10;35079:15;;35055:113;;;35186:6;35183:1;35180:13;35177:101;;;35266:1;35257:6;35252:3;35248:16;35241:27;35177:101;35026:258;34977:307;;;:::o;35290:320::-;35334:6;35371:1;35365:4;35361:12;35351:22;;35418:1;35412:4;35408:12;35439:18;35429:81;;35495:4;35487:6;35483:17;35473:27;;35429:81;35557:2;35549:6;35546:14;35526:18;35523:38;35520:84;;;35576:18;;:::i;:::-;35520:84;35341:269;35290:320;;;:::o;35616:281::-;35699:27;35721:4;35699:27;:::i;:::-;35691:6;35687:40;35829:6;35817:10;35814:22;35793:18;35781:10;35778:34;35775:62;35772:88;;;35840:18;;:::i;:::-;35772:88;35880:10;35876:2;35869:22;35659:238;35616:281;;:::o;35903:233::-;35942:3;35965:24;35983:5;35965:24;:::i;:::-;35956:33;;36011:66;36004:5;36001:77;35998:103;;;36081:18;;:::i;:::-;35998:103;36128:1;36121:5;36117:13;36110:20;;35903:233;;;:::o;36142:176::-;36174:1;36191:20;36209:1;36191:20;:::i;:::-;36186:25;;36225:20;36243:1;36225:20;:::i;:::-;36220:25;;36264:1;36254:35;;36269:18;;:::i;:::-;36254:35;36310:1;36307;36303:9;36298:14;;36142:176;;;;:::o;36324:180::-;36372:77;36369:1;36362:88;36469:4;36466:1;36459:15;36493:4;36490:1;36483:15;36510:180;36558:77;36555:1;36548:88;36655:4;36652:1;36645:15;36679:4;36676:1;36669:15;36696:180;36744:77;36741:1;36734:88;36841:4;36838:1;36831:15;36865:4;36862:1;36855:15;36882:180;36930:77;36927:1;36920:88;37027:4;37024:1;37017:15;37051:4;37048:1;37041:15;37068:180;37116:77;37113:1;37106:88;37213:4;37210:1;37203:15;37237:4;37234:1;37227:15;37254:180;37302:77;37299:1;37292:88;37399:4;37396:1;37389:15;37423:4;37420:1;37413:15;37440:117;37549:1;37546;37539:12;37563:117;37672:1;37669;37662:12;37686:117;37795:1;37792;37785:12;37809:117;37918:1;37915;37908:12;37932:102;37973:6;38024:2;38020:7;38015:2;38008:5;38004:14;38000:28;37990:38;;37932:102;;;:::o;38040:214::-;38180:66;38176:1;38168:6;38164:14;38157:90;38040:214;:::o;38260:357::-;38400:66;38396:1;38388:6;38384:14;38377:90;38501:66;38496:2;38488:6;38484:15;38477:91;38602:7;38597:2;38589:6;38585:15;38578:32;38260:357;:::o;38623:230::-;38763:34;38759:1;38751:6;38747:14;38740:58;38832:13;38827:2;38819:6;38815:15;38808:38;38623:230;:::o;38859:237::-;38999:34;38995:1;38987:6;38983:14;38976:58;39068:20;39063:2;39055:6;39051:15;39044:45;38859:237;:::o;39102:225::-;39242:34;39238:1;39230:6;39226:14;39219:58;39311:8;39306:2;39298:6;39294:15;39287:33;39102:225;:::o;39333:178::-;39473:30;39469:1;39461:6;39457:14;39450:54;39333:178;:::o;39517:223::-;39657:34;39653:1;39645:6;39641:14;39634:58;39726:6;39721:2;39713:6;39709:15;39702:31;39517:223;:::o;39746:175::-;39886:27;39882:1;39874:6;39870:14;39863:51;39746:175;:::o;39927:231::-;40067:34;40063:1;40055:6;40051:14;40044:58;40136:14;40131:2;40123:6;40119:15;40112:39;39927:231;:::o;40164:243::-;40304:34;40300:1;40292:6;40288:14;40281:58;40373:26;40368:2;40360:6;40356:15;40349:51;40164:243;:::o;40413:229::-;40553:34;40549:1;40541:6;40537:14;40530:58;40622:12;40617:2;40609:6;40605:15;40598:37;40413:229;:::o;40648:228::-;40788:34;40784:1;40776:6;40772:14;40765:58;40857:11;40852:2;40844:6;40840:15;40833:36;40648:228;:::o;40882:214::-;41022:66;41018:1;41010:6;41006:14;40999:90;40882:214;:::o;41102:182::-;41242:34;41238:1;41230:6;41226:14;41219:58;41102:182;:::o;41290:231::-;41430:34;41426:1;41418:6;41414:14;41407:58;41499:14;41494:2;41486:6;41482:15;41475:39;41290:231;:::o;41527:182::-;41667:34;41663:1;41655:6;41651:14;41644:58;41527:182;:::o;41715:166::-;41855:18;41851:1;41843:6;41839:14;41832:42;41715:166;:::o;41887:228::-;42027:34;42023:1;42015:6;42011:14;42004:58;42096:11;42091:2;42083:6;42079:15;42072:36;41887:228;:::o;42121:220::-;42261:34;42257:1;42249:6;42245:14;42238:58;42330:3;42325:2;42317:6;42313:15;42306:28;42121:220;:::o;42347:179::-;42487:31;42483:1;42475:6;42471:14;42464:55;42347:179;:::o;42532:114::-;;:::o;42652:236::-;42792:34;42788:1;42780:6;42776:14;42769:58;42861:19;42856:2;42848:6;42844:15;42837:44;42652:236;:::o;42894:231::-;43034:34;43030:1;43022:6;43018:14;43011:58;43103:14;43098:2;43090:6;43086:15;43079:39;42894:231;:::o;43131:181::-;43271:33;43267:1;43259:6;43255:14;43248:57;43131:181;:::o;43318:122::-;43391:24;43409:5;43391:24;:::i;:::-;43384:5;43381:35;43371:63;;43430:1;43427;43420:12;43371:63;43318:122;:::o;43446:116::-;43516:21;43531:5;43516:21;:::i;:::-;43509:5;43506:32;43496:60;;43552:1;43549;43542:12;43496:60;43446:116;:::o;43568:120::-;43640:23;43657:5;43640:23;:::i;:::-;43633:5;43630:34;43620:62;;43678:1;43675;43668:12;43620:62;43568:120;:::o;43694:122::-;43767:24;43785:5;43767:24;:::i;:::-;43760:5;43757:35;43747:63;;43806:1;43803;43796:12;43747:63;43694:122;:::o
Swarm Source
ipfs://da61337a785d478f26639d613ed457c74082266082608f9599019898840468e4
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.