ERC-721
Overview
Max Total Supply
8,102 ALI
Holders
3,514
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 ALILoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ALIToken
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-15 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.2; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @title 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 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; } } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @title 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); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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 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 Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } /** * @dev Contract module 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 making 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; } } contract ALIToken is ERC721, Ownable, ERC721Enumerable, ReentrancyGuard { using Strings for uint256; constructor() ERC721("alinft-official", "ALI") {} string private baseURI; string private blindURI; uint256 constant private MAX_NFT = 10000; uint256 public WHITE_ONE_COUNT; uint256 public WHITE_TWO_COUNT; uint256 public _oneListCount; uint256 public _twoListCount; uint256 public listPrice = 100000000000000000; // 0.1 ETH uint256 public publicPrice = 150000000000000000; // 0.15 ETH address private root = 0xA6c28f11002435EA015309Ca1b5DaDc533Be22fB; bool public isActive; bool public reveal; uint256 public ONE_TIME; uint256 public TWO_TIME; uint256 public PUBLIC_TIME; uint256 public END_TIME; mapping (address => uint256) private _nftMintCount; mapping (uint256 => uint256) private _allowCount; mapping(uint256 => mapping(address => bool)) private _whiteList; function oneCount(uint256 _num) public onlyOwner { WHITE_ONE_COUNT = _num; } function twoCount(uint256 _num) public onlyOwner { WHITE_TWO_COUNT = _num; } function activeNow() public onlyOwner { isActive = true; } function revealNow() public onlyOwner { reveal = true; } function onetime(uint256 _time) public onlyOwner(){ ONE_TIME = _time; } function twotime(uint256 _time) public onlyOwner(){ TWO_TIME = _time; } function publictime(uint256 _time) public onlyOwner(){ PUBLIC_TIME = _time; } function endtime(uint256 _time) public onlyOwner(){ END_TIME = _time; } function mintCount(address _address) public view returns(uint256){ return _nftMintCount[_address]; } function allowCount(uint256 _edition) public view returns(uint256){ return _allowCount[_edition]; } function white(address _address) public view returns(uint256){ if(_whiteList[1][_address]){ return 1; }else if(_whiteList[2][_address]){ return 2; }else{ return 3; } } function setWhite(address[] memory _address,uint256[] memory _edition) public onlyOwner { require(_address.length == _edition.length, "Should have same length"); for(uint256 i = 0; i < _address.length;i++){ if(_edition[i] == 1){ require(_oneListCount + 1 <= WHITE_ONE_COUNT,"Cannot list above limit"); _oneListCount++; } if(_edition[i] == 2){ require(_twoListCount + 1 <= WHITE_TWO_COUNT,"Cannot list above limit"); _twoListCount++; } _whiteList[_edition[i]][_address[i]] = true; } } modifier mintCheck(uint256 num){ require(tx.origin == msg.sender,"CONTRACTS_NOT_ALLOWED_TO_MINT"); require(isActive, "Contract is not active"); require(totalSupply() + num <= MAX_NFT, "Purchase would exceed max public supply of NFTs"); address _address = msg.sender; uint256 time = block.timestamp; if(_whiteList[1][_address] && time >= ONE_TIME && time < PUBLIC_TIME){ require(_nftMintCount[_address] + num <= 2, "Cannot mint above limit"); require(msg.value == listPrice * num, "Ether value sent is not correct"); }else if(_whiteList[2][_address] && time >= TWO_TIME && time < PUBLIC_TIME){ require(_nftMintCount[_address] + num <= 1, "Cannot mint above limit"); require(msg.value == listPrice * num, "Ether value sent is not correct"); }else if(_whiteList[1][_address] == false && _whiteList[2][_address] == false && time >= PUBLIC_TIME && time < END_TIME){ require(_nftMintCount[_address] + num <= 1, "Cannot mint above limit"); require(msg.value == publicPrice * num, "Ether value sent is not correct"); }else{ revert("mint error"); } _; } function mintNFT(uint256 num) external payable mintCheck(num) nonReentrant { address _address = msg.sender; (bool success, ) = payable(root).call{value: msg.value}(""); require(success, "Failed to withdraw payment"); for(uint256 i = 0; i < num;i++){ uint256 tokenId = _randMod(); _safeMint(_address, tokenId); _nftMintCount[_address]++; if(_whiteList[1][_address]){ _allowCount[1]++; }else if(_whiteList[2][_address]){ _allowCount[2]++; }else{ _allowCount[3]++; } } } function setURI(string memory _blindURI, string memory _URI) external onlyOwner { blindURI = _blindURI; baseURI = _URI; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token"); if (!reveal) { return string(abi.encodePacked(blindURI, _tokenId.toString())); } else { return string(abi.encodePacked(baseURI, _tokenId.toString())); } } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } uint[MAX_NFT] public indices; uint nonce; function _randMod() private returns (uint) { uint totalSize = MAX_NFT - nonce; uint index = uint(keccak256(abi.encodePacked(nonce, msg.sender, block.difficulty, block.timestamp))) % totalSize; uint value = 0; if (indices[index] != 0) { value = indices[index]; } else { value = index; } if (indices[totalSize - 1] == 0) { indices[index] = totalSize - 1; } else { indices[index] = indices[totalSize - 1]; } nonce++; return value+1; } }
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":[],"name":"END_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ONE_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TWO_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITE_ONE_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITE_TWO_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_oneListCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_twoListCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activeNow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_edition","type":"uint256"}],"name":"allowCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"endtime","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":"uint256","name":"","type":"uint256"}],"name":"indices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_num","type":"uint256"}],"name":"oneCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"onetime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"publictime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealNow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_blindURI","type":"string"},{"internalType":"string","name":"_URI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"},{"internalType":"uint256[]","name":"_edition","type":"uint256[]"}],"name":"setWhite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_num","type":"uint256"}],"name":"twoCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"twotime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"white","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405267016345785d8a0000601255670214e8348c4f000060135573a6c28f11002435ea015309ca1b5dadc533be22fb601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200007e57600080fd5b506040518060400160405280600f81526020017f616c696e66742d6f6666696369616c00000000000000000000000000000000008152506040518060400160405280600381526020017f414c4900000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001039291906200021b565b5080600190805190602001906200011c9291906200021b565b5050506200013f620001336200014d60201b60201c565b6200015560201b60201c565b6001600b8190555062000330565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200022990620002cb565b90600052602060002090601f0160209004810192826200024d576000855562000299565b82601f106200026857805160ff191683800117855562000299565b8280016001018555821562000299579182015b82811115620002985782518255916020019190600101906200027b565b5b509050620002a89190620002ac565b5090565b5b80821115620002c7576000816000905550600101620002ad565b5090565b60006002820490506001821680620002e457607f821691505b60208210811415620002fb57620002fa62000301565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61575980620003406000396000f3fe60806040526004361061027d5760003560e01c8063715018a61161014f578063ad147f49116100c1578063d026901c1161007a578063d026901c146109a1578063d160011f146109ca578063e985e9c5146109e1578063ed9ec88814610a1e578063f2fde38b14610a5b578063f316ea6e14610a845761027d565b8063ad147f4914610897578063b88d4fde146108c0578063bf2db4c8146108e9578063c6df7cfd14610912578063c87b56dd1461093b578063cb0c6145146109785761027d565b80639264274411610113578063926427441461079457806395d89b41146107b0578063a1a953fd146107db578063a22cb46514610818578063a475b5dd14610841578063a945bf801461086c5761027d565b8063715018a6146106bf57806373fb9711146106d65780637a8c3172146107135780638942a4c01461073e5780638da5cb5b146107695761027d565b806325a9e76a116101f35780634f6ccce7116101ac5780634f6ccce71461059b57806355c425aa146105d85780635f0f45b2146106035780636352211e1461061a5780636eb588d91461065757806370a08231146106825761027d565b806325a9e76a1461048b5780632f745c59146104b457806337ba682d146104f15780633a4ff7761461051c57806342842e0e1461054757806347c445d4146105705761027d565b80630b40abea116102455780630b40abea1461038d57806318160ddd146103b65780631f7abb5e146103e1578063213e4d911461040c57806322f3e2d41461043757806323b872dd146104625761027d565b806301ffc9a71461028257806304f5a077146102bf57806306fdde03146102fc578063081812fc14610327578063095ea7b314610364575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613f6c565b610aad565b6040516102b691906146cd565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190613d31565b610abf565b6040516102f39190614a8a565b60405180910390f35b34801561030857600080fd5b50610311610ba5565b60405161031e91906146e8565b60405180910390f35b34801561033357600080fd5b5061034e6004803603810190610349919061403e565b610c37565b60405161035b9190614666565b60405180910390f35b34801561037057600080fd5b5061038b60048036038101906103869190613eb4565b610cbc565b005b34801561039957600080fd5b506103b460048036038101906103af919061403e565b610dd4565b005b3480156103c257600080fd5b506103cb610e5a565b6040516103d89190614a8a565b60405180910390f35b3480156103ed57600080fd5b506103f6610e67565b6040516104039190614a8a565b60405180910390f35b34801561041857600080fd5b50610421610e6d565b60405161042e9190614a8a565b60405180910390f35b34801561044357600080fd5b5061044c610e73565b60405161045991906146cd565b60405180910390f35b34801561046e57600080fd5b5061048960048036038101906104849190613d9e565b610e84565b005b34801561049757600080fd5b506104b260048036038101906104ad919061403e565b610ee4565b005b3480156104c057600080fd5b506104db60048036038101906104d69190613eb4565b610f6a565b6040516104e89190614a8a565b60405180910390f35b3480156104fd57600080fd5b5061050661100f565b6040516105139190614a8a565b60405180910390f35b34801561052857600080fd5b50610531611015565b60405161053e9190614a8a565b60405180910390f35b34801561055357600080fd5b5061056e60048036038101906105699190613d9e565b61101b565b005b34801561057c57600080fd5b5061058561103b565b6040516105929190614a8a565b60405180910390f35b3480156105a757600080fd5b506105c260048036038101906105bd919061403e565b611041565b6040516105cf9190614a8a565b60405180910390f35b3480156105e457600080fd5b506105ed6110b2565b6040516105fa9190614a8a565b60405180910390f35b34801561060f57600080fd5b506106186110b8565b005b34801561062657600080fd5b50610641600480360381019061063c919061403e565b611151565b60405161064e9190614666565b60405180910390f35b34801561066357600080fd5b5061066c611203565b6040516106799190614a8a565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a49190613d31565b611209565b6040516106b69190614a8a565b60405180910390f35b3480156106cb57600080fd5b506106d46112c1565b005b3480156106e257600080fd5b506106fd60048036038101906106f8919061403e565b611349565b60405161070a9190614a8a565b60405180910390f35b34801561071f57600080fd5b50610728611366565b6040516107359190614a8a565b60405180910390f35b34801561074a57600080fd5b5061075361136c565b6040516107609190614a8a565b60405180910390f35b34801561077557600080fd5b5061077e611372565b60405161078b9190614666565b60405180910390f35b6107ae60048036038101906107a9919061403e565b61139c565b005b3480156107bc57600080fd5b506107c5611c9c565b6040516107d291906146e8565b60405180910390f35b3480156107e757600080fd5b5061080260048036038101906107fd919061403e565b611d2e565b60405161080f9190614a8a565b60405180910390f35b34801561082457600080fd5b5061083f600480360381019061083a9190613e74565b611d4a565b005b34801561084d57600080fd5b50610856611d60565b60405161086391906146cd565b60405180910390f35b34801561087857600080fd5b50610881611d73565b60405161088e9190614a8a565b60405180910390f35b3480156108a357600080fd5b506108be60048036038101906108b9919061403e565b611d79565b005b3480156108cc57600080fd5b506108e760048036038101906108e29190613df1565b611dff565b005b3480156108f557600080fd5b50610910600480360381019061090b9190613fc6565b611e61565b005b34801561091e57600080fd5b506109396004803603810190610934919061403e565b611f0f565b005b34801561094757600080fd5b50610962600480360381019061095d919061403e565b611f95565b60405161096f91906146e8565b60405180910390f35b34801561098457600080fd5b5061099f600480360381019061099a9190613ef4565b612058565b005b3480156109ad57600080fd5b506109c860048036038101906109c3919061403e565b6122f7565b005b3480156109d657600080fd5b506109df61237d565b005b3480156109ed57600080fd5b50610a086004803603810190610a039190613d5e565b612415565b604051610a1591906146cd565b60405180910390f35b348015610a2a57600080fd5b50610a456004803603810190610a409190613d31565b6124a9565b604051610a529190614a8a565b60405180910390f35b348015610a6757600080fd5b50610a826004803603810190610a7d9190613d31565b6124f2565b005b348015610a9057600080fd5b50610aab6004803603810190610aa6919061403e565b6125ea565b005b6000610ab882612670565b9050919050565b6000601b60006001815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b2e5760019050610ba0565b601b60006002815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b9b5760029050610ba0565b600390505b919050565b606060008054610bb490614db2565b80601f0160208091040260200160405190810160405280929190818152602001828054610be090614db2565b8015610c2d5780601f10610c0257610100808354040283529160200191610c2d565b820191906000526020600020905b815481529060010190602001808311610c1057829003601f168201915b5050505050905090565b6000610c42826126ea565b610c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c78906148ea565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cc782611151565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2f9061498a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d57612756565b73ffffffffffffffffffffffffffffffffffffffff161480610d865750610d8581610d80612756565b612415565b5b610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc9061484a565b60405180910390fd5b610dcf838361275e565b505050565b610ddc612756565b73ffffffffffffffffffffffffffffffffffffffff16610dfa611372565b73ffffffffffffffffffffffffffffffffffffffff1614610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e479061490a565b60405180910390fd5b80600e8190555050565b6000600980549050905090565b600f5481565b600e5481565b60148054906101000a900460ff1681565b610e95610e8f612756565b82612817565b610ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecb906149ca565b60405180910390fd5b610edf8383836128f5565b505050565b610eec612756565b73ffffffffffffffffffffffffffffffffffffffff16610f0a611372565b73ffffffffffffffffffffffffffffffffffffffff1614610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f579061490a565b60405180910390fd5b8060188190555050565b6000610f7583611209565b8210610fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fad9061472a565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60185481565b60105481565b61103683838360405180602001604052806000815250611dff565b505050565b60175481565b600061104b610e5a565b821061108c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108390614a0a565b60405180910390fd5b600982815481106110a05761109f614f79565b5b90600052602060002001549050919050565b60155481565b6110c0612756565b73ffffffffffffffffffffffffffffffffffffffff166110de611372565b73ffffffffffffffffffffffffffffffffffffffff1614611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112b9061490a565b60405180910390fd5b6001601460156101000a81548160ff021916908315150217905550565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f19061488a565b60405180910390fd5b80915050919050565b60125481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561127a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112719061486a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112c9612756565b73ffffffffffffffffffffffffffffffffffffffff166112e7611372565b73ffffffffffffffffffffffffffffffffffffffff161461133d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113349061490a565b60405180910390fd5b6113476000612b51565b565b6000601a6000838152602001908152602001600020549050919050565b60165481565b60115481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b803373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461140b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114029061470a565b60405180910390fd5b60148054906101000a900460ff16611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f906148ca565b60405180910390fd5b61271081611464610e5a565b61146e9190614be7565b11156114af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a6906149aa565b60405180910390fd5b60003390506000429050601b60006001815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561152657506015548110155b8015611533575060175481105b1561161a57600283601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115859190614be7565b11156115c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bd906147aa565b60405180910390fd5b826012546115d49190614c6e565b3414611615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160c9061480a565b60405180910390fd5b61198e565b601b60006002815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561168757506016548110155b8015611694575060175481105b1561177b57600183601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116e69190614be7565b1115611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e906147aa565b60405180910390fd5b826012546117359190614c6e565b3414611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d9061480a565b60405180910390fd5b61198d565b60001515601b60006001815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514801561184f575060001515601b60006002815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b801561185d57506017548110155b801561186a575060185481105b1561195157600183601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118bc9190614be7565b11156118fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f4906147aa565b60405180910390fd5b8260135461190b9190614c6e565b341461194c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119439061480a565b60405180910390fd5b61198c565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611983906149ea565b60405180910390fd5b5b5b6002600b5414156119d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cb90614a6a565b60405180910390fd5b6002600b8190555060003390506000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051611a2990614603565b60006040518083038185875af1925050503d8060008114611a66576040519150601f19603f3d011682016040523d82523d6000602084013e611a6b565b606091505b5050905080611aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa690614a2a565b60405180910390fd5b60005b86811015611c8b576000611ac4612c17565b9050611ad08482612d73565b601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611b2090614e15565b9190505550601b60006001815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611bb857601a6000600181526020019081526020016000206000815480929190611bae90614e15565b9190505550611c77565b601b60006002815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611c4b57601a6000600281526020019081526020016000206000815480929190611c4190614e15565b9190505550611c76565b601a6000600381526020019081526020016000206000815480929190611c7090614e15565b91905055505b5b508080611c8390614e15565b915050611ab2565b5050506001600b8190555050505050565b606060018054611cab90614db2565b80601f0160208091040260200160405190810160405280929190818152602001828054611cd790614db2565b8015611d245780601f10611cf957610100808354040283529160200191611d24565b820191906000526020600020905b815481529060010190602001808311611d0757829003601f168201915b5050505050905090565b601c816127108110611d3f57600080fd5b016000915090505481565b611d5c611d55612756565b8383612d91565b5050565b601460159054906101000a900460ff1681565b60135481565b611d81612756565b73ffffffffffffffffffffffffffffffffffffffff16611d9f611372565b73ffffffffffffffffffffffffffffffffffffffff1614611df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dec9061490a565b60405180910390fd5b8060158190555050565b611e10611e0a612756565b83612817565b611e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e46906149ca565b60405180910390fd5b611e5b84848484612efe565b50505050565b611e69612756565b73ffffffffffffffffffffffffffffffffffffffff16611e87611372565b73ffffffffffffffffffffffffffffffffffffffff1614611edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed49061490a565b60405180910390fd5b81600d9080519060200190611ef3929190613a09565b5080600c9080519060200190611f0a929190613a09565b505050565b611f17612756565b73ffffffffffffffffffffffffffffffffffffffff16611f35611372565b73ffffffffffffffffffffffffffffffffffffffff1614611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f829061490a565b60405180910390fd5b8060168190555050565b6060611fa0826126ea565b611fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd69061494a565b60405180910390fd5b601460159054906101000a900460ff1661202557600d611ffe83612f5a565b60405160200161200f9291906145df565b6040516020818303038152906040529050612053565b600c61203083612f5a565b6040516020016120419291906145df565b60405160208183030381529060405290505b919050565b612060612756565b73ffffffffffffffffffffffffffffffffffffffff1661207e611372565b73ffffffffffffffffffffffffffffffffffffffff16146120d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cb9061490a565b60405180910390fd5b8051825114612118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210f90614a4a565b60405180910390fd5b60005b82518110156122f257600182828151811061213957612138614f79565b5b602002602001015114156121b357600e5460016010546121599190614be7565b111561219a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121919061496a565b60405180910390fd5b601060008154809291906121ad90614e15565b91905055505b60028282815181106121c8576121c7614f79565b5b6020026020010151141561224257600f5460016011546121e89190614be7565b1115612229576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122209061496a565b60405180910390fd5b6011600081548092919061223c90614e15565b91905055505b6001601b600084848151811061225b5761225a614f79565b5b60200260200101518152602001908152602001600020600085848151811061228657612285614f79565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806122ea90614e15565b91505061211b565b505050565b6122ff612756565b73ffffffffffffffffffffffffffffffffffffffff1661231d611372565b73ffffffffffffffffffffffffffffffffffffffff1614612373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236a9061490a565b60405180910390fd5b8060178190555050565b612385612756565b73ffffffffffffffffffffffffffffffffffffffff166123a3611372565b73ffffffffffffffffffffffffffffffffffffffff16146123f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f09061490a565b60405180910390fd5b60016014806101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6124fa612756565b73ffffffffffffffffffffffffffffffffffffffff16612518611372565b73ffffffffffffffffffffffffffffffffffffffff161461256e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125659061490a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d59061476a565b60405180910390fd5b6125e781612b51565b50565b6125f2612756565b73ffffffffffffffffffffffffffffffffffffffff16612610611372565b73ffffffffffffffffffffffffffffffffffffffff1614612666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265d9061490a565b60405180910390fd5b80600f8190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126e357506126e2826130bb565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127d183611151565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612822826126ea565b612861576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128589061482a565b60405180910390fd5b600061286c83611151565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128db57508373ffffffffffffffffffffffffffffffffffffffff166128c384610c37565b73ffffffffffffffffffffffffffffffffffffffff16145b806128ec57506128eb8185612415565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661291582611151565b73ffffffffffffffffffffffffffffffffffffffff161461296b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129629061492a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d2906147ca565b60405180910390fd5b6129e683838361319d565b6129f160008261275e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a419190614cc8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a989190614be7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008061272c54612710612c2b9190614cc8565b905060008161272c54334442604051602001612c4a9493929190614618565b6040516020818303038152906040528051906020012060001c612c6d9190614e8c565b9050600080601c836127108110612c8757612c86614f79565b5b015414612cac57601c826127108110612ca357612ca2614f79565b5b01549050612cb0565b8190505b6000601c600185612cc19190614cc8565b6127108110612cd357612cd2614f79565b5b01541415612d0757600183612ce89190614cc8565b601c836127108110612cfd57612cfc614f79565b5b0181905550612d45565b601c600184612d169190614cc8565b6127108110612d2857612d27614f79565b5b0154601c836127108110612d3f57612d3e614f79565b5b01819055505b61272c6000815480929190612d5990614e15565b9190505550600181612d6b9190614be7565b935050505090565b612d8d8282604051806020016040528060008152506131ad565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df7906147ea565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ef191906146cd565b60405180910390a3505050565b612f098484846128f5565b612f1584848484613208565b612f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4b9061474a565b60405180910390fd5b50505050565b60606000821415612fa2576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130b6565b600082905060005b60008214612fd4578080612fbd90614e15565b915050600a82612fcd9190614c3d565b9150612faa565b60008167ffffffffffffffff811115612ff057612fef614fa8565b5b6040519080825280601f01601f1916602001820160405280156130225781602001600182028036833780820191505090505b5090505b600085146130af5760018261303b9190614cc8565b9150600a8561304a9190614e8c565b60306130569190614be7565b60f81b81838151811061306c5761306b614f79565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130a89190614c3d565b9450613026565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061318657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061319657506131958261339f565b5b9050919050565b6131a8838383613409565b505050565b6131b7838361351d565b6131c46000848484613208565b613203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131fa9061474a565b60405180910390fd5b505050565b60006132298473ffffffffffffffffffffffffffffffffffffffff166136eb565b15613392578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613252612756565b8786866040518563ffffffff1660e01b81526004016132749493929190614681565b602060405180830381600087803b15801561328e57600080fd5b505af19250505080156132bf57506040513d601f19601f820116820180604052508101906132bc9190613f99565b60015b613342573d80600081146132ef576040519150601f19603f3d011682016040523d82523d6000602084013e6132f4565b606091505b5060008151141561333a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133319061474a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613397565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6134148383836136fe565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134575761345281613703565b613496565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461349557613494838261374c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134d9576134d4816138b9565b613518565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461351757613516828261398a565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561358d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613584906148aa565b60405180910390fd5b613596816126ea565b156135d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135cd9061478a565b60405180910390fd5b6135e26000838361319d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136329190614be7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161375984611209565b6137639190614cc8565b9050600060086000848152602001908152602001600020549050818114613848576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506138cd9190614cc8565b90506000600a60008481526020019081526020016000205490506000600983815481106138fd576138fc614f79565b5b90600052602060002001549050806009838154811061391f5761391e614f79565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061396e5761396d614f4a565b5b6001900381819060005260206000200160009055905550505050565b600061399583611209565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b828054613a1590614db2565b90600052602060002090601f016020900481019282613a375760008555613a7e565b82601f10613a5057805160ff1916838001178555613a7e565b82800160010185558215613a7e579182015b82811115613a7d578251825591602001919060010190613a62565b5b509050613a8b9190613a8f565b5090565b5b80821115613aa8576000816000905550600101613a90565b5090565b6000613abf613aba84614aca565b614aa5565b90508083825260208201905082856020860282011115613ae257613ae1614fdc565b5b60005b85811015613b125781613af88882613c10565b845260208401935060208301925050600181019050613ae5565b5050509392505050565b6000613b2f613b2a84614af6565b614aa5565b90508083825260208201905082856020860282011115613b5257613b51614fdc565b5b60005b85811015613b825781613b688882613d1c565b845260208401935060208301925050600181019050613b55565b5050509392505050565b6000613b9f613b9a84614b22565b614aa5565b905082815260208101848484011115613bbb57613bba614fe1565b5b613bc6848285614d70565b509392505050565b6000613be1613bdc84614b53565b614aa5565b905082815260208101848484011115613bfd57613bfc614fe1565b5b613c08848285614d70565b509392505050565b600081359050613c1f816156c7565b92915050565b600082601f830112613c3a57613c39614fd7565b5b8135613c4a848260208601613aac565b91505092915050565b600082601f830112613c6857613c67614fd7565b5b8135613c78848260208601613b1c565b91505092915050565b600081359050613c90816156de565b92915050565b600081359050613ca5816156f5565b92915050565b600081519050613cba816156f5565b92915050565b600082601f830112613cd557613cd4614fd7565b5b8135613ce5848260208601613b8c565b91505092915050565b600082601f830112613d0357613d02614fd7565b5b8135613d13848260208601613bce565b91505092915050565b600081359050613d2b8161570c565b92915050565b600060208284031215613d4757613d46614feb565b5b6000613d5584828501613c10565b91505092915050565b60008060408385031215613d7557613d74614feb565b5b6000613d8385828601613c10565b9250506020613d9485828601613c10565b9150509250929050565b600080600060608486031215613db757613db6614feb565b5b6000613dc586828701613c10565b9350506020613dd686828701613c10565b9250506040613de786828701613d1c565b9150509250925092565b60008060008060808587031215613e0b57613e0a614feb565b5b6000613e1987828801613c10565b9450506020613e2a87828801613c10565b9350506040613e3b87828801613d1c565b925050606085013567ffffffffffffffff811115613e5c57613e5b614fe6565b5b613e6887828801613cc0565b91505092959194509250565b60008060408385031215613e8b57613e8a614feb565b5b6000613e9985828601613c10565b9250506020613eaa85828601613c81565b9150509250929050565b60008060408385031215613ecb57613eca614feb565b5b6000613ed985828601613c10565b9250506020613eea85828601613d1c565b9150509250929050565b60008060408385031215613f0b57613f0a614feb565b5b600083013567ffffffffffffffff811115613f2957613f28614fe6565b5b613f3585828601613c25565b925050602083013567ffffffffffffffff811115613f5657613f55614fe6565b5b613f6285828601613c53565b9150509250929050565b600060208284031215613f8257613f81614feb565b5b6000613f9084828501613c96565b91505092915050565b600060208284031215613faf57613fae614feb565b5b6000613fbd84828501613cab565b91505092915050565b60008060408385031215613fdd57613fdc614feb565b5b600083013567ffffffffffffffff811115613ffb57613ffa614fe6565b5b61400785828601613cee565b925050602083013567ffffffffffffffff81111561402857614027614fe6565b5b61403485828601613cee565b9150509250929050565b60006020828403121561405457614053614feb565b5b600061406284828501613d1c565b91505092915050565b61407481614cfc565b82525050565b61408b61408682614cfc565b614e5e565b82525050565b61409a81614d0e565b82525050565b60006140ab82614b99565b6140b58185614baf565b93506140c5818560208601614d7f565b6140ce81614ff0565b840191505092915050565b60006140e482614ba4565b6140ee8185614bcb565b93506140fe818560208601614d7f565b61410781614ff0565b840191505092915050565b600061411d82614ba4565b6141278185614bdc565b9350614137818560208601614d7f565b80840191505092915050565b6000815461415081614db2565b61415a8186614bdc565b945060018216600081146141755760018114614186576141b9565b60ff198316865281860193506141b9565b61418f85614b84565b60005b838110156141b157815481890152600182019150602081019050614192565b838801955050505b50505092915050565b60006141cf601d83614bcb565b91506141da8261500e565b602082019050919050565b60006141f2602b83614bcb565b91506141fd82615037565b604082019050919050565b6000614215603283614bcb565b915061422082615086565b604082019050919050565b6000614238602683614bcb565b9150614243826150d5565b604082019050919050565b600061425b601c83614bcb565b915061426682615124565b602082019050919050565b600061427e601783614bcb565b91506142898261514d565b602082019050919050565b60006142a1602483614bcb565b91506142ac82615176565b604082019050919050565b60006142c4601983614bcb565b91506142cf826151c5565b602082019050919050565b60006142e7601f83614bcb565b91506142f2826151ee565b602082019050919050565b600061430a602c83614bcb565b915061431582615217565b604082019050919050565b600061432d603883614bcb565b915061433882615266565b604082019050919050565b6000614350602a83614bcb565b915061435b826152b5565b604082019050919050565b6000614373602983614bcb565b915061437e82615304565b604082019050919050565b6000614396602083614bcb565b91506143a182615353565b602082019050919050565b60006143b9601683614bcb565b91506143c48261537c565b602082019050919050565b60006143dc602c83614bcb565b91506143e7826153a5565b604082019050919050565b60006143ff602083614bcb565b915061440a826153f4565b602082019050919050565b6000614422602983614bcb565b915061442d8261541d565b604082019050919050565b6000614445602f83614bcb565b91506144508261546c565b604082019050919050565b6000614468601783614bcb565b9150614473826154bb565b602082019050919050565b600061448b602183614bcb565b9150614496826154e4565b604082019050919050565b60006144ae602f83614bcb565b91506144b982615533565b604082019050919050565b60006144d1600083614bc0565b91506144dc82615582565b600082019050919050565b60006144f4603183614bcb565b91506144ff82615585565b604082019050919050565b6000614517600a83614bcb565b9150614522826155d4565b602082019050919050565b600061453a602c83614bcb565b9150614545826155fd565b604082019050919050565b600061455d601a83614bcb565b91506145688261564c565b602082019050919050565b6000614580601783614bcb565b915061458b82615675565b602082019050919050565b60006145a3601f83614bcb565b91506145ae8261569e565b602082019050919050565b6145c281614d66565b82525050565b6145d96145d482614d66565b614e82565b82525050565b60006145eb8285614143565b91506145f78284614112565b91508190509392505050565b600061460e826144c4565b9150819050919050565b600061462482876145c8565b602082019150614634828661407a565b60148201915061464482856145c8565b60208201915061465482846145c8565b60208201915081905095945050505050565b600060208201905061467b600083018461406b565b92915050565b6000608082019050614696600083018761406b565b6146a3602083018661406b565b6146b060408301856145b9565b81810360608301526146c281846140a0565b905095945050505050565b60006020820190506146e26000830184614091565b92915050565b6000602082019050818103600083015261470281846140d9565b905092915050565b60006020820190508181036000830152614723816141c2565b9050919050565b60006020820190508181036000830152614743816141e5565b9050919050565b6000602082019050818103600083015261476381614208565b9050919050565b600060208201905081810360008301526147838161422b565b9050919050565b600060208201905081810360008301526147a38161424e565b9050919050565b600060208201905081810360008301526147c381614271565b9050919050565b600060208201905081810360008301526147e381614294565b9050919050565b60006020820190508181036000830152614803816142b7565b9050919050565b60006020820190508181036000830152614823816142da565b9050919050565b60006020820190508181036000830152614843816142fd565b9050919050565b6000602082019050818103600083015261486381614320565b9050919050565b6000602082019050818103600083015261488381614343565b9050919050565b600060208201905081810360008301526148a381614366565b9050919050565b600060208201905081810360008301526148c381614389565b9050919050565b600060208201905081810360008301526148e3816143ac565b9050919050565b60006020820190508181036000830152614903816143cf565b9050919050565b60006020820190508181036000830152614923816143f2565b9050919050565b6000602082019050818103600083015261494381614415565b9050919050565b6000602082019050818103600083015261496381614438565b9050919050565b600060208201905081810360008301526149838161445b565b9050919050565b600060208201905081810360008301526149a38161447e565b9050919050565b600060208201905081810360008301526149c3816144a1565b9050919050565b600060208201905081810360008301526149e3816144e7565b9050919050565b60006020820190508181036000830152614a038161450a565b9050919050565b60006020820190508181036000830152614a238161452d565b9050919050565b60006020820190508181036000830152614a4381614550565b9050919050565b60006020820190508181036000830152614a6381614573565b9050919050565b60006020820190508181036000830152614a8381614596565b9050919050565b6000602082019050614a9f60008301846145b9565b92915050565b6000614aaf614ac0565b9050614abb8282614de4565b919050565b6000604051905090565b600067ffffffffffffffff821115614ae557614ae4614fa8565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614b1157614b10614fa8565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614b3d57614b3c614fa8565b5b614b4682614ff0565b9050602081019050919050565b600067ffffffffffffffff821115614b6e57614b6d614fa8565b5b614b7782614ff0565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614bf282614d66565b9150614bfd83614d66565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c3257614c31614ebd565b5b828201905092915050565b6000614c4882614d66565b9150614c5383614d66565b925082614c6357614c62614eec565b5b828204905092915050565b6000614c7982614d66565b9150614c8483614d66565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614cbd57614cbc614ebd565b5b828202905092915050565b6000614cd382614d66565b9150614cde83614d66565b925082821015614cf157614cf0614ebd565b5b828203905092915050565b6000614d0782614d46565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d9d578082015181840152602081019050614d82565b83811115614dac576000848401525b50505050565b60006002820490506001821680614dca57607f821691505b60208210811415614dde57614ddd614f1b565b5b50919050565b614ded82614ff0565b810181811067ffffffffffffffff82111715614e0c57614e0b614fa8565b5b80604052505050565b6000614e2082614d66565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e5357614e52614ebd565b5b600182019050919050565b6000614e6982614e70565b9050919050565b6000614e7b82615001565b9050919050565b6000819050919050565b6000614e9782614d66565b9150614ea283614d66565b925082614eb257614eb1614eec565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f434f4e5452414354535f4e4f545f414c4c4f5745445f544f5f4d494e54000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43616e6e6f74206d696e742061626f7665206c696d6974000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f436f6e7472616374206973206e6f742061637469766500000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f43616e6e6f74206c6973742061626f7665206c696d6974000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d6178207075626c696360008201527f20737570706c79206f66204e4654730000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f6d696e74206572726f7200000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4661696c656420746f207769746864726177207061796d656e74000000000000600082015250565b7f53686f756c6420686176652073616d65206c656e677468000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6156d081614cfc565b81146156db57600080fd5b50565b6156e781614d0e565b81146156f257600080fd5b50565b6156fe81614d1a565b811461570957600080fd5b50565b61571581614d66565b811461572057600080fd5b5056fea264697066735822122017499e064b4bf72f6bc4133cd1c521ecdc2227aaca43536875a955db7f3bc76964736f6c63430008070033
Deployed Bytecode
0x60806040526004361061027d5760003560e01c8063715018a61161014f578063ad147f49116100c1578063d026901c1161007a578063d026901c146109a1578063d160011f146109ca578063e985e9c5146109e1578063ed9ec88814610a1e578063f2fde38b14610a5b578063f316ea6e14610a845761027d565b8063ad147f4914610897578063b88d4fde146108c0578063bf2db4c8146108e9578063c6df7cfd14610912578063c87b56dd1461093b578063cb0c6145146109785761027d565b80639264274411610113578063926427441461079457806395d89b41146107b0578063a1a953fd146107db578063a22cb46514610818578063a475b5dd14610841578063a945bf801461086c5761027d565b8063715018a6146106bf57806373fb9711146106d65780637a8c3172146107135780638942a4c01461073e5780638da5cb5b146107695761027d565b806325a9e76a116101f35780634f6ccce7116101ac5780634f6ccce71461059b57806355c425aa146105d85780635f0f45b2146106035780636352211e1461061a5780636eb588d91461065757806370a08231146106825761027d565b806325a9e76a1461048b5780632f745c59146104b457806337ba682d146104f15780633a4ff7761461051c57806342842e0e1461054757806347c445d4146105705761027d565b80630b40abea116102455780630b40abea1461038d57806318160ddd146103b65780631f7abb5e146103e1578063213e4d911461040c57806322f3e2d41461043757806323b872dd146104625761027d565b806301ffc9a71461028257806304f5a077146102bf57806306fdde03146102fc578063081812fc14610327578063095ea7b314610364575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613f6c565b610aad565b6040516102b691906146cd565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190613d31565b610abf565b6040516102f39190614a8a565b60405180910390f35b34801561030857600080fd5b50610311610ba5565b60405161031e91906146e8565b60405180910390f35b34801561033357600080fd5b5061034e6004803603810190610349919061403e565b610c37565b60405161035b9190614666565b60405180910390f35b34801561037057600080fd5b5061038b60048036038101906103869190613eb4565b610cbc565b005b34801561039957600080fd5b506103b460048036038101906103af919061403e565b610dd4565b005b3480156103c257600080fd5b506103cb610e5a565b6040516103d89190614a8a565b60405180910390f35b3480156103ed57600080fd5b506103f6610e67565b6040516104039190614a8a565b60405180910390f35b34801561041857600080fd5b50610421610e6d565b60405161042e9190614a8a565b60405180910390f35b34801561044357600080fd5b5061044c610e73565b60405161045991906146cd565b60405180910390f35b34801561046e57600080fd5b5061048960048036038101906104849190613d9e565b610e84565b005b34801561049757600080fd5b506104b260048036038101906104ad919061403e565b610ee4565b005b3480156104c057600080fd5b506104db60048036038101906104d69190613eb4565b610f6a565b6040516104e89190614a8a565b60405180910390f35b3480156104fd57600080fd5b5061050661100f565b6040516105139190614a8a565b60405180910390f35b34801561052857600080fd5b50610531611015565b60405161053e9190614a8a565b60405180910390f35b34801561055357600080fd5b5061056e60048036038101906105699190613d9e565b61101b565b005b34801561057c57600080fd5b5061058561103b565b6040516105929190614a8a565b60405180910390f35b3480156105a757600080fd5b506105c260048036038101906105bd919061403e565b611041565b6040516105cf9190614a8a565b60405180910390f35b3480156105e457600080fd5b506105ed6110b2565b6040516105fa9190614a8a565b60405180910390f35b34801561060f57600080fd5b506106186110b8565b005b34801561062657600080fd5b50610641600480360381019061063c919061403e565b611151565b60405161064e9190614666565b60405180910390f35b34801561066357600080fd5b5061066c611203565b6040516106799190614a8a565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a49190613d31565b611209565b6040516106b69190614a8a565b60405180910390f35b3480156106cb57600080fd5b506106d46112c1565b005b3480156106e257600080fd5b506106fd60048036038101906106f8919061403e565b611349565b60405161070a9190614a8a565b60405180910390f35b34801561071f57600080fd5b50610728611366565b6040516107359190614a8a565b60405180910390f35b34801561074a57600080fd5b5061075361136c565b6040516107609190614a8a565b60405180910390f35b34801561077557600080fd5b5061077e611372565b60405161078b9190614666565b60405180910390f35b6107ae60048036038101906107a9919061403e565b61139c565b005b3480156107bc57600080fd5b506107c5611c9c565b6040516107d291906146e8565b60405180910390f35b3480156107e757600080fd5b5061080260048036038101906107fd919061403e565b611d2e565b60405161080f9190614a8a565b60405180910390f35b34801561082457600080fd5b5061083f600480360381019061083a9190613e74565b611d4a565b005b34801561084d57600080fd5b50610856611d60565b60405161086391906146cd565b60405180910390f35b34801561087857600080fd5b50610881611d73565b60405161088e9190614a8a565b60405180910390f35b3480156108a357600080fd5b506108be60048036038101906108b9919061403e565b611d79565b005b3480156108cc57600080fd5b506108e760048036038101906108e29190613df1565b611dff565b005b3480156108f557600080fd5b50610910600480360381019061090b9190613fc6565b611e61565b005b34801561091e57600080fd5b506109396004803603810190610934919061403e565b611f0f565b005b34801561094757600080fd5b50610962600480360381019061095d919061403e565b611f95565b60405161096f91906146e8565b60405180910390f35b34801561098457600080fd5b5061099f600480360381019061099a9190613ef4565b612058565b005b3480156109ad57600080fd5b506109c860048036038101906109c3919061403e565b6122f7565b005b3480156109d657600080fd5b506109df61237d565b005b3480156109ed57600080fd5b50610a086004803603810190610a039190613d5e565b612415565b604051610a1591906146cd565b60405180910390f35b348015610a2a57600080fd5b50610a456004803603810190610a409190613d31565b6124a9565b604051610a529190614a8a565b60405180910390f35b348015610a6757600080fd5b50610a826004803603810190610a7d9190613d31565b6124f2565b005b348015610a9057600080fd5b50610aab6004803603810190610aa6919061403e565b6125ea565b005b6000610ab882612670565b9050919050565b6000601b60006001815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b2e5760019050610ba0565b601b60006002815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b9b5760029050610ba0565b600390505b919050565b606060008054610bb490614db2565b80601f0160208091040260200160405190810160405280929190818152602001828054610be090614db2565b8015610c2d5780601f10610c0257610100808354040283529160200191610c2d565b820191906000526020600020905b815481529060010190602001808311610c1057829003601f168201915b5050505050905090565b6000610c42826126ea565b610c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c78906148ea565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cc782611151565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2f9061498a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d57612756565b73ffffffffffffffffffffffffffffffffffffffff161480610d865750610d8581610d80612756565b612415565b5b610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc9061484a565b60405180910390fd5b610dcf838361275e565b505050565b610ddc612756565b73ffffffffffffffffffffffffffffffffffffffff16610dfa611372565b73ffffffffffffffffffffffffffffffffffffffff1614610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e479061490a565b60405180910390fd5b80600e8190555050565b6000600980549050905090565b600f5481565b600e5481565b60148054906101000a900460ff1681565b610e95610e8f612756565b82612817565b610ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecb906149ca565b60405180910390fd5b610edf8383836128f5565b505050565b610eec612756565b73ffffffffffffffffffffffffffffffffffffffff16610f0a611372565b73ffffffffffffffffffffffffffffffffffffffff1614610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f579061490a565b60405180910390fd5b8060188190555050565b6000610f7583611209565b8210610fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fad9061472a565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60185481565b60105481565b61103683838360405180602001604052806000815250611dff565b505050565b60175481565b600061104b610e5a565b821061108c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108390614a0a565b60405180910390fd5b600982815481106110a05761109f614f79565b5b90600052602060002001549050919050565b60155481565b6110c0612756565b73ffffffffffffffffffffffffffffffffffffffff166110de611372565b73ffffffffffffffffffffffffffffffffffffffff1614611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112b9061490a565b60405180910390fd5b6001601460156101000a81548160ff021916908315150217905550565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f19061488a565b60405180910390fd5b80915050919050565b60125481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561127a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112719061486a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112c9612756565b73ffffffffffffffffffffffffffffffffffffffff166112e7611372565b73ffffffffffffffffffffffffffffffffffffffff161461133d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113349061490a565b60405180910390fd5b6113476000612b51565b565b6000601a6000838152602001908152602001600020549050919050565b60165481565b60115481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b803373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461140b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114029061470a565b60405180910390fd5b60148054906101000a900460ff16611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f906148ca565b60405180910390fd5b61271081611464610e5a565b61146e9190614be7565b11156114af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a6906149aa565b60405180910390fd5b60003390506000429050601b60006001815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561152657506015548110155b8015611533575060175481105b1561161a57600283601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115859190614be7565b11156115c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bd906147aa565b60405180910390fd5b826012546115d49190614c6e565b3414611615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160c9061480a565b60405180910390fd5b61198e565b601b60006002815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561168757506016548110155b8015611694575060175481105b1561177b57600183601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116e69190614be7565b1115611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e906147aa565b60405180910390fd5b826012546117359190614c6e565b3414611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d9061480a565b60405180910390fd5b61198d565b60001515601b60006001815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514801561184f575060001515601b60006002815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b801561185d57506017548110155b801561186a575060185481105b1561195157600183601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118bc9190614be7565b11156118fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f4906147aa565b60405180910390fd5b8260135461190b9190614c6e565b341461194c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119439061480a565b60405180910390fd5b61198c565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611983906149ea565b60405180910390fd5b5b5b6002600b5414156119d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cb90614a6a565b60405180910390fd5b6002600b8190555060003390506000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051611a2990614603565b60006040518083038185875af1925050503d8060008114611a66576040519150601f19603f3d011682016040523d82523d6000602084013e611a6b565b606091505b5050905080611aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa690614a2a565b60405180910390fd5b60005b86811015611c8b576000611ac4612c17565b9050611ad08482612d73565b601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611b2090614e15565b9190505550601b60006001815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611bb857601a6000600181526020019081526020016000206000815480929190611bae90614e15565b9190505550611c77565b601b60006002815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611c4b57601a6000600281526020019081526020016000206000815480929190611c4190614e15565b9190505550611c76565b601a6000600381526020019081526020016000206000815480929190611c7090614e15565b91905055505b5b508080611c8390614e15565b915050611ab2565b5050506001600b8190555050505050565b606060018054611cab90614db2565b80601f0160208091040260200160405190810160405280929190818152602001828054611cd790614db2565b8015611d245780601f10611cf957610100808354040283529160200191611d24565b820191906000526020600020905b815481529060010190602001808311611d0757829003601f168201915b5050505050905090565b601c816127108110611d3f57600080fd5b016000915090505481565b611d5c611d55612756565b8383612d91565b5050565b601460159054906101000a900460ff1681565b60135481565b611d81612756565b73ffffffffffffffffffffffffffffffffffffffff16611d9f611372565b73ffffffffffffffffffffffffffffffffffffffff1614611df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dec9061490a565b60405180910390fd5b8060158190555050565b611e10611e0a612756565b83612817565b611e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e46906149ca565b60405180910390fd5b611e5b84848484612efe565b50505050565b611e69612756565b73ffffffffffffffffffffffffffffffffffffffff16611e87611372565b73ffffffffffffffffffffffffffffffffffffffff1614611edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed49061490a565b60405180910390fd5b81600d9080519060200190611ef3929190613a09565b5080600c9080519060200190611f0a929190613a09565b505050565b611f17612756565b73ffffffffffffffffffffffffffffffffffffffff16611f35611372565b73ffffffffffffffffffffffffffffffffffffffff1614611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f829061490a565b60405180910390fd5b8060168190555050565b6060611fa0826126ea565b611fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd69061494a565b60405180910390fd5b601460159054906101000a900460ff1661202557600d611ffe83612f5a565b60405160200161200f9291906145df565b6040516020818303038152906040529050612053565b600c61203083612f5a565b6040516020016120419291906145df565b60405160208183030381529060405290505b919050565b612060612756565b73ffffffffffffffffffffffffffffffffffffffff1661207e611372565b73ffffffffffffffffffffffffffffffffffffffff16146120d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cb9061490a565b60405180910390fd5b8051825114612118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210f90614a4a565b60405180910390fd5b60005b82518110156122f257600182828151811061213957612138614f79565b5b602002602001015114156121b357600e5460016010546121599190614be7565b111561219a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121919061496a565b60405180910390fd5b601060008154809291906121ad90614e15565b91905055505b60028282815181106121c8576121c7614f79565b5b6020026020010151141561224257600f5460016011546121e89190614be7565b1115612229576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122209061496a565b60405180910390fd5b6011600081548092919061223c90614e15565b91905055505b6001601b600084848151811061225b5761225a614f79565b5b60200260200101518152602001908152602001600020600085848151811061228657612285614f79565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806122ea90614e15565b91505061211b565b505050565b6122ff612756565b73ffffffffffffffffffffffffffffffffffffffff1661231d611372565b73ffffffffffffffffffffffffffffffffffffffff1614612373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236a9061490a565b60405180910390fd5b8060178190555050565b612385612756565b73ffffffffffffffffffffffffffffffffffffffff166123a3611372565b73ffffffffffffffffffffffffffffffffffffffff16146123f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f09061490a565b60405180910390fd5b60016014806101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6124fa612756565b73ffffffffffffffffffffffffffffffffffffffff16612518611372565b73ffffffffffffffffffffffffffffffffffffffff161461256e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125659061490a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d59061476a565b60405180910390fd5b6125e781612b51565b50565b6125f2612756565b73ffffffffffffffffffffffffffffffffffffffff16612610611372565b73ffffffffffffffffffffffffffffffffffffffff1614612666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265d9061490a565b60405180910390fd5b80600f8190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126e357506126e2826130bb565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127d183611151565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612822826126ea565b612861576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128589061482a565b60405180910390fd5b600061286c83611151565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128db57508373ffffffffffffffffffffffffffffffffffffffff166128c384610c37565b73ffffffffffffffffffffffffffffffffffffffff16145b806128ec57506128eb8185612415565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661291582611151565b73ffffffffffffffffffffffffffffffffffffffff161461296b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129629061492a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d2906147ca565b60405180910390fd5b6129e683838361319d565b6129f160008261275e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a419190614cc8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a989190614be7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008061272c54612710612c2b9190614cc8565b905060008161272c54334442604051602001612c4a9493929190614618565b6040516020818303038152906040528051906020012060001c612c6d9190614e8c565b9050600080601c836127108110612c8757612c86614f79565b5b015414612cac57601c826127108110612ca357612ca2614f79565b5b01549050612cb0565b8190505b6000601c600185612cc19190614cc8565b6127108110612cd357612cd2614f79565b5b01541415612d0757600183612ce89190614cc8565b601c836127108110612cfd57612cfc614f79565b5b0181905550612d45565b601c600184612d169190614cc8565b6127108110612d2857612d27614f79565b5b0154601c836127108110612d3f57612d3e614f79565b5b01819055505b61272c6000815480929190612d5990614e15565b9190505550600181612d6b9190614be7565b935050505090565b612d8d8282604051806020016040528060008152506131ad565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df7906147ea565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ef191906146cd565b60405180910390a3505050565b612f098484846128f5565b612f1584848484613208565b612f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4b9061474a565b60405180910390fd5b50505050565b60606000821415612fa2576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130b6565b600082905060005b60008214612fd4578080612fbd90614e15565b915050600a82612fcd9190614c3d565b9150612faa565b60008167ffffffffffffffff811115612ff057612fef614fa8565b5b6040519080825280601f01601f1916602001820160405280156130225781602001600182028036833780820191505090505b5090505b600085146130af5760018261303b9190614cc8565b9150600a8561304a9190614e8c565b60306130569190614be7565b60f81b81838151811061306c5761306b614f79565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130a89190614c3d565b9450613026565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061318657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061319657506131958261339f565b5b9050919050565b6131a8838383613409565b505050565b6131b7838361351d565b6131c46000848484613208565b613203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131fa9061474a565b60405180910390fd5b505050565b60006132298473ffffffffffffffffffffffffffffffffffffffff166136eb565b15613392578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613252612756565b8786866040518563ffffffff1660e01b81526004016132749493929190614681565b602060405180830381600087803b15801561328e57600080fd5b505af19250505080156132bf57506040513d601f19601f820116820180604052508101906132bc9190613f99565b60015b613342573d80600081146132ef576040519150601f19603f3d011682016040523d82523d6000602084013e6132f4565b606091505b5060008151141561333a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133319061474a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613397565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6134148383836136fe565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134575761345281613703565b613496565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461349557613494838261374c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134d9576134d4816138b9565b613518565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461351757613516828261398a565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561358d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613584906148aa565b60405180910390fd5b613596816126ea565b156135d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135cd9061478a565b60405180910390fd5b6135e26000838361319d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136329190614be7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161375984611209565b6137639190614cc8565b9050600060086000848152602001908152602001600020549050818114613848576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506138cd9190614cc8565b90506000600a60008481526020019081526020016000205490506000600983815481106138fd576138fc614f79565b5b90600052602060002001549050806009838154811061391f5761391e614f79565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061396e5761396d614f4a565b5b6001900381819060005260206000200160009055905550505050565b600061399583611209565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b828054613a1590614db2565b90600052602060002090601f016020900481019282613a375760008555613a7e565b82601f10613a5057805160ff1916838001178555613a7e565b82800160010185558215613a7e579182015b82811115613a7d578251825591602001919060010190613a62565b5b509050613a8b9190613a8f565b5090565b5b80821115613aa8576000816000905550600101613a90565b5090565b6000613abf613aba84614aca565b614aa5565b90508083825260208201905082856020860282011115613ae257613ae1614fdc565b5b60005b85811015613b125781613af88882613c10565b845260208401935060208301925050600181019050613ae5565b5050509392505050565b6000613b2f613b2a84614af6565b614aa5565b90508083825260208201905082856020860282011115613b5257613b51614fdc565b5b60005b85811015613b825781613b688882613d1c565b845260208401935060208301925050600181019050613b55565b5050509392505050565b6000613b9f613b9a84614b22565b614aa5565b905082815260208101848484011115613bbb57613bba614fe1565b5b613bc6848285614d70565b509392505050565b6000613be1613bdc84614b53565b614aa5565b905082815260208101848484011115613bfd57613bfc614fe1565b5b613c08848285614d70565b509392505050565b600081359050613c1f816156c7565b92915050565b600082601f830112613c3a57613c39614fd7565b5b8135613c4a848260208601613aac565b91505092915050565b600082601f830112613c6857613c67614fd7565b5b8135613c78848260208601613b1c565b91505092915050565b600081359050613c90816156de565b92915050565b600081359050613ca5816156f5565b92915050565b600081519050613cba816156f5565b92915050565b600082601f830112613cd557613cd4614fd7565b5b8135613ce5848260208601613b8c565b91505092915050565b600082601f830112613d0357613d02614fd7565b5b8135613d13848260208601613bce565b91505092915050565b600081359050613d2b8161570c565b92915050565b600060208284031215613d4757613d46614feb565b5b6000613d5584828501613c10565b91505092915050565b60008060408385031215613d7557613d74614feb565b5b6000613d8385828601613c10565b9250506020613d9485828601613c10565b9150509250929050565b600080600060608486031215613db757613db6614feb565b5b6000613dc586828701613c10565b9350506020613dd686828701613c10565b9250506040613de786828701613d1c565b9150509250925092565b60008060008060808587031215613e0b57613e0a614feb565b5b6000613e1987828801613c10565b9450506020613e2a87828801613c10565b9350506040613e3b87828801613d1c565b925050606085013567ffffffffffffffff811115613e5c57613e5b614fe6565b5b613e6887828801613cc0565b91505092959194509250565b60008060408385031215613e8b57613e8a614feb565b5b6000613e9985828601613c10565b9250506020613eaa85828601613c81565b9150509250929050565b60008060408385031215613ecb57613eca614feb565b5b6000613ed985828601613c10565b9250506020613eea85828601613d1c565b9150509250929050565b60008060408385031215613f0b57613f0a614feb565b5b600083013567ffffffffffffffff811115613f2957613f28614fe6565b5b613f3585828601613c25565b925050602083013567ffffffffffffffff811115613f5657613f55614fe6565b5b613f6285828601613c53565b9150509250929050565b600060208284031215613f8257613f81614feb565b5b6000613f9084828501613c96565b91505092915050565b600060208284031215613faf57613fae614feb565b5b6000613fbd84828501613cab565b91505092915050565b60008060408385031215613fdd57613fdc614feb565b5b600083013567ffffffffffffffff811115613ffb57613ffa614fe6565b5b61400785828601613cee565b925050602083013567ffffffffffffffff81111561402857614027614fe6565b5b61403485828601613cee565b9150509250929050565b60006020828403121561405457614053614feb565b5b600061406284828501613d1c565b91505092915050565b61407481614cfc565b82525050565b61408b61408682614cfc565b614e5e565b82525050565b61409a81614d0e565b82525050565b60006140ab82614b99565b6140b58185614baf565b93506140c5818560208601614d7f565b6140ce81614ff0565b840191505092915050565b60006140e482614ba4565b6140ee8185614bcb565b93506140fe818560208601614d7f565b61410781614ff0565b840191505092915050565b600061411d82614ba4565b6141278185614bdc565b9350614137818560208601614d7f565b80840191505092915050565b6000815461415081614db2565b61415a8186614bdc565b945060018216600081146141755760018114614186576141b9565b60ff198316865281860193506141b9565b61418f85614b84565b60005b838110156141b157815481890152600182019150602081019050614192565b838801955050505b50505092915050565b60006141cf601d83614bcb565b91506141da8261500e565b602082019050919050565b60006141f2602b83614bcb565b91506141fd82615037565b604082019050919050565b6000614215603283614bcb565b915061422082615086565b604082019050919050565b6000614238602683614bcb565b9150614243826150d5565b604082019050919050565b600061425b601c83614bcb565b915061426682615124565b602082019050919050565b600061427e601783614bcb565b91506142898261514d565b602082019050919050565b60006142a1602483614bcb565b91506142ac82615176565b604082019050919050565b60006142c4601983614bcb565b91506142cf826151c5565b602082019050919050565b60006142e7601f83614bcb565b91506142f2826151ee565b602082019050919050565b600061430a602c83614bcb565b915061431582615217565b604082019050919050565b600061432d603883614bcb565b915061433882615266565b604082019050919050565b6000614350602a83614bcb565b915061435b826152b5565b604082019050919050565b6000614373602983614bcb565b915061437e82615304565b604082019050919050565b6000614396602083614bcb565b91506143a182615353565b602082019050919050565b60006143b9601683614bcb565b91506143c48261537c565b602082019050919050565b60006143dc602c83614bcb565b91506143e7826153a5565b604082019050919050565b60006143ff602083614bcb565b915061440a826153f4565b602082019050919050565b6000614422602983614bcb565b915061442d8261541d565b604082019050919050565b6000614445602f83614bcb565b91506144508261546c565b604082019050919050565b6000614468601783614bcb565b9150614473826154bb565b602082019050919050565b600061448b602183614bcb565b9150614496826154e4565b604082019050919050565b60006144ae602f83614bcb565b91506144b982615533565b604082019050919050565b60006144d1600083614bc0565b91506144dc82615582565b600082019050919050565b60006144f4603183614bcb565b91506144ff82615585565b604082019050919050565b6000614517600a83614bcb565b9150614522826155d4565b602082019050919050565b600061453a602c83614bcb565b9150614545826155fd565b604082019050919050565b600061455d601a83614bcb565b91506145688261564c565b602082019050919050565b6000614580601783614bcb565b915061458b82615675565b602082019050919050565b60006145a3601f83614bcb565b91506145ae8261569e565b602082019050919050565b6145c281614d66565b82525050565b6145d96145d482614d66565b614e82565b82525050565b60006145eb8285614143565b91506145f78284614112565b91508190509392505050565b600061460e826144c4565b9150819050919050565b600061462482876145c8565b602082019150614634828661407a565b60148201915061464482856145c8565b60208201915061465482846145c8565b60208201915081905095945050505050565b600060208201905061467b600083018461406b565b92915050565b6000608082019050614696600083018761406b565b6146a3602083018661406b565b6146b060408301856145b9565b81810360608301526146c281846140a0565b905095945050505050565b60006020820190506146e26000830184614091565b92915050565b6000602082019050818103600083015261470281846140d9565b905092915050565b60006020820190508181036000830152614723816141c2565b9050919050565b60006020820190508181036000830152614743816141e5565b9050919050565b6000602082019050818103600083015261476381614208565b9050919050565b600060208201905081810360008301526147838161422b565b9050919050565b600060208201905081810360008301526147a38161424e565b9050919050565b600060208201905081810360008301526147c381614271565b9050919050565b600060208201905081810360008301526147e381614294565b9050919050565b60006020820190508181036000830152614803816142b7565b9050919050565b60006020820190508181036000830152614823816142da565b9050919050565b60006020820190508181036000830152614843816142fd565b9050919050565b6000602082019050818103600083015261486381614320565b9050919050565b6000602082019050818103600083015261488381614343565b9050919050565b600060208201905081810360008301526148a381614366565b9050919050565b600060208201905081810360008301526148c381614389565b9050919050565b600060208201905081810360008301526148e3816143ac565b9050919050565b60006020820190508181036000830152614903816143cf565b9050919050565b60006020820190508181036000830152614923816143f2565b9050919050565b6000602082019050818103600083015261494381614415565b9050919050565b6000602082019050818103600083015261496381614438565b9050919050565b600060208201905081810360008301526149838161445b565b9050919050565b600060208201905081810360008301526149a38161447e565b9050919050565b600060208201905081810360008301526149c3816144a1565b9050919050565b600060208201905081810360008301526149e3816144e7565b9050919050565b60006020820190508181036000830152614a038161450a565b9050919050565b60006020820190508181036000830152614a238161452d565b9050919050565b60006020820190508181036000830152614a4381614550565b9050919050565b60006020820190508181036000830152614a6381614573565b9050919050565b60006020820190508181036000830152614a8381614596565b9050919050565b6000602082019050614a9f60008301846145b9565b92915050565b6000614aaf614ac0565b9050614abb8282614de4565b919050565b6000604051905090565b600067ffffffffffffffff821115614ae557614ae4614fa8565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614b1157614b10614fa8565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614b3d57614b3c614fa8565b5b614b4682614ff0565b9050602081019050919050565b600067ffffffffffffffff821115614b6e57614b6d614fa8565b5b614b7782614ff0565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614bf282614d66565b9150614bfd83614d66565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c3257614c31614ebd565b5b828201905092915050565b6000614c4882614d66565b9150614c5383614d66565b925082614c6357614c62614eec565b5b828204905092915050565b6000614c7982614d66565b9150614c8483614d66565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614cbd57614cbc614ebd565b5b828202905092915050565b6000614cd382614d66565b9150614cde83614d66565b925082821015614cf157614cf0614ebd565b5b828203905092915050565b6000614d0782614d46565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d9d578082015181840152602081019050614d82565b83811115614dac576000848401525b50505050565b60006002820490506001821680614dca57607f821691505b60208210811415614dde57614ddd614f1b565b5b50919050565b614ded82614ff0565b810181811067ffffffffffffffff82111715614e0c57614e0b614fa8565b5b80604052505050565b6000614e2082614d66565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e5357614e52614ebd565b5b600182019050919050565b6000614e6982614e70565b9050919050565b6000614e7b82615001565b9050919050565b6000819050919050565b6000614e9782614d66565b9150614ea283614d66565b925082614eb257614eb1614eec565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f434f4e5452414354535f4e4f545f414c4c4f5745445f544f5f4d494e54000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43616e6e6f74206d696e742061626f7665206c696d6974000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f436f6e7472616374206973206e6f742061637469766500000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f43616e6e6f74206c6973742061626f7665206c696d6974000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d6178207075626c696360008201527f20737570706c79206f66204e4654730000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f6d696e74206572726f7200000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4661696c656420746f207769746864726177207061796d656e74000000000000600082015250565b7f53686f756c6420686176652073616d65206c656e677468000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6156d081614cfc565b81146156db57600080fd5b50565b6156e781614d0e565b81146156f257600080fd5b50565b6156fe81614d1a565b811461570957600080fd5b50565b61571581614d66565b811461572057600080fd5b5056fea264697066735822122017499e064b4bf72f6bc4133cd1c521ecdc2227aaca43536875a955db7f3bc76964736f6c63430008070033
Deployed Bytecode Sourcemap
45102:6418:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50654:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47062:247;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24047:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25606:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25129:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46087:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36996:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45419:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45382;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45728:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26356:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46726:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36664:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45873:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45456:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26766:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45840:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37186:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45780:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46363:70;;;;;;;;;;;;;:::i;:::-;;23741:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45526:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23471:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21058:103;;;;;;;;;;;;;:::i;:::-;;46941:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45810:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45491:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20407:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49220:663;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24216:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50875:28;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25899:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45755:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45590:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46441:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27022:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49891:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46534:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50043:391;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47317:648;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46627:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46283:72;;;;;;;;;;;;;:::i;:::-;;26125:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46819:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21316:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46185:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50654:212;50793:4;50822:36;50846:11;50822:23;:36::i;:::-;50815:43;;50654:212;;;:::o;47062:247::-;47115:7;47137:10;:13;47148:1;47137:13;;;;;;;;;;;:23;47151:8;47137:23;;;;;;;;;;;;;;;;;;;;;;;;;47134:168;;;47183:1;47176:8;;;;47134:168;47204:10;:13;47215:1;47204:13;;;;;;;;;;;:23;47218:8;47204:23;;;;;;;;;;;;;;;;;;;;;;;;;47201:101;;;47250:1;47243:8;;;;47201:101;47289:1;47282:8;;47062:247;;;;:::o;24047:100::-;24101:13;24134:5;24127:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24047:100;:::o;25606:221::-;25682:7;25710:16;25718:7;25710;:16::i;:::-;25702:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25795:15;:24;25811:7;25795:24;;;;;;;;;;;;;;;;;;;;;25788:31;;25606:221;;;:::o;25129:411::-;25210:13;25226:23;25241:7;25226:14;:23::i;:::-;25210:39;;25274:5;25268:11;;:2;:11;;;;25260:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25368:5;25352:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25377:37;25394:5;25401:12;:10;:12::i;:::-;25377:16;:37::i;:::-;25352:62;25330:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25511:21;25520:2;25524:7;25511:8;:21::i;:::-;25199:341;25129:411;;:::o;46087:90::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46165:4:::1;46147:15;:22;;;;46087:90:::0;:::o;36996:113::-;37057:7;37084:10;:17;;;;37077:24;;36996:113;:::o;45419:30::-;;;;:::o;45382:::-;;;;:::o;45728:20::-;;;;;;;;;;;;:::o;26356:339::-;26551:41;26570:12;:10;:12::i;:::-;26584:7;26551:18;:41::i;:::-;26543:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26659:28;26669:4;26675:2;26679:7;26659:9;:28::i;:::-;26356:339;;;:::o;46726:85::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46798:5:::1;46787:8;:16;;;;46726:85:::0;:::o;36664:256::-;36761:7;36797:23;36814:5;36797:16;:23::i;:::-;36789:5;:31;36781:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36886:12;:19;36899:5;36886:19;;;;;;;;;;;;;;;:26;36906:5;36886:26;;;;;;;;;;;;36879:33;;36664:256;;;;:::o;45873:23::-;;;;:::o;45456:28::-;;;;:::o;26766:185::-;26904:39;26921:4;26927:2;26931:7;26904:39;;;;;;;;;;;;:16;:39::i;:::-;26766:185;;;:::o;45840:26::-;;;;:::o;37186:233::-;37261:7;37297:30;:28;:30::i;:::-;37289:5;:38;37281:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37394:10;37405:5;37394:17;;;;;;;;:::i;:::-;;;;;;;;;;37387:24;;37186:233;;;:::o;45780:23::-;;;;:::o;46363:70::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46421:4:::1;46412:6;;:13;;;;;;;;;;;;;;;;;;46363:70::o:0;23741:239::-;23813:7;23833:13;23849:7;:16;23857:7;23849:16;;;;;;;;;;;;;;;;;;;;;23833:32;;23901:1;23884:19;;:5;:19;;;;23876:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23967:5;23960:12;;;23741:239;;;:::o;45526:45::-;;;;:::o;23471:208::-;23543:7;23588:1;23571:19;;:5;:19;;;;23563:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23655:9;:16;23665:5;23655:16;;;;;;;;;;;;;;;;23648:23;;23471:208;;;:::o;21058:103::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21123:30:::1;21150:1;21123:18;:30::i;:::-;21058:103::o:0;46941:113::-;46999:7;47025:11;:21;47037:8;47025:21;;;;;;;;;;;;47018:28;;46941:113;;;:::o;45810:23::-;;;;:::o;45491:28::-;;;;:::o;20407:87::-;20453:7;20480:6;;;;;;;;;;;20473:13;;20407:87;:::o;49220:663::-;49277:3;48036:10;48023:23;;:9;:23;;;48015:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;48098:8;;;;;;;;;;48090:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;45370:5;48168:3;48152:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:30;;48144:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;48245:16;48264:10;48245:29;;48285:12;48300:15;48285:30;;48329:10;:13;48340:1;48329:13;;;;;;;;;;;:23;48343:8;48329:23;;;;;;;;;;;;;;;;;;;;;;;;;:43;;;;;48364:8;;48356:4;:16;;48329:43;:65;;;;;48383:11;;48376:4;:18;48329:65;48326:867;;;48451:1;48444:3;48418:13;:23;48432:8;48418:23;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;:34;;48410:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;48528:3;48516:9;;:15;;;;:::i;:::-;48503:9;:28;48495:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;48326:867;;;48587:10;:13;48598:1;48587:13;;;;;;;;;;;:23;48601:8;48587:23;;;;;;;;;;;;;;;;;;;;;;;;;:43;;;;;48622:8;;48614:4;:16;;48587:43;:65;;;;;48641:11;;48634:4;:18;48587:65;48584:609;;;48709:1;48702:3;48676:13;:23;48690:8;48676:23;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;:34;;48668:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;48786:3;48774:9;;:15;;;;:::i;:::-;48761:9;:28;48753:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;48584:609;;;48872:5;48845:32;;:10;:13;48856:1;48845:13;;;;;;;;;;;:23;48859:8;48845:23;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;:68;;;;;48908:5;48881:32;;:10;:13;48892:1;48881:13;;;;;;;;;;;:23;48895:8;48881:23;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;48845:68;:91;;;;;48925:11;;48917:4;:19;;48845:91;:110;;;;;48947:8;;48940:4;:15;48845:110;48842:351;;;49012:1;49005:3;48979:13;:23;48993:8;48979:23;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;:34;;48971:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;49091:3;49077:11;;:17;;;;:::i;:::-;49064:9;:30;49056:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;48842:351;;;49161:20;;;;;;;;;;:::i;:::-;;;;;;;;48842:351;48584:609;48326:867;44155:1:::1;44753:7;;:19;;44745:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;44155:1;44886:7;:18;;;;49306:16:::2;49325:10;49306:29;;49347:12;49373:4;;;;;;;;;;;49365:18;;49391:9;49365:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49346:59;;;49424:7;49416:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;49477:9;49473:403;49496:3;49492:1;:7;49473:403;;;49520:15;49538:10;:8;:10::i;:::-;49520:28;;49564;49574:8;49584:7;49564:9;:28::i;:::-;49608:13;:23;49622:8;49608:23;;;;;;;;;;;;;;;;:25;;;;;;;;;:::i;:::-;;;;;;49652:10;:13;49663:1;49652:13;;;;;;;;;;;:23;49666:8;49652:23;;;;;;;;;;;;;;;;;;;;;;;;;49649:216;;;49695:11;:14;49707:1;49695:14;;;;;;;;;;;;:16;;;;;;;;;:::i;:::-;;;;;;49649:216;;;49735:10;:13;49746:1;49735:13;;;;;;;;;;;:23;49749:8;49735:23;;;;;;;;;;;;;;;;;;;;;;;;;49732:133;;;49778:11;:14;49790:1;49778:14;;;;;;;;;;;;:16;;;;;;;;;:::i;:::-;;;;;;49732:133;;;49833:11;:14;49845:1;49833:14;;;;;;;;;;;;:16;;;;;;;;;:::i;:::-;;;;;;49732:133;49649:216;49504:372;49500:3;;;;;:::i;:::-;;;;49473:403;;;;49295:588;;44111:1:::1;45065:7;:22;;;;48004:1208:::0;;49220:663;;:::o;24216:104::-;24272:13;24305:7;24298:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24216:104;:::o;50875:28::-;;;;;;;;;;;;;;;;;;;;:::o;25899:155::-;25994:52;26013:12;:10;:12::i;:::-;26027:8;26037;25994:18;:52::i;:::-;25899:155;;:::o;45755:18::-;;;;;;;;;;;;;:::o;45590:47::-;;;;:::o;46441:85::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46513:5:::1;46502:8;:16;;;;46441:85:::0;:::o;27022:328::-;27197:41;27216:12;:10;:12::i;:::-;27230:7;27197:18;:41::i;:::-;27189:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27303:39;27317:4;27323:2;27327:7;27336:5;27303:13;:39::i;:::-;27022:328;;;;:::o;49891:144::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49993:9:::1;49982:8;:20;;;;;;;;;;;;:::i;:::-;;50023:4;50013:7;:14;;;;;;;;;;;;:::i;:::-;;49891:144:::0;;:::o;46534:85::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46606:5:::1;46595:8;:16;;;;46534:85:::0;:::o;50043:391::-;50117:13;50151:17;50159:8;50151:7;:17::i;:::-;50143:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;50236:6;;;;;;;;;;;50231:196;;50290:8;50300:19;:8;:17;:19::i;:::-;50273:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50259:62;;;;50231:196;50385:7;50394:19;:8;:17;:19::i;:::-;50368:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50354:61;;50043:391;;;;:::o;47317:648::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47443:8:::1;:15;47424:8;:15;:34;47416:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;47501:9;47497:461;47520:8;:15;47516:1;:19;47497:461;;;47573:1;47558:8;47567:1;47558:11;;;;;;;;:::i;:::-;;;;;;;;:16;47555:160;;;47623:15;;47618:1;47602:13;;:17;;;;:::i;:::-;:36;;47594:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;47684:13;;:15;;;;;;;;;:::i;:::-;;;;;;47555:160;47747:1;47732:8;47741:1;47732:11;;;;;;;;:::i;:::-;;;;;;;;:16;47729:160;;;47797:15;;47792:1;47776:13;;:17;;;;:::i;:::-;:36;;47768:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;47858:13;;:15;;;;;;;;;:::i;:::-;;;;;;47729:160;47942:4;47903:10;:23;47914:8;47923:1;47914:11;;;;;;;;:::i;:::-;;;;;;;;47903:23;;;;;;;;;;;:36;47927:8;47936:1;47927:11;;;;;;;;:::i;:::-;;;;;;;;47903:36;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;47536:3;;;;;:::i;:::-;;;;47497:461;;;;47317:648:::0;;:::o;46627:91::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46705:5:::1;46691:11;:19;;;;46627:91:::0;:::o;46283:72::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46343:4:::1;46332:8;::::0;:15:::1;;;;;;;;;;;;;;;;;;46283:72::o:0;26125:164::-;26222:4;26246:18;:25;26265:5;26246:25;;;;;;;;;;;;;;;:35;26272:8;26246:35;;;;;;;;;;;;;;;;;;;;;;;;;26239:42;;26125:164;;;;:::o;46819:114::-;46876:7;46902:13;:23;46916:8;46902:23;;;;;;;;;;;;;;;;46895:30;;46819:114;;;:::o;21316:201::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21425:1:::1;21405:22;;:8;:22;;;;21397:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21481:28;21500:8;21481:18;:28::i;:::-;21316:201:::0;:::o;46185:90::-;20638:12;:10;:12::i;:::-;20627:23;;:7;:5;:7::i;:::-;:23;;;20619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46263:4:::1;46245:15;:22;;;;46185:90:::0;:::o;36356:224::-;36458:4;36497:35;36482:50;;;:11;:50;;;;:90;;;;36536:36;36560:11;36536:23;:36::i;:::-;36482:90;36475:97;;36356:224;;;:::o;28860:127::-;28925:4;28977:1;28949:30;;:7;:16;28957:7;28949:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28942:37;;28860:127;;;:::o;17289:98::-;17342:7;17369:10;17362:17;;17289:98;:::o;32842:174::-;32944:2;32917:15;:24;32933:7;32917:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33000:7;32996:2;32962:46;;32971:23;32986:7;32971:14;:23::i;:::-;32962:46;;;;;;;;;;;;32842:174;;:::o;29154:348::-;29247:4;29272:16;29280:7;29272;:16::i;:::-;29264:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29348:13;29364:23;29379:7;29364:14;:23::i;:::-;29348:39;;29417:5;29406:16;;:7;:16;;;:51;;;;29450:7;29426:31;;:20;29438:7;29426:11;:20::i;:::-;:31;;;29406:51;:87;;;;29461:32;29478:5;29485:7;29461:16;:32::i;:::-;29406:87;29398:96;;;29154:348;;;;:::o;32146:578::-;32305:4;32278:31;;:23;32293:7;32278:14;:23::i;:::-;:31;;;32270:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32388:1;32374:16;;:2;:16;;;;32366:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32444:39;32465:4;32471:2;32475:7;32444:20;:39::i;:::-;32548:29;32565:1;32569:7;32548:8;:29::i;:::-;32609:1;32590:9;:15;32600:4;32590:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32638:1;32621:9;:13;32631:2;32621:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32669:2;32650:7;:16;32658:7;32650:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32708:7;32704:2;32689:27;;32698:4;32689:27;;;;;;;;;;;;32146:578;;;:::o;21677:191::-;21751:16;21770:6;;;;;;;;;;;21751:25;;21796:8;21787:6;;:17;;;;;;;;;;;;;;;;;;21851:8;21820:40;;21841:8;21820:40;;;;;;;;;;;;21740:128;21677:191;:::o;50927:590::-;50964:4;50981:14;51008:5;;45370;50998:15;;;;:::i;:::-;50981:32;;51024:10;51127:9;51069:5;;51076:10;51088:16;51106:15;51052:70;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51042:81;;;;;;51037:87;;:99;;;;:::i;:::-;51024:112;;51147:10;51194:1;51176:7;51184:5;51176:14;;;;;;;:::i;:::-;;;;:19;51172:120;;51220:7;51228:5;51220:14;;;;;;;:::i;:::-;;;;51212:22;;51172:120;;;51275:5;51267:13;;51172:120;51335:1;51309:7;51329:1;51317:9;:13;;;;:::i;:::-;51309:22;;;;;;;:::i;:::-;;;;:27;51305:162;;;51382:1;51370:9;:13;;;;:::i;:::-;51353:7;51361:5;51353:14;;;;;;;:::i;:::-;;;:30;;;;51305:162;;;51433:7;51453:1;51441:9;:13;;;;:::i;:::-;51433:22;;;;;;;:::i;:::-;;;;51416:7;51424:5;51416:14;;;;;;;:::i;:::-;;;:39;;;;51305:162;51477:5;;:7;;;;;;;;;:::i;:::-;;;;;;51508:1;51502:5;:7;;;;:::i;:::-;51495:14;;;;;50927:590;:::o;29844:110::-;29920:26;29930:2;29934:7;29920:26;;;;;;;;;;;;:9;:26::i;:::-;29844:110;;:::o;33158:315::-;33313:8;33304:17;;:5;:17;;;;33296:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;33400:8;33362:18;:25;33381:5;33362:25;;;;;;;;;;;;;;;:35;33388:8;33362:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;33446:8;33424:41;;33439:5;33424:41;;;33456:8;33424:41;;;;;;:::i;:::-;;;;;;;;33158:315;;;:::o;28232:::-;28389:28;28399:4;28405:2;28409:7;28389:9;:28::i;:::-;28436:48;28459:4;28465:2;28469:7;28478:5;28436:22;:48::i;:::-;28428:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28232:315;;;;:::o;17729:723::-;17785:13;18015:1;18006:5;:10;18002:53;;;18033:10;;;;;;;;;;;;;;;;;;;;;18002:53;18065:12;18080:5;18065:20;;18096:14;18121:78;18136:1;18128:4;:9;18121:78;;18154:8;;;;;:::i;:::-;;;;18185:2;18177:10;;;;;:::i;:::-;;;18121:78;;;18209:19;18241:6;18231:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18209:39;;18259:154;18275:1;18266:5;:10;18259:154;;18303:1;18293:11;;;;;:::i;:::-;;;18370:2;18362:5;:10;;;;:::i;:::-;18349:2;:24;;;;:::i;:::-;18336:39;;18319:6;18326;18319:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18399:2;18390:11;;;;;:::i;:::-;;;18259:154;;;18437:6;18423:21;;;;;17729:723;;;;:::o;23102:305::-;23204:4;23256:25;23241:40;;;:11;:40;;;;:105;;;;23313:33;23298:48;;;:11;:48;;;;23241:105;:158;;;;23363:36;23387:11;23363:23;:36::i;:::-;23241:158;23221:178;;23102:305;;;:::o;50442:204::-;50593:45;50620:4;50626:2;50630:7;50593:26;:45::i;:::-;50442:204;;;:::o;30181:321::-;30311:18;30317:2;30321:7;30311:5;:18::i;:::-;30362:54;30393:1;30397:2;30401:7;30410:5;30362:22;:54::i;:::-;30340:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30181:321;;;:::o;34038:799::-;34193:4;34214:15;:2;:13;;;:15::i;:::-;34210:620;;;34266:2;34250:36;;;34287:12;:10;:12::i;:::-;34301:4;34307:7;34316:5;34250:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34246:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34509:1;34492:6;:13;:18;34488:272;;;34535:60;;;;;;;;;;:::i;:::-;;;;;;;;34488:272;34710:6;34704:13;34695:6;34691:2;34687:15;34680:38;34246:529;34383:41;;;34373:51;;;:6;:51;;;;34366:58;;;;;34210:620;34814:4;34807:11;;34038:799;;;;;;;:::o;7091:157::-;7176:4;7215:25;7200:40;;;:11;:40;;;;7193:47;;7091:157;;;:::o;38032:589::-;38176:45;38203:4;38209:2;38213:7;38176:26;:45::i;:::-;38254:1;38238:18;;:4;:18;;;38234:187;;;38273:40;38305:7;38273:31;:40::i;:::-;38234:187;;;38343:2;38335:10;;:4;:10;;;38331:90;;38362:47;38395:4;38401:7;38362:32;:47::i;:::-;38331:90;38234:187;38449:1;38435:16;;:2;:16;;;38431:183;;;38468:45;38505:7;38468:36;:45::i;:::-;38431:183;;;38541:4;38535:10;;:2;:10;;;38531:83;;38562:40;38590:2;38594:7;38562:27;:40::i;:::-;38531:83;38431:183;38032:589;;;:::o;30838:382::-;30932:1;30918:16;;:2;:16;;;;30910:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30991:16;30999:7;30991;:16::i;:::-;30990:17;30982:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31053:45;31082:1;31086:2;31090:7;31053:20;:45::i;:::-;31128:1;31111:9;:13;31121:2;31111:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31159:2;31140:7;:16;31148:7;31140:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31204:7;31200:2;31179:33;;31196:1;31179:33;;;;;;;;;;;;30838:382;;:::o;9418:387::-;9478:4;9686:12;9753:7;9741:20;9733:28;;9796:1;9789:4;:8;9782:15;;;9418:387;;;:::o;35409:126::-;;;;:::o;39344:164::-;39448:10;:17;;;;39421:15;:24;39437:7;39421:24;;;;;;;;;;;:44;;;;39476:10;39492:7;39476:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39344:164;:::o;40135:988::-;40401:22;40451:1;40426:22;40443:4;40426:16;:22::i;:::-;:26;;;;:::i;:::-;40401:51;;40463:18;40484:17;:26;40502:7;40484:26;;;;;;;;;;;;40463:47;;40631:14;40617:10;:28;40613:328;;40662:19;40684:12;:18;40697:4;40684:18;;;;;;;;;;;;;;;:34;40703:14;40684:34;;;;;;;;;;;;40662:56;;40768:11;40735:12;:18;40748:4;40735:18;;;;;;;;;;;;;;;:30;40754:10;40735:30;;;;;;;;;;;:44;;;;40885:10;40852:17;:30;40870:11;40852:30;;;;;;;;;;;:43;;;;40647:294;40613:328;41037:17;:26;41055:7;41037:26;;;;;;;;;;;41030:33;;;41081:12;:18;41094:4;41081:18;;;;;;;;;;;;;;;:34;41100:14;41081:34;;;;;;;;;;;41074:41;;;40216:907;;40135:988;;:::o;41418:1079::-;41671:22;41716:1;41696:10;:17;;;;:21;;;;:::i;:::-;41671:46;;41728:18;41749:15;:24;41765:7;41749:24;;;;;;;;;;;;41728:45;;42100:19;42122:10;42133:14;42122:26;;;;;;;;:::i;:::-;;;;;;;;;;42100:48;;42186:11;42161:10;42172;42161:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42297:10;42266:15;:28;42282:11;42266:28;;;;;;;;;;;:41;;;;42438:15;:24;42454:7;42438:24;;;;;;;;;;;42431:31;;;42473:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41489:1008;;;41418:1079;:::o;38922:221::-;39007:14;39024:20;39041:2;39024:16;:20::i;:::-;39007:37;;39082:7;39055:12;:16;39068:2;39055:16;;;;;;;;;;;;;;;:24;39072:6;39055:24;;;;;;;;;;;:34;;;;39129:6;39100:17;:26;39118:7;39100:26;;;;;;;;;;;:35;;;;38996:147;38922:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:137::-;3446:5;3484:6;3471:20;3462:29;;3500:32;3526:5;3500:32;:::i;:::-;3401:137;;;;:::o;3544:141::-;3600:5;3631:6;3625:13;3616:22;;3647:32;3673:5;3647:32;:::i;:::-;3544:141;;;;:::o;3704:338::-;3759:5;3808:3;3801:4;3793:6;3789:17;3785:27;3775:122;;3816:79;;:::i;:::-;3775:122;3933:6;3920:20;3958:78;4032:3;4024:6;4017:4;4009:6;4005:17;3958:78;:::i;:::-;3949:87;;3765:277;3704:338;;;;:::o;4062:340::-;4118:5;4167:3;4160:4;4152:6;4148:17;4144:27;4134:122;;4175:79;;:::i;:::-;4134:122;4292:6;4279:20;4317:79;4392:3;4384:6;4377:4;4369:6;4365:17;4317:79;:::i;:::-;4308:88;;4124:278;4062:340;;;;:::o;4408:139::-;4454:5;4492:6;4479:20;4470:29;;4508:33;4535:5;4508:33;:::i;:::-;4408:139;;;;:::o;4553:329::-;4612:6;4661:2;4649:9;4640:7;4636:23;4632:32;4629:119;;;4667:79;;:::i;:::-;4629:119;4787:1;4812:53;4857:7;4848:6;4837:9;4833:22;4812:53;:::i;:::-;4802:63;;4758:117;4553:329;;;;:::o;4888:474::-;4956:6;4964;5013:2;5001:9;4992:7;4988:23;4984:32;4981:119;;;5019:79;;:::i;:::-;4981:119;5139:1;5164:53;5209:7;5200:6;5189:9;5185:22;5164:53;:::i;:::-;5154:63;;5110:117;5266:2;5292:53;5337:7;5328:6;5317:9;5313:22;5292:53;:::i;:::-;5282:63;;5237:118;4888:474;;;;;:::o;5368:619::-;5445:6;5453;5461;5510:2;5498:9;5489:7;5485:23;5481:32;5478:119;;;5516:79;;:::i;:::-;5478:119;5636:1;5661:53;5706:7;5697:6;5686:9;5682:22;5661:53;:::i;:::-;5651:63;;5607:117;5763:2;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5734:118;5891:2;5917:53;5962:7;5953:6;5942:9;5938:22;5917:53;:::i;:::-;5907:63;;5862:118;5368:619;;;;;:::o;5993:943::-;6088:6;6096;6104;6112;6161:3;6149:9;6140:7;6136:23;6132:33;6129:120;;;6168:79;;:::i;:::-;6129:120;6288:1;6313:53;6358:7;6349:6;6338:9;6334:22;6313:53;:::i;:::-;6303:63;;6259:117;6415:2;6441:53;6486:7;6477:6;6466:9;6462:22;6441:53;:::i;:::-;6431:63;;6386:118;6543:2;6569:53;6614:7;6605:6;6594:9;6590:22;6569:53;:::i;:::-;6559:63;;6514:118;6699:2;6688:9;6684:18;6671:32;6730:18;6722:6;6719:30;6716:117;;;6752:79;;:::i;:::-;6716:117;6857:62;6911:7;6902:6;6891:9;6887:22;6857:62;:::i;:::-;6847:72;;6642:287;5993:943;;;;;;;:::o;6942:468::-;7007:6;7015;7064:2;7052:9;7043:7;7039:23;7035:32;7032:119;;;7070:79;;:::i;:::-;7032:119;7190:1;7215:53;7260:7;7251:6;7240:9;7236:22;7215:53;:::i;:::-;7205:63;;7161:117;7317:2;7343:50;7385:7;7376:6;7365:9;7361:22;7343:50;:::i;:::-;7333:60;;7288:115;6942:468;;;;;:::o;7416:474::-;7484:6;7492;7541:2;7529:9;7520:7;7516:23;7512:32;7509:119;;;7547:79;;:::i;:::-;7509:119;7667:1;7692:53;7737:7;7728:6;7717:9;7713:22;7692:53;:::i;:::-;7682:63;;7638:117;7794:2;7820:53;7865:7;7856:6;7845:9;7841:22;7820:53;:::i;:::-;7810:63;;7765:118;7416:474;;;;;:::o;7896:894::-;8014:6;8022;8071:2;8059:9;8050:7;8046:23;8042:32;8039:119;;;8077:79;;:::i;:::-;8039:119;8225:1;8214:9;8210:17;8197:31;8255:18;8247:6;8244:30;8241:117;;;8277:79;;:::i;:::-;8241:117;8382:78;8452:7;8443:6;8432:9;8428:22;8382:78;:::i;:::-;8372:88;;8168:302;8537:2;8526:9;8522:18;8509:32;8568:18;8560:6;8557:30;8554:117;;;8590:79;;:::i;:::-;8554:117;8695:78;8765:7;8756:6;8745:9;8741:22;8695:78;:::i;:::-;8685:88;;8480:303;7896:894;;;;;:::o;8796:327::-;8854:6;8903:2;8891:9;8882:7;8878:23;8874:32;8871:119;;;8909:79;;:::i;:::-;8871:119;9029:1;9054:52;9098:7;9089:6;9078:9;9074:22;9054:52;:::i;:::-;9044:62;;9000:116;8796:327;;;;:::o;9129:349::-;9198:6;9247:2;9235:9;9226:7;9222:23;9218:32;9215:119;;;9253:79;;:::i;:::-;9215:119;9373:1;9398:63;9453:7;9444:6;9433:9;9429:22;9398:63;:::i;:::-;9388:73;;9344:127;9129:349;;;;:::o;9484:834::-;9572:6;9580;9629:2;9617:9;9608:7;9604:23;9600:32;9597:119;;;9635:79;;:::i;:::-;9597:119;9783:1;9772:9;9768:17;9755:31;9813:18;9805:6;9802:30;9799:117;;;9835:79;;:::i;:::-;9799:117;9940:63;9995:7;9986:6;9975:9;9971:22;9940:63;:::i;:::-;9930:73;;9726:287;10080:2;10069:9;10065:18;10052:32;10111:18;10103:6;10100:30;10097:117;;;10133:79;;:::i;:::-;10097:117;10238:63;10293:7;10284:6;10273:9;10269:22;10238:63;:::i;:::-;10228:73;;10023:288;9484:834;;;;;:::o;10324:329::-;10383:6;10432:2;10420:9;10411:7;10407:23;10403:32;10400:119;;;10438:79;;:::i;:::-;10400:119;10558:1;10583:53;10628:7;10619:6;10608:9;10604:22;10583:53;:::i;:::-;10573:63;;10529:117;10324:329;;;;:::o;10659:118::-;10746:24;10764:5;10746:24;:::i;:::-;10741:3;10734:37;10659:118;;:::o;10783:157::-;10888:45;10908:24;10926:5;10908:24;:::i;:::-;10888:45;:::i;:::-;10883:3;10876:58;10783:157;;:::o;10946:109::-;11027:21;11042:5;11027:21;:::i;:::-;11022:3;11015:34;10946:109;;:::o;11061:360::-;11147:3;11175:38;11207:5;11175:38;:::i;:::-;11229:70;11292:6;11287:3;11229:70;:::i;:::-;11222:77;;11308:52;11353:6;11348:3;11341:4;11334:5;11330:16;11308:52;:::i;:::-;11385:29;11407:6;11385:29;:::i;:::-;11380:3;11376:39;11369:46;;11151:270;11061:360;;;;:::o;11427:364::-;11515:3;11543:39;11576:5;11543:39;:::i;:::-;11598:71;11662:6;11657:3;11598:71;:::i;:::-;11591:78;;11678:52;11723:6;11718:3;11711:4;11704:5;11700:16;11678:52;:::i;:::-;11755:29;11777:6;11755:29;:::i;:::-;11750:3;11746:39;11739:46;;11519:272;11427:364;;;;:::o;11797:377::-;11903:3;11931:39;11964:5;11931:39;:::i;:::-;11986:89;12068:6;12063:3;11986:89;:::i;:::-;11979:96;;12084:52;12129:6;12124:3;12117:4;12110:5;12106:16;12084:52;:::i;:::-;12161:6;12156:3;12152:16;12145:23;;11907:267;11797:377;;;;:::o;12204:845::-;12307:3;12344:5;12338:12;12373:36;12399:9;12373:36;:::i;:::-;12425:89;12507:6;12502:3;12425:89;:::i;:::-;12418:96;;12545:1;12534:9;12530:17;12561:1;12556:137;;;;12707:1;12702:341;;;;12523:520;;12556:137;12640:4;12636:9;12625;12621:25;12616:3;12609:38;12676:6;12671:3;12667:16;12660:23;;12556:137;;12702:341;12769:38;12801:5;12769:38;:::i;:::-;12829:1;12843:154;12857:6;12854:1;12851:13;12843:154;;;12931:7;12925:14;12921:1;12916:3;12912:11;12905:35;12981:1;12972:7;12968:15;12957:26;;12879:4;12876:1;12872:12;12867:17;;12843:154;;;13026:6;13021:3;13017:16;13010:23;;12709:334;;12523:520;;12311:738;;12204:845;;;;:::o;13055:366::-;13197:3;13218:67;13282:2;13277:3;13218:67;:::i;:::-;13211:74;;13294:93;13383:3;13294:93;:::i;:::-;13412:2;13407:3;13403:12;13396:19;;13055:366;;;:::o;13427:::-;13569:3;13590:67;13654:2;13649:3;13590:67;:::i;:::-;13583:74;;13666:93;13755:3;13666:93;:::i;:::-;13784:2;13779:3;13775:12;13768:19;;13427:366;;;:::o;13799:::-;13941:3;13962:67;14026:2;14021:3;13962:67;:::i;:::-;13955:74;;14038:93;14127:3;14038:93;:::i;:::-;14156:2;14151:3;14147:12;14140:19;;13799:366;;;:::o;14171:::-;14313:3;14334:67;14398:2;14393:3;14334:67;:::i;:::-;14327:74;;14410:93;14499:3;14410:93;:::i;:::-;14528:2;14523:3;14519:12;14512:19;;14171:366;;;:::o;14543:::-;14685:3;14706:67;14770:2;14765:3;14706:67;:::i;:::-;14699:74;;14782:93;14871:3;14782:93;:::i;:::-;14900:2;14895:3;14891:12;14884:19;;14543:366;;;:::o;14915:::-;15057:3;15078:67;15142:2;15137:3;15078:67;:::i;:::-;15071:74;;15154:93;15243:3;15154:93;:::i;:::-;15272:2;15267:3;15263:12;15256:19;;14915:366;;;:::o;15287:::-;15429:3;15450:67;15514:2;15509:3;15450:67;:::i;:::-;15443:74;;15526:93;15615:3;15526:93;:::i;:::-;15644:2;15639:3;15635:12;15628:19;;15287:366;;;:::o;15659:::-;15801:3;15822:67;15886:2;15881:3;15822:67;:::i;:::-;15815:74;;15898:93;15987:3;15898:93;:::i;:::-;16016:2;16011:3;16007:12;16000:19;;15659:366;;;:::o;16031:::-;16173:3;16194:67;16258:2;16253:3;16194:67;:::i;:::-;16187:74;;16270:93;16359:3;16270:93;:::i;:::-;16388:2;16383:3;16379:12;16372:19;;16031:366;;;:::o;16403:::-;16545:3;16566:67;16630:2;16625:3;16566:67;:::i;:::-;16559:74;;16642:93;16731:3;16642:93;:::i;:::-;16760:2;16755:3;16751:12;16744:19;;16403:366;;;:::o;16775:::-;16917:3;16938:67;17002:2;16997:3;16938:67;:::i;:::-;16931:74;;17014:93;17103:3;17014:93;:::i;:::-;17132:2;17127:3;17123:12;17116:19;;16775:366;;;:::o;17147:::-;17289:3;17310:67;17374:2;17369:3;17310:67;:::i;:::-;17303:74;;17386:93;17475:3;17386:93;:::i;:::-;17504:2;17499:3;17495:12;17488:19;;17147:366;;;:::o;17519:::-;17661:3;17682:67;17746:2;17741:3;17682:67;:::i;:::-;17675:74;;17758:93;17847:3;17758:93;:::i;:::-;17876:2;17871:3;17867:12;17860:19;;17519:366;;;:::o;17891:::-;18033:3;18054:67;18118:2;18113:3;18054:67;:::i;:::-;18047:74;;18130:93;18219:3;18130:93;:::i;:::-;18248:2;18243:3;18239:12;18232:19;;17891:366;;;:::o;18263:::-;18405:3;18426:67;18490:2;18485:3;18426:67;:::i;:::-;18419:74;;18502:93;18591:3;18502:93;:::i;:::-;18620:2;18615:3;18611:12;18604:19;;18263:366;;;:::o;18635:::-;18777:3;18798:67;18862:2;18857:3;18798:67;:::i;:::-;18791:74;;18874:93;18963:3;18874:93;:::i;:::-;18992:2;18987:3;18983:12;18976:19;;18635:366;;;:::o;19007:::-;19149:3;19170:67;19234:2;19229:3;19170:67;:::i;:::-;19163:74;;19246:93;19335:3;19246:93;:::i;:::-;19364:2;19359:3;19355:12;19348:19;;19007:366;;;:::o;19379:::-;19521:3;19542:67;19606:2;19601:3;19542:67;:::i;:::-;19535:74;;19618:93;19707:3;19618:93;:::i;:::-;19736:2;19731:3;19727:12;19720:19;;19379:366;;;:::o;19751:::-;19893:3;19914:67;19978:2;19973:3;19914:67;:::i;:::-;19907:74;;19990:93;20079:3;19990:93;:::i;:::-;20108:2;20103:3;20099:12;20092:19;;19751:366;;;:::o;20123:::-;20265:3;20286:67;20350:2;20345:3;20286:67;:::i;:::-;20279:74;;20362:93;20451:3;20362:93;:::i;:::-;20480:2;20475:3;20471:12;20464:19;;20123:366;;;:::o;20495:::-;20637:3;20658:67;20722:2;20717:3;20658:67;:::i;:::-;20651:74;;20734:93;20823:3;20734:93;:::i;:::-;20852:2;20847:3;20843:12;20836:19;;20495:366;;;:::o;20867:::-;21009:3;21030:67;21094:2;21089:3;21030:67;:::i;:::-;21023:74;;21106:93;21195:3;21106:93;:::i;:::-;21224:2;21219:3;21215:12;21208:19;;20867:366;;;:::o;21239:398::-;21398:3;21419:83;21500:1;21495:3;21419:83;:::i;:::-;21412:90;;21511:93;21600:3;21511:93;:::i;:::-;21629:1;21624:3;21620:11;21613:18;;21239:398;;;:::o;21643:366::-;21785:3;21806:67;21870:2;21865:3;21806:67;:::i;:::-;21799:74;;21882:93;21971:3;21882:93;:::i;:::-;22000:2;21995:3;21991:12;21984:19;;21643:366;;;:::o;22015:::-;22157:3;22178:67;22242:2;22237:3;22178:67;:::i;:::-;22171:74;;22254:93;22343:3;22254:93;:::i;:::-;22372:2;22367:3;22363:12;22356:19;;22015:366;;;:::o;22387:::-;22529:3;22550:67;22614:2;22609:3;22550:67;:::i;:::-;22543:74;;22626:93;22715:3;22626:93;:::i;:::-;22744:2;22739:3;22735:12;22728:19;;22387:366;;;:::o;22759:::-;22901:3;22922:67;22986:2;22981:3;22922:67;:::i;:::-;22915:74;;22998:93;23087:3;22998:93;:::i;:::-;23116:2;23111:3;23107:12;23100:19;;22759:366;;;:::o;23131:::-;23273:3;23294:67;23358:2;23353:3;23294:67;:::i;:::-;23287:74;;23370:93;23459:3;23370:93;:::i;:::-;23488:2;23483:3;23479:12;23472:19;;23131:366;;;:::o;23503:::-;23645:3;23666:67;23730:2;23725:3;23666:67;:::i;:::-;23659:74;;23742:93;23831:3;23742:93;:::i;:::-;23860:2;23855:3;23851:12;23844:19;;23503:366;;;:::o;23875:118::-;23962:24;23980:5;23962:24;:::i;:::-;23957:3;23950:37;23875:118;;:::o;23999:157::-;24104:45;24124:24;24142:5;24124:24;:::i;:::-;24104:45;:::i;:::-;24099:3;24092:58;23999:157;;:::o;24162:429::-;24339:3;24361:92;24449:3;24440:6;24361:92;:::i;:::-;24354:99;;24470:95;24561:3;24552:6;24470:95;:::i;:::-;24463:102;;24582:3;24575:10;;24162:429;;;;;:::o;24597:379::-;24781:3;24803:147;24946:3;24803:147;:::i;:::-;24796:154;;24967:3;24960:10;;24597:379;;;:::o;24982:679::-;25178:3;25193:75;25264:3;25255:6;25193:75;:::i;:::-;25293:2;25288:3;25284:12;25277:19;;25306:75;25377:3;25368:6;25306:75;:::i;:::-;25406:2;25401:3;25397:12;25390:19;;25419:75;25490:3;25481:6;25419:75;:::i;:::-;25519:2;25514:3;25510:12;25503:19;;25532:75;25603:3;25594:6;25532:75;:::i;:::-;25632:2;25627:3;25623:12;25616:19;;25652:3;25645:10;;24982:679;;;;;;;:::o;25667:222::-;25760:4;25798:2;25787:9;25783:18;25775:26;;25811:71;25879:1;25868:9;25864:17;25855:6;25811:71;:::i;:::-;25667:222;;;;:::o;25895:640::-;26090:4;26128:3;26117:9;26113:19;26105:27;;26142:71;26210:1;26199:9;26195:17;26186:6;26142:71;:::i;:::-;26223:72;26291:2;26280:9;26276:18;26267:6;26223:72;:::i;:::-;26305;26373:2;26362:9;26358:18;26349:6;26305:72;:::i;:::-;26424:9;26418:4;26414:20;26409:2;26398:9;26394:18;26387:48;26452:76;26523:4;26514:6;26452:76;:::i;:::-;26444:84;;25895:640;;;;;;;:::o;26541:210::-;26628:4;26666:2;26655:9;26651:18;26643:26;;26679:65;26741:1;26730:9;26726:17;26717:6;26679:65;:::i;:::-;26541:210;;;;:::o;26757:313::-;26870:4;26908:2;26897:9;26893:18;26885:26;;26957:9;26951:4;26947:20;26943:1;26932:9;26928:17;26921:47;26985:78;27058:4;27049:6;26985:78;:::i;:::-;26977:86;;26757:313;;;;:::o;27076:419::-;27242:4;27280:2;27269:9;27265:18;27257:26;;27329:9;27323:4;27319:20;27315:1;27304:9;27300:17;27293:47;27357:131;27483:4;27357:131;:::i;:::-;27349:139;;27076:419;;;:::o;27501:::-;27667:4;27705:2;27694:9;27690:18;27682:26;;27754:9;27748:4;27744:20;27740:1;27729:9;27725:17;27718:47;27782:131;27908:4;27782:131;:::i;:::-;27774:139;;27501:419;;;:::o;27926:::-;28092:4;28130:2;28119:9;28115:18;28107:26;;28179:9;28173:4;28169:20;28165:1;28154:9;28150:17;28143:47;28207:131;28333:4;28207:131;:::i;:::-;28199:139;;27926:419;;;:::o;28351:::-;28517:4;28555:2;28544:9;28540:18;28532:26;;28604:9;28598:4;28594:20;28590:1;28579:9;28575:17;28568:47;28632:131;28758:4;28632:131;:::i;:::-;28624:139;;28351:419;;;:::o;28776:::-;28942:4;28980:2;28969:9;28965:18;28957:26;;29029:9;29023:4;29019:20;29015:1;29004:9;29000:17;28993:47;29057:131;29183:4;29057:131;:::i;:::-;29049:139;;28776:419;;;:::o;29201:::-;29367:4;29405:2;29394:9;29390:18;29382:26;;29454:9;29448:4;29444:20;29440:1;29429:9;29425:17;29418:47;29482:131;29608:4;29482:131;:::i;:::-;29474:139;;29201:419;;;:::o;29626:::-;29792:4;29830:2;29819:9;29815:18;29807:26;;29879:9;29873:4;29869:20;29865:1;29854:9;29850:17;29843:47;29907:131;30033:4;29907:131;:::i;:::-;29899:139;;29626:419;;;:::o;30051:::-;30217:4;30255:2;30244:9;30240:18;30232:26;;30304:9;30298:4;30294:20;30290:1;30279:9;30275:17;30268:47;30332:131;30458:4;30332:131;:::i;:::-;30324:139;;30051:419;;;:::o;30476:::-;30642:4;30680:2;30669:9;30665:18;30657:26;;30729:9;30723:4;30719:20;30715:1;30704:9;30700:17;30693:47;30757:131;30883:4;30757:131;:::i;:::-;30749:139;;30476:419;;;:::o;30901:::-;31067:4;31105:2;31094:9;31090:18;31082:26;;31154:9;31148:4;31144:20;31140:1;31129:9;31125:17;31118:47;31182:131;31308:4;31182:131;:::i;:::-;31174:139;;30901:419;;;:::o;31326:::-;31492:4;31530:2;31519:9;31515:18;31507:26;;31579:9;31573:4;31569:20;31565:1;31554:9;31550:17;31543:47;31607:131;31733:4;31607:131;:::i;:::-;31599:139;;31326:419;;;:::o;31751:::-;31917:4;31955:2;31944:9;31940:18;31932:26;;32004:9;31998:4;31994:20;31990:1;31979:9;31975:17;31968:47;32032:131;32158:4;32032:131;:::i;:::-;32024:139;;31751:419;;;:::o;32176:::-;32342:4;32380:2;32369:9;32365:18;32357:26;;32429:9;32423:4;32419:20;32415:1;32404:9;32400:17;32393:47;32457:131;32583:4;32457:131;:::i;:::-;32449:139;;32176:419;;;:::o;32601:::-;32767:4;32805:2;32794:9;32790:18;32782:26;;32854:9;32848:4;32844:20;32840:1;32829:9;32825:17;32818:47;32882:131;33008:4;32882:131;:::i;:::-;32874:139;;32601:419;;;:::o;33026:::-;33192:4;33230:2;33219:9;33215:18;33207:26;;33279:9;33273:4;33269:20;33265:1;33254:9;33250:17;33243:47;33307:131;33433:4;33307:131;:::i;:::-;33299:139;;33026:419;;;:::o;33451:::-;33617:4;33655:2;33644:9;33640:18;33632:26;;33704:9;33698:4;33694:20;33690:1;33679:9;33675:17;33668:47;33732:131;33858:4;33732:131;:::i;:::-;33724:139;;33451:419;;;:::o;33876:::-;34042:4;34080:2;34069:9;34065:18;34057:26;;34129:9;34123:4;34119:20;34115:1;34104:9;34100:17;34093:47;34157:131;34283:4;34157:131;:::i;:::-;34149:139;;33876:419;;;:::o;34301:::-;34467:4;34505:2;34494:9;34490:18;34482:26;;34554:9;34548:4;34544:20;34540:1;34529:9;34525:17;34518:47;34582:131;34708:4;34582:131;:::i;:::-;34574:139;;34301:419;;;:::o;34726:::-;34892:4;34930:2;34919:9;34915:18;34907:26;;34979:9;34973:4;34969:20;34965:1;34954:9;34950:17;34943:47;35007:131;35133:4;35007:131;:::i;:::-;34999:139;;34726:419;;;:::o;35151:::-;35317:4;35355:2;35344:9;35340:18;35332:26;;35404:9;35398:4;35394:20;35390:1;35379:9;35375:17;35368:47;35432:131;35558:4;35432:131;:::i;:::-;35424:139;;35151:419;;;:::o;35576:::-;35742:4;35780:2;35769:9;35765:18;35757:26;;35829:9;35823:4;35819:20;35815:1;35804:9;35800:17;35793:47;35857:131;35983:4;35857:131;:::i;:::-;35849:139;;35576:419;;;:::o;36001:::-;36167:4;36205:2;36194:9;36190:18;36182:26;;36254:9;36248:4;36244:20;36240:1;36229:9;36225:17;36218:47;36282:131;36408:4;36282:131;:::i;:::-;36274:139;;36001:419;;;:::o;36426:::-;36592:4;36630:2;36619:9;36615:18;36607:26;;36679:9;36673:4;36669:20;36665:1;36654:9;36650:17;36643:47;36707:131;36833:4;36707:131;:::i;:::-;36699:139;;36426:419;;;:::o;36851:::-;37017:4;37055:2;37044:9;37040:18;37032:26;;37104:9;37098:4;37094:20;37090:1;37079:9;37075:17;37068:47;37132:131;37258:4;37132:131;:::i;:::-;37124:139;;36851:419;;;:::o;37276:::-;37442:4;37480:2;37469:9;37465:18;37457:26;;37529:9;37523:4;37519:20;37515:1;37504:9;37500:17;37493:47;37557:131;37683:4;37557:131;:::i;:::-;37549:139;;37276:419;;;:::o;37701:::-;37867:4;37905:2;37894:9;37890:18;37882:26;;37954:9;37948:4;37944:20;37940:1;37929:9;37925:17;37918:47;37982:131;38108:4;37982:131;:::i;:::-;37974:139;;37701:419;;;:::o;38126:::-;38292:4;38330:2;38319:9;38315:18;38307:26;;38379:9;38373:4;38369:20;38365:1;38354:9;38350:17;38343:47;38407:131;38533:4;38407:131;:::i;:::-;38399:139;;38126:419;;;:::o;38551:::-;38717:4;38755:2;38744:9;38740:18;38732:26;;38804:9;38798:4;38794:20;38790:1;38779:9;38775:17;38768:47;38832:131;38958:4;38832:131;:::i;:::-;38824:139;;38551:419;;;:::o;38976:222::-;39069:4;39107:2;39096:9;39092:18;39084:26;;39120:71;39188:1;39177:9;39173:17;39164:6;39120:71;:::i;:::-;38976:222;;;;:::o;39204:129::-;39238:6;39265:20;;:::i;:::-;39255:30;;39294:33;39322:4;39314:6;39294:33;:::i;:::-;39204:129;;;:::o;39339:75::-;39372:6;39405:2;39399:9;39389:19;;39339:75;:::o;39420:311::-;39497:4;39587:18;39579:6;39576:30;39573:56;;;39609:18;;:::i;:::-;39573:56;39659:4;39651:6;39647:17;39639:25;;39719:4;39713;39709:15;39701:23;;39420:311;;;:::o;39737:::-;39814:4;39904:18;39896:6;39893:30;39890:56;;;39926:18;;:::i;:::-;39890:56;39976:4;39968:6;39964:17;39956:25;;40036:4;40030;40026:15;40018:23;;39737:311;;;:::o;40054:307::-;40115:4;40205:18;40197:6;40194:30;40191:56;;;40227:18;;:::i;:::-;40191:56;40265:29;40287:6;40265:29;:::i;:::-;40257:37;;40349:4;40343;40339:15;40331:23;;40054:307;;;:::o;40367:308::-;40429:4;40519:18;40511:6;40508:30;40505:56;;;40541:18;;:::i;:::-;40505:56;40579:29;40601:6;40579:29;:::i;:::-;40571:37;;40663:4;40657;40653:15;40645:23;;40367:308;;;:::o;40681:141::-;40730:4;40753:3;40745:11;;40776:3;40773:1;40766:14;40810:4;40807:1;40797:18;40789:26;;40681:141;;;:::o;40828:98::-;40879:6;40913:5;40907:12;40897:22;;40828:98;;;:::o;40932:99::-;40984:6;41018:5;41012:12;41002:22;;40932:99;;;:::o;41037:168::-;41120:11;41154:6;41149:3;41142:19;41194:4;41189:3;41185:14;41170:29;;41037:168;;;;:::o;41211:147::-;41312:11;41349:3;41334:18;;41211:147;;;;:::o;41364:169::-;41448:11;41482:6;41477:3;41470:19;41522:4;41517:3;41513:14;41498:29;;41364:169;;;;:::o;41539:148::-;41641:11;41678:3;41663:18;;41539:148;;;;:::o;41693:305::-;41733:3;41752:20;41770:1;41752:20;:::i;:::-;41747:25;;41786:20;41804:1;41786:20;:::i;:::-;41781:25;;41940:1;41872:66;41868:74;41865:1;41862:81;41859:107;;;41946:18;;:::i;:::-;41859:107;41990:1;41987;41983:9;41976:16;;41693:305;;;;:::o;42004:185::-;42044:1;42061:20;42079:1;42061:20;:::i;:::-;42056:25;;42095:20;42113:1;42095:20;:::i;:::-;42090:25;;42134:1;42124:35;;42139:18;;:::i;:::-;42124:35;42181:1;42178;42174:9;42169:14;;42004:185;;;;:::o;42195:348::-;42235:7;42258:20;42276:1;42258:20;:::i;:::-;42253:25;;42292:20;42310:1;42292:20;:::i;:::-;42287:25;;42480:1;42412:66;42408:74;42405:1;42402:81;42397:1;42390:9;42383:17;42379:105;42376:131;;;42487:18;;:::i;:::-;42376:131;42535:1;42532;42528:9;42517:20;;42195:348;;;;:::o;42549:191::-;42589:4;42609:20;42627:1;42609:20;:::i;:::-;42604:25;;42643:20;42661:1;42643:20;:::i;:::-;42638:25;;42682:1;42679;42676:8;42673:34;;;42687:18;;:::i;:::-;42673:34;42732:1;42729;42725:9;42717:17;;42549:191;;;;:::o;42746:96::-;42783:7;42812:24;42830:5;42812:24;:::i;:::-;42801:35;;42746:96;;;:::o;42848:90::-;42882:7;42925:5;42918:13;42911:21;42900:32;;42848:90;;;:::o;42944:149::-;42980:7;43020:66;43013:5;43009:78;42998:89;;42944:149;;;:::o;43099:126::-;43136:7;43176:42;43169:5;43165:54;43154:65;;43099:126;;;:::o;43231:77::-;43268:7;43297:5;43286:16;;43231:77;;;:::o;43314:154::-;43398:6;43393:3;43388;43375:30;43460:1;43451:6;43446:3;43442:16;43435:27;43314:154;;;:::o;43474:307::-;43542:1;43552:113;43566:6;43563:1;43560:13;43552:113;;;43651:1;43646:3;43642:11;43636:18;43632:1;43627:3;43623:11;43616:39;43588:2;43585:1;43581:10;43576:15;;43552:113;;;43683:6;43680:1;43677:13;43674:101;;;43763:1;43754:6;43749:3;43745:16;43738:27;43674:101;43523:258;43474:307;;;:::o;43787:320::-;43831:6;43868:1;43862:4;43858:12;43848:22;;43915:1;43909:4;43905:12;43936:18;43926:81;;43992:4;43984:6;43980:17;43970:27;;43926:81;44054:2;44046:6;44043:14;44023:18;44020:38;44017:84;;;44073:18;;:::i;:::-;44017:84;43838:269;43787:320;;;:::o;44113:281::-;44196:27;44218:4;44196:27;:::i;:::-;44188:6;44184:40;44326:6;44314:10;44311:22;44290:18;44278:10;44275:34;44272:62;44269:88;;;44337:18;;:::i;:::-;44269:88;44377:10;44373:2;44366:22;44156:238;44113:281;;:::o;44400:233::-;44439:3;44462:24;44480:5;44462:24;:::i;:::-;44453:33;;44508:66;44501:5;44498:77;44495:103;;;44578:18;;:::i;:::-;44495:103;44625:1;44618:5;44614:13;44607:20;;44400:233;;;:::o;44639:100::-;44678:7;44707:26;44727:5;44707:26;:::i;:::-;44696:37;;44639:100;;;:::o;44745:94::-;44784:7;44813:20;44827:5;44813:20;:::i;:::-;44802:31;;44745:94;;;:::o;44845:79::-;44884:7;44913:5;44902:16;;44845:79;;;:::o;44930:176::-;44962:1;44979:20;44997:1;44979:20;:::i;:::-;44974:25;;45013:20;45031:1;45013:20;:::i;:::-;45008:25;;45052:1;45042:35;;45057:18;;:::i;:::-;45042:35;45098:1;45095;45091:9;45086:14;;44930:176;;;;:::o;45112:180::-;45160:77;45157:1;45150:88;45257:4;45254:1;45247:15;45281:4;45278:1;45271:15;45298:180;45346:77;45343:1;45336:88;45443:4;45440:1;45433:15;45467:4;45464:1;45457:15;45484:180;45532:77;45529:1;45522:88;45629:4;45626:1;45619:15;45653:4;45650:1;45643:15;45670:180;45718:77;45715:1;45708:88;45815:4;45812:1;45805:15;45839:4;45836:1;45829:15;45856:180;45904:77;45901:1;45894:88;46001:4;45998:1;45991:15;46025:4;46022:1;46015:15;46042:180;46090:77;46087:1;46080:88;46187:4;46184:1;46177:15;46211:4;46208:1;46201:15;46228:117;46337:1;46334;46327:12;46351:117;46460:1;46457;46450:12;46474:117;46583:1;46580;46573:12;46597:117;46706:1;46703;46696:12;46720:117;46829:1;46826;46819:12;46843:102;46884:6;46935:2;46931:7;46926:2;46919:5;46915:14;46911:28;46901:38;;46843:102;;;:::o;46951:94::-;46984:8;47032:5;47028:2;47024:14;47003:35;;46951:94;;;:::o;47051:179::-;47191:31;47187:1;47179:6;47175:14;47168:55;47051:179;:::o;47236:230::-;47376:34;47372:1;47364:6;47360:14;47353:58;47445:13;47440:2;47432:6;47428:15;47421:38;47236:230;:::o;47472:237::-;47612:34;47608:1;47600:6;47596:14;47589:58;47681:20;47676:2;47668:6;47664:15;47657:45;47472:237;:::o;47715:225::-;47855:34;47851:1;47843:6;47839:14;47832:58;47924:8;47919:2;47911:6;47907:15;47900:33;47715:225;:::o;47946:178::-;48086:30;48082:1;48074:6;48070:14;48063:54;47946:178;:::o;48130:173::-;48270:25;48266:1;48258:6;48254:14;48247:49;48130:173;:::o;48309:223::-;48449:34;48445:1;48437:6;48433:14;48426:58;48518:6;48513:2;48505:6;48501:15;48494:31;48309:223;:::o;48538:175::-;48678:27;48674:1;48666:6;48662:14;48655:51;48538:175;:::o;48719:181::-;48859:33;48855:1;48847:6;48843:14;48836:57;48719:181;:::o;48906:231::-;49046:34;49042:1;49034:6;49030:14;49023:58;49115:14;49110:2;49102:6;49098:15;49091:39;48906:231;:::o;49143:243::-;49283:34;49279:1;49271:6;49267:14;49260:58;49352:26;49347:2;49339:6;49335:15;49328:51;49143:243;:::o;49392:229::-;49532:34;49528:1;49520:6;49516:14;49509:58;49601:12;49596:2;49588:6;49584:15;49577:37;49392:229;:::o;49627:228::-;49767:34;49763:1;49755:6;49751:14;49744:58;49836:11;49831:2;49823:6;49819:15;49812:36;49627:228;:::o;49861:182::-;50001:34;49997:1;49989:6;49985:14;49978:58;49861:182;:::o;50049:172::-;50189:24;50185:1;50177:6;50173:14;50166:48;50049:172;:::o;50227:231::-;50367:34;50363:1;50355:6;50351:14;50344:58;50436:14;50431:2;50423:6;50419:15;50412:39;50227:231;:::o;50464:182::-;50604:34;50600:1;50592:6;50588:14;50581:58;50464:182;:::o;50652:228::-;50792:34;50788:1;50780:6;50776:14;50769:58;50861:11;50856:2;50848:6;50844:15;50837:36;50652:228;:::o;50886:234::-;51026:34;51022:1;51014:6;51010:14;51003:58;51095:17;51090:2;51082:6;51078:15;51071:42;50886:234;:::o;51126:173::-;51266:25;51262:1;51254:6;51250:14;51243:49;51126:173;:::o;51305:220::-;51445:34;51441:1;51433:6;51429:14;51422:58;51514:3;51509:2;51501:6;51497:15;51490:28;51305:220;:::o;51531:234::-;51671:34;51667:1;51659:6;51655:14;51648:58;51740:17;51735:2;51727:6;51723:15;51716:42;51531:234;:::o;51771:114::-;;:::o;51891:236::-;52031:34;52027:1;52019:6;52015:14;52008:58;52100:19;52095:2;52087:6;52083:15;52076:44;51891:236;:::o;52133:160::-;52273:12;52269:1;52261:6;52257:14;52250:36;52133:160;:::o;52299:231::-;52439:34;52435:1;52427:6;52423:14;52416:58;52508:14;52503:2;52495:6;52491:15;52484:39;52299:231;:::o;52536:176::-;52676:28;52672:1;52664:6;52660:14;52653:52;52536:176;:::o;52718:173::-;52858:25;52854:1;52846:6;52842:14;52835:49;52718:173;:::o;52897:181::-;53037:33;53033:1;53025:6;53021:14;53014:57;52897:181;:::o;53084:122::-;53157:24;53175:5;53157:24;:::i;:::-;53150:5;53147:35;53137:63;;53196:1;53193;53186:12;53137:63;53084:122;:::o;53212:116::-;53282:21;53297:5;53282:21;:::i;:::-;53275:5;53272:32;53262:60;;53318:1;53315;53308:12;53262:60;53212:116;:::o;53334:120::-;53406:23;53423:5;53406:23;:::i;:::-;53399:5;53396:34;53386:62;;53444:1;53441;53434:12;53386:62;53334:120;:::o;53460:122::-;53533:24;53551:5;53533:24;:::i;:::-;53526:5;53523:35;53513:63;;53572:1;53569;53562:12;53513:63;53460:122;:::o
Swarm Source
ipfs://17499e064b4bf72f6bc4133cd1c521ecdc2227aaca43536875a955db7f3bc769
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.