ERC-721
Overview
Max Total Supply
328 AI
Holders
198
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AutisticIntelligence
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-08 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } 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); } 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; } 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); } 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); } 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); } library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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 * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @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 || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @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(),".json")) : ""; } /** * @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 override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: 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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } 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); } } interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } contract AutisticIntelligence is Ownable, ERC721A, ReentrancyGuard { string private _baseTokenURI = "https://poettxt.art/meta/"; address private receiver_wallet; uint256 public price = 1111 * 10**14; uint256 public max_per_wallet = 11; uint256 public starttime = 1649426400; uint256 public wl_duration = 2 days; mapping(address => bool) private _whitelistedAddresses; address private _wassie_address = 0xFdD103eD6bB31e28ad506DE89829249D340b22e4; IERC721Enumerable private _wassie_contract; mapping(uint256 => bool) private _wassie_mints; constructor() ERC721A("AI - Autistic Intelligence", "AI", 11, 1111) { receiver_wallet = msg.sender; _wassie_contract = IERC721Enumerable(_wassie_address); } modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } function isUnlocked() public view returns (bool) { return block.timestamp >= starttime; } function isWlMinting() public view returns (bool) { return isUnlocked() && (block.timestamp < (starttime+wl_duration)); } function isPublicMinting() public view returns (bool) { return isUnlocked() && (block.timestamp >= (starttime+wl_duration)); } function isWhitelisted(address account) public view returns (bool) { return _whitelistedAddresses[account] == true; } function wlMintAllowed(address account) public view returns (bool) { if(isPublicMinting()) { return false; } if(isWhitelisted(account)) { return true; } if(remainingWassieMints(account) > 0) { return true; } return false; } function timeUntilUnlock() public view returns (uint256) { if(isUnlocked()) { return 0; } return starttime - block.timestamp; } function timeUntilPublic() public view returns (uint256) { if(isPublicMinting()) { return 0; } return (starttime + wl_duration) - block.timestamp; } function remainingWassieMints(address account) public view returns (uint256) { if(isPublicMinting()) { return 0; } uint256 wassies = _wassie_contract.balanceOf(account); uint256 remaining_mints = 0; for(uint i=0;i<wassies;i++) { uint256 token_id = _wassie_contract.tokenOfOwnerByIndex(account, i); if(_wassie_mints[token_id] != true) { remaining_mints = remaining_mints+1; } } return remaining_mints; } function getNextWassieId(address account) public view returns (uint256) { require(remainingWassieMints(account) > 0, "no mints left"); uint256 wassies = _wassie_contract.balanceOf(account); for(uint i=0;i<wassies;i++) { uint256 token_id = _wassie_contract.tokenOfOwnerByIndex(account, i); if(_wassie_mints[token_id] != true) { return token_id; } } revert(); } function mint(uint256 quantity) external payable callerIsUser { require(isUnlocked(), "minting not active, please wait"); require(totalSupply() + quantity <= collectionSize, "reached max supply"); if(isWlMinting()) { uint256 remainingWassiesInAccount = remainingWassieMints(msg.sender); // user has wassies if(remainingWassiesInAccount > 0) { // minting only free ones - no payment needed if(quantity <= remainingWassiesInAccount) { require(msg.value == 0, "no payment needed"); for(uint i=0;i<quantity;i++) { uint256 token_id = getNextWassieId(msg.sender); _wassie_mints[token_id] = true; } _safeMint(msg.sender, quantity); } // minting free ones + wl else { require(_whitelistedAddresses[msg.sender] == true, "not on whitelist or already minted"); require(quantity == (remainingWassiesInAccount+1), "can not mint this many"); require(msg.value >= price, "Need to send more ETH."); for(uint i=0;i<quantity-1;i++) { uint256 token_id = getNextWassieId(msg.sender); _wassie_mints[token_id] = true; } _whitelistedAddresses[msg.sender] = false; _safeMint(msg.sender, quantity); } } // no wassies - just wl mint else { require(_whitelistedAddresses[msg.sender] == true, "not on whitelist or already minted"); require(quantity == 1, "can not mint this many"); require(msg.value >= price, "Need to send more ETH."); _whitelistedAddresses[msg.sender] = false; _safeMint(msg.sender, quantity); } } else { require( numberMinted(msg.sender) + quantity <= max_per_wallet, "can not mint this many" ); require(msg.value >= quantity * price, "Need to send more ETH."); _safeMint(msg.sender, quantity); } payable(receiver_wallet).transfer(address(this).balance); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function setOwnersExplicit(uint256 quantity) external onlyOwner nonReentrant { _setOwnersExplicit(quantity); } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) { return ownershipOf(tokenId); } function addToWhitelist(address[] calldata addresses) external onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { _whitelistedAddresses[addresses[i]] = true; } } function setStartingTimestamp(uint256 ts) external onlyOwner { starttime = ts; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getNextWassieId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isUnlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWlMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max_per_wallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"remainingWassieMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ts","type":"uint256"}],"name":"setStartingTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"starttime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeUntilPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeUntilUnlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"wlMintAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wl_duration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c0604052600060015560006008556040518060400160405280601981526020017f68747470733a2f2f706f65747478742e6172742f6d6574612f00000000000000815250600a90805190602001906200005b929190620003c0565b5067018ab4dc828bc000600c55600b600d556362503fe0600e556202a300600f5573fdd103ed6bb31e28ad506de89829249d340b22e4601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000de57600080fd5b506040518060400160405280601a81526020017f4149202d20417574697374696320496e74656c6c6967656e63650000000000008152506040518060400160405280600281526020017f4149000000000000000000000000000000000000000000000000000000000000815250600b6104576200017062000164620002f460201b60201c565b620002fc60201b60201c565b60008111620001b6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001ad90620004e0565b60405180910390fd5b60008211620001fc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001f390620004be565b60405180910390fd5b836002908051906020019062000214929190620003c0565b5082600390805190602001906200022d929190620003c0565b508160a08181525050806080818152505050505050600160098190555033600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000616565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003ce9062000513565b90600052602060002090601f016020900481019282620003f257600085556200043e565b82601f106200040d57805160ff19168380011785556200043e565b828001600101855582156200043e579182015b828111156200043d57825182559160200191906001019062000420565b5b5090506200044d919062000451565b5090565b5b808211156200046c57600081600090555060010162000452565b5090565b60006200047f60278362000502565b91506200048c8262000578565b604082019050919050565b6000620004a6602e8362000502565b9150620004b382620005c7565b604082019050919050565b60006020820190508181036000830152620004d98162000470565b9050919050565b60006020820190508181036000830152620004fb8162000497565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200052c57607f821691505b6020821081141562000543576200054262000549565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60805160a0516159966200065860003960008181612f3701528181612f6001526137090152600081816118c601528181612cbf0152612cf301526159966000f3fe60806040526004361061023b5760003560e01c8063866fb0cc1161012e578063ab53fcaa116100ab578063d7224ba01161006f578063d7224ba0146108c4578063dc33e681146108ef578063e985e9c51461092c578063f2fde38b14610969578063f34857f5146109925761023b565b8063ab53fcaa146107cd578063aee83952146107f8578063b88d4fde14610835578063c01f8b5f1461085e578063c87b56dd146108875761023b565b806395d89b41116100f257806395d89b4114610707578063a035b1fe14610732578063a0712d681461075d578063a12219c614610779578063a22cb465146107a45761023b565b8063866fb0cc1461061e5780638687a949146106495780638da58897146106745780638da5cb5b1461069f5780639231ab2a146106ca5761023b565b80632f745c59116101bc5780636352211e116101805780636352211e1461053957806370a0823114610576578063715018a6146105b35780637f649783146105ca5780638380edb7146105f35761023b565b80632f745c59146104305780633af32abf1461046d57806342842e0e146104aa5780634f6ccce7146104d357806355f804b3146105105761023b565b806318160ddd1161020357806318160ddd1461034b57806323b872dd146103765780632c6739151461039f5780632d20fb60146103ca5780632d73a74e146103f35761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e55780631348f1ba1461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613fc1565b6109bd565b6040516102749190614721565b60405180910390f35b34801561028957600080fd5b50610292610b07565b60405161029f919061473c565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190614068565b610b99565b6040516102dc9190614691565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613f34565b610c1e565b005b34801561031a57600080fd5b5061033560048036038101906103309190613db1565b610d37565b6040516103429190614721565b60405180910390f35b34801561035757600080fd5b50610360610d8a565b60405161036d9190614b79565b60405180910390f35b34801561038257600080fd5b5061039d60048036038101906103989190613e1e565b610d94565b005b3480156103ab57600080fd5b506103b4610da4565b6040516103c19190614721565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec9190614068565b610dce565b005b3480156103ff57600080fd5b5061041a60048036038101906104159190613db1565b610eac565b6040516104279190614b79565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190613f34565b6110b9565b6040516104649190614b79565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190613db1565b6112b7565b6040516104a19190614721565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc9190613e1e565b611314565b005b3480156104df57600080fd5b506104fa60048036038101906104f59190614068565b611334565b6040516105079190614b79565b60405180910390f35b34801561051c57600080fd5b506105376004803603810190610532919061401b565b611387565b005b34801561054557600080fd5b50610560600480360381019061055b9190614068565b611419565b60405161056d9190614691565b60405180910390f35b34801561058257600080fd5b5061059d60048036038101906105989190613db1565b61142f565b6040516105aa9190614b79565b60405180910390f35b3480156105bf57600080fd5b506105c8611518565b005b3480156105d657600080fd5b506105f160048036038101906105ec9190613f74565b6115a0565b005b3480156105ff57600080fd5b506106086116c1565b6040516106159190614721565b60405180910390f35b34801561062a57600080fd5b506106336116ce565b6040516106409190614b79565b60405180910390f35b34801561065557600080fd5b5061065e611707565b60405161066b9190614721565b60405180910390f35b34801561068057600080fd5b50610689611730565b6040516106969190614b79565b60405180910390f35b3480156106ab57600080fd5b506106b4611736565b6040516106c19190614691565b60405180910390f35b3480156106d657600080fd5b506106f160048036038101906106ec9190614068565b61175f565b6040516106fe9190614b5e565b60405180910390f35b34801561071357600080fd5b5061071c611777565b604051610729919061473c565b60405180910390f35b34801561073e57600080fd5b50610747611809565b6040516107549190614b79565b60405180910390f35b61077760048036038101906107729190614068565b61180f565b005b34801561078557600080fd5b5061078e611ea4565b60405161079b9190614b79565b60405180910390f35b3480156107b057600080fd5b506107cb60048036038101906107c69190613ef4565b611ed0565b005b3480156107d957600080fd5b506107e2612051565b6040516107ef9190614b79565b60405180910390f35b34801561080457600080fd5b5061081f600480360381019061081a9190613db1565b612057565b60405161082c9190614b79565b60405180910390f35b34801561084157600080fd5b5061085c60048036038101906108579190613e71565b612237565b005b34801561086a57600080fd5b5061088560048036038101906108809190614068565b612293565b005b34801561089357600080fd5b506108ae60048036038101906108a99190614068565b612319565b6040516108bb919061473c565b60405180910390f35b3480156108d057600080fd5b506108d96123c0565b6040516108e69190614b79565b60405180910390f35b3480156108fb57600080fd5b5061091660048036038101906109119190613db1565b6123c6565b6040516109239190614b79565b60405180910390f35b34801561093857600080fd5b50610953600480360381019061094e9190613dde565b6123d8565b6040516109609190614721565b60405180910390f35b34801561097557600080fd5b50610990600480360381019061098b9190613db1565b61246c565b005b34801561099e57600080fd5b506109a7612564565b6040516109b49190614b79565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610af057507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b005750610aff8261256a565b5b9050919050565b606060028054610b1690614ecc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4290614ecc565b8015610b8f5780601f10610b6457610100808354040283529160200191610b8f565b820191906000526020600020905b815481529060010190602001808311610b7257829003601f168201915b5050505050905090565b6000610ba4826125d4565b610be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bda90614b1e565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c2982611419565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c91906149de565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cb96125e2565b73ffffffffffffffffffffffffffffffffffffffff161480610ce85750610ce781610ce26125e2565b6123d8565b5b610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e9061489e565b60405180910390fd5b610d328383836125ea565b505050565b6000610d41610da4565b15610d4f5760009050610d85565b610d58826112b7565b15610d665760019050610d85565b6000610d7183612057565b1115610d805760019050610d85565b600090505b919050565b6000600154905090565b610d9f83838361269c565b505050565b6000610dae6116c1565b8015610dc95750600f54600e54610dc59190614c73565b4210155b905090565b610dd66125e2565b73ffffffffffffffffffffffffffffffffffffffff16610df4611736565b73ffffffffffffffffffffffffffffffffffffffff1614610e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e419061493e565b60405180910390fd5b60026009541415610e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8790614ade565b60405180910390fd5b6002600981905550610ea181612c55565b600160098190555050565b600080610eb883612057565b11610ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eef906147be565b60405180910390fd5b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610f559190614691565b60206040518083038186803b158015610f6d57600080fd5b505afa158015610f81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa59190614095565b905060005b818110156110ae576000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5986846040518363ffffffff1660e01b81526004016110119291906146f8565b60206040518083038186803b15801561102957600080fd5b505afa15801561103d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110619190614095565b9050600115156013600083815260200190815260200160002060009054906101000a900460ff1615151461109a578093505050506110b4565b5080806110a690614f2f565b915050610faa565b50600080fd5b919050565b60006110c48361142f565b8210611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc9061475e565b60405180910390fd5b600061110f610d8a565b905060008060005b83811015611275576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461120957806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561126157868414156112525781955050505050506112b1565b838061125d90614f2f565b9450505b50808061126d90614f2f565b915050611117565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a890614a9e565b60405180910390fd5b92915050565b600060011515601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515149050919050565b61132f83838360405180602001604052806000815250612237565b505050565b600061133e610d8a565b821061137f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611376906147de565b60405180910390fd5b819050919050565b61138f6125e2565b73ffffffffffffffffffffffffffffffffffffffff166113ad611736565b73ffffffffffffffffffffffffffffffffffffffff1614611403576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fa9061493e565b60405180910390fd5b8181600a9190611414929190613b3a565b505050565b600061142482612ee3565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611497906148de565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6115206125e2565b73ffffffffffffffffffffffffffffffffffffffff1661153e611736565b73ffffffffffffffffffffffffffffffffffffffff1614611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158b9061493e565b60405180910390fd5b61159e60006130e6565b565b6115a86125e2565b73ffffffffffffffffffffffffffffffffffffffff166115c6611736565b73ffffffffffffffffffffffffffffffffffffffff161461161c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116139061493e565b60405180910390fd5b60005b828290508110156116bc5760016010600085858581811061164357611642615036565b5b90506020020160208101906116589190613db1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806116b490614f2f565b91505061161f565b505050565b6000600e54421015905090565b60006116d8610da4565b156116e65760009050611704565b42600f54600e546116f79190614c73565b6117019190614d88565b90505b90565b60006117116116c1565b801561172b5750600f54600e546117289190614c73565b42105b905090565b600e5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611767613bc0565b61177082612ee3565b9050919050565b60606003805461178690614ecc565b80601f01602080910402602001604051908101604052809291908181526020018280546117b290614ecc565b80156117ff5780601f106117d4576101008083540402835291602001916117ff565b820191906000526020600020905b8154815290600101906020018083116117e257829003601f168201915b5050505050905090565b600c5481565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461187d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118749061487e565b60405180910390fd5b6118856116c1565b6118c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bb9061483e565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000816118ee610d8a565b6118f89190614c73565b1115611939576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611930906148fe565b60405180910390fd5b611941611707565b15611d8557600061195133612057565b90506000811115611c0157808211611a0e57600034146119a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199d9061495e565b60405180910390fd5b60005b828110156119fe5760006119bc33610eac565b905060016013600083815260200190815260200160002060006101000a81548160ff0219169083151502179055505080806119f690614f2f565b9150506119a9565b50611a0933836131aa565b611bfc565b60011515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a989061485e565b60405180910390fd5b600181611aae9190614c73565b8214611aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae690614a7e565b60405180910390fd5b600c54341015611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b90614a1e565b60405180910390fd5b60005b600183611b449190614d88565b811015611b98576000611b5633610eac565b905060016013600083815260200190815260200160002060006101000a81548160ff021916908315150217905550508080611b9090614f2f565b915050611b37565b506000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611bfb33836131aa565b5b611d7f565b60011515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8b9061485e565b60405180910390fd5b60018214611cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cce90614a7e565b60405180910390fd5b600c54341015611d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1390614a1e565b60405180910390fd5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611d7e33836131aa565b5b50611e38565b600d5481611d92336123c6565b611d9c9190614c73565b1115611ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd490614a7e565b60405180910390fd5b600c5481611deb9190614cfa565b341015611e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2490614a1e565b60405180910390fd5b611e3733826131aa565b5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611ea0573d6000803e3d6000fd5b5050565b6000611eae6116c1565b15611ebc5760009050611ecd565b42600e54611eca9190614d88565b90505b90565b611ed86125e2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3d9061499e565b60405180910390fd5b8060076000611f536125e2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120006125e2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120459190614721565b60405180910390a35050565b600d5481565b6000612061610da4565b1561206f5760009050612232565b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016120cc9190614691565b60206040518083038186803b1580156120e457600080fd5b505afa1580156120f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211c9190614095565b90506000805b8281101561222b576000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5987846040518363ffffffff1660e01b81526004016121899291906146f8565b60206040518083038186803b1580156121a157600080fd5b505afa1580156121b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d99190614095565b9050600115156013600083815260200190815260200160002060009054906101000a900460ff16151514612217576001836122149190614c73565b92505b50808061222390614f2f565b915050612122565b5080925050505b919050565b61224284848461269c565b61224e848484846131c8565b61228d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612284906149fe565b60405180910390fd5b50505050565b61229b6125e2565b73ffffffffffffffffffffffffffffffffffffffff166122b9611736565b73ffffffffffffffffffffffffffffffffffffffff161461230f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123069061493e565b60405180910390fd5b80600e8190555050565b6060612324826125d4565b612363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235a9061497e565b60405180910390fd5b600061236d61335f565b9050600081511161238d57604051806020016040528060008152506123b8565b80612397846133f1565b6040516020016123a8929190614662565b6040516020818303038152906040525b915050919050565b60085481565b60006123d182613552565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124746125e2565b73ffffffffffffffffffffffffffffffffffffffff16612492611736565b73ffffffffffffffffffffffffffffffffffffffff16146124e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124df9061493e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254f9061477e565b60405180910390fd5b612561816130e6565b50565b600f5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006126a782612ee3565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166126ce6125e2565b73ffffffffffffffffffffffffffffffffffffffff16148061272a57506126f36125e2565b73ffffffffffffffffffffffffffffffffffffffff1661271284610b99565b73ffffffffffffffffffffffffffffffffffffffff16145b80612746575061274582600001516127406125e2565b6123d8565b5b905080612788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277f906149be565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146127fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f19061491e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561286a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612861906147fe565b60405180910390fd5b612877858585600161363b565b61288760008484600001516125ea565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166128f59190614d54565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166129999190614c2d565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612a9f9190614c73565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612be557612b15816125d4565b15612be4576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c4d8686866001613641565b505050505050565b6000600854905060008211612c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c96906148be565b60405180910390fd5b600060018383612caf9190614c73565b612cb99190614d88565b905060017f0000000000000000000000000000000000000000000000000000000000000000612ce89190614d88565b811115612d1f5760017f0000000000000000000000000000000000000000000000000000000000000000612d1c9190614d88565b90505b612d28816125d4565b612d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5e90614abe565b60405180910390fd5b60008290505b818111612eca57600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612eb7576000612dea82612ee3565b90506040518060400160405280826000015173ffffffffffffffffffffffffffffffffffffffff168152602001826020015167ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050505b8080612ec290614f2f565b915050612d6d565b50600181612ed89190614c73565b600881905550505050565b612eeb613bc0565b612ef4826125d4565b612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a9061479e565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310612f975760017f000000000000000000000000000000000000000000000000000000000000000084612f8a9190614d88565b612f949190614c73565b90505b60008390505b8181106130a5576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613091578093505050506130e1565b50808061309d90614ea2565b915050612f9d565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d890614afe565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6131c4828260405180602001604052806000815250613647565b5050565b60006131e98473ffffffffffffffffffffffffffffffffffffffff16613b27565b15613352578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132126125e2565b8786866040518563ffffffff1660e01b815260040161323494939291906146ac565b602060405180830381600087803b15801561324e57600080fd5b505af192505050801561327f57506040513d601f19601f8201168201806040525081019061327c9190613fee565b60015b613302573d80600081146132af576040519150601f19603f3d011682016040523d82523d6000602084013e6132b4565b606091505b506000815114156132fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f1906149fe565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613357565b600190505b949350505050565b6060600a805461336e90614ecc565b80601f016020809104026020016040519081016040528092919081815260200182805461339a90614ecc565b80156133e75780601f106133bc576101008083540402835291602001916133e7565b820191906000526020600020905b8154815290600101906020018083116133ca57829003601f168201915b5050505050905090565b60606000821415613439576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061354d565b600082905060005b6000821461346b57808061345490614f2f565b915050600a826134649190614cc9565b9150613441565b60008167ffffffffffffffff81111561348757613486615065565b5b6040519080825280601f01601f1916602001820160405280156134b95781602001600182028036833780820191505090505b5090505b60008514613546576001826134d29190614d88565b9150600a856134e19190614f78565b60306134ed9190614c73565b60f81b81838151811061350357613502615036565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561353f9190614cc9565b94506134bd565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ba9061481e565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156136be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136b590614a5e565b60405180910390fd5b6136c7816125d4565b15613707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136fe90614a3e565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000083111561376a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376190614b3e565b60405180910390fd5b613777600085838661363b565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516138749190614c2d565b6fffffffffffffffffffffffffffffffff16815260200185836020015161389b9190614c2d565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015613b0a57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613aaa60008884886131c8565b613ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ae0906149fe565b60405180910390fd5b8180613af490614f2f565b9250508080613b0290614f2f565b915050613a39565b5080600181905550613b1f6000878588613641565b505050505050565b600080823b905060008111915050919050565b828054613b4690614ecc565b90600052602060002090601f016020900481019282613b685760008555613baf565b82601f10613b8157803560ff1916838001178555613baf565b82800160010185558215613baf579182015b82811115613bae578235825591602001919060010190613b93565b5b509050613bbc9190613bfa565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613c13576000816000905550600101613bfb565b5090565b6000613c2a613c2584614bb9565b614b94565b905082815260208101848484011115613c4657613c456150a3565b5b613c51848285614e60565b509392505050565b600081359050613c6881615904565b92915050565b60008083601f840112613c8457613c83615099565b5b8235905067ffffffffffffffff811115613ca157613ca0615094565b5b602083019150836020820283011115613cbd57613cbc61509e565b5b9250929050565b600081359050613cd38161591b565b92915050565b600081359050613ce881615932565b92915050565b600081519050613cfd81615932565b92915050565b600082601f830112613d1857613d17615099565b5b8135613d28848260208601613c17565b91505092915050565b60008083601f840112613d4757613d46615099565b5b8235905067ffffffffffffffff811115613d6457613d63615094565b5b602083019150836001820283011115613d8057613d7f61509e565b5b9250929050565b600081359050613d9681615949565b92915050565b600081519050613dab81615949565b92915050565b600060208284031215613dc757613dc66150ad565b5b6000613dd584828501613c59565b91505092915050565b60008060408385031215613df557613df46150ad565b5b6000613e0385828601613c59565b9250506020613e1485828601613c59565b9150509250929050565b600080600060608486031215613e3757613e366150ad565b5b6000613e4586828701613c59565b9350506020613e5686828701613c59565b9250506040613e6786828701613d87565b9150509250925092565b60008060008060808587031215613e8b57613e8a6150ad565b5b6000613e9987828801613c59565b9450506020613eaa87828801613c59565b9350506040613ebb87828801613d87565b925050606085013567ffffffffffffffff811115613edc57613edb6150a8565b5b613ee887828801613d03565b91505092959194509250565b60008060408385031215613f0b57613f0a6150ad565b5b6000613f1985828601613c59565b9250506020613f2a85828601613cc4565b9150509250929050565b60008060408385031215613f4b57613f4a6150ad565b5b6000613f5985828601613c59565b9250506020613f6a85828601613d87565b9150509250929050565b60008060208385031215613f8b57613f8a6150ad565b5b600083013567ffffffffffffffff811115613fa957613fa86150a8565b5b613fb585828601613c6e565b92509250509250929050565b600060208284031215613fd757613fd66150ad565b5b6000613fe584828501613cd9565b91505092915050565b600060208284031215614004576140036150ad565b5b600061401284828501613cee565b91505092915050565b60008060208385031215614032576140316150ad565b5b600083013567ffffffffffffffff8111156140505761404f6150a8565b5b61405c85828601613d31565b92509250509250929050565b60006020828403121561407e5761407d6150ad565b5b600061408c84828501613d87565b91505092915050565b6000602082840312156140ab576140aa6150ad565b5b60006140b984828501613d9c565b91505092915050565b6140cb81614dbc565b82525050565b6140da81614dbc565b82525050565b6140e981614dce565b82525050565b60006140fa82614bea565b6141048185614c00565b9350614114818560208601614e6f565b61411d816150b2565b840191505092915050565b600061413382614bf5565b61413d8185614c11565b935061414d818560208601614e6f565b614156816150b2565b840191505092915050565b600061416c82614bf5565b6141768185614c22565b9350614186818560208601614e6f565b80840191505092915050565b600061419f602283614c11565b91506141aa826150c3565b604082019050919050565b60006141c2602683614c11565b91506141cd82615112565b604082019050919050565b60006141e5602a83614c11565b91506141f082615161565b604082019050919050565b6000614208600d83614c11565b9150614213826151b0565b602082019050919050565b600061422b602383614c11565b9150614236826151d9565b604082019050919050565b600061424e602583614c11565b915061425982615228565b604082019050919050565b6000614271603183614c11565b915061427c82615277565b604082019050919050565b6000614294601f83614c11565b915061429f826152c6565b602082019050919050565b60006142b7602283614c11565b91506142c2826152ef565b604082019050919050565b60006142da601e83614c11565b91506142e58261533e565b602082019050919050565b60006142fd603983614c11565b915061430882615367565b604082019050919050565b6000614320601883614c11565b915061432b826153b6565b602082019050919050565b6000614343602b83614c11565b915061434e826153df565b604082019050919050565b6000614366601283614c11565b91506143718261542e565b602082019050919050565b6000614389602683614c11565b915061439482615457565b604082019050919050565b60006143ac600583614c22565b91506143b7826154a6565b600582019050919050565b60006143cf602083614c11565b91506143da826154cf565b602082019050919050565b60006143f2601183614c11565b91506143fd826154f8565b602082019050919050565b6000614415602f83614c11565b915061442082615521565b604082019050919050565b6000614438601a83614c11565b915061444382615570565b602082019050919050565b600061445b603283614c11565b915061446682615599565b604082019050919050565b600061447e602283614c11565b9150614489826155e8565b604082019050919050565b60006144a1603383614c11565b91506144ac82615637565b604082019050919050565b60006144c4601683614c11565b91506144cf82615686565b602082019050919050565b60006144e7601d83614c11565b91506144f2826156af565b602082019050919050565b600061450a602183614c11565b9150614515826156d8565b604082019050919050565b600061452d601683614c11565b915061453882615727565b602082019050919050565b6000614550602e83614c11565b915061455b82615750565b604082019050919050565b6000614573602683614c11565b915061457e8261579f565b604082019050919050565b6000614596601f83614c11565b91506145a1826157ee565b602082019050919050565b60006145b9602f83614c11565b91506145c482615817565b604082019050919050565b60006145dc602d83614c11565b91506145e782615866565b604082019050919050565b60006145ff602283614c11565b915061460a826158b5565b604082019050919050565b60408201600082015161462b60008501826140c2565b50602082015161463e6020850182614653565b50505050565b61464d81614e42565b82525050565b61465c81614e4c565b82525050565b600061466e8285614161565b915061467a8284614161565b91506146858261439f565b91508190509392505050565b60006020820190506146a660008301846140d1565b92915050565b60006080820190506146c160008301876140d1565b6146ce60208301866140d1565b6146db6040830185614644565b81810360608301526146ed81846140ef565b905095945050505050565b600060408201905061470d60008301856140d1565b61471a6020830184614644565b9392505050565b600060208201905061473660008301846140e0565b92915050565b600060208201905081810360008301526147568184614128565b905092915050565b6000602082019050818103600083015261477781614192565b9050919050565b60006020820190508181036000830152614797816141b5565b9050919050565b600060208201905081810360008301526147b7816141d8565b9050919050565b600060208201905081810360008301526147d7816141fb565b9050919050565b600060208201905081810360008301526147f78161421e565b9050919050565b6000602082019050818103600083015261481781614241565b9050919050565b6000602082019050818103600083015261483781614264565b9050919050565b6000602082019050818103600083015261485781614287565b9050919050565b60006020820190508181036000830152614877816142aa565b9050919050565b60006020820190508181036000830152614897816142cd565b9050919050565b600060208201905081810360008301526148b7816142f0565b9050919050565b600060208201905081810360008301526148d781614313565b9050919050565b600060208201905081810360008301526148f781614336565b9050919050565b6000602082019050818103600083015261491781614359565b9050919050565b600060208201905081810360008301526149378161437c565b9050919050565b60006020820190508181036000830152614957816143c2565b9050919050565b60006020820190508181036000830152614977816143e5565b9050919050565b6000602082019050818103600083015261499781614408565b9050919050565b600060208201905081810360008301526149b78161442b565b9050919050565b600060208201905081810360008301526149d78161444e565b9050919050565b600060208201905081810360008301526149f781614471565b9050919050565b60006020820190508181036000830152614a1781614494565b9050919050565b60006020820190508181036000830152614a37816144b7565b9050919050565b60006020820190508181036000830152614a57816144da565b9050919050565b60006020820190508181036000830152614a77816144fd565b9050919050565b60006020820190508181036000830152614a9781614520565b9050919050565b60006020820190508181036000830152614ab781614543565b9050919050565b60006020820190508181036000830152614ad781614566565b9050919050565b60006020820190508181036000830152614af781614589565b9050919050565b60006020820190508181036000830152614b17816145ac565b9050919050565b60006020820190508181036000830152614b37816145cf565b9050919050565b60006020820190508181036000830152614b57816145f2565b9050919050565b6000604082019050614b736000830184614615565b92915050565b6000602082019050614b8e6000830184614644565b92915050565b6000614b9e614baf565b9050614baa8282614efe565b919050565b6000604051905090565b600067ffffffffffffffff821115614bd457614bd3615065565b5b614bdd826150b2565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c3882614e06565b9150614c4383614e06565b9250826fffffffffffffffffffffffffffffffff03821115614c6857614c67614fa9565b5b828201905092915050565b6000614c7e82614e42565b9150614c8983614e42565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cbe57614cbd614fa9565b5b828201905092915050565b6000614cd482614e42565b9150614cdf83614e42565b925082614cef57614cee614fd8565b5b828204905092915050565b6000614d0582614e42565b9150614d1083614e42565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d4957614d48614fa9565b5b828202905092915050565b6000614d5f82614e06565b9150614d6a83614e06565b925082821015614d7d57614d7c614fa9565b5b828203905092915050565b6000614d9382614e42565b9150614d9e83614e42565b925082821015614db157614db0614fa9565b5b828203905092915050565b6000614dc782614e22565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614e8d578082015181840152602081019050614e72565b83811115614e9c576000848401525b50505050565b6000614ead82614e42565b91506000821415614ec157614ec0614fa9565b5b600182039050919050565b60006002820490506001821680614ee457607f821691505b60208210811415614ef857614ef7615007565b5b50919050565b614f07826150b2565b810181811067ffffffffffffffff82111715614f2657614f25615065565b5b80604052505050565b6000614f3a82614e42565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f6d57614f6c614fa9565b5b600182019050919050565b6000614f8382614e42565b9150614f8e83614e42565b925082614f9e57614f9d614fd8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f6e6f206d696e7473206c65667400000000000000000000000000000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f6d696e74696e67206e6f74206163746976652c20706c65617365207761697400600082015250565b7f6e6f74206f6e2077686974656c697374206f7220616c7265616479206d696e7460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6e6f207061796d656e74206e6565646564000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360008201527f6c65616e75700000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b61590d81614dbc565b811461591857600080fd5b50565b61592481614dce565b811461592f57600080fd5b50565b61593b81614dda565b811461594657600080fd5b50565b61595281614e42565b811461595d57600080fd5b5056fea26469706673582212203967b7ffb4916d5224260ecac4723e2eeff69c29ecc19545824373399cd4304264736f6c63430008070033
Deployed Bytecode
0x60806040526004361061023b5760003560e01c8063866fb0cc1161012e578063ab53fcaa116100ab578063d7224ba01161006f578063d7224ba0146108c4578063dc33e681146108ef578063e985e9c51461092c578063f2fde38b14610969578063f34857f5146109925761023b565b8063ab53fcaa146107cd578063aee83952146107f8578063b88d4fde14610835578063c01f8b5f1461085e578063c87b56dd146108875761023b565b806395d89b41116100f257806395d89b4114610707578063a035b1fe14610732578063a0712d681461075d578063a12219c614610779578063a22cb465146107a45761023b565b8063866fb0cc1461061e5780638687a949146106495780638da58897146106745780638da5cb5b1461069f5780639231ab2a146106ca5761023b565b80632f745c59116101bc5780636352211e116101805780636352211e1461053957806370a0823114610576578063715018a6146105b35780637f649783146105ca5780638380edb7146105f35761023b565b80632f745c59146104305780633af32abf1461046d57806342842e0e146104aa5780634f6ccce7146104d357806355f804b3146105105761023b565b806318160ddd1161020357806318160ddd1461034b57806323b872dd146103765780632c6739151461039f5780632d20fb60146103ca5780632d73a74e146103f35761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e55780631348f1ba1461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613fc1565b6109bd565b6040516102749190614721565b60405180910390f35b34801561028957600080fd5b50610292610b07565b60405161029f919061473c565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190614068565b610b99565b6040516102dc9190614691565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613f34565b610c1e565b005b34801561031a57600080fd5b5061033560048036038101906103309190613db1565b610d37565b6040516103429190614721565b60405180910390f35b34801561035757600080fd5b50610360610d8a565b60405161036d9190614b79565b60405180910390f35b34801561038257600080fd5b5061039d60048036038101906103989190613e1e565b610d94565b005b3480156103ab57600080fd5b506103b4610da4565b6040516103c19190614721565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec9190614068565b610dce565b005b3480156103ff57600080fd5b5061041a60048036038101906104159190613db1565b610eac565b6040516104279190614b79565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190613f34565b6110b9565b6040516104649190614b79565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190613db1565b6112b7565b6040516104a19190614721565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc9190613e1e565b611314565b005b3480156104df57600080fd5b506104fa60048036038101906104f59190614068565b611334565b6040516105079190614b79565b60405180910390f35b34801561051c57600080fd5b506105376004803603810190610532919061401b565b611387565b005b34801561054557600080fd5b50610560600480360381019061055b9190614068565b611419565b60405161056d9190614691565b60405180910390f35b34801561058257600080fd5b5061059d60048036038101906105989190613db1565b61142f565b6040516105aa9190614b79565b60405180910390f35b3480156105bf57600080fd5b506105c8611518565b005b3480156105d657600080fd5b506105f160048036038101906105ec9190613f74565b6115a0565b005b3480156105ff57600080fd5b506106086116c1565b6040516106159190614721565b60405180910390f35b34801561062a57600080fd5b506106336116ce565b6040516106409190614b79565b60405180910390f35b34801561065557600080fd5b5061065e611707565b60405161066b9190614721565b60405180910390f35b34801561068057600080fd5b50610689611730565b6040516106969190614b79565b60405180910390f35b3480156106ab57600080fd5b506106b4611736565b6040516106c19190614691565b60405180910390f35b3480156106d657600080fd5b506106f160048036038101906106ec9190614068565b61175f565b6040516106fe9190614b5e565b60405180910390f35b34801561071357600080fd5b5061071c611777565b604051610729919061473c565b60405180910390f35b34801561073e57600080fd5b50610747611809565b6040516107549190614b79565b60405180910390f35b61077760048036038101906107729190614068565b61180f565b005b34801561078557600080fd5b5061078e611ea4565b60405161079b9190614b79565b60405180910390f35b3480156107b057600080fd5b506107cb60048036038101906107c69190613ef4565b611ed0565b005b3480156107d957600080fd5b506107e2612051565b6040516107ef9190614b79565b60405180910390f35b34801561080457600080fd5b5061081f600480360381019061081a9190613db1565b612057565b60405161082c9190614b79565b60405180910390f35b34801561084157600080fd5b5061085c60048036038101906108579190613e71565b612237565b005b34801561086a57600080fd5b5061088560048036038101906108809190614068565b612293565b005b34801561089357600080fd5b506108ae60048036038101906108a99190614068565b612319565b6040516108bb919061473c565b60405180910390f35b3480156108d057600080fd5b506108d96123c0565b6040516108e69190614b79565b60405180910390f35b3480156108fb57600080fd5b5061091660048036038101906109119190613db1565b6123c6565b6040516109239190614b79565b60405180910390f35b34801561093857600080fd5b50610953600480360381019061094e9190613dde565b6123d8565b6040516109609190614721565b60405180910390f35b34801561097557600080fd5b50610990600480360381019061098b9190613db1565b61246c565b005b34801561099e57600080fd5b506109a7612564565b6040516109b49190614b79565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610af057507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b005750610aff8261256a565b5b9050919050565b606060028054610b1690614ecc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4290614ecc565b8015610b8f5780601f10610b6457610100808354040283529160200191610b8f565b820191906000526020600020905b815481529060010190602001808311610b7257829003601f168201915b5050505050905090565b6000610ba4826125d4565b610be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bda90614b1e565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c2982611419565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c91906149de565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cb96125e2565b73ffffffffffffffffffffffffffffffffffffffff161480610ce85750610ce781610ce26125e2565b6123d8565b5b610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e9061489e565b60405180910390fd5b610d328383836125ea565b505050565b6000610d41610da4565b15610d4f5760009050610d85565b610d58826112b7565b15610d665760019050610d85565b6000610d7183612057565b1115610d805760019050610d85565b600090505b919050565b6000600154905090565b610d9f83838361269c565b505050565b6000610dae6116c1565b8015610dc95750600f54600e54610dc59190614c73565b4210155b905090565b610dd66125e2565b73ffffffffffffffffffffffffffffffffffffffff16610df4611736565b73ffffffffffffffffffffffffffffffffffffffff1614610e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e419061493e565b60405180910390fd5b60026009541415610e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8790614ade565b60405180910390fd5b6002600981905550610ea181612c55565b600160098190555050565b600080610eb883612057565b11610ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eef906147be565b60405180910390fd5b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610f559190614691565b60206040518083038186803b158015610f6d57600080fd5b505afa158015610f81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa59190614095565b905060005b818110156110ae576000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5986846040518363ffffffff1660e01b81526004016110119291906146f8565b60206040518083038186803b15801561102957600080fd5b505afa15801561103d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110619190614095565b9050600115156013600083815260200190815260200160002060009054906101000a900460ff1615151461109a578093505050506110b4565b5080806110a690614f2f565b915050610faa565b50600080fd5b919050565b60006110c48361142f565b8210611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc9061475e565b60405180910390fd5b600061110f610d8a565b905060008060005b83811015611275576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461120957806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561126157868414156112525781955050505050506112b1565b838061125d90614f2f565b9450505b50808061126d90614f2f565b915050611117565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a890614a9e565b60405180910390fd5b92915050565b600060011515601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515149050919050565b61132f83838360405180602001604052806000815250612237565b505050565b600061133e610d8a565b821061137f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611376906147de565b60405180910390fd5b819050919050565b61138f6125e2565b73ffffffffffffffffffffffffffffffffffffffff166113ad611736565b73ffffffffffffffffffffffffffffffffffffffff1614611403576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fa9061493e565b60405180910390fd5b8181600a9190611414929190613b3a565b505050565b600061142482612ee3565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611497906148de565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6115206125e2565b73ffffffffffffffffffffffffffffffffffffffff1661153e611736565b73ffffffffffffffffffffffffffffffffffffffff1614611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158b9061493e565b60405180910390fd5b61159e60006130e6565b565b6115a86125e2565b73ffffffffffffffffffffffffffffffffffffffff166115c6611736565b73ffffffffffffffffffffffffffffffffffffffff161461161c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116139061493e565b60405180910390fd5b60005b828290508110156116bc5760016010600085858581811061164357611642615036565b5b90506020020160208101906116589190613db1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806116b490614f2f565b91505061161f565b505050565b6000600e54421015905090565b60006116d8610da4565b156116e65760009050611704565b42600f54600e546116f79190614c73565b6117019190614d88565b90505b90565b60006117116116c1565b801561172b5750600f54600e546117289190614c73565b42105b905090565b600e5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611767613bc0565b61177082612ee3565b9050919050565b60606003805461178690614ecc565b80601f01602080910402602001604051908101604052809291908181526020018280546117b290614ecc565b80156117ff5780601f106117d4576101008083540402835291602001916117ff565b820191906000526020600020905b8154815290600101906020018083116117e257829003601f168201915b5050505050905090565b600c5481565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461187d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118749061487e565b60405180910390fd5b6118856116c1565b6118c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bb9061483e565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000457816118ee610d8a565b6118f89190614c73565b1115611939576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611930906148fe565b60405180910390fd5b611941611707565b15611d8557600061195133612057565b90506000811115611c0157808211611a0e57600034146119a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199d9061495e565b60405180910390fd5b60005b828110156119fe5760006119bc33610eac565b905060016013600083815260200190815260200160002060006101000a81548160ff0219169083151502179055505080806119f690614f2f565b9150506119a9565b50611a0933836131aa565b611bfc565b60011515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a989061485e565b60405180910390fd5b600181611aae9190614c73565b8214611aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae690614a7e565b60405180910390fd5b600c54341015611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b90614a1e565b60405180910390fd5b60005b600183611b449190614d88565b811015611b98576000611b5633610eac565b905060016013600083815260200190815260200160002060006101000a81548160ff021916908315150217905550508080611b9090614f2f565b915050611b37565b506000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611bfb33836131aa565b5b611d7f565b60011515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8b9061485e565b60405180910390fd5b60018214611cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cce90614a7e565b60405180910390fd5b600c54341015611d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1390614a1e565b60405180910390fd5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611d7e33836131aa565b5b50611e38565b600d5481611d92336123c6565b611d9c9190614c73565b1115611ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd490614a7e565b60405180910390fd5b600c5481611deb9190614cfa565b341015611e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2490614a1e565b60405180910390fd5b611e3733826131aa565b5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611ea0573d6000803e3d6000fd5b5050565b6000611eae6116c1565b15611ebc5760009050611ecd565b42600e54611eca9190614d88565b90505b90565b611ed86125e2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3d9061499e565b60405180910390fd5b8060076000611f536125e2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120006125e2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120459190614721565b60405180910390a35050565b600d5481565b6000612061610da4565b1561206f5760009050612232565b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016120cc9190614691565b60206040518083038186803b1580156120e457600080fd5b505afa1580156120f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211c9190614095565b90506000805b8281101561222b576000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5987846040518363ffffffff1660e01b81526004016121899291906146f8565b60206040518083038186803b1580156121a157600080fd5b505afa1580156121b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d99190614095565b9050600115156013600083815260200190815260200160002060009054906101000a900460ff16151514612217576001836122149190614c73565b92505b50808061222390614f2f565b915050612122565b5080925050505b919050565b61224284848461269c565b61224e848484846131c8565b61228d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612284906149fe565b60405180910390fd5b50505050565b61229b6125e2565b73ffffffffffffffffffffffffffffffffffffffff166122b9611736565b73ffffffffffffffffffffffffffffffffffffffff161461230f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123069061493e565b60405180910390fd5b80600e8190555050565b6060612324826125d4565b612363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235a9061497e565b60405180910390fd5b600061236d61335f565b9050600081511161238d57604051806020016040528060008152506123b8565b80612397846133f1565b6040516020016123a8929190614662565b6040516020818303038152906040525b915050919050565b60085481565b60006123d182613552565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124746125e2565b73ffffffffffffffffffffffffffffffffffffffff16612492611736565b73ffffffffffffffffffffffffffffffffffffffff16146124e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124df9061493e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254f9061477e565b60405180910390fd5b612561816130e6565b50565b600f5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006126a782612ee3565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166126ce6125e2565b73ffffffffffffffffffffffffffffffffffffffff16148061272a57506126f36125e2565b73ffffffffffffffffffffffffffffffffffffffff1661271284610b99565b73ffffffffffffffffffffffffffffffffffffffff16145b80612746575061274582600001516127406125e2565b6123d8565b5b905080612788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277f906149be565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146127fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f19061491e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561286a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612861906147fe565b60405180910390fd5b612877858585600161363b565b61288760008484600001516125ea565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166128f59190614d54565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166129999190614c2d565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612a9f9190614c73565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612be557612b15816125d4565b15612be4576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c4d8686866001613641565b505050505050565b6000600854905060008211612c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c96906148be565b60405180910390fd5b600060018383612caf9190614c73565b612cb99190614d88565b905060017f0000000000000000000000000000000000000000000000000000000000000457612ce89190614d88565b811115612d1f5760017f0000000000000000000000000000000000000000000000000000000000000457612d1c9190614d88565b90505b612d28816125d4565b612d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5e90614abe565b60405180910390fd5b60008290505b818111612eca57600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612eb7576000612dea82612ee3565b90506040518060400160405280826000015173ffffffffffffffffffffffffffffffffffffffff168152602001826020015167ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050505b8080612ec290614f2f565b915050612d6d565b50600181612ed89190614c73565b600881905550505050565b612eeb613bc0565b612ef4826125d4565b612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a9061479e565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000b8310612f975760017f000000000000000000000000000000000000000000000000000000000000000b84612f8a9190614d88565b612f949190614c73565b90505b60008390505b8181106130a5576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613091578093505050506130e1565b50808061309d90614ea2565b915050612f9d565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d890614afe565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6131c4828260405180602001604052806000815250613647565b5050565b60006131e98473ffffffffffffffffffffffffffffffffffffffff16613b27565b15613352578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132126125e2565b8786866040518563ffffffff1660e01b815260040161323494939291906146ac565b602060405180830381600087803b15801561324e57600080fd5b505af192505050801561327f57506040513d601f19601f8201168201806040525081019061327c9190613fee565b60015b613302573d80600081146132af576040519150601f19603f3d011682016040523d82523d6000602084013e6132b4565b606091505b506000815114156132fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f1906149fe565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613357565b600190505b949350505050565b6060600a805461336e90614ecc565b80601f016020809104026020016040519081016040528092919081815260200182805461339a90614ecc565b80156133e75780601f106133bc576101008083540402835291602001916133e7565b820191906000526020600020905b8154815290600101906020018083116133ca57829003601f168201915b5050505050905090565b60606000821415613439576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061354d565b600082905060005b6000821461346b57808061345490614f2f565b915050600a826134649190614cc9565b9150613441565b60008167ffffffffffffffff81111561348757613486615065565b5b6040519080825280601f01601f1916602001820160405280156134b95781602001600182028036833780820191505090505b5090505b60008514613546576001826134d29190614d88565b9150600a856134e19190614f78565b60306134ed9190614c73565b60f81b81838151811061350357613502615036565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561353f9190614cc9565b94506134bd565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ba9061481e565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156136be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136b590614a5e565b60405180910390fd5b6136c7816125d4565b15613707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136fe90614a3e565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000b83111561376a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376190614b3e565b60405180910390fd5b613777600085838661363b565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516138749190614c2d565b6fffffffffffffffffffffffffffffffff16815260200185836020015161389b9190614c2d565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015613b0a57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613aaa60008884886131c8565b613ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ae0906149fe565b60405180910390fd5b8180613af490614f2f565b9250508080613b0290614f2f565b915050613a39565b5080600181905550613b1f6000878588613641565b505050505050565b600080823b905060008111915050919050565b828054613b4690614ecc565b90600052602060002090601f016020900481019282613b685760008555613baf565b82601f10613b8157803560ff1916838001178555613baf565b82800160010185558215613baf579182015b82811115613bae578235825591602001919060010190613b93565b5b509050613bbc9190613bfa565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613c13576000816000905550600101613bfb565b5090565b6000613c2a613c2584614bb9565b614b94565b905082815260208101848484011115613c4657613c456150a3565b5b613c51848285614e60565b509392505050565b600081359050613c6881615904565b92915050565b60008083601f840112613c8457613c83615099565b5b8235905067ffffffffffffffff811115613ca157613ca0615094565b5b602083019150836020820283011115613cbd57613cbc61509e565b5b9250929050565b600081359050613cd38161591b565b92915050565b600081359050613ce881615932565b92915050565b600081519050613cfd81615932565b92915050565b600082601f830112613d1857613d17615099565b5b8135613d28848260208601613c17565b91505092915050565b60008083601f840112613d4757613d46615099565b5b8235905067ffffffffffffffff811115613d6457613d63615094565b5b602083019150836001820283011115613d8057613d7f61509e565b5b9250929050565b600081359050613d9681615949565b92915050565b600081519050613dab81615949565b92915050565b600060208284031215613dc757613dc66150ad565b5b6000613dd584828501613c59565b91505092915050565b60008060408385031215613df557613df46150ad565b5b6000613e0385828601613c59565b9250506020613e1485828601613c59565b9150509250929050565b600080600060608486031215613e3757613e366150ad565b5b6000613e4586828701613c59565b9350506020613e5686828701613c59565b9250506040613e6786828701613d87565b9150509250925092565b60008060008060808587031215613e8b57613e8a6150ad565b5b6000613e9987828801613c59565b9450506020613eaa87828801613c59565b9350506040613ebb87828801613d87565b925050606085013567ffffffffffffffff811115613edc57613edb6150a8565b5b613ee887828801613d03565b91505092959194509250565b60008060408385031215613f0b57613f0a6150ad565b5b6000613f1985828601613c59565b9250506020613f2a85828601613cc4565b9150509250929050565b60008060408385031215613f4b57613f4a6150ad565b5b6000613f5985828601613c59565b9250506020613f6a85828601613d87565b9150509250929050565b60008060208385031215613f8b57613f8a6150ad565b5b600083013567ffffffffffffffff811115613fa957613fa86150a8565b5b613fb585828601613c6e565b92509250509250929050565b600060208284031215613fd757613fd66150ad565b5b6000613fe584828501613cd9565b91505092915050565b600060208284031215614004576140036150ad565b5b600061401284828501613cee565b91505092915050565b60008060208385031215614032576140316150ad565b5b600083013567ffffffffffffffff8111156140505761404f6150a8565b5b61405c85828601613d31565b92509250509250929050565b60006020828403121561407e5761407d6150ad565b5b600061408c84828501613d87565b91505092915050565b6000602082840312156140ab576140aa6150ad565b5b60006140b984828501613d9c565b91505092915050565b6140cb81614dbc565b82525050565b6140da81614dbc565b82525050565b6140e981614dce565b82525050565b60006140fa82614bea565b6141048185614c00565b9350614114818560208601614e6f565b61411d816150b2565b840191505092915050565b600061413382614bf5565b61413d8185614c11565b935061414d818560208601614e6f565b614156816150b2565b840191505092915050565b600061416c82614bf5565b6141768185614c22565b9350614186818560208601614e6f565b80840191505092915050565b600061419f602283614c11565b91506141aa826150c3565b604082019050919050565b60006141c2602683614c11565b91506141cd82615112565b604082019050919050565b60006141e5602a83614c11565b91506141f082615161565b604082019050919050565b6000614208600d83614c11565b9150614213826151b0565b602082019050919050565b600061422b602383614c11565b9150614236826151d9565b604082019050919050565b600061424e602583614c11565b915061425982615228565b604082019050919050565b6000614271603183614c11565b915061427c82615277565b604082019050919050565b6000614294601f83614c11565b915061429f826152c6565b602082019050919050565b60006142b7602283614c11565b91506142c2826152ef565b604082019050919050565b60006142da601e83614c11565b91506142e58261533e565b602082019050919050565b60006142fd603983614c11565b915061430882615367565b604082019050919050565b6000614320601883614c11565b915061432b826153b6565b602082019050919050565b6000614343602b83614c11565b915061434e826153df565b604082019050919050565b6000614366601283614c11565b91506143718261542e565b602082019050919050565b6000614389602683614c11565b915061439482615457565b604082019050919050565b60006143ac600583614c22565b91506143b7826154a6565b600582019050919050565b60006143cf602083614c11565b91506143da826154cf565b602082019050919050565b60006143f2601183614c11565b91506143fd826154f8565b602082019050919050565b6000614415602f83614c11565b915061442082615521565b604082019050919050565b6000614438601a83614c11565b915061444382615570565b602082019050919050565b600061445b603283614c11565b915061446682615599565b604082019050919050565b600061447e602283614c11565b9150614489826155e8565b604082019050919050565b60006144a1603383614c11565b91506144ac82615637565b604082019050919050565b60006144c4601683614c11565b91506144cf82615686565b602082019050919050565b60006144e7601d83614c11565b91506144f2826156af565b602082019050919050565b600061450a602183614c11565b9150614515826156d8565b604082019050919050565b600061452d601683614c11565b915061453882615727565b602082019050919050565b6000614550602e83614c11565b915061455b82615750565b604082019050919050565b6000614573602683614c11565b915061457e8261579f565b604082019050919050565b6000614596601f83614c11565b91506145a1826157ee565b602082019050919050565b60006145b9602f83614c11565b91506145c482615817565b604082019050919050565b60006145dc602d83614c11565b91506145e782615866565b604082019050919050565b60006145ff602283614c11565b915061460a826158b5565b604082019050919050565b60408201600082015161462b60008501826140c2565b50602082015161463e6020850182614653565b50505050565b61464d81614e42565b82525050565b61465c81614e4c565b82525050565b600061466e8285614161565b915061467a8284614161565b91506146858261439f565b91508190509392505050565b60006020820190506146a660008301846140d1565b92915050565b60006080820190506146c160008301876140d1565b6146ce60208301866140d1565b6146db6040830185614644565b81810360608301526146ed81846140ef565b905095945050505050565b600060408201905061470d60008301856140d1565b61471a6020830184614644565b9392505050565b600060208201905061473660008301846140e0565b92915050565b600060208201905081810360008301526147568184614128565b905092915050565b6000602082019050818103600083015261477781614192565b9050919050565b60006020820190508181036000830152614797816141b5565b9050919050565b600060208201905081810360008301526147b7816141d8565b9050919050565b600060208201905081810360008301526147d7816141fb565b9050919050565b600060208201905081810360008301526147f78161421e565b9050919050565b6000602082019050818103600083015261481781614241565b9050919050565b6000602082019050818103600083015261483781614264565b9050919050565b6000602082019050818103600083015261485781614287565b9050919050565b60006020820190508181036000830152614877816142aa565b9050919050565b60006020820190508181036000830152614897816142cd565b9050919050565b600060208201905081810360008301526148b7816142f0565b9050919050565b600060208201905081810360008301526148d781614313565b9050919050565b600060208201905081810360008301526148f781614336565b9050919050565b6000602082019050818103600083015261491781614359565b9050919050565b600060208201905081810360008301526149378161437c565b9050919050565b60006020820190508181036000830152614957816143c2565b9050919050565b60006020820190508181036000830152614977816143e5565b9050919050565b6000602082019050818103600083015261499781614408565b9050919050565b600060208201905081810360008301526149b78161442b565b9050919050565b600060208201905081810360008301526149d78161444e565b9050919050565b600060208201905081810360008301526149f781614471565b9050919050565b60006020820190508181036000830152614a1781614494565b9050919050565b60006020820190508181036000830152614a37816144b7565b9050919050565b60006020820190508181036000830152614a57816144da565b9050919050565b60006020820190508181036000830152614a77816144fd565b9050919050565b60006020820190508181036000830152614a9781614520565b9050919050565b60006020820190508181036000830152614ab781614543565b9050919050565b60006020820190508181036000830152614ad781614566565b9050919050565b60006020820190508181036000830152614af781614589565b9050919050565b60006020820190508181036000830152614b17816145ac565b9050919050565b60006020820190508181036000830152614b37816145cf565b9050919050565b60006020820190508181036000830152614b57816145f2565b9050919050565b6000604082019050614b736000830184614615565b92915050565b6000602082019050614b8e6000830184614644565b92915050565b6000614b9e614baf565b9050614baa8282614efe565b919050565b6000604051905090565b600067ffffffffffffffff821115614bd457614bd3615065565b5b614bdd826150b2565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c3882614e06565b9150614c4383614e06565b9250826fffffffffffffffffffffffffffffffff03821115614c6857614c67614fa9565b5b828201905092915050565b6000614c7e82614e42565b9150614c8983614e42565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cbe57614cbd614fa9565b5b828201905092915050565b6000614cd482614e42565b9150614cdf83614e42565b925082614cef57614cee614fd8565b5b828204905092915050565b6000614d0582614e42565b9150614d1083614e42565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d4957614d48614fa9565b5b828202905092915050565b6000614d5f82614e06565b9150614d6a83614e06565b925082821015614d7d57614d7c614fa9565b5b828203905092915050565b6000614d9382614e42565b9150614d9e83614e42565b925082821015614db157614db0614fa9565b5b828203905092915050565b6000614dc782614e22565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614e8d578082015181840152602081019050614e72565b83811115614e9c576000848401525b50505050565b6000614ead82614e42565b91506000821415614ec157614ec0614fa9565b5b600182039050919050565b60006002820490506001821680614ee457607f821691505b60208210811415614ef857614ef7615007565b5b50919050565b614f07826150b2565b810181811067ffffffffffffffff82111715614f2657614f25615065565b5b80604052505050565b6000614f3a82614e42565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f6d57614f6c614fa9565b5b600182019050919050565b6000614f8382614e42565b9150614f8e83614e42565b925082614f9e57614f9d614fd8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f6e6f206d696e7473206c65667400000000000000000000000000000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f6d696e74696e67206e6f74206163746976652c20706c65617365207761697400600082015250565b7f6e6f74206f6e2077686974656c697374206f7220616c7265616479206d696e7460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6e6f207061796d656e74206e6565646564000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360008201527f6c65616e75700000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b61590d81614dbc565b811461591857600080fd5b50565b61592481614dce565b811461592f57600080fd5b50565b61593b81614dda565b811461594657600080fd5b50565b61595281614e42565b811461595d57600080fd5b5056fea26469706673582212203967b7ffb4916d5224260ecac4723e2eeff69c29ecc19545824373399cd4304264736f6c63430008070033
Deployed Bytecode Sourcemap
40445:6624:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22333:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24209:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25872:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25393:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41909:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20746:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26778:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41622:140;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46336:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43175:465;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21413:848;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41770:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27011:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20923:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46222:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24018:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22783:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1363:94;;;;;;;;;;;;;:::i;:::-;;46752:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41368:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42427:193;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41479:135;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40708:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;712:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46589:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24378:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40624:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43650:2440;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42247:172;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26158:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40667:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42628:539;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27259:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46970:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24553:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32132:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46468:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26517:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1612:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40752:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22333:386;22460:4;22513:25;22498:40;;;:11;:40;;;;:101;;;;22566:33;22551:48;;;:11;:48;;;;22498:101;:164;;;;22627:35;22612:50;;;:11;:50;;;;22498:164;:213;;;;22675:36;22699:11;22675:23;:36::i;:::-;22498:213;22482:229;;22333:386;;;:::o;24209:100::-;24263:13;24296:5;24289:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24209:100;:::o;25872:214::-;25940:7;25968:16;25976:7;25968;:16::i;:::-;25960:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26054:15;:24;26070:7;26054:24;;;;;;;;;;;;;;;;;;;;;26047:31;;25872:214;;;:::o;25393:413::-;25466:13;25482:24;25498:7;25482:15;:24::i;:::-;25466:40;;25531:5;25525:11;;:2;:11;;;;25517:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;25626:5;25610:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25635:37;25652:5;25659:12;:10;:12::i;:::-;25635:16;:37::i;:::-;25610:62;25588:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;25770:28;25779:2;25783:7;25792:5;25770:8;:28::i;:::-;25455:351;25393:413;;:::o;41909:330::-;41970:4;41990:17;:15;:17::i;:::-;41987:61;;;42031:5;42024:12;;;;41987:61;42061:22;42075:7;42061:13;:22::i;:::-;42058:65;;;42107:4;42100:11;;;;42058:65;42168:1;42136:29;42157:7;42136:20;:29::i;:::-;:33;42133:76;;;42193:4;42186:11;;;;42133:76;42226:5;42219:12;;41909:330;;;;:::o;20746:100::-;20799:7;20826:12;;20819:19;;20746:100;:::o;26778:162::-;26904:28;26914:4;26920:2;26924:7;26904:9;:28::i;:::-;26778:162;;;:::o;41622:140::-;41670:4;41694:12;:10;:12::i;:::-;:60;;;;;41741:11;;41731:9;;:21;;;;:::i;:::-;41711:15;:42;;41694:60;41687:67;;41622:140;:::o;46336:124::-;943:12;:10;:12::i;:::-;932:23;;:7;:5;:7::i;:::-;:23;;;924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2876:1:::1;3472:7;;:19;;3464:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2876:1;3605:7;:18;;;;46424:28:::2;46443:8;46424:18;:28::i;:::-;2832:1:::1;3784:7;:22;;;;46336:124:::0;:::o;43175:465::-;43238:7;43298:1;43266:29;43287:7;43266:20;:29::i;:::-;:33;43258:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;43328:15;43346:16;;;;;;;;;;;:26;;;43373:7;43346:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43328:53;;43396:6;43392:222;43407:7;43405:1;:9;43392:222;;;43435:16;43454;;;;;;;;;;;:36;;;43491:7;43500:1;43454:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43435:67;;43547:4;43520:31;;:13;:23;43534:8;43520:23;;;;;;;;;;;;;;;;;;;;;:31;;;43517:86;;43579:8;43572:15;;;;;;;43517:86;43420:194;43415:3;;;;;:::i;:::-;;;;43392:222;;;;43624:8;;;43175:465;;;;:::o;21413:848::-;21522:7;21563:16;21573:5;21563:9;:16::i;:::-;21555:5;:24;21547:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;21629:22;21654:13;:11;:13::i;:::-;21629:38;;21678:19;21712:25;21766:9;21761:426;21785:14;21781:1;:18;21761:426;;;21821:31;21855:11;:14;21867:1;21855:14;;;;;;;;;;;21821:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21914:1;21888:28;;:9;:14;;;:28;;;21884:103;;21957:9;:14;;;21937:34;;21884:103;22026:5;22005:26;;:17;:26;;;22001:175;;;22071:5;22056:11;:20;22052:77;;;22108:1;22101:8;;;;;;;;;22052:77;22147:13;;;;;:::i;:::-;;;;22001:175;21806:381;21801:3;;;;;:::i;:::-;;;;21761:426;;;;22197:56;;;;;;;;;;:::i;:::-;;;;;;;;21413:848;;;;;:::o;41770:131::-;41831:4;41889;41855:38;;:21;:30;41877:7;41855:30;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;41848:45;;41770:131;;;:::o;27011:177::-;27141:39;27158:4;27164:2;27168:7;27141:39;;;;;;;;;;;;:16;:39::i;:::-;27011:177;;;:::o;20923:187::-;20990:7;21026:13;:11;:13::i;:::-;21018:5;:21;21010:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;21097:5;21090:12;;20923:187;;;:::o;46222:106::-;943:12;:10;:12::i;:::-;932:23;;:7;:5;:7::i;:::-;:23;;;924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46313:7:::1;;46297:13;:23;;;;;;;:::i;:::-;;46222:106:::0;;:::o;24018:124::-;24082:7;24109:20;24121:7;24109:11;:20::i;:::-;:25;;;24102:32;;24018:124;;;:::o;22783:221::-;22847:7;22892:1;22875:19;;:5;:19;;;;22867:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;22968:12;:19;22981:5;22968:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;22960:36;;22953:43;;22783:221;;;:::o;1363:94::-;943:12;:10;:12::i;:::-;932:23;;:7;:5;:7::i;:::-;:23;;;924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1428:21:::1;1446:1;1428:9;:21::i;:::-;1363:94::o:0;46752:208::-;943:12;:10;:12::i;:::-;932:23;;:7;:5;:7::i;:::-;:23;;;924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46842:9:::1;46837:116;46861:9;;:16;;46857:1;:20;46837:116;;;46937:4;46899:21;:35;46921:9;;46931:1;46921:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;46899:35;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;46879:3;;;;;:::i;:::-;;;;46837:116;;;;46752:208:::0;;:::o;41368:103::-;41411:4;41454:9;;41435:15;:28;;41428:35;;41368:103;:::o;42427:193::-;42475:7;42498:17;:15;:17::i;:::-;42495:57;;;42539:1;42532:8;;;;42495:57;42597:15;42582:11;;42570:9;;:23;;;;:::i;:::-;42569:43;;;;:::i;:::-;42562:50;;42427:193;;:::o;41479:135::-;41523:4;41547:12;:10;:12::i;:::-;:59;;;;;41593:11;;41583:9;;:21;;;;:::i;:::-;41564:15;:41;41547:59;41540:66;;41479:135;:::o;40708:37::-;;;;:::o;712:87::-;758:7;785:6;;;;;;;;;;;778:13;;712:87;:::o;46589:155::-;46670:21;;:::i;:::-;46716:20;46728:7;46716:11;:20::i;:::-;46709:27;;46589:155;;;:::o;24378:104::-;24434:13;24467:7;24460:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24378:104;:::o;40624:36::-;;;;:::o;43650:2440::-;41291:10;41278:23;;:9;:23;;;41270:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43751:12:::1;:10;:12::i;:::-;43743:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;43846:14;43834:8;43818:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;43810:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43899:13;:11;:13::i;:::-;43896:2116;;;43931:33;43967:32;43988:10;43967:20;:32::i;:::-;43931:68;;44080:1;44052:25;:29;44049:1653;;;44182:25;44170:8;:37;44167:1085;;44253:1;44240:9;:14;44232:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;44303:6;44299:183;44314:8;44312:1;:10;44299:183;;;44355:16;44374:27;44390:10;44374:15;:27::i;:::-;44355:46;;44454:4;44428:13;:23;44442:8;44428:23;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;44328:154;44323:3;;;;;:::i;:::-;;;;44299:183;;;;44504:31;44514:10;44526:8;44504:9;:31::i;:::-;44167:1085;;;44689:4;44652:41;;:21;:33;44674:10;44652:33;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;44644:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;44802:1;44776:25;:27;;;;:::i;:::-;44763:8;:41;44755:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;44875:5;;44862:9;:18;;44854:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;44934:6;44930:185;44954:1;44945:8;:10;;;;:::i;:::-;44943:1;:12;44930:185;;;44988:16;45007:27;45023:10;45007:15;:27::i;:::-;44988:46;;45087:4;45061:13;:23;45075:8;45061:23;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;44961:154;44956:3;;;;;:::i;:::-;;;;44930:185;;;;45173:5;45137:21;:33;45159:10;45137:33;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;45201:31;45211:10;45223:8;45201:9;:31::i;:::-;44167:1085;44049:1653;;;45394:4;45357:41;;:21;:33;45379:10;45357:33;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;45349:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;45476:1;45464:8;:13;45456:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;45544:5;;45531:9;:18;;45523:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;45631:5;45595:21;:33;45617:10;45595:33;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;45655:31;45665:10;45677:8;45655:9;:31::i;:::-;44049:1653;43914:1801;43896:2116;;;45803:14;;45791:8;45764:24;45777:10;45764:12;:24::i;:::-;:35;;;;:::i;:::-;:53;;45738:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;45922:5;;45911:8;:16;;;;:::i;:::-;45898:9;:29;;45890:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;45969:31;45979:10;45991:8;45969:9;:31::i;:::-;43896:2116;46034:15;;;;;;;;;;;46026:33;;:56;46060:21;46026:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;43650:2440:::0;:::o;42247:172::-;42295:7;42318:12;:10;:12::i;:::-;42315:52;;;42354:1;42347:8;;;;42315:52;42396:15;42384:9;;:27;;;;:::i;:::-;42377:34;;42247:172;;:::o;26158:288::-;26265:12;:10;:12::i;:::-;26253:24;;:8;:24;;;;26245:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;26366:8;26321:18;:32;26340:12;:10;:12::i;:::-;26321:32;;;;;;;;;;;;;;;:42;26354:8;26321:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26419:8;26390:48;;26405:12;:10;:12::i;:::-;26390:48;;;26429:8;26390:48;;;;;;:::i;:::-;;;;;;;;26158:288;;:::o;40667:34::-;;;;:::o;42628:539::-;42696:7;42719:17;:15;:17::i;:::-;42716:57;;;42760:1;42753:8;;;;42716:57;42783:15;42801:16;;;;;;;;;;;:26;;;42828:7;42801:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42783:53;;42847:23;42889:6;42885:242;42900:7;42898:1;:9;42885:242;;;42928:16;42947;;;;;;;;;;;:36;;;42984:7;42993:1;42947:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42928:67;;43040:4;43013:31;;:13;:23;43027:8;43013:23;;;;;;;;;;;;;;;;;;;;;:31;;;43010:106;;43099:1;43083:15;:17;;;;:::i;:::-;43065:35;;43010:106;42913:214;42908:3;;;;;:::i;:::-;;;;42885:242;;;;43144:15;43137:22;;;;42628:539;;;;:::o;27259:355::-;27418:28;27428:4;27434:2;27438:7;27418:9;:28::i;:::-;27479:48;27502:4;27508:2;27512:7;27521:5;27479:22;:48::i;:::-;27457:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;27259:355;;;;:::o;46970:94::-;943:12;:10;:12::i;:::-;932:23;;:7;:5;:7::i;:::-;:23;;;924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47054:2:::1;47042:9;:14;;;;46970:94:::0;:::o;24553:436::-;24651:13;24704:16;24712:7;24704;:16::i;:::-;24682:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;24808:21;24832:10;:8;:10::i;:::-;24808:34;;24893:1;24875:7;24869:21;:25;:112;;;;;;;;;;;;;;;;;24930:7;24939:18;:7;:16;:18::i;:::-;24913:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24869:112;24853:128;;;24553:436;;;:::o;32132:43::-;;;;:::o;46468:113::-;46526:7;46553:20;46567:5;46553:13;:20::i;:::-;46546:27;;46468:113;;;:::o;26517:194::-;26639:4;26668:18;:25;26687:5;26668:25;;;;;;;;;;;;;;;:35;26694:8;26668:35;;;;;;;;;;;;;;;;;;;;;;;;;26661:42;;26517:194;;;;:::o;1612:192::-;943:12;:10;:12::i;:::-;932:23;;:7;:5;:7::i;:::-;:23;;;924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1721:1:::1;1701:22;;:8;:22;;;;1693:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1777:19;1787:8;1777:9;:19::i;:::-;1612:192:::0;:::o;40752:35::-;;;;:::o;18670:157::-;18755:4;18794:25;18779:40;;;:11;:40;;;;18772:47;;18670:157;;;:::o;27869:111::-;27926:4;27960:12;;27950:7;:22;27943:29;;27869:111;;;:::o;95:98::-;148:7;175:10;168:17;;95:98;:::o;31928:196::-;32070:2;32043:15;:24;32059:7;32043:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32108:7;32104:2;32088:28;;32097:5;32088:28;;;;;;;;;;;;31928:196;;;:::o;30109:1701::-;30224:35;30262:20;30274:7;30262:11;:20::i;:::-;30224:58;;30295:22;30337:13;:18;;;30321:34;;:12;:10;:12::i;:::-;:34;;;:83;;;;30392:12;:10;:12::i;:::-;30368:36;;:20;30380:7;30368:11;:20::i;:::-;:36;;;30321:83;:146;;;;30417:50;30434:13;:18;;;30454:12;:10;:12::i;:::-;30417:16;:50::i;:::-;30321:146;30295:173;;30503:17;30481:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;30655:4;30633:26;;:13;:18;;;:26;;;30611:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;30758:1;30744:16;;:2;:16;;;;30736:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;30815:43;30837:4;30843:2;30847:7;30856:1;30815:21;:43::i;:::-;30923:49;30940:1;30944:7;30953:13;:18;;;30923:8;:49::i;:::-;31015:1;30985:12;:18;30998:4;30985:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31055:1;31027:12;:16;31040:2;31027:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31090:43;;;;;;;;31105:2;31090:43;;;;;;31116:15;31090:43;;;;;31067:11;:20;31079:7;31067:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31373:19;31405:1;31395:7;:11;;;;:::i;:::-;31373:33;;31462:1;31421:43;;:11;:24;31433:11;31421:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;31417:288;;;31485:20;31493:11;31485:7;:20::i;:::-;31481:213;;;31553:125;;;;;;;;31590:13;:18;;;31553:125;;;;;;31631:13;:28;;;31553:125;;;;;31526:11;:24;31538:11;31526:24;;;;;;;;;;;:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31481:213;31417:288;31741:7;31737:2;31722:27;;31731:4;31722:27;;;;;;;;;;;;31760:42;31781:4;31787:2;31791:7;31800:1;31760:20;:42::i;:::-;30213:1597;;;30109:1701;;;:::o;32288:950::-;32354:25;32382:24;;32354:52;;32436:1;32425:8;:12;32417:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;32477:16;32527:1;32516:8;32496:17;:28;;;;:::i;:::-;:32;;;;:::i;:::-;32477:51;;32571:1;32554:14;:18;;;;:::i;:::-;32543:8;:29;32539:91;;;32617:1;32600:14;:18;;;;:::i;:::-;32589:29;;32539:91;32753:17;32761:8;32753:7;:17::i;:::-;32745:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32829:9;32841:17;32829:29;;32824:357;32865:8;32860:1;:13;32824:357;;32930:1;32899:33;;:11;:14;32911:1;32899:14;;;;;;;;;;;:19;;;;;;;;;;;;:33;;;32895:275;;;32953:31;32987:14;32999:1;32987:11;:14::i;:::-;32953:48;;33037:117;;;;;;;;33074:9;:14;;;33037:117;;;;;;33111:9;:24;;;33037:117;;;;;33020:11;:14;33032:1;33020:14;;;;;;;;;;;:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32934:236;32895:275;32875:3;;;;;:::i;:::-;;;;32824:357;;;;33229:1;33218:8;:12;;;;:::i;:::-;33191:24;:39;;;;32343:895;;32288:950;:::o;23286:670::-;23362:21;;:::i;:::-;23409:16;23417:7;23409;:16::i;:::-;23401:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;23485:26;23537:12;23526:7;:23;23522:103;;23612:1;23597:12;23587:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;23566:47;;23522:103;23642:12;23657:7;23642:22;;23637:242;23674:18;23666:4;:26;23637:242;;23717:31;23751:11;:17;23763:4;23751:17;;;;;;;;;;;23717:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23813:1;23787:28;;:9;:14;;;:28;;;23783:85;;23843:9;23836:16;;;;;;;23783:85;23702:177;23694:6;;;;;:::i;:::-;;;;23637:242;;;;23891:57;;;;;;;;;;:::i;:::-;;;;;;;;23286:670;;;;:::o;1812:173::-;1868:16;1887:6;;;;;;;;;;;1868:25;;1913:8;1904:6;;:17;;;;;;;;;;;;;;;;;;1968:8;1937:40;;1958:8;1937:40;;;;;;;;;;;;1857:128;1812:173;:::o;27988:104::-;28057:27;28067:2;28071:8;28057:27;;;;;;;;;;;;:9;:27::i;:::-;27988:104;;:::o;33803:830::-;33958:4;33979:15;:2;:13;;;:15::i;:::-;33975:651;;;34044:2;34028:36;;;34065:12;:10;:12::i;:::-;34079:4;34085:7;34094:5;34028:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34011:560;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34304:1;34287:6;:13;:18;34283:273;;;34330:61;;;;;;;;;;:::i;:::-;;;;;;;;34283:273;34506:6;34500:13;34491:6;34487:2;34483:15;34476:38;34011:560;34174:45;;;34164:55;;;:6;:55;;;;34157:62;;;;;33975:651;34610:4;34603:11;;33803:830;;;;;;;:::o;46100:114::-;46160:13;46193;46186:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46100:114;:::o;36045:723::-;36101:13;36331:1;36322:5;:10;36318:53;;;36349:10;;;;;;;;;;;;;;;;;;;;;36318:53;36381:12;36396:5;36381:20;;36412:14;36437:78;36452:1;36444:4;:9;36437:78;;36470:8;;;;;:::i;:::-;;;;36501:2;36493:10;;;;;:::i;:::-;;;36437:78;;;36525:19;36557:6;36547:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36525:39;;36575:154;36591:1;36582:5;:10;36575:154;;36619:1;36609:11;;;;;:::i;:::-;;;36686:2;36678:5;:10;;;;:::i;:::-;36665:2;:24;;;;:::i;:::-;36652:39;;36635:6;36642;36635:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;36715:2;36706:11;;;;;:::i;:::-;;;36575:154;;;36753:6;36739:21;;;;;36045:723;;;;:::o;23012:266::-;23073:7;23132:1;23115:19;;:5;:19;;;;23093:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;23237:12;:19;23250:5;23237:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;23229:41;;23222:48;;23012:266;;;:::o;35121:159::-;;;;;:::o;35692:158::-;;;;;:::o;28455:1400::-;28578:20;28601:12;;28578:35;;28646:1;28632:16;;:2;:16;;;;28624:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28831:21;28839:12;28831:7;:21::i;:::-;28830:22;28822:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;28917:12;28905:8;:24;;28897:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;28981:61;29011:1;29015:2;29019:12;29033:8;28981:21;:61::i;:::-;29055:30;29088:12;:16;29101:2;29088:16;;;;;;;;;;;;;;;29055:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29134:135;;;;;;;;29190:8;29160:11;:19;;;:39;;;;:::i;:::-;29134:135;;;;;;29249:8;29214:11;:24;;;:44;;;;:::i;:::-;29134:135;;;;;29115:12;:16;29128:2;29115:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29308:43;;;;;;;;29323:2;29308:43;;;;;;29334:15;29308:43;;;;;29280:11;:25;29292:12;29280:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29364:20;29387:12;29364:35;;29417:9;29412:325;29436:8;29432:1;:12;29412:325;;;29496:12;29492:2;29471:38;;29488:1;29471:38;;;;;;;;;;;;29550:59;29581:1;29585:2;29589:12;29603:5;29550:22;:59::i;:::-;29524:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;29711:14;;;;;:::i;:::-;;;;29446:3;;;;;:::i;:::-;;;;29412:325;;;;29764:12;29749;:27;;;;29787:60;29816:1;29820:2;29824:12;29838:8;29787:20;:60::i;:::-;28567:1288;;;28455:1400;;;:::o;11449:387::-;11509:4;11717:12;11784:7;11772:20;11764:28;;11827:1;11820:4;:8;11813:15;;;11449:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1159:133::-;1202:5;1240:6;1227:20;1218:29;;1256:30;1280:5;1256:30;:::i;:::-;1159:133;;;;:::o;1298:137::-;1343:5;1381:6;1368:20;1359:29;;1397:32;1423:5;1397:32;:::i;:::-;1298:137;;;;:::o;1441:141::-;1497:5;1528:6;1522:13;1513:22;;1544:32;1570:5;1544:32;:::i;:::-;1441:141;;;;:::o;1601:338::-;1656:5;1705:3;1698:4;1690:6;1686:17;1682:27;1672:122;;1713:79;;:::i;:::-;1672:122;1830:6;1817:20;1855:78;1929:3;1921:6;1914:4;1906:6;1902:17;1855:78;:::i;:::-;1846:87;;1662:277;1601:338;;;;:::o;1959:553::-;2017:8;2027:6;2077:3;2070:4;2062:6;2058:17;2054:27;2044:122;;2085:79;;:::i;:::-;2044:122;2198:6;2185:20;2175:30;;2228:18;2220:6;2217:30;2214:117;;;2250:79;;:::i;:::-;2214:117;2364:4;2356:6;2352:17;2340:29;;2418:3;2410:4;2402:6;2398:17;2388:8;2384:32;2381:41;2378:128;;;2425:79;;:::i;:::-;2378:128;1959:553;;;;;:::o;2518:139::-;2564:5;2602:6;2589:20;2580:29;;2618:33;2645:5;2618:33;:::i;:::-;2518:139;;;;:::o;2663:143::-;2720:5;2751:6;2745:13;2736:22;;2767:33;2794:5;2767:33;:::i;:::-;2663:143;;;;:::o;2812:329::-;2871:6;2920:2;2908:9;2899:7;2895:23;2891:32;2888:119;;;2926:79;;:::i;:::-;2888:119;3046:1;3071:53;3116:7;3107:6;3096:9;3092:22;3071:53;:::i;:::-;3061:63;;3017:117;2812:329;;;;:::o;3147:474::-;3215:6;3223;3272:2;3260:9;3251:7;3247:23;3243:32;3240:119;;;3278:79;;:::i;:::-;3240:119;3398:1;3423:53;3468:7;3459:6;3448:9;3444:22;3423:53;:::i;:::-;3413:63;;3369:117;3525:2;3551:53;3596:7;3587:6;3576:9;3572:22;3551:53;:::i;:::-;3541:63;;3496:118;3147:474;;;;;:::o;3627:619::-;3704:6;3712;3720;3769:2;3757:9;3748:7;3744:23;3740:32;3737:119;;;3775:79;;:::i;:::-;3737:119;3895:1;3920:53;3965:7;3956:6;3945:9;3941:22;3920:53;:::i;:::-;3910:63;;3866:117;4022:2;4048:53;4093:7;4084:6;4073:9;4069:22;4048:53;:::i;:::-;4038:63;;3993:118;4150:2;4176:53;4221:7;4212:6;4201:9;4197:22;4176:53;:::i;:::-;4166:63;;4121:118;3627:619;;;;;:::o;4252:943::-;4347:6;4355;4363;4371;4420:3;4408:9;4399:7;4395:23;4391:33;4388:120;;;4427:79;;:::i;:::-;4388:120;4547:1;4572:53;4617:7;4608:6;4597:9;4593:22;4572:53;:::i;:::-;4562:63;;4518:117;4674:2;4700:53;4745:7;4736:6;4725:9;4721:22;4700:53;:::i;:::-;4690:63;;4645:118;4802:2;4828:53;4873:7;4864:6;4853:9;4849:22;4828:53;:::i;:::-;4818:63;;4773:118;4958:2;4947:9;4943:18;4930:32;4989:18;4981:6;4978:30;4975:117;;;5011:79;;:::i;:::-;4975:117;5116:62;5170:7;5161:6;5150:9;5146:22;5116:62;:::i;:::-;5106:72;;4901:287;4252:943;;;;;;;:::o;5201:468::-;5266:6;5274;5323:2;5311:9;5302:7;5298:23;5294:32;5291:119;;;5329:79;;:::i;:::-;5291:119;5449:1;5474:53;5519:7;5510:6;5499:9;5495:22;5474:53;:::i;:::-;5464:63;;5420:117;5576:2;5602:50;5644:7;5635:6;5624:9;5620:22;5602:50;:::i;:::-;5592:60;;5547:115;5201:468;;;;;:::o;5675:474::-;5743:6;5751;5800:2;5788:9;5779:7;5775:23;5771:32;5768:119;;;5806:79;;:::i;:::-;5768:119;5926:1;5951:53;5996:7;5987:6;5976:9;5972:22;5951:53;:::i;:::-;5941:63;;5897:117;6053:2;6079:53;6124:7;6115:6;6104:9;6100:22;6079:53;:::i;:::-;6069:63;;6024:118;5675:474;;;;;:::o;6155:559::-;6241:6;6249;6298:2;6286:9;6277:7;6273:23;6269:32;6266:119;;;6304:79;;:::i;:::-;6266:119;6452:1;6441:9;6437:17;6424:31;6482:18;6474:6;6471:30;6468:117;;;6504:79;;:::i;:::-;6468:117;6617:80;6689:7;6680:6;6669:9;6665:22;6617:80;:::i;:::-;6599:98;;;;6395:312;6155:559;;;;;:::o;6720:327::-;6778:6;6827:2;6815:9;6806:7;6802:23;6798:32;6795:119;;;6833:79;;:::i;:::-;6795:119;6953:1;6978:52;7022:7;7013:6;7002:9;6998:22;6978:52;:::i;:::-;6968:62;;6924:116;6720:327;;;;:::o;7053:349::-;7122:6;7171:2;7159:9;7150:7;7146:23;7142:32;7139:119;;;7177:79;;:::i;:::-;7139:119;7297:1;7322:63;7377:7;7368:6;7357:9;7353:22;7322:63;:::i;:::-;7312:73;;7268:127;7053:349;;;;:::o;7408:529::-;7479:6;7487;7536:2;7524:9;7515:7;7511:23;7507:32;7504:119;;;7542:79;;:::i;:::-;7504:119;7690:1;7679:9;7675:17;7662:31;7720:18;7712:6;7709:30;7706:117;;;7742:79;;:::i;:::-;7706:117;7855:65;7912:7;7903:6;7892:9;7888:22;7855:65;:::i;:::-;7837:83;;;;7633:297;7408:529;;;;;:::o;7943:329::-;8002:6;8051:2;8039:9;8030:7;8026:23;8022:32;8019:119;;;8057:79;;:::i;:::-;8019:119;8177:1;8202:53;8247:7;8238:6;8227:9;8223:22;8202:53;:::i;:::-;8192:63;;8148:117;7943:329;;;;:::o;8278:351::-;8348:6;8397:2;8385:9;8376:7;8372:23;8368:32;8365:119;;;8403:79;;:::i;:::-;8365:119;8523:1;8548:64;8604:7;8595:6;8584:9;8580:22;8548:64;:::i;:::-;8538:74;;8494:128;8278:351;;;;:::o;8635:108::-;8712:24;8730:5;8712:24;:::i;:::-;8707:3;8700:37;8635:108;;:::o;8749:118::-;8836:24;8854:5;8836:24;:::i;:::-;8831:3;8824:37;8749:118;;:::o;8873:109::-;8954:21;8969:5;8954:21;:::i;:::-;8949:3;8942:34;8873:109;;:::o;8988:360::-;9074:3;9102:38;9134:5;9102:38;:::i;:::-;9156:70;9219:6;9214:3;9156:70;:::i;:::-;9149:77;;9235:52;9280:6;9275:3;9268:4;9261:5;9257:16;9235:52;:::i;:::-;9312:29;9334:6;9312:29;:::i;:::-;9307:3;9303:39;9296:46;;9078:270;8988:360;;;;:::o;9354:364::-;9442:3;9470:39;9503:5;9470:39;:::i;:::-;9525:71;9589:6;9584:3;9525:71;:::i;:::-;9518:78;;9605:52;9650:6;9645:3;9638:4;9631:5;9627:16;9605:52;:::i;:::-;9682:29;9704:6;9682:29;:::i;:::-;9677:3;9673:39;9666:46;;9446:272;9354:364;;;;:::o;9724:377::-;9830:3;9858:39;9891:5;9858:39;:::i;:::-;9913:89;9995:6;9990:3;9913:89;:::i;:::-;9906:96;;10011:52;10056:6;10051:3;10044:4;10037:5;10033:16;10011:52;:::i;:::-;10088:6;10083:3;10079:16;10072:23;;9834:267;9724:377;;;;:::o;10107:366::-;10249:3;10270:67;10334:2;10329:3;10270:67;:::i;:::-;10263:74;;10346:93;10435:3;10346:93;:::i;:::-;10464:2;10459:3;10455:12;10448:19;;10107:366;;;:::o;10479:::-;10621:3;10642:67;10706:2;10701:3;10642:67;:::i;:::-;10635:74;;10718:93;10807:3;10718:93;:::i;:::-;10836:2;10831:3;10827:12;10820:19;;10479:366;;;:::o;10851:::-;10993:3;11014:67;11078:2;11073:3;11014:67;:::i;:::-;11007:74;;11090:93;11179:3;11090:93;:::i;:::-;11208:2;11203:3;11199:12;11192:19;;10851:366;;;:::o;11223:::-;11365:3;11386:67;11450:2;11445:3;11386:67;:::i;:::-;11379:74;;11462:93;11551:3;11462:93;:::i;:::-;11580:2;11575:3;11571:12;11564:19;;11223:366;;;:::o;11595:::-;11737:3;11758:67;11822:2;11817:3;11758:67;:::i;:::-;11751:74;;11834:93;11923:3;11834:93;:::i;:::-;11952:2;11947:3;11943:12;11936:19;;11595:366;;;:::o;11967:::-;12109:3;12130:67;12194:2;12189:3;12130:67;:::i;:::-;12123:74;;12206:93;12295:3;12206:93;:::i;:::-;12324:2;12319:3;12315:12;12308:19;;11967:366;;;:::o;12339:::-;12481:3;12502:67;12566:2;12561:3;12502:67;:::i;:::-;12495:74;;12578:93;12667:3;12578:93;:::i;:::-;12696:2;12691:3;12687:12;12680:19;;12339:366;;;:::o;12711:::-;12853:3;12874:67;12938:2;12933:3;12874:67;:::i;:::-;12867:74;;12950:93;13039:3;12950:93;:::i;:::-;13068:2;13063:3;13059:12;13052:19;;12711:366;;;:::o;13083:::-;13225:3;13246:67;13310:2;13305:3;13246:67;:::i;:::-;13239:74;;13322:93;13411:3;13322:93;:::i;:::-;13440:2;13435:3;13431:12;13424:19;;13083:366;;;:::o;13455:::-;13597:3;13618:67;13682:2;13677:3;13618:67;:::i;:::-;13611:74;;13694:93;13783:3;13694:93;:::i;:::-;13812:2;13807:3;13803:12;13796:19;;13455:366;;;:::o;13827:::-;13969:3;13990:67;14054:2;14049:3;13990:67;:::i;:::-;13983:74;;14066:93;14155:3;14066:93;:::i;:::-;14184:2;14179:3;14175:12;14168:19;;13827:366;;;:::o;14199:::-;14341:3;14362:67;14426:2;14421:3;14362:67;:::i;:::-;14355:74;;14438:93;14527:3;14438:93;:::i;:::-;14556:2;14551:3;14547:12;14540:19;;14199:366;;;:::o;14571:::-;14713:3;14734:67;14798:2;14793:3;14734:67;:::i;:::-;14727:74;;14810:93;14899:3;14810:93;:::i;:::-;14928:2;14923:3;14919:12;14912:19;;14571:366;;;:::o;14943:::-;15085:3;15106:67;15170:2;15165:3;15106:67;:::i;:::-;15099:74;;15182:93;15271:3;15182:93;:::i;:::-;15300:2;15295:3;15291:12;15284:19;;14943:366;;;:::o;15315:::-;15457:3;15478:67;15542:2;15537:3;15478:67;:::i;:::-;15471:74;;15554:93;15643:3;15554:93;:::i;:::-;15672:2;15667:3;15663:12;15656:19;;15315:366;;;:::o;15687:400::-;15847:3;15868:84;15950:1;15945:3;15868:84;:::i;:::-;15861:91;;15961:93;16050:3;15961:93;:::i;:::-;16079:1;16074:3;16070:11;16063:18;;15687:400;;;:::o;16093:366::-;16235:3;16256:67;16320:2;16315:3;16256:67;:::i;:::-;16249:74;;16332:93;16421:3;16332:93;:::i;:::-;16450:2;16445:3;16441:12;16434:19;;16093:366;;;:::o;16465:::-;16607:3;16628:67;16692:2;16687:3;16628:67;:::i;:::-;16621:74;;16704:93;16793:3;16704:93;:::i;:::-;16822:2;16817:3;16813:12;16806:19;;16465:366;;;:::o;16837:::-;16979:3;17000:67;17064:2;17059:3;17000:67;:::i;:::-;16993:74;;17076:93;17165:3;17076:93;:::i;:::-;17194:2;17189:3;17185:12;17178:19;;16837:366;;;:::o;17209:::-;17351:3;17372:67;17436:2;17431:3;17372:67;:::i;:::-;17365:74;;17448:93;17537:3;17448:93;:::i;:::-;17566:2;17561:3;17557:12;17550:19;;17209:366;;;:::o;17581:::-;17723:3;17744:67;17808:2;17803:3;17744:67;:::i;:::-;17737:74;;17820:93;17909:3;17820:93;:::i;:::-;17938:2;17933:3;17929:12;17922:19;;17581:366;;;:::o;17953:::-;18095:3;18116:67;18180:2;18175:3;18116:67;:::i;:::-;18109:74;;18192:93;18281:3;18192:93;:::i;:::-;18310:2;18305:3;18301:12;18294:19;;17953:366;;;:::o;18325:::-;18467:3;18488:67;18552:2;18547:3;18488:67;:::i;:::-;18481:74;;18564:93;18653:3;18564:93;:::i;:::-;18682:2;18677:3;18673:12;18666:19;;18325:366;;;:::o;18697:::-;18839:3;18860:67;18924:2;18919:3;18860:67;:::i;:::-;18853:74;;18936:93;19025:3;18936:93;:::i;:::-;19054:2;19049:3;19045:12;19038:19;;18697:366;;;:::o;19069:::-;19211:3;19232:67;19296:2;19291:3;19232:67;:::i;:::-;19225:74;;19308:93;19397:3;19308:93;:::i;:::-;19426:2;19421:3;19417:12;19410:19;;19069:366;;;:::o;19441:::-;19583:3;19604:67;19668:2;19663:3;19604:67;:::i;:::-;19597:74;;19680:93;19769:3;19680:93;:::i;:::-;19798:2;19793:3;19789:12;19782:19;;19441:366;;;:::o;19813:::-;19955:3;19976:67;20040:2;20035:3;19976:67;:::i;:::-;19969:74;;20052:93;20141:3;20052:93;:::i;:::-;20170:2;20165:3;20161:12;20154:19;;19813:366;;;:::o;20185:::-;20327:3;20348:67;20412:2;20407:3;20348:67;:::i;:::-;20341:74;;20424:93;20513:3;20424:93;:::i;:::-;20542:2;20537:3;20533:12;20526:19;;20185:366;;;:::o;20557:::-;20699:3;20720:67;20784:2;20779:3;20720:67;:::i;:::-;20713:74;;20796:93;20885:3;20796:93;:::i;:::-;20914:2;20909:3;20905:12;20898:19;;20557:366;;;:::o;20929:::-;21071:3;21092:67;21156:2;21151:3;21092:67;:::i;:::-;21085:74;;21168:93;21257:3;21168:93;:::i;:::-;21286:2;21281:3;21277:12;21270:19;;20929:366;;;:::o;21301:::-;21443:3;21464:67;21528:2;21523:3;21464:67;:::i;:::-;21457:74;;21540:93;21629:3;21540:93;:::i;:::-;21658:2;21653:3;21649:12;21642:19;;21301:366;;;:::o;21673:::-;21815:3;21836:67;21900:2;21895:3;21836:67;:::i;:::-;21829:74;;21912:93;22001:3;21912:93;:::i;:::-;22030:2;22025:3;22021:12;22014:19;;21673:366;;;:::o;22045:::-;22187:3;22208:67;22272:2;22267:3;22208:67;:::i;:::-;22201:74;;22284:93;22373:3;22284:93;:::i;:::-;22402:2;22397:3;22393:12;22386:19;;22045:366;;;:::o;22487:527::-;22646:4;22641:3;22637:14;22733:4;22726:5;22722:16;22716:23;22752:63;22809:4;22804:3;22800:14;22786:12;22752:63;:::i;:::-;22661:164;22917:4;22910:5;22906:16;22900:23;22936:61;22991:4;22986:3;22982:14;22968:12;22936:61;:::i;:::-;22835:172;22615:399;22487:527;;:::o;23020:118::-;23107:24;23125:5;23107:24;:::i;:::-;23102:3;23095:37;23020:118;;:::o;23144:105::-;23219:23;23236:5;23219:23;:::i;:::-;23214:3;23207:36;23144:105;;:::o;23255:701::-;23536:3;23558:95;23649:3;23640:6;23558:95;:::i;:::-;23551:102;;23670:95;23761:3;23752:6;23670:95;:::i;:::-;23663:102;;23782:148;23926:3;23782:148;:::i;:::-;23775:155;;23947:3;23940:10;;23255:701;;;;;:::o;23962:222::-;24055:4;24093:2;24082:9;24078:18;24070:26;;24106:71;24174:1;24163:9;24159:17;24150:6;24106:71;:::i;:::-;23962:222;;;;:::o;24190:640::-;24385:4;24423:3;24412:9;24408:19;24400:27;;24437:71;24505:1;24494:9;24490:17;24481:6;24437:71;:::i;:::-;24518:72;24586:2;24575:9;24571:18;24562:6;24518:72;:::i;:::-;24600;24668:2;24657:9;24653:18;24644:6;24600:72;:::i;:::-;24719:9;24713:4;24709:20;24704:2;24693:9;24689:18;24682:48;24747:76;24818:4;24809:6;24747:76;:::i;:::-;24739:84;;24190:640;;;;;;;:::o;24836:332::-;24957:4;24995:2;24984:9;24980:18;24972:26;;25008:71;25076:1;25065:9;25061:17;25052:6;25008:71;:::i;:::-;25089:72;25157:2;25146:9;25142:18;25133:6;25089:72;:::i;:::-;24836:332;;;;;:::o;25174:210::-;25261:4;25299:2;25288:9;25284:18;25276:26;;25312:65;25374:1;25363:9;25359:17;25350:6;25312:65;:::i;:::-;25174:210;;;;:::o;25390:313::-;25503:4;25541:2;25530:9;25526:18;25518:26;;25590:9;25584:4;25580:20;25576:1;25565:9;25561:17;25554:47;25618:78;25691:4;25682:6;25618:78;:::i;:::-;25610:86;;25390:313;;;;:::o;25709:419::-;25875:4;25913:2;25902:9;25898:18;25890:26;;25962:9;25956:4;25952:20;25948:1;25937:9;25933:17;25926:47;25990:131;26116:4;25990:131;:::i;:::-;25982:139;;25709:419;;;:::o;26134:::-;26300:4;26338:2;26327:9;26323:18;26315:26;;26387:9;26381:4;26377:20;26373:1;26362:9;26358:17;26351:47;26415:131;26541:4;26415:131;:::i;:::-;26407:139;;26134:419;;;:::o;26559:::-;26725:4;26763:2;26752:9;26748:18;26740:26;;26812:9;26806:4;26802:20;26798:1;26787:9;26783:17;26776:47;26840:131;26966:4;26840:131;:::i;:::-;26832:139;;26559:419;;;:::o;26984:::-;27150:4;27188:2;27177:9;27173:18;27165:26;;27237:9;27231:4;27227:20;27223:1;27212:9;27208:17;27201:47;27265:131;27391:4;27265:131;:::i;:::-;27257:139;;26984:419;;;:::o;27409:::-;27575:4;27613:2;27602:9;27598:18;27590:26;;27662:9;27656:4;27652:20;27648:1;27637:9;27633:17;27626:47;27690:131;27816:4;27690:131;:::i;:::-;27682:139;;27409:419;;;:::o;27834:::-;28000:4;28038:2;28027:9;28023:18;28015:26;;28087:9;28081:4;28077:20;28073:1;28062:9;28058:17;28051:47;28115:131;28241:4;28115:131;:::i;:::-;28107:139;;27834:419;;;:::o;28259:::-;28425:4;28463:2;28452:9;28448:18;28440:26;;28512:9;28506:4;28502:20;28498:1;28487:9;28483:17;28476:47;28540:131;28666:4;28540:131;:::i;:::-;28532:139;;28259:419;;;:::o;28684:::-;28850:4;28888:2;28877:9;28873:18;28865:26;;28937:9;28931:4;28927:20;28923:1;28912:9;28908:17;28901:47;28965:131;29091:4;28965:131;:::i;:::-;28957:139;;28684:419;;;:::o;29109:::-;29275:4;29313:2;29302:9;29298:18;29290:26;;29362:9;29356:4;29352:20;29348:1;29337:9;29333:17;29326:47;29390:131;29516:4;29390:131;:::i;:::-;29382:139;;29109:419;;;:::o;29534:::-;29700:4;29738:2;29727:9;29723:18;29715:26;;29787:9;29781:4;29777:20;29773:1;29762:9;29758:17;29751:47;29815:131;29941:4;29815:131;:::i;:::-;29807:139;;29534:419;;;:::o;29959:::-;30125:4;30163:2;30152:9;30148:18;30140:26;;30212:9;30206:4;30202:20;30198:1;30187:9;30183:17;30176:47;30240:131;30366:4;30240:131;:::i;:::-;30232:139;;29959:419;;;:::o;30384:::-;30550:4;30588:2;30577:9;30573:18;30565:26;;30637:9;30631:4;30627:20;30623:1;30612:9;30608:17;30601:47;30665:131;30791:4;30665:131;:::i;:::-;30657:139;;30384:419;;;:::o;30809:::-;30975:4;31013:2;31002:9;30998:18;30990:26;;31062:9;31056:4;31052:20;31048:1;31037:9;31033:17;31026:47;31090:131;31216:4;31090:131;:::i;:::-;31082:139;;30809:419;;;:::o;31234:::-;31400:4;31438:2;31427:9;31423:18;31415:26;;31487:9;31481:4;31477:20;31473:1;31462:9;31458:17;31451:47;31515:131;31641:4;31515:131;:::i;:::-;31507:139;;31234:419;;;:::o;31659:::-;31825:4;31863:2;31852:9;31848:18;31840:26;;31912:9;31906:4;31902:20;31898:1;31887:9;31883:17;31876:47;31940:131;32066:4;31940:131;:::i;:::-;31932:139;;31659:419;;;:::o;32084:::-;32250:4;32288:2;32277:9;32273:18;32265:26;;32337:9;32331:4;32327:20;32323:1;32312:9;32308:17;32301:47;32365:131;32491:4;32365:131;:::i;:::-;32357:139;;32084:419;;;:::o;32509:::-;32675:4;32713:2;32702:9;32698:18;32690:26;;32762:9;32756:4;32752:20;32748:1;32737:9;32733:17;32726:47;32790:131;32916:4;32790:131;:::i;:::-;32782:139;;32509:419;;;:::o;32934:::-;33100:4;33138:2;33127:9;33123:18;33115:26;;33187:9;33181:4;33177:20;33173:1;33162:9;33158:17;33151:47;33215:131;33341:4;33215:131;:::i;:::-;33207:139;;32934:419;;;:::o;33359:::-;33525:4;33563:2;33552:9;33548:18;33540:26;;33612:9;33606:4;33602:20;33598:1;33587:9;33583:17;33576:47;33640:131;33766:4;33640:131;:::i;:::-;33632:139;;33359:419;;;:::o;33784:::-;33950:4;33988:2;33977:9;33973:18;33965:26;;34037:9;34031:4;34027:20;34023:1;34012:9;34008:17;34001:47;34065:131;34191:4;34065:131;:::i;:::-;34057:139;;33784:419;;;:::o;34209:::-;34375:4;34413:2;34402:9;34398:18;34390:26;;34462:9;34456:4;34452:20;34448:1;34437:9;34433:17;34426:47;34490:131;34616:4;34490:131;:::i;:::-;34482:139;;34209:419;;;:::o;34634:::-;34800:4;34838:2;34827:9;34823:18;34815:26;;34887:9;34881:4;34877:20;34873:1;34862:9;34858:17;34851:47;34915:131;35041:4;34915:131;:::i;:::-;34907:139;;34634:419;;;:::o;35059:::-;35225:4;35263:2;35252:9;35248:18;35240:26;;35312:9;35306:4;35302:20;35298:1;35287:9;35283:17;35276:47;35340:131;35466:4;35340:131;:::i;:::-;35332:139;;35059:419;;;:::o;35484:::-;35650:4;35688:2;35677:9;35673:18;35665:26;;35737:9;35731:4;35727:20;35723:1;35712:9;35708:17;35701:47;35765:131;35891:4;35765:131;:::i;:::-;35757:139;;35484:419;;;:::o;35909:::-;36075:4;36113:2;36102:9;36098:18;36090:26;;36162:9;36156:4;36152:20;36148:1;36137:9;36133:17;36126:47;36190:131;36316:4;36190:131;:::i;:::-;36182:139;;35909:419;;;:::o;36334:::-;36500:4;36538:2;36527:9;36523:18;36515:26;;36587:9;36581:4;36577:20;36573:1;36562:9;36558:17;36551:47;36615:131;36741:4;36615:131;:::i;:::-;36607:139;;36334:419;;;:::o;36759:::-;36925:4;36963:2;36952:9;36948:18;36940:26;;37012:9;37006:4;37002:20;36998:1;36987:9;36983:17;36976:47;37040:131;37166:4;37040:131;:::i;:::-;37032:139;;36759:419;;;:::o;37184:::-;37350:4;37388:2;37377:9;37373:18;37365:26;;37437:9;37431:4;37427:20;37423:1;37412:9;37408:17;37401:47;37465:131;37591:4;37465:131;:::i;:::-;37457:139;;37184:419;;;:::o;37609:::-;37775:4;37813:2;37802:9;37798:18;37790:26;;37862:9;37856:4;37852:20;37848:1;37837:9;37833:17;37826:47;37890:131;38016:4;37890:131;:::i;:::-;37882:139;;37609:419;;;:::o;38034:::-;38200:4;38238:2;38227:9;38223:18;38215:26;;38287:9;38281:4;38277:20;38273:1;38262:9;38258:17;38251:47;38315:131;38441:4;38315:131;:::i;:::-;38307:139;;38034:419;;;:::o;38459:::-;38625:4;38663:2;38652:9;38648:18;38640:26;;38712:9;38706:4;38702:20;38698:1;38687:9;38683:17;38676:47;38740:131;38866:4;38740:131;:::i;:::-;38732:139;;38459:419;;;:::o;38884:::-;39050:4;39088:2;39077:9;39073:18;39065:26;;39137:9;39131:4;39127:20;39123:1;39112:9;39108:17;39101:47;39165:131;39291:4;39165:131;:::i;:::-;39157:139;;38884:419;;;:::o;39309:346::-;39464:4;39502:2;39491:9;39487:18;39479:26;;39515:133;39645:1;39634:9;39630:17;39621:6;39515:133;:::i;:::-;39309:346;;;;:::o;39661:222::-;39754:4;39792:2;39781:9;39777:18;39769:26;;39805:71;39873:1;39862:9;39858:17;39849:6;39805:71;:::i;:::-;39661:222;;;;:::o;39889:129::-;39923:6;39950:20;;:::i;:::-;39940:30;;39979:33;40007:4;39999:6;39979:33;:::i;:::-;39889:129;;;:::o;40024:75::-;40057:6;40090:2;40084:9;40074:19;;40024:75;:::o;40105:307::-;40166:4;40256:18;40248:6;40245:30;40242:56;;;40278:18;;:::i;:::-;40242:56;40316:29;40338:6;40316:29;:::i;:::-;40308:37;;40400:4;40394;40390:15;40382:23;;40105:307;;;:::o;40418:98::-;40469:6;40503:5;40497:12;40487:22;;40418:98;;;:::o;40522:99::-;40574:6;40608:5;40602:12;40592:22;;40522:99;;;:::o;40627:168::-;40710:11;40744:6;40739:3;40732:19;40784:4;40779:3;40775:14;40760:29;;40627:168;;;;:::o;40801:169::-;40885:11;40919:6;40914:3;40907:19;40959:4;40954:3;40950:14;40935:29;;40801:169;;;;:::o;40976:148::-;41078:11;41115:3;41100:18;;40976:148;;;;:::o;41130:273::-;41170:3;41189:20;41207:1;41189:20;:::i;:::-;41184:25;;41223:20;41241:1;41223:20;:::i;:::-;41218:25;;41345:1;41309:34;41305:42;41302:1;41299:49;41296:75;;;41351:18;;:::i;:::-;41296:75;41395:1;41392;41388:9;41381:16;;41130:273;;;;:::o;41409:305::-;41449:3;41468:20;41486:1;41468:20;:::i;:::-;41463:25;;41502:20;41520:1;41502:20;:::i;:::-;41497:25;;41656:1;41588:66;41584:74;41581:1;41578:81;41575:107;;;41662:18;;:::i;:::-;41575:107;41706:1;41703;41699:9;41692:16;;41409:305;;;;:::o;41720:185::-;41760:1;41777:20;41795:1;41777:20;:::i;:::-;41772:25;;41811:20;41829:1;41811:20;:::i;:::-;41806:25;;41850:1;41840:35;;41855:18;;:::i;:::-;41840:35;41897:1;41894;41890:9;41885:14;;41720:185;;;;:::o;41911:348::-;41951:7;41974:20;41992:1;41974:20;:::i;:::-;41969:25;;42008:20;42026:1;42008:20;:::i;:::-;42003:25;;42196:1;42128:66;42124:74;42121:1;42118:81;42113:1;42106:9;42099:17;42095:105;42092:131;;;42203:18;;:::i;:::-;42092:131;42251:1;42248;42244:9;42233:20;;41911:348;;;;:::o;42265:191::-;42305:4;42325:20;42343:1;42325:20;:::i;:::-;42320:25;;42359:20;42377:1;42359:20;:::i;:::-;42354:25;;42398:1;42395;42392:8;42389:34;;;42403:18;;:::i;:::-;42389:34;42448:1;42445;42441:9;42433:17;;42265:191;;;;:::o;42462:::-;42502:4;42522:20;42540:1;42522:20;:::i;:::-;42517:25;;42556:20;42574:1;42556:20;:::i;:::-;42551:25;;42595:1;42592;42589:8;42586:34;;;42600:18;;:::i;:::-;42586:34;42645:1;42642;42638:9;42630:17;;42462:191;;;;:::o;42659:96::-;42696:7;42725:24;42743:5;42725:24;:::i;:::-;42714:35;;42659:96;;;:::o;42761:90::-;42795:7;42838:5;42831:13;42824:21;42813:32;;42761:90;;;:::o;42857:149::-;42893:7;42933:66;42926:5;42922:78;42911:89;;42857:149;;;:::o;43012:118::-;43049:7;43089:34;43082:5;43078:46;43067:57;;43012:118;;;:::o;43136:126::-;43173:7;43213:42;43206:5;43202:54;43191:65;;43136:126;;;:::o;43268:77::-;43305:7;43334:5;43323:16;;43268:77;;;:::o;43351:101::-;43387:7;43427:18;43420:5;43416:30;43405:41;;43351:101;;;:::o;43458:154::-;43542:6;43537:3;43532;43519:30;43604:1;43595:6;43590:3;43586:16;43579:27;43458:154;;;:::o;43618:307::-;43686:1;43696:113;43710:6;43707:1;43704:13;43696:113;;;43795:1;43790:3;43786:11;43780:18;43776:1;43771:3;43767:11;43760:39;43732:2;43729:1;43725:10;43720:15;;43696:113;;;43827:6;43824:1;43821:13;43818:101;;;43907:1;43898:6;43893:3;43889:16;43882:27;43818:101;43667:258;43618:307;;;:::o;43931:171::-;43970:3;43993:24;44011:5;43993:24;:::i;:::-;43984:33;;44039:4;44032:5;44029:15;44026:41;;;44047:18;;:::i;:::-;44026:41;44094:1;44087:5;44083:13;44076:20;;43931:171;;;:::o;44108:320::-;44152:6;44189:1;44183:4;44179:12;44169:22;;44236:1;44230:4;44226:12;44257:18;44247:81;;44313:4;44305:6;44301:17;44291:27;;44247:81;44375:2;44367:6;44364:14;44344:18;44341:38;44338:84;;;44394:18;;:::i;:::-;44338:84;44159:269;44108:320;;;:::o;44434:281::-;44517:27;44539:4;44517:27;:::i;:::-;44509:6;44505:40;44647:6;44635:10;44632:22;44611:18;44599:10;44596:34;44593:62;44590:88;;;44658:18;;:::i;:::-;44590:88;44698:10;44694:2;44687:22;44477:238;44434:281;;:::o;44721:233::-;44760:3;44783:24;44801:5;44783:24;:::i;:::-;44774:33;;44829:66;44822:5;44819:77;44816:103;;;44899:18;;:::i;:::-;44816:103;44946:1;44939:5;44935:13;44928:20;;44721:233;;;:::o;44960:176::-;44992:1;45009:20;45027:1;45009:20;:::i;:::-;45004:25;;45043:20;45061:1;45043:20;:::i;:::-;45038:25;;45082:1;45072:35;;45087:18;;:::i;:::-;45072:35;45128:1;45125;45121:9;45116:14;;44960:176;;;;:::o;45142:180::-;45190:77;45187:1;45180:88;45287:4;45284:1;45277:15;45311:4;45308:1;45301:15;45328:180;45376:77;45373:1;45366:88;45473:4;45470:1;45463:15;45497:4;45494:1;45487:15;45514:180;45562:77;45559:1;45552:88;45659:4;45656:1;45649:15;45683:4;45680:1;45673:15;45700:180;45748:77;45745:1;45738:88;45845:4;45842:1;45835:15;45869:4;45866:1;45859:15;45886:180;45934:77;45931:1;45924:88;46031:4;46028:1;46021:15;46055:4;46052:1;46045:15;46072:117;46181:1;46178;46171:12;46195:117;46304:1;46301;46294:12;46318:117;46427:1;46424;46417:12;46441:117;46550:1;46547;46540:12;46564:117;46673:1;46670;46663:12;46687:117;46796:1;46793;46786:12;46810:102;46851:6;46902:2;46898:7;46893:2;46886:5;46882:14;46878:28;46868:38;;46810:102;;;:::o;46918:221::-;47058:34;47054:1;47046:6;47042:14;47035:58;47127:4;47122:2;47114:6;47110:15;47103:29;46918:221;:::o;47145:225::-;47285:34;47281:1;47273:6;47269:14;47262:58;47354:8;47349:2;47341:6;47337:15;47330:33;47145:225;:::o;47376:229::-;47516:34;47512:1;47504:6;47500:14;47493:58;47585:12;47580:2;47572:6;47568:15;47561:37;47376:229;:::o;47611:163::-;47751:15;47747:1;47739:6;47735:14;47728:39;47611:163;:::o;47780:222::-;47920:34;47916:1;47908:6;47904:14;47897:58;47989:5;47984:2;47976:6;47972:15;47965:30;47780:222;:::o;48008:224::-;48148:34;48144:1;48136:6;48132:14;48125:58;48217:7;48212:2;48204:6;48200:15;48193:32;48008:224;:::o;48238:236::-;48378:34;48374:1;48366:6;48362:14;48355:58;48447:19;48442:2;48434:6;48430:15;48423:44;48238:236;:::o;48480:181::-;48620:33;48616:1;48608:6;48604:14;48597:57;48480:181;:::o;48667:221::-;48807:34;48803:1;48795:6;48791:14;48784:58;48876:4;48871:2;48863:6;48859:15;48852:29;48667:221;:::o;48894:180::-;49034:32;49030:1;49022:6;49018:14;49011:56;48894:180;:::o;49080:244::-;49220:34;49216:1;49208:6;49204:14;49197:58;49289:27;49284:2;49276:6;49272:15;49265:52;49080:244;:::o;49330:174::-;49470:26;49466:1;49458:6;49454:14;49447:50;49330:174;:::o;49510:230::-;49650:34;49646:1;49638:6;49634:14;49627:58;49719:13;49714:2;49706:6;49702:15;49695:38;49510:230;:::o;49746:168::-;49886:20;49882:1;49874:6;49870:14;49863:44;49746:168;:::o;49920:225::-;50060:34;50056:1;50048:6;50044:14;50037:58;50129:8;50124:2;50116:6;50112:15;50105:33;49920:225;:::o;50151:155::-;50291:7;50287:1;50279:6;50275:14;50268:31;50151:155;:::o;50312:182::-;50452:34;50448:1;50440:6;50436:14;50429:58;50312:182;:::o;50500:167::-;50640:19;50636:1;50628:6;50624:14;50617:43;50500:167;:::o;50673:234::-;50813:34;50809:1;50801:6;50797:14;50790:58;50882:17;50877:2;50869:6;50865:15;50858:42;50673:234;:::o;50913:176::-;51053:28;51049:1;51041:6;51037:14;51030:52;50913:176;:::o;51095:237::-;51235:34;51231:1;51223:6;51219:14;51212:58;51304:20;51299:2;51291:6;51287:15;51280:45;51095:237;:::o;51338:221::-;51478:34;51474:1;51466:6;51462:14;51455:58;51547:4;51542:2;51534:6;51530:15;51523:29;51338:221;:::o;51565:238::-;51705:34;51701:1;51693:6;51689:14;51682:58;51774:21;51769:2;51761:6;51757:15;51750:46;51565:238;:::o;51809:172::-;51949:24;51945:1;51937:6;51933:14;51926:48;51809:172;:::o;51987:179::-;52127:31;52123:1;52115:6;52111:14;52104:55;51987:179;:::o;52172:220::-;52312:34;52308:1;52300:6;52296:14;52289:58;52381:3;52376:2;52368:6;52364:15;52357:28;52172:220;:::o;52398:172::-;52538:24;52534:1;52526:6;52522:14;52515:48;52398:172;:::o;52576:233::-;52716:34;52712:1;52704:6;52700:14;52693:58;52785:16;52780:2;52772:6;52768:15;52761:41;52576:233;:::o;52815:225::-;52955:34;52951:1;52943:6;52939:14;52932:58;53024:8;53019:2;53011:6;53007:15;53000:33;52815:225;:::o;53046:181::-;53186:33;53182:1;53174:6;53170:14;53163:57;53046:181;:::o;53233:234::-;53373:34;53369:1;53361:6;53357:14;53350:58;53442:17;53437:2;53429:6;53425:15;53418:42;53233:234;:::o;53473:232::-;53613:34;53609:1;53601:6;53597:14;53590:58;53682:15;53677:2;53669:6;53665:15;53658:40;53473:232;:::o;53711:221::-;53851:34;53847:1;53839:6;53835:14;53828:58;53920:4;53915:2;53907:6;53903:15;53896:29;53711:221;:::o;53938:122::-;54011:24;54029:5;54011:24;:::i;:::-;54004:5;54001:35;53991:63;;54050:1;54047;54040:12;53991:63;53938:122;:::o;54066:116::-;54136:21;54151:5;54136:21;:::i;:::-;54129:5;54126:32;54116:60;;54172:1;54169;54162:12;54116:60;54066:116;:::o;54188:120::-;54260:23;54277:5;54260:23;:::i;:::-;54253:5;54250:34;54240:62;;54298:1;54295;54288:12;54240:62;54188:120;:::o;54314:122::-;54387:24;54405:5;54387:24;:::i;:::-;54380:5;54377:35;54367:63;;54426:1;54423;54416:12;54367:63;54314:122;:::o
Swarm Source
ipfs://3967b7ffb4916d5224260ecac4723e2eeff69c29ecc19545824373399cd43042
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.