Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
213 MSBT
Holders
158
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MSBTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MetopiaAlphaTestProof
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-28 */ // File: @openzeppelin\contracts\utils\Context.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin\contracts\access\Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin\contracts\utils\introspection\IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin\contracts\token\ERC721\IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin\contracts\token\ERC721\IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin\contracts\token\ERC721\extensions\IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin\contracts\utils\Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin\contracts\utils\Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin\contracts\utils\introspection\ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin\contracts\token\ERC721\ERC721.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin\contracts\utils\Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: lib\base64.sol pragma solidity >=0.6.0; /// @title Base64 /// @author Brecht Devos - <[email protected]> /// @notice Provides functions for encoding/decoding base64 library Base64 { string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; bytes internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000" hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000" hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000" hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000"; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE_ENCODE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for {} lt(dataPtr, endPtr) {} { // read 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // write 4 characters mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and( input, 0x3F)))) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } } // File: lib\addressFormatter.sol pragma solidity ^0.8.0; library addressFormatter{ function char(bytes1 b) internal pure returns (bytes1 c) { if (uint8(b) < 10) return bytes1(uint8(b) + 0x30); else return bytes1(uint8(b) + 0x57); } function toAsciiString(address x) internal pure returns (string memory) { bytes memory s = new bytes(40); for (uint256 i = 0; i < 20; i++) { bytes1 b = bytes1(uint8(uint256(uint160(x)) / (2**(8 * (19 - i))))); bytes1 hi = bytes1(uint8(b) / 16); bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi)); s[2 * i] = char(hi); s[2 * i + 1] = char(lo); } return string(s); } } // File: lib\strings.sol /* * @title String & slice utility library for Solidity contracts. * @author Nick Johnson <[email protected]> * * @dev Functionality in this library is largely implemented using an * abstraction called a 'slice'. A slice represents a part of a string - * anything from the entire string to a single character, or even no * characters at all (a 0-length slice). Since a slice only has to specify * an offset and a length, copying and manipulating slices is a lot less * expensive than copying and manipulating the strings they reference. * * To further reduce gas costs, most functions on slice that need to return * a slice modify the original one instead of allocating a new one; for * instance, `s.split(".")` will return the text up to the first '.', * modifying s to only contain the remainder of the string after the '.'. * In situations where you do not want to modify the original slice, you * can make a copy first with `.copy()`, for example: * `s.copy().split(".")`. Try and avoid using this idiom in loops; since * Solidity has no memory management, it will result in allocating many * short-lived slices that are later discarded. * * Functions that return two slices come in two versions: a non-allocating * version that takes the second slice as an argument, modifying it in * place, and an allocating version that allocates and returns the second * slice; see `nextRune` for example. * * Functions that have to copy string data will return strings rather than * slices; these can be cast back to slices for further processing if * required. * * For convenience, some functions are provided with non-modifying * variants that create a new slice and return both; for instance, * `s.splitNew('.')` leaves s unmodified, and returns two values * corresponding to the left and right parts of the string. */ pragma solidity ^0.8.0; library strings { struct slice { uint _len; uint _ptr; } function memcpy(uint dest, uint src, uint len) private pure { // Copy word-length chunks while possible for(; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes uint mask = type(uint).max; if (len > 0) { mask = 256 ** (32 - len) - 1; } assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } } /* * @dev Returns a slice containing the entire string. * @param self The string to make a slice from. * @return A newly allocated slice containing the entire string. */ function toSlice(string memory self) internal pure returns (slice memory) { uint ptr; assembly { ptr := add(self, 0x20) } return slice(bytes(self).length, ptr); } /* * @dev Returns the length of a null-terminated bytes32 string. * @param self The value to find the length of. * @return The length of the string, from 0 to 32. */ function len(bytes32 self) internal pure returns (uint) { uint ret; if (self == 0) return 0; if (uint(self) & type(uint128).max == 0) { ret += 16; self = bytes32(uint(self) / 0x100000000000000000000000000000000); } if (uint(self) & type(uint64).max == 0) { ret += 8; self = bytes32(uint(self) / 0x10000000000000000); } if (uint(self) & type(uint32).max == 0) { ret += 4; self = bytes32(uint(self) / 0x100000000); } if (uint(self) & type(uint16).max == 0) { ret += 2; self = bytes32(uint(self) / 0x10000); } if (uint(self) & type(uint8).max == 0) { ret += 1; } return 32 - ret; } /* * @dev Returns a slice containing the entire bytes32, interpreted as a * null-terminated utf-8 string. * @param self The bytes32 value to convert to a slice. * @return A new slice containing the value of the input argument up to the * first null. */ function toSliceB32(bytes32 self) internal pure returns (slice memory ret) { // Allocate space for `self` in memory, copy it there, and point ret at it assembly { let ptr := mload(0x40) mstore(0x40, add(ptr, 0x20)) mstore(ptr, self) mstore(add(ret, 0x20), ptr) } ret._len = len(self); } /* * @dev Returns a new slice containing the same data as the current slice. * @param self The slice to copy. * @return A new slice containing the same data as `self`. */ function copy(slice memory self) internal pure returns (slice memory) { return slice(self._len, self._ptr); } /* * @dev Copies a slice to a new string. * @param self The slice to copy. * @return A newly allocated string containing the slice's text. */ function toString(slice memory self) internal pure returns (string memory) { string memory ret = new string(self._len); uint retptr; assembly { retptr := add(ret, 32) } memcpy(retptr, self._ptr, self._len); return ret; } /* * @dev Returns the length in runes of the slice. Note that this operation * takes time proportional to the length of the slice; avoid using it * in loops, and call `slice.empty()` if you only need to know whether * the slice is empty or not. * @param self The slice to operate on. * @return The length of the slice in runes. */ function len(slice memory self) internal pure returns (uint l) { // Starting at ptr-31 means the LSB will be the byte we care about uint ptr = self._ptr - 31; uint end = ptr + self._len; for (l = 0; ptr < end; l++) { uint8 b; assembly { b := and(mload(ptr), 0xFF) } if (b < 0x80) { ptr += 1; } else if(b < 0xE0) { ptr += 2; } else if(b < 0xF0) { ptr += 3; } else if(b < 0xF8) { ptr += 4; } else if(b < 0xFC) { ptr += 5; } else { ptr += 6; } } } /* * @dev Returns true if the slice is empty (has a length of 0). * @param self The slice to operate on. * @return True if the slice is empty, False otherwise. */ function empty(slice memory self) internal pure returns (bool) { return self._len == 0; } /* * @dev Returns a positive number if `other` comes lexicographically after * `self`, a negative number if it comes before, or zero if the * contents of the two slices are equal. Comparison is done per-rune, * on unicode codepoints. * @param self The first slice to compare. * @param other The second slice to compare. * @return The result of the comparison. */ function compare(slice memory self, slice memory other) internal pure returns (int) { uint shortest = self._len; if (other._len < self._len) shortest = other._len; uint selfptr = self._ptr; uint otherptr = other._ptr; for (uint idx = 0; idx < shortest; idx += 32) { uint a; uint b; assembly { a := mload(selfptr) b := mload(otherptr) } if (a != b) { // Mask out irrelevant bytes and check again uint mask = type(uint).max; // 0xffff... if(shortest < 32) { mask = ~(2 ** (8 * (32 - shortest + idx)) - 1); } unchecked { uint diff = (a & mask) - (b & mask); if (diff != 0) return int(diff); } } selfptr += 32; otherptr += 32; } return int(self._len) - int(other._len); } /* * @dev Extracts the first rune in the slice into `rune`, advancing the * slice to point to the next rune and returning `self`. * @param self The slice to operate on. * @param rune The slice that will contain the first rune. * @return `rune`. */ function nextRune(slice memory self, slice memory rune) internal pure returns (slice memory) { rune._ptr = self._ptr; if (self._len == 0) { rune._len = 0; return rune; } uint l; uint b; // Load the first byte of the rune into the LSBs of b assembly { b := and(mload(sub(mload(add(self, 32)), 31)), 0xFF) } if (b < 0x80) { l = 1; } else if(b < 0xE0) { l = 2; } else if(b < 0xF0) { l = 3; } else { l = 4; } // Check for truncated codepoints if (l > self._len) { rune._len = self._len; self._ptr += self._len; self._len = 0; return rune; } self._ptr += l; self._len -= l; rune._len = l; return rune; } /* * @dev Returns the first rune in the slice, advancing the slice to point * to the next rune. * @param self The slice to operate on. * @return A slice containing only the first rune from `self`. */ function nextRune(slice memory self) internal pure returns (slice memory ret) { nextRune(self, ret); } /* * @dev Returns the keccak-256 hash of the slice. * @param self The slice to hash. * @return The hash of the slice. */ function keccak(slice memory self) internal pure returns (bytes32 ret) { assembly { ret := keccak256(mload(add(self, 32)), mload(self)) } } // Returns the memory address of the first byte of the first occurrence of // `needle` in `self`, or the first byte after `self` if not found. function findPtr(uint selflen, uint selfptr, uint needlelen, uint needleptr) private pure returns (uint) { uint ptr = selfptr; uint idx; if (needlelen <= selflen) { if (needlelen <= 32) { bytes32 mask; if (needlelen > 0) { mask = bytes32(~(2 ** (8 * (32 - needlelen)) - 1)); } bytes32 needledata; assembly { needledata := and(mload(needleptr), mask) } uint end = selfptr + selflen - needlelen; bytes32 ptrdata; assembly { ptrdata := and(mload(ptr), mask) } while (ptrdata != needledata) { if (ptr >= end) return selfptr + selflen; ptr++; assembly { ptrdata := and(mload(ptr), mask) } } return ptr; } else { // For long needles, use hashing bytes32 hash; assembly { hash := keccak256(needleptr, needlelen) } for (idx = 0; idx <= selflen - needlelen; idx++) { bytes32 testHash; assembly { testHash := keccak256(ptr, needlelen) } if (hash == testHash) return ptr; ptr += 1; } } } return selfptr + selflen; } /* * @dev Modifies `self` to contain everything from the first occurrence of * `needle` to the end of the slice. `self` is set to the empty slice * if `needle` is not found. * @param self The slice to search and modify. * @param needle The text to search for. * @return `self`. */ function find(slice memory self, slice memory needle) internal pure returns (slice memory) { uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr); self._len -= ptr - self._ptr; self._ptr = ptr; return self; } /* * @dev Splits the slice, setting `self` to everything after the first * occurrence of `needle`, and `token` to everything before it. If * `needle` does not occur in `self`, `self` is set to the empty slice, * and `token` is set to the entirety of `self`. * @param self The slice to split. * @param needle The text to search for in `self`. * @param token An output parameter to which the first token is written. * @return `token`. */ function split(slice memory self, slice memory needle, slice memory token) internal pure returns (slice memory) { uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr); token._ptr = self._ptr; token._len = ptr - self._ptr; if (ptr == self._ptr + self._len) { // Not found self._len = 0; } else { self._len -= token._len + needle._len; self._ptr = ptr + needle._len; } return token; } /* * @dev Splits the slice, setting `self` to everything after the first * occurrence of `needle`, and returning everything before it. If * `needle` does not occur in `self`, `self` is set to the empty slice, * and the entirety of `self` is returned. * @param self The slice to split. * @param needle The text to search for in `self`. * @return The part of `self` up to the first occurrence of `delim`. */ function split(slice memory self, slice memory needle) internal pure returns (slice memory token) { split(self, needle, token); } /* * @dev Counts the number of nonoverlapping occurrences of `needle` in `self`. * @param self The slice to search. * @param needle The text to search for in `self`. * @return The number of occurrences of `needle` found in `self`. */ function count(slice memory self, slice memory needle) internal pure returns (uint cnt) { uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr) + needle._len; while (ptr <= self._ptr + self._len) { cnt++; ptr = findPtr(self._len - (ptr - self._ptr), ptr, needle._len, needle._ptr) + needle._len; } } /* * @dev Returns a newly allocated string containing the concatenation of * `self` and `other`. * @param self The first slice to concatenate. * @param other The second slice to concatenate. * @return The concatenation of the two strings. */ function concat(slice memory self, slice memory other) internal pure returns (string memory) { string memory ret = new string(self._len + other._len); uint retptr; assembly { retptr := add(ret, 32) } memcpy(retptr, self._ptr, self._len); memcpy(retptr + self._len, other._ptr, other._len); return ret; } } // File: tools\IValidator.sol pragma solidity ^0.8.0; interface IValidator { function verify( address _signer, address _receiver, string memory message, bytes memory _sig ) external pure returns (bool); } // File: contracts\IMetopianSBTFactory.sol pragma solidity >=0.8.0; interface IMetopianSBTFactory { struct TokenType{ // IPFS CID string featuredImageCID; // TODO logo image CID string title; string space; string description; string titleEncoded; string spaceEncoded; string descriptionEncoded; string[] fields; address owner; // address issuer; // string issuerName; } function tokenType(uint id) external view returns(TokenType memory); } // File: contracts\MetopiaAlphaTestProof.sol pragma solidity >=0.8.0 <0.9.0; error Soulbound(); abstract contract IReverseRecords { function getNames(address[] calldata addresses) external view virtual returns (string[] memory); } contract MetopiaAlphaTestProof is ERC721, Ownable { using strings for *; using Counters for Counters.Counter; event Issue(uint typeId); IValidator validator = IValidator(0xEadC2a6fff036C12e62A74392d4c6CA77A5Ea007); IMetopianSBTFactory sbtFactory = IMetopianSBTFactory(0xeFC0590f81a6d3067d98ECEB11c1bF5a42ece05e); IReverseRecords res = IReverseRecords (0x3671aE578E63FdF66ad4F3E12CC0c0d71Ac7510C); function lookupName(address addr) private view returns (string memory) { string memory resolved; address[] memory t = new address[](1); t[0] = addr; string[] memory results = res.getNames(t); if (bytes(results[0]).length == 0) { resolved = string(abi.encodePacked("0x",addressFormatter.toAsciiString(addr))); } else { resolved = results[0]; } return resolved; } struct Token { uint id; uint tokenType; address issuer; string issuerName; bytes signature; uint timestamp; mapping(string=>string) attributes; } Counters.Counter private _tokenId; Token[] public _tokens; mapping(uint=>uint) _tokenIdCounters; mapping(uint=>mapping(address=>uint)) private _balances; string private imageRenderURI = "https://ai.metopia.xyz/sbt-generator"; string private description = ""; constructor() ERC721("Metopian SBT", "MSBT"){} function mint(uint typeId, string memory attributes, bytes memory _sig) public { require(_balances[typeId][msg.sender]==0, "Dupl"); IMetopianSBTFactory.TokenType memory tokenType = sbtFactory.tokenType(typeId); string memory message = string(abi.encodePacked("0x",addressFormatter.toAsciiString(msg.sender), attributes, Strings.toString(typeId))); require(validator.verify(tokenType.owner, msg.sender, message, _sig)); _tokenIdCounters[typeId] = _tokenIdCounters[typeId] + 1 ; _tokenId.increment(); _safeMint(msg.sender, _tokenId.current()); _balances[typeId][msg.sender] = 1; Token storage token = _tokens.push(); token.id = _tokenIdCounters[typeId]; token.tokenType = typeId; token.signature = _sig; token.issuer = tokenType.owner; token.issuerName = lookupName(tokenType.owner); token.timestamp = block.timestamp; updateTokenAttrs(_tokenId.current(), attributes); } function updateTokenAttrs(uint id, string memory attributes) private{ // Token storage token = _tokens[id - 1]; if(bytes(attributes).length>0){ strings.slice memory s = attributes.toSlice(); strings.slice memory delim = "==".toSlice(); strings.slice memory delim2 = "&&".toSlice(); while(!s.empty()){ string memory tmpField = s.split(delim).toString(); string memory tmpValue = s.split(delim2).toString(); _tokens[id - 1].attributes[tmpField] = tmpValue; } } } function update(uint id, string memory attributes, bytes memory _sig) public { require(id <= _tokenId.current(), "Invalid id"); Token storage token = _tokens[id-1]; IMetopianSBTFactory.TokenType memory tokenType = sbtFactory.tokenType(token.tokenType); string memory message = string(abi.encodePacked(attributes, Strings.toString(id))); require(validator.verify(tokenType.owner, msg.sender, message, _sig)); token.signature = _sig; updateTokenAttrs(id, attributes); } function tokenAttr(uint256 id, string calldata field) public view returns (string memory){ return _tokens[id-1].attributes[field]; } function tokenAttrsJsonStr(uint id) public view returns (string memory){ bytes memory buff; Token storage token = _tokens[id-1]; IMetopianSBTFactory.TokenType memory tokenType = sbtFactory.tokenType(token.tokenType); if(tokenType.fields.length==0){ return ""; } for (uint i=0; i<tokenType.fields.length; i++) { buff = bytes(abi.encodePacked( buff, ',{"trait_type":"', tokenType.fields[i], '","value":"', token.attributes[tokenType.fields[i]], '"}' )); } return string(buff); } function totalSupply() public view returns (uint256) { return _tokenId.current(); } function tokenURI(uint256 id) public view override returns (string memory){ require(id <= _tokenId.current(), "Invalid id"); return constructTokenURI(id); } function tokenImageUrl(uint256 id) private view returns (string memory) { Token storage token = _tokens[id-1]; IMetopianSBTFactory.TokenType memory tokenType = sbtFactory.tokenType(token.tokenType); // TokenType storage tokenType = _tokenTypes[token.tokenType]; return string(abi.encodePacked( imageRenderURI, '?title=', tokenType.titleEncoded, '&description=', tokenType.descriptionEncoded, '&space=', tokenType.spaceEncoded, '&signer=', token.issuerName, '&featuredImageCID=', tokenType.featuredImageCID, '&id=', Strings.toString(id))); } function constructTokenURI(uint256 id) private view returns (string memory) { Token storage token = _tokens[id-1]; IMetopianSBTFactory.TokenType memory tokenType = sbtFactory.tokenType(token.tokenType); // TokenType storage tokenType = _tokenTypes[token.tokenType]; return string( abi.encodePacked( "data:application/json;base64,", Base64.encode( bytes( abi.encodePacked( '{', '"name":"', name(), '",', '"description":"', description, '","image":"', tokenImageUrl(id), '", "attributes":[', '{"trait_type": "Title", "value": "', tokenType.title, '"},', '{"trait_type":"Description", "value":"', tokenType.description, '"},', '{"trait_type":"Space", "value":"', tokenType.space, '"},', '{"trait_type":"Signer", "value":"', token.issuerName, '"}', tokenAttrsJsonStr(id), ']}' ) ) ) ) ); } function setValidator(address _addr) public onlyOwner{ validator = IValidator(_addr); } function setSBTFactory(address _addr) public onlyOwner{ sbtFactory = IMetopianSBTFactory(_addr); } function setImageRenderURI(string memory _uri) public onlyOwner{ imageRenderURI = _uri; } function setDescription(string calldata _description) public onlyOwner{ description = _description; } /** * @notice SOULBOUND: Block transfers. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { require( from == address(0) || to == address(0), "SB: Nontransferable" ); super._beforeTokenTransfer(from, to, tokenId); } /** * @notice SOULBOUND: Block approvals. */ function setApprovalForAll(address operator, bool _approved) public virtual override { revert Soulbound(); } /** * @notice SOULBOUND: Block approvals. */ function approve(address to, uint256 tokenId) public virtual override { revert Soulbound(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Soulbound","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"Issue","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":"uint256","name":"","type":"uint256"}],"name":"_tokens","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"tokenType","type":"uint256"},{"internalType":"address","name":"issuer","type":"address"},{"internalType":"string","name":"issuerName","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"string","name":"attributes","type":"string"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_description","type":"string"}],"name":"setDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setImageRenderURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setSBTFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"field","type":"string"}],"name":"tokenAttr","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenAttrsJsonStr","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"attributes","type":"string"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405273eadc2a6fff036c12e62a74392d4c6ca77a5ea007600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073efc0590f81a6d3067d98eceb11c1bf5a42ece05e600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550733671ae578e63fdf66ad4f3e12cc0c0d71ac7510c600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060600160405280602481526020016200644960249139600e90816200012d91906200055d565b5060405180602001604052806000815250600f90816200014e91906200055d565b503480156200015c57600080fd5b506040518060400160405280600c81526020017f4d65746f7069616e2053425400000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d534254000000000000000000000000000000000000000000000000000000008152508160009081620001da91906200055d565b508060019081620001ec91906200055d565b5050506200020f620002036200021560201b60201c565b6200021d60201b60201c565b62000644565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036557607f821691505b6020821081036200037b576200037a6200031d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003e57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a6565b620003f18683620003a6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200043e62000438620004328462000409565b62000413565b62000409565b9050919050565b6000819050919050565b6200045a836200041d565b62000472620004698262000445565b848454620003b3565b825550505050565b600090565b620004896200047a565b620004968184846200044f565b505050565b5b81811015620004be57620004b26000826200047f565b6001810190506200049c565b5050565b601f8211156200050d57620004d78162000381565b620004e28462000396565b81016020851015620004f2578190505b6200050a620005018562000396565b8301826200049b565b50505b505050565b600082821c905092915050565b6000620005326000198460080262000512565b1980831691505092915050565b60006200054d83836200051f565b9150826002028217905092915050565b6200056882620002e3565b67ffffffffffffffff811115620005845762000583620002ee565b5b6200059082546200034c565b6200059d828285620004c2565b600060209050601f831160018114620005d55760008415620005c0578287015190505b620005cc85826200053f565b8655506200063c565b601f198416620005e58662000381565b60005b828110156200060f57848901518255600182019150602085019450602081019050620005e8565b868310156200062f57848901516200062b601f8916826200051f565b8355505b6001600288020188555050505b505050505050565b615df580620006546000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c8063785cc997116100de578063a22cb46511610097578063c87b56dd11610071578063c87b56dd14610469578063e985e9c514610499578063ed70554d146104c9578063f2fde38b146104fe5761018e565b8063a22cb46514610401578063a610040f1461041d578063b88d4fde1461044d5761018e565b8063785cc997146103415780638a0374921461035d5780638da5cb5b1461038d57806390c3f38f146103ab578063944ea5a4146103c757806395d89b41146103e35761018e565b806323b872dd1161014b5780635043c8c4116101255780635043c8c4146102bb5780636352211e146102d757806370a0823114610307578063715018a6146103375761018e565b806323b872dd146102675780632f607ddd1461028357806342842e0e1461029f5761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b3146102115780631327d3d81461022d57806318160ddd14610249575b600080fd5b6101ad60048036038101906101a89190613308565b61051a565b6040516101ba9190613350565b60405180910390f35b6101cb6105fc565b6040516101d891906133fb565b60405180910390f35b6101fb60048036038101906101f69190613453565b61068e565b60405161020891906134c1565b60405180910390f35b61022b60048036038101906102269190613508565b610713565b005b61024760048036038101906102429190613548565b610745565b005b610251610805565b60405161025e9190613584565b60405180910390f35b610281600480360381019061027c919061359f565b610816565b005b61029d600480360381019061029891906137c8565b610876565b005b6102b960048036038101906102b4919061359f565b610a9f565b005b6102d560048036038101906102d09190613548565b610abf565b005b6102f160048036038101906102ec9190613453565b610b7f565b6040516102fe91906134c1565b60405180910390f35b610321600480360381019061031c9190613548565b610c30565b60405161032e9190613584565b60405180910390f35b61033f610ce7565b005b61035b600480360381019061035691906137c8565b610d6f565b005b61037760048036038101906103729190613453565b61111f565b60405161038491906133fb565b60405180910390f35b6103956112d5565b6040516103a291906134c1565b60405180910390f35b6103c560048036038101906103c091906138b3565b6112ff565b005b6103e160048036038101906103dc9190613900565b611391565b005b6103eb611420565b6040516103f891906133fb565b60405180910390f35b61041b60048036038101906104169190613975565b6114b2565b005b610437600480360381019061043291906139b5565b6114e4565b60405161044491906133fb565b60405180910390f35b61046760048036038101906104629190613a15565b6115c7565b005b610483600480360381019061047e9190613453565b611629565b60405161049091906133fb565b60405180910390f35b6104b360048036038101906104ae9190613a98565b611687565b6040516104c09190613350565b60405180910390f35b6104e360048036038101906104de9190613453565b61171b565b6040516104f596959493929190613b2d565b60405180910390f35b61051860048036038101906105139190613548565b611897565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105e557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105f557506105f48261198e565b5b9050919050565b60606000805461060b90613bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613bcb565b80156106845780601f1061065957610100808354040283529160200191610684565b820191906000526020600020905b81548152906001019060200180831161066757829003601f168201915b5050505050905090565b6000610699826119f8565b6106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90613c6e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6040517fa4420a9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61074d611a64565b73ffffffffffffffffffffffffffffffffffffffff1661076b6112d5565b73ffffffffffffffffffffffffffffffffffffffff16146107c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b890613cda565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610811600a611a6c565b905090565b610827610821611a64565b82611a7a565b610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085d90613d6c565b60405180910390fd5b610871838383611b58565b505050565b610880600a611a6c565b8311156108c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b990613dd8565b60405180910390fd5b6000600b6001856108d39190613e27565b815481106108e4576108e3613e5b565b5b906000526020600020906007020190506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6c3b1f683600101546040518263ffffffff1660e01b81526004016109559190613584565b600060405180830381865afa158015610972573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061099b91906141ba565b90506000846109a987611dbe565b6040516020016109ba92919061423f565b6040516020818303038152906040529050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ba4f8668361010001513384886040518563ffffffff1660e01b8152600401610a319493929190614263565b602060405180830381865afa158015610a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7291906142cb565b610a7b57600080fd5b83836004019081610a8c91906144a4565b50610a978686611f1e565b505050505050565b610aba838383604051806020016040528060008152506115c7565b505050565b610ac7611a64565b73ffffffffffffffffffffffffffffffffffffffff16610ae56112d5565b73ffffffffffffffffffffffffffffffffffffffff1614610b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3290613cda565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1e906145e8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c979061467a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cef611a64565b73ffffffffffffffffffffffffffffffffffffffff16610d0d6112d5565b73ffffffffffffffffffffffffffffffffffffffff1614610d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5a90613cda565b60405180910390fd5b610d6d600061206f565b565b6000600d600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df9906146e6565b60405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6c3b1f6856040518263ffffffff1660e01b8152600401610e5f9190613584565b600060405180830381865afa158015610e7c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ea591906141ba565b90506000610eb233612135565b84610ebc87611dbe565b604051602001610ece93929190614752565b6040516020818303038152906040529050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ba4f8668361010001513384876040518563ffffffff1660e01b8152600401610f459493929190614263565b602060405180830381865afa158015610f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8691906142cb565b610f8f57600080fd5b6001600c600087815260200190815260200160002054610faf919061478e565b600c600087815260200190815260200160002081905550610fd0600a6122f8565b610fe333610fde600a611a6c565b61230e565b6001600d600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600b6001816001815401808255809150500390600052602060002090600702019050600c60008781526020019081526020016000205481600001819055508581600101819055508381600401908161109391906144a4565b508261010001518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506110ea83610100015161232c565b8160030190816110fa919061481d565b50428160050181905550611117611111600a611a6c565b86611f1e565b505050505050565b6060806000600b6001856111339190613e27565b8154811061114457611143613e5b565b5b906000526020600020906007020190506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6c3b1f683600101546040518263ffffffff1660e01b81526004016111b59190613584565b600060405180830381865afa1580156111d2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906111fb91906141ba565b905060008160e001515103611224576040518060200160405280600081525093505050506112d0565b60005b8160e00151518110156112c857838260e00151828151811061124c5761124b613e5b565b5b6020026020010151846006018460e00151848151811061126f5761126e613e5b565b5b602002602001015160405161128491906148ef565b90815260200160405180910390206040516020016112a493929190614aa9565b604051602081830303815290604052935080806112c090614afb565b915050611227565b508293505050505b919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611307611a64565b73ffffffffffffffffffffffffffffffffffffffff166113256112d5565b73ffffffffffffffffffffffffffffffffffffffff161461137b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137290613cda565b60405180910390fd5b8181600f918261138c929190614b4e565b505050565b611399611a64565b73ffffffffffffffffffffffffffffffffffffffff166113b76112d5565b73ffffffffffffffffffffffffffffffffffffffff161461140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140490613cda565b60405180910390fd5b80600e908161141c919061481d565b5050565b60606001805461142f90613bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461145b90613bcb565b80156114a85780601f1061147d576101008083540402835291602001916114a8565b820191906000526020600020905b81548152906001019060200180831161148b57829003601f168201915b5050505050905090565b6040517fa4420a9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060600b6001856114f59190613e27565b8154811061150657611505613e5b565b5b90600052602060002090600702016006018383604051611527929190614c43565b9081526020016040518091039020805461154090613bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461156c90613bcb565b80156115b95780601f1061158e576101008083540402835291602001916115b9565b820191906000526020600020905b81548152906001019060200180831161159c57829003601f168201915b505050505090509392505050565b6115d86115d2611a64565b83611a7a565b611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160e90613d6c565b60405180910390fd5b611623848484846124ee565b50505050565b6060611635600a611a6c565b821115611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166e90613dd8565b60405180910390fd5b6116808261254a565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b818154811061172b57600080fd5b90600052602060002090600702016000915090508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600301805461178090613bcb565b80601f01602080910402602001604051908101604052809291908181526020018280546117ac90613bcb565b80156117f95780601f106117ce576101008083540402835291602001916117f9565b820191906000526020600020905b8154815290600101906020018083116117dc57829003601f168201915b50505050509080600401805461180e90613bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461183a90613bcb565b80156118875780601f1061185c57610100808354040283529160200191611887565b820191906000526020600020905b81548152906001019060200180831161186a57829003601f168201915b5050505050908060050154905086565b61189f611a64565b73ffffffffffffffffffffffffffffffffffffffff166118bd6112d5565b73ffffffffffffffffffffffffffffffffffffffff1614611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190a90613cda565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197990614cce565b60405180910390fd5b61198b8161206f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b600081600001549050919050565b6000611a85826119f8565b611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb90614d60565b60405180910390fd5b6000611acf83610b7f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b3e57508373ffffffffffffffffffffffffffffffffffffffff16611b268461068e565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b4f5750611b4e8185611687565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b7882610b7f565b73ffffffffffffffffffffffffffffffffffffffff1614611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc590614df2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3490614e84565b60405180910390fd5b611c488383836126ac565b611c53600082612762565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ca39190613e27565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cfa919061478e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611db983838361281b565b505050565b606060008203611e05576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f19565b600082905060005b60008214611e37578080611e2090614afb565b915050600a82611e309190614ed3565b9150611e0d565b60008167ffffffffffffffff811115611e5357611e526135fc565b5b6040519080825280601f01601f191660200182016040528015611e855781602001600182028036833780820191505090505b5090505b60008514611f1257600182611e9e9190613e27565b9150600a85611ead9190614f04565b6030611eb9919061478e565b60f81b818381518110611ecf57611ece613e5b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f0b9190614ed3565b9450611e89565b8093505050505b919050565b60008151111561206b576000611f3382612820565b90506000611f756040518060400160405280600281526020017f3d3d000000000000000000000000000000000000000000000000000000000000815250612820565b90506000611fb76040518060400160405280600281526020017f2626000000000000000000000000000000000000000000000000000000000000815250612820565b90505b611fc38361284e565b612067576000611fe4611fdf848661285e90919063ffffffff16565b612878565b90506000612003611ffe848761285e90919063ffffffff16565b612878565b905080600b6001896120159190613e27565b8154811061202657612025613e5b565b5b90600052602060002090600702016006018360405161204591906148ef565b9081526020016040518091039020908161205f919061481d565b505050611fba565b5050505b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000602867ffffffffffffffff811115612154576121536135fc565b5b6040519080825280601f01601f1916602001820160405280156121865781602001600182028036833780820191505090505b50905060005b60148110156122ee5760008160136121a49190613e27565b60086121b09190614f35565b60026121bc91906150aa565b8573ffffffffffffffffffffffffffffffffffffffff166121dd9190614ed3565b60f81b9050600060108260f81c6121f49190615102565b60f81b905060008160f81c601061220b9190615133565b8360f81c6122199190615170565b60f81b9050612227826128f4565b858560026122359190614f35565b8151811061224657612245613e5b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061227e816128f4565b85600186600261228e9190614f35565b612298919061478e565b815181106122a9576122a8613e5b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050505080806122e690614afb565b91505061218c565b5080915050919050565b6001816000016000828254019250508190555050565b61232882826040518060200160405280600081525061293a565b5050565b6060806000600167ffffffffffffffff81111561234c5761234b6135fc565b5b60405190808252806020026020018201604052801561237a5781602001602082028036833780820191505090505b509050838160008151811061239257612391613e5b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cbf8b66c836040518263ffffffff1660e01b81526004016124299190615263565b600060405180830381865afa158015612446573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061246f9190615285565b905060008160008151811061248757612486613e5b565b5b602002602001015151036124c45761249e85612135565b6040516020016124ae91906152ce565b60405160208183030381529060405292506124e3565b806000815181106124d8576124d7613e5b565b5b602002602001015192505b829350505050919050565b6124f9848484611b58565b61250584848484612995565b612544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253b90615362565b60405180910390fd5b50505050565b60606000600b60018461255d9190613e27565b8154811061256e5761256d613e5b565b5b906000526020600020906007020190506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6c3b1f683600101546040518263ffffffff1660e01b81526004016125df9190613584565b600060405180830381865afa1580156125fc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061262591906141ba565b90506126846126326105fc565b600f61263d87612b1c565b846020015185606001518660400151886003016126598c61111f565b604051602001612670989796959493929190615784565b604051602081830303815290604052612c4a565b60405160200161269491906158e7565b60405160208183030381529060405292505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806127135750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b612752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274990615955565b60405180910390fd5b61275d838383612dc2565b505050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127d583610b7f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b505050565b612828613282565b600060208301905060405180604001604052808451815260200182815250915050919050565b6000808260000151149050919050565b612866613282565b612871838383612dc7565b5092915050565b60606000826000015167ffffffffffffffff81111561289a576128996135fc565b5b6040519080825280601f01601f1916602001820160405280156128cc5781602001600182028036833780820191505090505b50905060006020820190506128ea8185602001518660000151612e91565b8192505050919050565b6000600a8260f81c60ff16101561291f5760308260f81c6129159190615975565b60f81b9050612935565b60578260f81c61292f9190615975565b60f81b90505b919050565b6129448383612f3d565b6129516000848484612995565b612990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298790615362565b60405180910390fd5b505050565b60006129b68473ffffffffffffffffffffffffffffffffffffffff16613116565b15612b0f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129df611a64565b8786866040518563ffffffff1660e01b8152600401612a0194939291906159aa565b6020604051808303816000875af1925050508015612a3d57506040513d601f19601f82011682018060405250810190612a3a9190615a0b565b60015b612abf573d8060008114612a6d576040519150601f19603f3d011682016040523d82523d6000602084013e612a72565b606091505b506000815103612ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aae90615362565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b14565b600190505b949350505050565b60606000600b600184612b2f9190613e27565b81548110612b4057612b3f613e5b565b5b906000526020600020906007020190506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6c3b1f683600101546040518263ffffffff1660e01b8152600401612bb19190613584565b600060405180830381865afa158015612bce573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612bf791906141ba565b9050600e81608001518260c001518360a00151856003018560000151612c1c8a611dbe565b604051602001612c329796959493929190615c00565b60405160208183030381529060405292505050919050565b60606000825103612c6c57604051806020016040528060008152509050612dbd565b6000604051806060016040528060408152602001615d806040913990506000600360028551612c9b919061478e565b612ca59190614ed3565b6004612cb19190614f35565b90506000602082612cc2919061478e565b67ffffffffffffffff811115612cdb57612cda6135fc565b5b6040519080825280601f01601f191660200182016040528015612d0d5781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015612d7c576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825360018201915050612d21565b600389510660018114612d965760028114612da657612db1565b613d3d60f01b6002830352612db1565b603d60f81b60018303525b50505050508093505050505b919050565b505050565b612dcf613282565b6000612ded8560000151866020015186600001518760200151613139565b90508460200151836020018181525050846020015181612e0d9190613e27565b83600001818152505084600001518560200151612e2a919061478e565b8103612e40576000856000018181525050612e86565b83600001518360000151612e54919061478e565b85600001818151612e659190613e27565b91508181525050836000015181612e7c919061478e565b8560200181815250505b829150509392505050565b5b60208110612ed05781518352602083612eab919061478e565b9250602082612eba919061478e565b9150602081612ec99190613e27565b9050612e92565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90506000821115612f27576001826020612f0d9190613e27565b610100612f1a91906150aa565b612f249190613e27565b90505b8019835116818551168181178652505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa390615cf3565b60405180910390fd5b612fb5816119f8565b15612ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fec90615d5f565b60405180910390fd5b613001600083836126ac565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613051919061478e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131126000838361281b565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000808490506000868511613269576020851161320c576000808611156131925760018660206131699190613e27565b60086131759190614f35565b600261318191906150aa565b61318b9190613e27565b1960001b90505b60008186511690506000878a8a6131a9919061478e565b6131b39190613e27565b905060008386511690505b8281146131fe578186106131e5578a8a6131d8919061478e565b965050505050505061327a565b85806131f090614afb565b9650508386511690506131be565b85965050505050505061327a565b60008585209050600091505b85886132249190613e27565b82116132675760008684209050808203613244578394505050505061327a565b600184613251919061478e565b935050818061325f90614afb565b925050613218565b505b8686613275919061478e565b925050505b949350505050565b604051806040016040528060008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132e5816132b0565b81146132f057600080fd5b50565b600081359050613302816132dc565b92915050565b60006020828403121561331e5761331d6132a6565b5b600061332c848285016132f3565b91505092915050565b60008115159050919050565b61334a81613335565b82525050565b60006020820190506133656000830184613341565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133a557808201518184015260208101905061338a565b60008484015250505050565b6000601f19601f8301169050919050565b60006133cd8261336b565b6133d78185613376565b93506133e7818560208601613387565b6133f0816133b1565b840191505092915050565b6000602082019050818103600083015261341581846133c2565b905092915050565b6000819050919050565b6134308161341d565b811461343b57600080fd5b50565b60008135905061344d81613427565b92915050565b600060208284031215613469576134686132a6565b5b60006134778482850161343e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134ab82613480565b9050919050565b6134bb816134a0565b82525050565b60006020820190506134d660008301846134b2565b92915050565b6134e5816134a0565b81146134f057600080fd5b50565b600081359050613502816134dc565b92915050565b6000806040838503121561351f5761351e6132a6565b5b600061352d858286016134f3565b925050602061353e8582860161343e565b9150509250929050565b60006020828403121561355e5761355d6132a6565b5b600061356c848285016134f3565b91505092915050565b61357e8161341d565b82525050565b60006020820190506135996000830184613575565b92915050565b6000806000606084860312156135b8576135b76132a6565b5b60006135c6868287016134f3565b93505060206135d7868287016134f3565b92505060406135e88682870161343e565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613634826133b1565b810181811067ffffffffffffffff82111715613653576136526135fc565b5b80604052505050565b600061366661329c565b9050613672828261362b565b919050565b600067ffffffffffffffff821115613692576136916135fc565b5b61369b826133b1565b9050602081019050919050565b82818337600083830152505050565b60006136ca6136c584613677565b61365c565b9050828152602081018484840111156136e6576136e56135f7565b5b6136f18482856136a8565b509392505050565b600082601f83011261370e5761370d6135f2565b5b813561371e8482602086016136b7565b91505092915050565b600067ffffffffffffffff821115613742576137416135fc565b5b61374b826133b1565b9050602081019050919050565b600061376b61376684613727565b61365c565b905082815260208101848484011115613787576137866135f7565b5b6137928482856136a8565b509392505050565b600082601f8301126137af576137ae6135f2565b5b81356137bf848260208601613758565b91505092915050565b6000806000606084860312156137e1576137e06132a6565b5b60006137ef8682870161343e565b935050602084013567ffffffffffffffff8111156138105761380f6132ab565b5b61381c868287016136f9565b925050604084013567ffffffffffffffff81111561383d5761383c6132ab565b5b6138498682870161379a565b9150509250925092565b600080fd5b600080fd5b60008083601f840112613873576138726135f2565b5b8235905067ffffffffffffffff8111156138905761388f613853565b5b6020830191508360018202830111156138ac576138ab613858565b5b9250929050565b600080602083850312156138ca576138c96132a6565b5b600083013567ffffffffffffffff8111156138e8576138e76132ab565b5b6138f48582860161385d565b92509250509250929050565b600060208284031215613916576139156132a6565b5b600082013567ffffffffffffffff811115613934576139336132ab565b5b613940848285016136f9565b91505092915050565b61395281613335565b811461395d57600080fd5b50565b60008135905061396f81613949565b92915050565b6000806040838503121561398c5761398b6132a6565b5b600061399a858286016134f3565b92505060206139ab85828601613960565b9150509250929050565b6000806000604084860312156139ce576139cd6132a6565b5b60006139dc8682870161343e565b935050602084013567ffffffffffffffff8111156139fd576139fc6132ab565b5b613a098682870161385d565b92509250509250925092565b60008060008060808587031215613a2f57613a2e6132a6565b5b6000613a3d878288016134f3565b9450506020613a4e878288016134f3565b9350506040613a5f8782880161343e565b925050606085013567ffffffffffffffff811115613a8057613a7f6132ab565b5b613a8c8782880161379a565b91505092959194509250565b60008060408385031215613aaf57613aae6132a6565b5b6000613abd858286016134f3565b9250506020613ace858286016134f3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000613aff82613ad8565b613b098185613ae3565b9350613b19818560208601613387565b613b22816133b1565b840191505092915050565b600060c082019050613b426000830189613575565b613b4f6020830188613575565b613b5c60408301876134b2565b8181036060830152613b6e81866133c2565b90508181036080830152613b828185613af4565b9050613b9160a0830184613575565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613be357607f821691505b602082108103613bf657613bf5613b9c565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613c58602c83613376565b9150613c6382613bfc565b604082019050919050565b60006020820190508181036000830152613c8781613c4b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613cc4602083613376565b9150613ccf82613c8e565b602082019050919050565b60006020820190508181036000830152613cf381613cb7565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613d56603183613376565b9150613d6182613cfa565b604082019050919050565b60006020820190508181036000830152613d8581613d49565b9050919050565b7f496e76616c696420696400000000000000000000000000000000000000000000600082015250565b6000613dc2600a83613376565b9150613dcd82613d8c565b602082019050919050565b60006020820190508181036000830152613df181613db5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e328261341d565b9150613e3d8361341d565b9250828203905081811115613e5557613e54613df8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b6000613ea7613ea284613677565b61365c565b905082815260208101848484011115613ec357613ec26135f7565b5b613ece848285613387565b509392505050565b600082601f830112613eeb57613eea6135f2565b5b8151613efb848260208601613e94565b91505092915050565b600067ffffffffffffffff821115613f1f57613f1e6135fc565b5b602082029050602081019050919050565b6000613f43613f3e84613f04565b61365c565b90508083825260208201905060208402830185811115613f6657613f65613858565b5b835b81811015613fad57805167ffffffffffffffff811115613f8b57613f8a6135f2565b5b808601613f988982613ed6565b85526020850194505050602081019050613f68565b5050509392505050565b600082601f830112613fcc57613fcb6135f2565b5b8151613fdc848260208601613f30565b91505092915050565b600081519050613ff4816134dc565b92915050565b6000610120828403121561401157614010613e8a565b5b61401c61012061365c565b9050600082015167ffffffffffffffff81111561403c5761403b613e8f565b5b61404884828501613ed6565b600083015250602082015167ffffffffffffffff81111561406c5761406b613e8f565b5b61407884828501613ed6565b602083015250604082015167ffffffffffffffff81111561409c5761409b613e8f565b5b6140a884828501613ed6565b604083015250606082015167ffffffffffffffff8111156140cc576140cb613e8f565b5b6140d884828501613ed6565b606083015250608082015167ffffffffffffffff8111156140fc576140fb613e8f565b5b61410884828501613ed6565b60808301525060a082015167ffffffffffffffff81111561412c5761412b613e8f565b5b61413884828501613ed6565b60a08301525060c082015167ffffffffffffffff81111561415c5761415b613e8f565b5b61416884828501613ed6565b60c08301525060e082015167ffffffffffffffff81111561418c5761418b613e8f565b5b61419884828501613fb7565b60e0830152506101006141ad84828501613fe5565b6101008301525092915050565b6000602082840312156141d0576141cf6132a6565b5b600082015167ffffffffffffffff8111156141ee576141ed6132ab565b5b6141fa84828501613ffa565b91505092915050565b600081905092915050565b60006142198261336b565b6142238185614203565b9350614233818560208601613387565b80840191505092915050565b600061424b828561420e565b9150614257828461420e565b91508190509392505050565b600060808201905061427860008301876134b2565b61428560208301866134b2565b818103604083015261429781856133c2565b905081810360608301526142ab8184613af4565b905095945050505050565b6000815190506142c581613949565b92915050565b6000602082840312156142e1576142e06132a6565b5b60006142ef848285016142b6565b91505092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261435a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261431d565b614364868361431d565b95508019841693508086168417925050509392505050565b6000819050919050565b60006143a161439c6143978461341d565b61437c565b61341d565b9050919050565b6000819050919050565b6143bb83614386565b6143cf6143c7826143a8565b84845461432a565b825550505050565b600090565b6143e46143d7565b6143ef8184846143b2565b505050565b5b81811015614413576144086000826143dc565b6001810190506143f5565b5050565b601f82111561445857614429816142f8565b6144328461430d565b81016020851015614441578190505b61445561444d8561430d565b8301826143f4565b50505b505050565b600082821c905092915050565b600061447b6000198460080261445d565b1980831691505092915050565b6000614494838361446a565b9150826002028217905092915050565b6144ad82613ad8565b67ffffffffffffffff8111156144c6576144c56135fc565b5b6144d08254613bcb565b6144db828285614417565b600060209050601f83116001811461450e57600084156144fc578287015190505b6145068582614488565b86555061456e565b601f19841661451c866142f8565b60005b828110156145445784890151825560018201915060208501945060208101905061451f565b86831015614561578489015161455d601f89168261446a565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006145d2602983613376565b91506145dd82614576565b604082019050919050565b60006020820190508181036000830152614601816145c5565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614664602a83613376565b915061466f82614608565b604082019050919050565b6000602082019050818103600083015261469381614657565b9050919050565b7f4475706c00000000000000000000000000000000000000000000000000000000600082015250565b60006146d0600483613376565b91506146db8261469a565b602082019050919050565b600060208201905081810360008301526146ff816146c3565b9050919050565b7f3078000000000000000000000000000000000000000000000000000000000000600082015250565b600061473c600283614203565b915061474782614706565b600282019050919050565b600061475d8261472f565b9150614769828661420e565b9150614775828561420e565b9150614781828461420e565b9150819050949350505050565b60006147998261341d565b91506147a48361341d565b92508282019050808211156147bc576147bb613df8565b5b92915050565b60008190508160005260206000209050919050565b601f821115614818576147e9816147c2565b6147f28461430d565b81016020851015614801578190505b61481561480d8561430d565b8301826143f4565b50505b505050565b6148268261336b565b67ffffffffffffffff81111561483f5761483e6135fc565b5b6148498254613bcb565b6148548282856147d7565b600060209050601f8311600181146148875760008415614875578287015190505b61487f8582614488565b8655506148e7565b601f198416614895866147c2565b60005b828110156148bd57848901518255600182019150602085019450602081019050614898565b868310156148da57848901516148d6601f89168261446a565b8355505b6001600288020188555050505b505050505050565b60006148fb828461420e565b915081905092915050565b600081905092915050565b600061491c82613ad8565b6149268185614906565b9350614936818560208601613387565b80840191505092915050565b7f2c7b2274726169745f74797065223a2200000000000000000000000000000000600082015250565b6000614978601083614203565b915061498382614942565b601082019050919050565b7f222c2276616c7565223a22000000000000000000000000000000000000000000600082015250565b60006149c4600b83614203565b91506149cf8261498e565b600b82019050919050565b600081546149e781613bcb565b6149f18186614203565b94506001821660008114614a0c5760018114614a2157614a54565b60ff1983168652811515820286019350614a54565b614a2a856147c2565b60005b83811015614a4c57815481890152600182019150602081019050614a2d565b838801955050505b50505092915050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b6000614a93600283614203565b9150614a9e82614a5d565b600282019050919050565b6000614ab58286614911565b9150614ac08261496b565b9150614acc828561420e565b9150614ad7826149b7565b9150614ae382846149da565b9150614aee82614a86565b9150819050949350505050565b6000614b068261341d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614b3857614b37613df8565b5b600182019050919050565b600082905092915050565b614b588383614b43565b67ffffffffffffffff811115614b7157614b706135fc565b5b614b7b8254613bcb565b614b868282856147d7565b6000601f831160018114614bb55760008415614ba3578287013590505b614bad8582614488565b865550614c15565b601f198416614bc3866147c2565b60005b82811015614beb57848901358255600182019150602085019450602081019050614bc6565b86831015614c085784890135614c04601f89168261446a565b8355505b6001600288020188555050505b50505050505050565b6000614c2a8385614203565b9350614c378385846136a8565b82840190509392505050565b6000614c50828486614c1e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614cb8602683613376565b9150614cc382614c5c565b604082019050919050565b60006020820190508181036000830152614ce781614cab565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614d4a602c83613376565b9150614d5582614cee565b604082019050919050565b60006020820190508181036000830152614d7981614d3d565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614ddc602583613376565b9150614de782614d80565b604082019050919050565b60006020820190508181036000830152614e0b81614dcf565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614e6e602483613376565b9150614e7982614e12565b604082019050919050565b60006020820190508181036000830152614e9d81614e61565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ede8261341d565b9150614ee98361341d565b925082614ef957614ef8614ea4565b5b828204905092915050565b6000614f0f8261341d565b9150614f1a8361341d565b925082614f2a57614f29614ea4565b5b828206905092915050565b6000614f408261341d565b9150614f4b8361341d565b9250828202614f598161341d565b91508282048414831517614f7057614f6f613df8565b5b5092915050565b60008160011c9050919050565b6000808291508390505b6001851115614fce57808604811115614faa57614fa9613df8565b5b6001851615614fb95780820291505b8081029050614fc785614f77565b9450614f8e565b94509492505050565b600082614fe757600190506150a3565b81614ff557600090506150a3565b816001811461500b576002811461501557615044565b60019150506150a3565b60ff84111561502757615026613df8565b5b8360020a91508482111561503e5761503d613df8565b5b506150a3565b5060208310610133831016604e8410600b84101617156150795782820a90508381111561507457615073613df8565b5b6150a3565b6150868484846001614f84565b9250905081840481111561509d5761509c613df8565b5b81810290505b9392505050565b60006150b58261341d565b91506150c08361341d565b92506150ed7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614fd7565b905092915050565b600060ff82169050919050565b600061510d826150f5565b9150615118836150f5565b92508261512857615127614ea4565b5b828204905092915050565b600061513e826150f5565b9150615149836150f5565b9250828202615157816150f5565b915080821461516957615168613df8565b5b5092915050565b600061517b826150f5565b9150615186836150f5565b9250828203905060ff81111561519f5761519e613df8565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6151da816134a0565b82525050565b60006151ec83836151d1565b60208301905092915050565b6000602082019050919050565b6000615210826151a5565b61521a81856151b0565b9350615225836151c1565b8060005b8381101561525657815161523d88826151e0565b9750615248836151f8565b925050600181019050615229565b5085935050505092915050565b6000602082019050818103600083015261527d8184615205565b905092915050565b60006020828403121561529b5761529a6132a6565b5b600082015167ffffffffffffffff8111156152b9576152b86132ab565b5b6152c584828501613fb7565b91505092915050565b60006152d98261472f565b91506152e5828461420e565b915081905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061534c603283613376565b9150615357826152f0565b604082019050919050565b6000602082019050818103600083015261537b8161533f565b9050919050565b7f7b00000000000000000000000000000000000000000000000000000000000000600082015250565b60006153b8600183614203565b91506153c382615382565b600182019050919050565b7f226e616d65223a22000000000000000000000000000000000000000000000000600082015250565b6000615404600883614203565b915061540f826153ce565b600882019050919050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b6000615450600283614203565b915061545b8261541a565b600282019050919050565b7f226465736372697074696f6e223a220000000000000000000000000000000000600082015250565b600061549c600f83614203565b91506154a782615466565b600f82019050919050565b7f222c22696d616765223a22000000000000000000000000000000000000000000600082015250565b60006154e8600b83614203565b91506154f3826154b2565b600b82019050919050565b7f222c202261747472696275746573223a5b000000000000000000000000000000600082015250565b6000615534601183614203565b915061553f826154fe565b601182019050919050565b7f7b2274726169745f74797065223a20225469746c65222c202276616c7565223a60008201527f2022000000000000000000000000000000000000000000000000000000000000602082015250565b60006155a6602283614203565b91506155b18261554a565b602282019050919050565b7f227d2c0000000000000000000000000000000000000000000000000000000000600082015250565b60006155f2600383614203565b91506155fd826155bc565b600382019050919050565b7f7b2274726169745f74797065223a224465736372697074696f6e222c2022766160008201527f6c7565223a220000000000000000000000000000000000000000000000000000602082015250565b6000615664602683614203565b915061566f82615608565b602682019050919050565b7f7b2274726169745f74797065223a225370616365222c202276616c7565223a22600082015250565b60006156b0602083614203565b91506156bb8261567a565b602082019050919050565b7f7b2274726169745f74797065223a225369676e6572222c202276616c7565223a60008201527f2200000000000000000000000000000000000000000000000000000000000000602082015250565b6000615722602183614203565b915061572d826156c6565b602182019050919050565b7f5d7d000000000000000000000000000000000000000000000000000000000000600082015250565b600061576e600283614203565b915061577982615738565b600282019050919050565b600061578f826153ab565b915061579a826153f7565b91506157a6828b61420e565b91506157b182615443565b91506157bc8261548f565b91506157c8828a6149da565b91506157d3826154db565b91506157df828961420e565b91506157ea82615527565b91506157f582615599565b9150615801828861420e565b915061580c826155e5565b915061581782615657565b9150615823828761420e565b915061582e826155e5565b9150615839826156a3565b9150615845828661420e565b9150615850826155e5565b915061585b82615715565b915061586782856149da565b915061587282614a86565b915061587e828461420e565b915061588982615761565b91508190509998505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b60006158d1601d83614203565b91506158dc8261589b565b601d82019050919050565b60006158f2826158c4565b91506158fe828461420e565b915081905092915050565b7f53423a204e6f6e7472616e7366657261626c6500000000000000000000000000600082015250565b600061593f601383613376565b915061594a82615909565b602082019050919050565b6000602082019050818103600083015261596e81615932565b9050919050565b6000615980826150f5565b915061598b836150f5565b9250828201905060ff8111156159a4576159a3613df8565b5b92915050565b60006080820190506159bf60008301876134b2565b6159cc60208301866134b2565b6159d96040830185613575565b81810360608301526159eb8184613af4565b905095945050505050565b600081519050615a05816132dc565b92915050565b600060208284031215615a2157615a206132a6565b5b6000615a2f848285016159f6565b91505092915050565b7f3f7469746c653d00000000000000000000000000000000000000000000000000600082015250565b6000615a6e600783614203565b9150615a7982615a38565b600782019050919050565b7f266465736372697074696f6e3d00000000000000000000000000000000000000600082015250565b6000615aba600d83614203565b9150615ac582615a84565b600d82019050919050565b7f2673706163653d00000000000000000000000000000000000000000000000000600082015250565b6000615b06600783614203565b9150615b1182615ad0565b600782019050919050565b7f267369676e65723d000000000000000000000000000000000000000000000000600082015250565b6000615b52600883614203565b9150615b5d82615b1c565b600882019050919050565b7f266665617475726564496d6167654349443d0000000000000000000000000000600082015250565b6000615b9e601283614203565b9150615ba982615b68565b601282019050919050565b7f2669643d00000000000000000000000000000000000000000000000000000000600082015250565b6000615bea600483614203565b9150615bf582615bb4565b600482019050919050565b6000615c0c828a6149da565b9150615c1782615a61565b9150615c23828961420e565b9150615c2e82615aad565b9150615c3a828861420e565b9150615c4582615af9565b9150615c51828761420e565b9150615c5c82615b45565b9150615c6882866149da565b9150615c7382615b91565b9150615c7f828561420e565b9150615c8a82615bdd565b9150615c96828461420e565b915081905098975050505050505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615cdd602083613376565b9150615ce882615ca7565b602082019050919050565b60006020820190508181036000830152615d0c81615cd0565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615d49601c83613376565b9150615d5482615d13565b602082019050919050565b60006020820190508181036000830152615d7881615d3c565b905091905056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220e09edc06651da4c00b85699b22bd541916b5b88e1bbf8012baecfe539d0d345e64736f6c6343000811003368747470733a2f2f61692e6d65746f7069612e78797a2f7362742d67656e657261746f72
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c8063785cc997116100de578063a22cb46511610097578063c87b56dd11610071578063c87b56dd14610469578063e985e9c514610499578063ed70554d146104c9578063f2fde38b146104fe5761018e565b8063a22cb46514610401578063a610040f1461041d578063b88d4fde1461044d5761018e565b8063785cc997146103415780638a0374921461035d5780638da5cb5b1461038d57806390c3f38f146103ab578063944ea5a4146103c757806395d89b41146103e35761018e565b806323b872dd1161014b5780635043c8c4116101255780635043c8c4146102bb5780636352211e146102d757806370a0823114610307578063715018a6146103375761018e565b806323b872dd146102675780632f607ddd1461028357806342842e0e1461029f5761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b3146102115780631327d3d81461022d57806318160ddd14610249575b600080fd5b6101ad60048036038101906101a89190613308565b61051a565b6040516101ba9190613350565b60405180910390f35b6101cb6105fc565b6040516101d891906133fb565b60405180910390f35b6101fb60048036038101906101f69190613453565b61068e565b60405161020891906134c1565b60405180910390f35b61022b60048036038101906102269190613508565b610713565b005b61024760048036038101906102429190613548565b610745565b005b610251610805565b60405161025e9190613584565b60405180910390f35b610281600480360381019061027c919061359f565b610816565b005b61029d600480360381019061029891906137c8565b610876565b005b6102b960048036038101906102b4919061359f565b610a9f565b005b6102d560048036038101906102d09190613548565b610abf565b005b6102f160048036038101906102ec9190613453565b610b7f565b6040516102fe91906134c1565b60405180910390f35b610321600480360381019061031c9190613548565b610c30565b60405161032e9190613584565b60405180910390f35b61033f610ce7565b005b61035b600480360381019061035691906137c8565b610d6f565b005b61037760048036038101906103729190613453565b61111f565b60405161038491906133fb565b60405180910390f35b6103956112d5565b6040516103a291906134c1565b60405180910390f35b6103c560048036038101906103c091906138b3565b6112ff565b005b6103e160048036038101906103dc9190613900565b611391565b005b6103eb611420565b6040516103f891906133fb565b60405180910390f35b61041b60048036038101906104169190613975565b6114b2565b005b610437600480360381019061043291906139b5565b6114e4565b60405161044491906133fb565b60405180910390f35b61046760048036038101906104629190613a15565b6115c7565b005b610483600480360381019061047e9190613453565b611629565b60405161049091906133fb565b60405180910390f35b6104b360048036038101906104ae9190613a98565b611687565b6040516104c09190613350565b60405180910390f35b6104e360048036038101906104de9190613453565b61171b565b6040516104f596959493929190613b2d565b60405180910390f35b61051860048036038101906105139190613548565b611897565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105e557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105f557506105f48261198e565b5b9050919050565b60606000805461060b90613bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613bcb565b80156106845780601f1061065957610100808354040283529160200191610684565b820191906000526020600020905b81548152906001019060200180831161066757829003601f168201915b5050505050905090565b6000610699826119f8565b6106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90613c6e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6040517fa4420a9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61074d611a64565b73ffffffffffffffffffffffffffffffffffffffff1661076b6112d5565b73ffffffffffffffffffffffffffffffffffffffff16146107c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b890613cda565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610811600a611a6c565b905090565b610827610821611a64565b82611a7a565b610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085d90613d6c565b60405180910390fd5b610871838383611b58565b505050565b610880600a611a6c565b8311156108c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b990613dd8565b60405180910390fd5b6000600b6001856108d39190613e27565b815481106108e4576108e3613e5b565b5b906000526020600020906007020190506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6c3b1f683600101546040518263ffffffff1660e01b81526004016109559190613584565b600060405180830381865afa158015610972573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061099b91906141ba565b90506000846109a987611dbe565b6040516020016109ba92919061423f565b6040516020818303038152906040529050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ba4f8668361010001513384886040518563ffffffff1660e01b8152600401610a319493929190614263565b602060405180830381865afa158015610a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7291906142cb565b610a7b57600080fd5b83836004019081610a8c91906144a4565b50610a978686611f1e565b505050505050565b610aba838383604051806020016040528060008152506115c7565b505050565b610ac7611a64565b73ffffffffffffffffffffffffffffffffffffffff16610ae56112d5565b73ffffffffffffffffffffffffffffffffffffffff1614610b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3290613cda565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1e906145e8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c979061467a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cef611a64565b73ffffffffffffffffffffffffffffffffffffffff16610d0d6112d5565b73ffffffffffffffffffffffffffffffffffffffff1614610d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5a90613cda565b60405180910390fd5b610d6d600061206f565b565b6000600d600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df9906146e6565b60405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6c3b1f6856040518263ffffffff1660e01b8152600401610e5f9190613584565b600060405180830381865afa158015610e7c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ea591906141ba565b90506000610eb233612135565b84610ebc87611dbe565b604051602001610ece93929190614752565b6040516020818303038152906040529050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ba4f8668361010001513384876040518563ffffffff1660e01b8152600401610f459493929190614263565b602060405180830381865afa158015610f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8691906142cb565b610f8f57600080fd5b6001600c600087815260200190815260200160002054610faf919061478e565b600c600087815260200190815260200160002081905550610fd0600a6122f8565b610fe333610fde600a611a6c565b61230e565b6001600d600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600b6001816001815401808255809150500390600052602060002090600702019050600c60008781526020019081526020016000205481600001819055508581600101819055508381600401908161109391906144a4565b508261010001518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506110ea83610100015161232c565b8160030190816110fa919061481d565b50428160050181905550611117611111600a611a6c565b86611f1e565b505050505050565b6060806000600b6001856111339190613e27565b8154811061114457611143613e5b565b5b906000526020600020906007020190506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6c3b1f683600101546040518263ffffffff1660e01b81526004016111b59190613584565b600060405180830381865afa1580156111d2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906111fb91906141ba565b905060008160e001515103611224576040518060200160405280600081525093505050506112d0565b60005b8160e00151518110156112c857838260e00151828151811061124c5761124b613e5b565b5b6020026020010151846006018460e00151848151811061126f5761126e613e5b565b5b602002602001015160405161128491906148ef565b90815260200160405180910390206040516020016112a493929190614aa9565b604051602081830303815290604052935080806112c090614afb565b915050611227565b508293505050505b919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611307611a64565b73ffffffffffffffffffffffffffffffffffffffff166113256112d5565b73ffffffffffffffffffffffffffffffffffffffff161461137b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137290613cda565b60405180910390fd5b8181600f918261138c929190614b4e565b505050565b611399611a64565b73ffffffffffffffffffffffffffffffffffffffff166113b76112d5565b73ffffffffffffffffffffffffffffffffffffffff161461140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140490613cda565b60405180910390fd5b80600e908161141c919061481d565b5050565b60606001805461142f90613bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461145b90613bcb565b80156114a85780601f1061147d576101008083540402835291602001916114a8565b820191906000526020600020905b81548152906001019060200180831161148b57829003601f168201915b5050505050905090565b6040517fa4420a9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060600b6001856114f59190613e27565b8154811061150657611505613e5b565b5b90600052602060002090600702016006018383604051611527929190614c43565b9081526020016040518091039020805461154090613bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461156c90613bcb565b80156115b95780601f1061158e576101008083540402835291602001916115b9565b820191906000526020600020905b81548152906001019060200180831161159c57829003601f168201915b505050505090509392505050565b6115d86115d2611a64565b83611a7a565b611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160e90613d6c565b60405180910390fd5b611623848484846124ee565b50505050565b6060611635600a611a6c565b821115611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166e90613dd8565b60405180910390fd5b6116808261254a565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b818154811061172b57600080fd5b90600052602060002090600702016000915090508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600301805461178090613bcb565b80601f01602080910402602001604051908101604052809291908181526020018280546117ac90613bcb565b80156117f95780601f106117ce576101008083540402835291602001916117f9565b820191906000526020600020905b8154815290600101906020018083116117dc57829003601f168201915b50505050509080600401805461180e90613bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461183a90613bcb565b80156118875780601f1061185c57610100808354040283529160200191611887565b820191906000526020600020905b81548152906001019060200180831161186a57829003601f168201915b5050505050908060050154905086565b61189f611a64565b73ffffffffffffffffffffffffffffffffffffffff166118bd6112d5565b73ffffffffffffffffffffffffffffffffffffffff1614611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190a90613cda565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197990614cce565b60405180910390fd5b61198b8161206f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b600081600001549050919050565b6000611a85826119f8565b611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb90614d60565b60405180910390fd5b6000611acf83610b7f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b3e57508373ffffffffffffffffffffffffffffffffffffffff16611b268461068e565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b4f5750611b4e8185611687565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b7882610b7f565b73ffffffffffffffffffffffffffffffffffffffff1614611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc590614df2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3490614e84565b60405180910390fd5b611c488383836126ac565b611c53600082612762565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ca39190613e27565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cfa919061478e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611db983838361281b565b505050565b606060008203611e05576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f19565b600082905060005b60008214611e37578080611e2090614afb565b915050600a82611e309190614ed3565b9150611e0d565b60008167ffffffffffffffff811115611e5357611e526135fc565b5b6040519080825280601f01601f191660200182016040528015611e855781602001600182028036833780820191505090505b5090505b60008514611f1257600182611e9e9190613e27565b9150600a85611ead9190614f04565b6030611eb9919061478e565b60f81b818381518110611ecf57611ece613e5b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f0b9190614ed3565b9450611e89565b8093505050505b919050565b60008151111561206b576000611f3382612820565b90506000611f756040518060400160405280600281526020017f3d3d000000000000000000000000000000000000000000000000000000000000815250612820565b90506000611fb76040518060400160405280600281526020017f2626000000000000000000000000000000000000000000000000000000000000815250612820565b90505b611fc38361284e565b612067576000611fe4611fdf848661285e90919063ffffffff16565b612878565b90506000612003611ffe848761285e90919063ffffffff16565b612878565b905080600b6001896120159190613e27565b8154811061202657612025613e5b565b5b90600052602060002090600702016006018360405161204591906148ef565b9081526020016040518091039020908161205f919061481d565b505050611fba565b5050505b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000602867ffffffffffffffff811115612154576121536135fc565b5b6040519080825280601f01601f1916602001820160405280156121865781602001600182028036833780820191505090505b50905060005b60148110156122ee5760008160136121a49190613e27565b60086121b09190614f35565b60026121bc91906150aa565b8573ffffffffffffffffffffffffffffffffffffffff166121dd9190614ed3565b60f81b9050600060108260f81c6121f49190615102565b60f81b905060008160f81c601061220b9190615133565b8360f81c6122199190615170565b60f81b9050612227826128f4565b858560026122359190614f35565b8151811061224657612245613e5b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061227e816128f4565b85600186600261228e9190614f35565b612298919061478e565b815181106122a9576122a8613e5b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050505080806122e690614afb565b91505061218c565b5080915050919050565b6001816000016000828254019250508190555050565b61232882826040518060200160405280600081525061293a565b5050565b6060806000600167ffffffffffffffff81111561234c5761234b6135fc565b5b60405190808252806020026020018201604052801561237a5781602001602082028036833780820191505090505b509050838160008151811061239257612391613e5b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cbf8b66c836040518263ffffffff1660e01b81526004016124299190615263565b600060405180830381865afa158015612446573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061246f9190615285565b905060008160008151811061248757612486613e5b565b5b602002602001015151036124c45761249e85612135565b6040516020016124ae91906152ce565b60405160208183030381529060405292506124e3565b806000815181106124d8576124d7613e5b565b5b602002602001015192505b829350505050919050565b6124f9848484611b58565b61250584848484612995565b612544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253b90615362565b60405180910390fd5b50505050565b60606000600b60018461255d9190613e27565b8154811061256e5761256d613e5b565b5b906000526020600020906007020190506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6c3b1f683600101546040518263ffffffff1660e01b81526004016125df9190613584565b600060405180830381865afa1580156125fc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061262591906141ba565b90506126846126326105fc565b600f61263d87612b1c565b846020015185606001518660400151886003016126598c61111f565b604051602001612670989796959493929190615784565b604051602081830303815290604052612c4a565b60405160200161269491906158e7565b60405160208183030381529060405292505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806127135750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b612752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274990615955565b60405180910390fd5b61275d838383612dc2565b505050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127d583610b7f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b505050565b612828613282565b600060208301905060405180604001604052808451815260200182815250915050919050565b6000808260000151149050919050565b612866613282565b612871838383612dc7565b5092915050565b60606000826000015167ffffffffffffffff81111561289a576128996135fc565b5b6040519080825280601f01601f1916602001820160405280156128cc5781602001600182028036833780820191505090505b50905060006020820190506128ea8185602001518660000151612e91565b8192505050919050565b6000600a8260f81c60ff16101561291f5760308260f81c6129159190615975565b60f81b9050612935565b60578260f81c61292f9190615975565b60f81b90505b919050565b6129448383612f3d565b6129516000848484612995565b612990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298790615362565b60405180910390fd5b505050565b60006129b68473ffffffffffffffffffffffffffffffffffffffff16613116565b15612b0f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129df611a64565b8786866040518563ffffffff1660e01b8152600401612a0194939291906159aa565b6020604051808303816000875af1925050508015612a3d57506040513d601f19601f82011682018060405250810190612a3a9190615a0b565b60015b612abf573d8060008114612a6d576040519150601f19603f3d011682016040523d82523d6000602084013e612a72565b606091505b506000815103612ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aae90615362565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b14565b600190505b949350505050565b60606000600b600184612b2f9190613e27565b81548110612b4057612b3f613e5b565b5b906000526020600020906007020190506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6c3b1f683600101546040518263ffffffff1660e01b8152600401612bb19190613584565b600060405180830381865afa158015612bce573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612bf791906141ba565b9050600e81608001518260c001518360a00151856003018560000151612c1c8a611dbe565b604051602001612c329796959493929190615c00565b60405160208183030381529060405292505050919050565b60606000825103612c6c57604051806020016040528060008152509050612dbd565b6000604051806060016040528060408152602001615d806040913990506000600360028551612c9b919061478e565b612ca59190614ed3565b6004612cb19190614f35565b90506000602082612cc2919061478e565b67ffffffffffffffff811115612cdb57612cda6135fc565b5b6040519080825280601f01601f191660200182016040528015612d0d5781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015612d7c576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825360018201915050612d21565b600389510660018114612d965760028114612da657612db1565b613d3d60f01b6002830352612db1565b603d60f81b60018303525b50505050508093505050505b919050565b505050565b612dcf613282565b6000612ded8560000151866020015186600001518760200151613139565b90508460200151836020018181525050846020015181612e0d9190613e27565b83600001818152505084600001518560200151612e2a919061478e565b8103612e40576000856000018181525050612e86565b83600001518360000151612e54919061478e565b85600001818151612e659190613e27565b91508181525050836000015181612e7c919061478e565b8560200181815250505b829150509392505050565b5b60208110612ed05781518352602083612eab919061478e565b9250602082612eba919061478e565b9150602081612ec99190613e27565b9050612e92565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90506000821115612f27576001826020612f0d9190613e27565b610100612f1a91906150aa565b612f249190613e27565b90505b8019835116818551168181178652505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa390615cf3565b60405180910390fd5b612fb5816119f8565b15612ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fec90615d5f565b60405180910390fd5b613001600083836126ac565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613051919061478e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131126000838361281b565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000808490506000868511613269576020851161320c576000808611156131925760018660206131699190613e27565b60086131759190614f35565b600261318191906150aa565b61318b9190613e27565b1960001b90505b60008186511690506000878a8a6131a9919061478e565b6131b39190613e27565b905060008386511690505b8281146131fe578186106131e5578a8a6131d8919061478e565b965050505050505061327a565b85806131f090614afb565b9650508386511690506131be565b85965050505050505061327a565b60008585209050600091505b85886132249190613e27565b82116132675760008684209050808203613244578394505050505061327a565b600184613251919061478e565b935050818061325f90614afb565b925050613218565b505b8686613275919061478e565b925050505b949350505050565b604051806040016040528060008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132e5816132b0565b81146132f057600080fd5b50565b600081359050613302816132dc565b92915050565b60006020828403121561331e5761331d6132a6565b5b600061332c848285016132f3565b91505092915050565b60008115159050919050565b61334a81613335565b82525050565b60006020820190506133656000830184613341565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133a557808201518184015260208101905061338a565b60008484015250505050565b6000601f19601f8301169050919050565b60006133cd8261336b565b6133d78185613376565b93506133e7818560208601613387565b6133f0816133b1565b840191505092915050565b6000602082019050818103600083015261341581846133c2565b905092915050565b6000819050919050565b6134308161341d565b811461343b57600080fd5b50565b60008135905061344d81613427565b92915050565b600060208284031215613469576134686132a6565b5b60006134778482850161343e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134ab82613480565b9050919050565b6134bb816134a0565b82525050565b60006020820190506134d660008301846134b2565b92915050565b6134e5816134a0565b81146134f057600080fd5b50565b600081359050613502816134dc565b92915050565b6000806040838503121561351f5761351e6132a6565b5b600061352d858286016134f3565b925050602061353e8582860161343e565b9150509250929050565b60006020828403121561355e5761355d6132a6565b5b600061356c848285016134f3565b91505092915050565b61357e8161341d565b82525050565b60006020820190506135996000830184613575565b92915050565b6000806000606084860312156135b8576135b76132a6565b5b60006135c6868287016134f3565b93505060206135d7868287016134f3565b92505060406135e88682870161343e565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613634826133b1565b810181811067ffffffffffffffff82111715613653576136526135fc565b5b80604052505050565b600061366661329c565b9050613672828261362b565b919050565b600067ffffffffffffffff821115613692576136916135fc565b5b61369b826133b1565b9050602081019050919050565b82818337600083830152505050565b60006136ca6136c584613677565b61365c565b9050828152602081018484840111156136e6576136e56135f7565b5b6136f18482856136a8565b509392505050565b600082601f83011261370e5761370d6135f2565b5b813561371e8482602086016136b7565b91505092915050565b600067ffffffffffffffff821115613742576137416135fc565b5b61374b826133b1565b9050602081019050919050565b600061376b61376684613727565b61365c565b905082815260208101848484011115613787576137866135f7565b5b6137928482856136a8565b509392505050565b600082601f8301126137af576137ae6135f2565b5b81356137bf848260208601613758565b91505092915050565b6000806000606084860312156137e1576137e06132a6565b5b60006137ef8682870161343e565b935050602084013567ffffffffffffffff8111156138105761380f6132ab565b5b61381c868287016136f9565b925050604084013567ffffffffffffffff81111561383d5761383c6132ab565b5b6138498682870161379a565b9150509250925092565b600080fd5b600080fd5b60008083601f840112613873576138726135f2565b5b8235905067ffffffffffffffff8111156138905761388f613853565b5b6020830191508360018202830111156138ac576138ab613858565b5b9250929050565b600080602083850312156138ca576138c96132a6565b5b600083013567ffffffffffffffff8111156138e8576138e76132ab565b5b6138f48582860161385d565b92509250509250929050565b600060208284031215613916576139156132a6565b5b600082013567ffffffffffffffff811115613934576139336132ab565b5b613940848285016136f9565b91505092915050565b61395281613335565b811461395d57600080fd5b50565b60008135905061396f81613949565b92915050565b6000806040838503121561398c5761398b6132a6565b5b600061399a858286016134f3565b92505060206139ab85828601613960565b9150509250929050565b6000806000604084860312156139ce576139cd6132a6565b5b60006139dc8682870161343e565b935050602084013567ffffffffffffffff8111156139fd576139fc6132ab565b5b613a098682870161385d565b92509250509250925092565b60008060008060808587031215613a2f57613a2e6132a6565b5b6000613a3d878288016134f3565b9450506020613a4e878288016134f3565b9350506040613a5f8782880161343e565b925050606085013567ffffffffffffffff811115613a8057613a7f6132ab565b5b613a8c8782880161379a565b91505092959194509250565b60008060408385031215613aaf57613aae6132a6565b5b6000613abd858286016134f3565b9250506020613ace858286016134f3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000613aff82613ad8565b613b098185613ae3565b9350613b19818560208601613387565b613b22816133b1565b840191505092915050565b600060c082019050613b426000830189613575565b613b4f6020830188613575565b613b5c60408301876134b2565b8181036060830152613b6e81866133c2565b90508181036080830152613b828185613af4565b9050613b9160a0830184613575565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613be357607f821691505b602082108103613bf657613bf5613b9c565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613c58602c83613376565b9150613c6382613bfc565b604082019050919050565b60006020820190508181036000830152613c8781613c4b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613cc4602083613376565b9150613ccf82613c8e565b602082019050919050565b60006020820190508181036000830152613cf381613cb7565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613d56603183613376565b9150613d6182613cfa565b604082019050919050565b60006020820190508181036000830152613d8581613d49565b9050919050565b7f496e76616c696420696400000000000000000000000000000000000000000000600082015250565b6000613dc2600a83613376565b9150613dcd82613d8c565b602082019050919050565b60006020820190508181036000830152613df181613db5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e328261341d565b9150613e3d8361341d565b9250828203905081811115613e5557613e54613df8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b6000613ea7613ea284613677565b61365c565b905082815260208101848484011115613ec357613ec26135f7565b5b613ece848285613387565b509392505050565b600082601f830112613eeb57613eea6135f2565b5b8151613efb848260208601613e94565b91505092915050565b600067ffffffffffffffff821115613f1f57613f1e6135fc565b5b602082029050602081019050919050565b6000613f43613f3e84613f04565b61365c565b90508083825260208201905060208402830185811115613f6657613f65613858565b5b835b81811015613fad57805167ffffffffffffffff811115613f8b57613f8a6135f2565b5b808601613f988982613ed6565b85526020850194505050602081019050613f68565b5050509392505050565b600082601f830112613fcc57613fcb6135f2565b5b8151613fdc848260208601613f30565b91505092915050565b600081519050613ff4816134dc565b92915050565b6000610120828403121561401157614010613e8a565b5b61401c61012061365c565b9050600082015167ffffffffffffffff81111561403c5761403b613e8f565b5b61404884828501613ed6565b600083015250602082015167ffffffffffffffff81111561406c5761406b613e8f565b5b61407884828501613ed6565b602083015250604082015167ffffffffffffffff81111561409c5761409b613e8f565b5b6140a884828501613ed6565b604083015250606082015167ffffffffffffffff8111156140cc576140cb613e8f565b5b6140d884828501613ed6565b606083015250608082015167ffffffffffffffff8111156140fc576140fb613e8f565b5b61410884828501613ed6565b60808301525060a082015167ffffffffffffffff81111561412c5761412b613e8f565b5b61413884828501613ed6565b60a08301525060c082015167ffffffffffffffff81111561415c5761415b613e8f565b5b61416884828501613ed6565b60c08301525060e082015167ffffffffffffffff81111561418c5761418b613e8f565b5b61419884828501613fb7565b60e0830152506101006141ad84828501613fe5565b6101008301525092915050565b6000602082840312156141d0576141cf6132a6565b5b600082015167ffffffffffffffff8111156141ee576141ed6132ab565b5b6141fa84828501613ffa565b91505092915050565b600081905092915050565b60006142198261336b565b6142238185614203565b9350614233818560208601613387565b80840191505092915050565b600061424b828561420e565b9150614257828461420e565b91508190509392505050565b600060808201905061427860008301876134b2565b61428560208301866134b2565b818103604083015261429781856133c2565b905081810360608301526142ab8184613af4565b905095945050505050565b6000815190506142c581613949565b92915050565b6000602082840312156142e1576142e06132a6565b5b60006142ef848285016142b6565b91505092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261435a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261431d565b614364868361431d565b95508019841693508086168417925050509392505050565b6000819050919050565b60006143a161439c6143978461341d565b61437c565b61341d565b9050919050565b6000819050919050565b6143bb83614386565b6143cf6143c7826143a8565b84845461432a565b825550505050565b600090565b6143e46143d7565b6143ef8184846143b2565b505050565b5b81811015614413576144086000826143dc565b6001810190506143f5565b5050565b601f82111561445857614429816142f8565b6144328461430d565b81016020851015614441578190505b61445561444d8561430d565b8301826143f4565b50505b505050565b600082821c905092915050565b600061447b6000198460080261445d565b1980831691505092915050565b6000614494838361446a565b9150826002028217905092915050565b6144ad82613ad8565b67ffffffffffffffff8111156144c6576144c56135fc565b5b6144d08254613bcb565b6144db828285614417565b600060209050601f83116001811461450e57600084156144fc578287015190505b6145068582614488565b86555061456e565b601f19841661451c866142f8565b60005b828110156145445784890151825560018201915060208501945060208101905061451f565b86831015614561578489015161455d601f89168261446a565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006145d2602983613376565b91506145dd82614576565b604082019050919050565b60006020820190508181036000830152614601816145c5565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614664602a83613376565b915061466f82614608565b604082019050919050565b6000602082019050818103600083015261469381614657565b9050919050565b7f4475706c00000000000000000000000000000000000000000000000000000000600082015250565b60006146d0600483613376565b91506146db8261469a565b602082019050919050565b600060208201905081810360008301526146ff816146c3565b9050919050565b7f3078000000000000000000000000000000000000000000000000000000000000600082015250565b600061473c600283614203565b915061474782614706565b600282019050919050565b600061475d8261472f565b9150614769828661420e565b9150614775828561420e565b9150614781828461420e565b9150819050949350505050565b60006147998261341d565b91506147a48361341d565b92508282019050808211156147bc576147bb613df8565b5b92915050565b60008190508160005260206000209050919050565b601f821115614818576147e9816147c2565b6147f28461430d565b81016020851015614801578190505b61481561480d8561430d565b8301826143f4565b50505b505050565b6148268261336b565b67ffffffffffffffff81111561483f5761483e6135fc565b5b6148498254613bcb565b6148548282856147d7565b600060209050601f8311600181146148875760008415614875578287015190505b61487f8582614488565b8655506148e7565b601f198416614895866147c2565b60005b828110156148bd57848901518255600182019150602085019450602081019050614898565b868310156148da57848901516148d6601f89168261446a565b8355505b6001600288020188555050505b505050505050565b60006148fb828461420e565b915081905092915050565b600081905092915050565b600061491c82613ad8565b6149268185614906565b9350614936818560208601613387565b80840191505092915050565b7f2c7b2274726169745f74797065223a2200000000000000000000000000000000600082015250565b6000614978601083614203565b915061498382614942565b601082019050919050565b7f222c2276616c7565223a22000000000000000000000000000000000000000000600082015250565b60006149c4600b83614203565b91506149cf8261498e565b600b82019050919050565b600081546149e781613bcb565b6149f18186614203565b94506001821660008114614a0c5760018114614a2157614a54565b60ff1983168652811515820286019350614a54565b614a2a856147c2565b60005b83811015614a4c57815481890152600182019150602081019050614a2d565b838801955050505b50505092915050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b6000614a93600283614203565b9150614a9e82614a5d565b600282019050919050565b6000614ab58286614911565b9150614ac08261496b565b9150614acc828561420e565b9150614ad7826149b7565b9150614ae382846149da565b9150614aee82614a86565b9150819050949350505050565b6000614b068261341d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614b3857614b37613df8565b5b600182019050919050565b600082905092915050565b614b588383614b43565b67ffffffffffffffff811115614b7157614b706135fc565b5b614b7b8254613bcb565b614b868282856147d7565b6000601f831160018114614bb55760008415614ba3578287013590505b614bad8582614488565b865550614c15565b601f198416614bc3866147c2565b60005b82811015614beb57848901358255600182019150602085019450602081019050614bc6565b86831015614c085784890135614c04601f89168261446a565b8355505b6001600288020188555050505b50505050505050565b6000614c2a8385614203565b9350614c378385846136a8565b82840190509392505050565b6000614c50828486614c1e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614cb8602683613376565b9150614cc382614c5c565b604082019050919050565b60006020820190508181036000830152614ce781614cab565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614d4a602c83613376565b9150614d5582614cee565b604082019050919050565b60006020820190508181036000830152614d7981614d3d565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614ddc602583613376565b9150614de782614d80565b604082019050919050565b60006020820190508181036000830152614e0b81614dcf565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614e6e602483613376565b9150614e7982614e12565b604082019050919050565b60006020820190508181036000830152614e9d81614e61565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ede8261341d565b9150614ee98361341d565b925082614ef957614ef8614ea4565b5b828204905092915050565b6000614f0f8261341d565b9150614f1a8361341d565b925082614f2a57614f29614ea4565b5b828206905092915050565b6000614f408261341d565b9150614f4b8361341d565b9250828202614f598161341d565b91508282048414831517614f7057614f6f613df8565b5b5092915050565b60008160011c9050919050565b6000808291508390505b6001851115614fce57808604811115614faa57614fa9613df8565b5b6001851615614fb95780820291505b8081029050614fc785614f77565b9450614f8e565b94509492505050565b600082614fe757600190506150a3565b81614ff557600090506150a3565b816001811461500b576002811461501557615044565b60019150506150a3565b60ff84111561502757615026613df8565b5b8360020a91508482111561503e5761503d613df8565b5b506150a3565b5060208310610133831016604e8410600b84101617156150795782820a90508381111561507457615073613df8565b5b6150a3565b6150868484846001614f84565b9250905081840481111561509d5761509c613df8565b5b81810290505b9392505050565b60006150b58261341d565b91506150c08361341d565b92506150ed7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614fd7565b905092915050565b600060ff82169050919050565b600061510d826150f5565b9150615118836150f5565b92508261512857615127614ea4565b5b828204905092915050565b600061513e826150f5565b9150615149836150f5565b9250828202615157816150f5565b915080821461516957615168613df8565b5b5092915050565b600061517b826150f5565b9150615186836150f5565b9250828203905060ff81111561519f5761519e613df8565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6151da816134a0565b82525050565b60006151ec83836151d1565b60208301905092915050565b6000602082019050919050565b6000615210826151a5565b61521a81856151b0565b9350615225836151c1565b8060005b8381101561525657815161523d88826151e0565b9750615248836151f8565b925050600181019050615229565b5085935050505092915050565b6000602082019050818103600083015261527d8184615205565b905092915050565b60006020828403121561529b5761529a6132a6565b5b600082015167ffffffffffffffff8111156152b9576152b86132ab565b5b6152c584828501613fb7565b91505092915050565b60006152d98261472f565b91506152e5828461420e565b915081905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061534c603283613376565b9150615357826152f0565b604082019050919050565b6000602082019050818103600083015261537b8161533f565b9050919050565b7f7b00000000000000000000000000000000000000000000000000000000000000600082015250565b60006153b8600183614203565b91506153c382615382565b600182019050919050565b7f226e616d65223a22000000000000000000000000000000000000000000000000600082015250565b6000615404600883614203565b915061540f826153ce565b600882019050919050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b6000615450600283614203565b915061545b8261541a565b600282019050919050565b7f226465736372697074696f6e223a220000000000000000000000000000000000600082015250565b600061549c600f83614203565b91506154a782615466565b600f82019050919050565b7f222c22696d616765223a22000000000000000000000000000000000000000000600082015250565b60006154e8600b83614203565b91506154f3826154b2565b600b82019050919050565b7f222c202261747472696275746573223a5b000000000000000000000000000000600082015250565b6000615534601183614203565b915061553f826154fe565b601182019050919050565b7f7b2274726169745f74797065223a20225469746c65222c202276616c7565223a60008201527f2022000000000000000000000000000000000000000000000000000000000000602082015250565b60006155a6602283614203565b91506155b18261554a565b602282019050919050565b7f227d2c0000000000000000000000000000000000000000000000000000000000600082015250565b60006155f2600383614203565b91506155fd826155bc565b600382019050919050565b7f7b2274726169745f74797065223a224465736372697074696f6e222c2022766160008201527f6c7565223a220000000000000000000000000000000000000000000000000000602082015250565b6000615664602683614203565b915061566f82615608565b602682019050919050565b7f7b2274726169745f74797065223a225370616365222c202276616c7565223a22600082015250565b60006156b0602083614203565b91506156bb8261567a565b602082019050919050565b7f7b2274726169745f74797065223a225369676e6572222c202276616c7565223a60008201527f2200000000000000000000000000000000000000000000000000000000000000602082015250565b6000615722602183614203565b915061572d826156c6565b602182019050919050565b7f5d7d000000000000000000000000000000000000000000000000000000000000600082015250565b600061576e600283614203565b915061577982615738565b600282019050919050565b600061578f826153ab565b915061579a826153f7565b91506157a6828b61420e565b91506157b182615443565b91506157bc8261548f565b91506157c8828a6149da565b91506157d3826154db565b91506157df828961420e565b91506157ea82615527565b91506157f582615599565b9150615801828861420e565b915061580c826155e5565b915061581782615657565b9150615823828761420e565b915061582e826155e5565b9150615839826156a3565b9150615845828661420e565b9150615850826155e5565b915061585b82615715565b915061586782856149da565b915061587282614a86565b915061587e828461420e565b915061588982615761565b91508190509998505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b60006158d1601d83614203565b91506158dc8261589b565b601d82019050919050565b60006158f2826158c4565b91506158fe828461420e565b915081905092915050565b7f53423a204e6f6e7472616e7366657261626c6500000000000000000000000000600082015250565b600061593f601383613376565b915061594a82615909565b602082019050919050565b6000602082019050818103600083015261596e81615932565b9050919050565b6000615980826150f5565b915061598b836150f5565b9250828201905060ff8111156159a4576159a3613df8565b5b92915050565b60006080820190506159bf60008301876134b2565b6159cc60208301866134b2565b6159d96040830185613575565b81810360608301526159eb8184613af4565b905095945050505050565b600081519050615a05816132dc565b92915050565b600060208284031215615a2157615a206132a6565b5b6000615a2f848285016159f6565b91505092915050565b7f3f7469746c653d00000000000000000000000000000000000000000000000000600082015250565b6000615a6e600783614203565b9150615a7982615a38565b600782019050919050565b7f266465736372697074696f6e3d00000000000000000000000000000000000000600082015250565b6000615aba600d83614203565b9150615ac582615a84565b600d82019050919050565b7f2673706163653d00000000000000000000000000000000000000000000000000600082015250565b6000615b06600783614203565b9150615b1182615ad0565b600782019050919050565b7f267369676e65723d000000000000000000000000000000000000000000000000600082015250565b6000615b52600883614203565b9150615b5d82615b1c565b600882019050919050565b7f266665617475726564496d6167654349443d0000000000000000000000000000600082015250565b6000615b9e601283614203565b9150615ba982615b68565b601282019050919050565b7f2669643d00000000000000000000000000000000000000000000000000000000600082015250565b6000615bea600483614203565b9150615bf582615bb4565b600482019050919050565b6000615c0c828a6149da565b9150615c1782615a61565b9150615c23828961420e565b9150615c2e82615aad565b9150615c3a828861420e565b9150615c4582615af9565b9150615c51828761420e565b9150615c5c82615b45565b9150615c6882866149da565b9150615c7382615b91565b9150615c7f828561420e565b9150615c8a82615bdd565b9150615c96828461420e565b915081905098975050505050505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615cdd602083613376565b9150615ce882615ca7565b602082019050919050565b60006020820190508181036000830152615d0c81615cd0565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615d49601c83613376565b9150615d5482615d13565b602082019050919050565b60006020820190508181036000830152615d7881615d3c565b905091905056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220e09edc06651da4c00b85699b22bd541916b5b88e1bbf8012baecfe539d0d345e64736f6c63430008110033
Deployed Bytecode Sourcemap
59144:8795:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24130:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25075:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26634:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67790:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66654:101;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63727:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27384:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62297:538;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27794:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66763:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24769:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24499:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2635:103;;;:::i;:::-;;60636:1027;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62997:722;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1984:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66994:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66883:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25244:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67566:154;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62843:146;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28050:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63832:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27153:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60324:22;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;2893:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24130:305;24232:4;24284:25;24269:40;;;:11;:40;;;;:105;;;;24341:33;24326:48;;;:11;:48;;;;24269:105;:158;;;;24391:36;24415:11;24391:23;:36::i;:::-;24269:158;24249:178;;24130:305;;;:::o;25075:100::-;25129:13;25162:5;25155:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25075:100;:::o;26634:221::-;26710:7;26738:16;26746:7;26738;:16::i;:::-;26730:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26823:15;:24;26839:7;26823:24;;;;;;;;;;;;;;;;;;;;;26816:31;;26634:221;;;:::o;67790:139::-;67910:11;;;;;;;;;;;;;;66654:101;2215:12;:10;:12::i;:::-;2204:23;;:7;:5;:7::i;:::-;:23;;;2196:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66741:5:::1;66718:9;;:29;;;;;;;;;;;;;;;;;;66654:101:::0;:::o;63727:97::-;63771:7;63798:18;:8;:16;:18::i;:::-;63791:25;;63727:97;:::o;27384:339::-;27579:41;27598:12;:10;:12::i;:::-;27612:7;27579:18;:41::i;:::-;27571:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27687:28;27697:4;27703:2;27707:7;27687:9;:28::i;:::-;27384:339;;;:::o;62297:538::-;62399:18;:8;:16;:18::i;:::-;62393:2;:24;;62385:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;62443:19;62465:7;62476:1;62473:2;:4;;;;:::i;:::-;62465:13;;;;;;;;:::i;:::-;;;;;;;;;;;;62443:35;;62490:46;62539:10;;;;;;;;;;;:20;;;62560:5;:15;;;62539:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62490:86;;62587:21;62635:10;62647:20;62664:2;62647:16;:20::i;:::-;62618:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62587:82;;62688:9;;;;;;;;;;;:16;;;62705:9;:15;;;62722:10;62734:7;62743:4;62688:60;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62680:69;;;;;;62778:4;62760:5;:15;;:22;;;;;;:::i;:::-;;62795:32;62812:2;62816:10;62795:16;:32::i;:::-;62374:461;;;62297:538;;;:::o;27794:185::-;27932:39;27949:4;27955:2;27959:7;27932:39;;;;;;;;;;;;:16;:39::i;:::-;27794:185;;;:::o;66763:112::-;2215:12;:10;:12::i;:::-;2204:23;;:7;:5;:7::i;:::-;:23;;;2196:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66861:5:::1;66828:10;;:39;;;;;;;;;;;;;;;;;;66763:112:::0;:::o;24769:239::-;24841:7;24861:13;24877:7;:16;24885:7;24877:16;;;;;;;;;;;;;;;;;;;;;24861:32;;24929:1;24912:19;;:5;:19;;;24904:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24995:5;24988:12;;;24769:239;;;:::o;24499:208::-;24571:7;24616:1;24599:19;;:5;:19;;;24591:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24683:9;:16;24693:5;24683:16;;;;;;;;;;;;;;;;24676:23;;24499:208;;;:::o;2635:103::-;2215:12;:10;:12::i;:::-;2204:23;;:7;:5;:7::i;:::-;:23;;;2196:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2700:30:::1;2727:1;2700:18;:30::i;:::-;2635:103::o:0;60636:1027::-;60765:1;60734:9;:17;60744:6;60734:17;;;;;;;;;;;:29;60752:10;60734:29;;;;;;;;;;;;;;;;:32;60726:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;60786:46;60835:10;;;;;;;;;;;:20;;;60856:6;60835:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60786:77;;60874:21;60927:42;60958:10;60927:30;:42::i;:::-;60971:10;60983:24;61000:6;60983:16;:24::i;:::-;60905:103;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60874:135;;61028:9;;;;;;;;;;;:16;;;61045:9;:15;;;61062:10;61074:7;61083:4;61028:60;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61020:69;;;;;;61154:1;61127:16;:24;61144:6;61127:24;;;;;;;;;;;;:28;;;;:::i;:::-;61100:16;:24;61117:6;61100:24;;;;;;;;;;;:55;;;;61167:20;:8;:18;:20::i;:::-;61198:41;61208:10;61220:18;:8;:16;:18::i;:::-;61198:9;:41::i;:::-;61282:1;61250:9;:17;61260:6;61250:17;;;;;;;;;;;:29;61268:10;61250:29;;;;;;;;;;;;;;;:33;;;;61294:19;61316:7;:14;;;;;;;;;;;;;;;;;;;;;;;;61294:36;;61352:16;:24;61369:6;61352:24;;;;;;;;;;;;61341:5;:8;;:35;;;;61405:6;61387:5;:15;;:24;;;;61440:4;61422:5;:15;;:22;;;;;;:::i;:::-;;61470:9;:15;;;61455:5;:12;;;:30;;;;;;;;;;;;;;;;;;61515:27;61526:9;:15;;;61515:10;:27::i;:::-;61496:5;:16;;:46;;;;;;:::i;:::-;;61571:15;61553:5;:15;;:33;;;;61607:48;61624:18;:8;:16;:18::i;:::-;61644:10;61607:16;:48::i;:::-;60715:948;;;60636:1027;;;:::o;62997:722::-;63054:13;63079:17;63107:19;63129:7;63140:1;63137:2;:4;;;;:::i;:::-;63129:13;;;;;;;;:::i;:::-;;;;;;;;;;;;63107:35;;63153:46;63202:10;;;;;;;;;;;:20;;;63223:5;:15;;;63202:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63153:86;;63278:1;63253:9;:16;;;:23;:26;63250:66;;63295:9;;;;;;;;;;;;;;;;;;;63250:66;63331:6;63326:356;63343:9;:16;;;:23;63341:1;:25;63326:356;;;63440:4;63508:9;:16;;;63525:1;63508:19;;;;;;;;:::i;:::-;;;;;;;;63586:5;:16;;63603:9;:16;;;63620:1;63603:19;;;;;;;;:::i;:::-;;;;;;;;63586:37;;;;;;:::i;:::-;;;;;;;;;;;;;63401:268;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63388:282;;63368:3;;;;;:::i;:::-;;;;63326:356;;;;63706:4;63692:19;;;;;62997:722;;;;:::o;1984:87::-;2030:7;2057:6;;;;;;;;;;;2050:13;;1984:87;:::o;66994:115::-;2215:12;:10;:12::i;:::-;2204:23;;:7;:5;:7::i;:::-;:23;;;2196:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67089:12:::1;;67075:11;:26;;;;;;;:::i;:::-;;66994:115:::0;;:::o;66883:103::-;2215:12;:10;:12::i;:::-;2204:23;;:7;:5;:7::i;:::-;:23;;;2196:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66974:4:::1;66957:14;:21;;;;;;:::i;:::-;;66883:103:::0;:::o;25244:104::-;25300:13;25333:7;25326:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25244:104;:::o;67566:154::-;67701:11;;;;;;;;;;;;;;62843:146;62918:13;62950:7;62961:1;62958:2;:4;;;;:::i;:::-;62950:13;;;;;;;;:::i;:::-;;;;;;;;;;;;:24;;62975:5;;62950:31;;;;;;;:::i;:::-;;;;;;;;;;;;;62943:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62843:146;;;;;:::o;28050:328::-;28225:41;28244:12;:10;:12::i;:::-;28258:7;28225:18;:41::i;:::-;28217:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28331:39;28345:4;28351:2;28355:7;28364:5;28331:13;:39::i;:::-;28050:328;;;;:::o;63832:179::-;63892:13;63931:18;:8;:16;:18::i;:::-;63925:2;:24;;63917:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;63982:21;64000:2;63982:17;:21::i;:::-;63975:28;;63832:179;;;:::o;27153:164::-;27250:4;27274:18;:25;27293:5;27274:25;;;;;;;;;;;;;;;:35;27300:8;27274:35;;;;;;;;;;;;;;;;;;;;;;;;;27267:42;;27153:164;;;;:::o;60324:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2893:201::-;2215:12;:10;:12::i;:::-;2204:23;;:7;:5;:7::i;:::-;:23;;;2196:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3002:1:::1;2982:22;;:8;:22;;::::0;2974:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3058:28;3077:8;3058:18;:28::i;:::-;2893:201:::0;:::o;22561:157::-;22646:4;22685:25;22670:40;;;:11;:40;;;;22663:47;;22561:157;;;:::o;29888:127::-;29953:4;30005:1;29977:30;;:7;:16;29985:7;29977:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29970:37;;29888:127;;;:::o;710:98::-;763:7;790:10;783:17;;710:98;:::o;38116:114::-;38181:7;38208;:14;;;38201:21;;38116:114;;;:::o;30182:348::-;30275:4;30300:16;30308:7;30300;:16::i;:::-;30292:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30376:13;30392:23;30407:7;30392:14;:23::i;:::-;30376:39;;30445:5;30434:16;;:7;:16;;;:51;;;;30478:7;30454:31;;:20;30466:7;30454:11;:20::i;:::-;:31;;;30434:51;:87;;;;30489:32;30506:5;30513:7;30489:16;:32::i;:::-;30434:87;30426:96;;;30182:348;;;;:::o;33291:625::-;33450:4;33423:31;;:23;33438:7;33423:14;:23::i;:::-;:31;;;33415:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;33529:1;33515:16;;:2;:16;;;33507:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33585:39;33606:4;33612:2;33616:7;33585:20;:39::i;:::-;33689:29;33706:1;33710:7;33689:8;:29::i;:::-;33750:1;33731:9;:15;33741:4;33731:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33779:1;33762:9;:13;33772:2;33762:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33810:2;33791:7;:16;33799:7;33791:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33849:7;33845:2;33830:27;;33839:4;33830:27;;;;;;;;;;;;33870:38;33890:4;33896:2;33900:7;33870:19;:38::i;:::-;33291:625;;;:::o;19939:723::-;19995:13;20225:1;20216:5;:10;20212:53;;20243:10;;;;;;;;;;;;;;;;;;;;;20212:53;20275:12;20290:5;20275:20;;20306:14;20331:78;20346:1;20338:4;:9;20331:78;;20364:8;;;;;:::i;:::-;;;;20395:2;20387:10;;;;;:::i;:::-;;;20331:78;;;20419:19;20451:6;20441:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20419:39;;20469:154;20485:1;20476:5;:10;20469:154;;20513:1;20503:11;;;;;:::i;:::-;;;20580:2;20572:5;:10;;;;:::i;:::-;20559:2;:24;;;;:::i;:::-;20546:39;;20529:6;20536;20529:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;20609:2;20600:11;;;;;:::i;:::-;;;20469:154;;;20647:6;20633:21;;;;;19939:723;;;;:::o;61671:618::-;61830:1;61811:10;61805:24;:26;61802:480;;;61847:22;61872:20;:10;:18;:20::i;:::-;61847:45;;61907:26;61936:14;:12;;;;;;;;;;;;;;;;;;:14::i;:::-;61907:43;;61965:27;61995:14;:12;;;;;;;;;;;;;;;;;;:14::i;:::-;61965:44;;62030:238;62037:9;:1;:7;:9::i;:::-;62030:238;;62066:22;62091:25;:14;62099:5;62091:1;:7;;:14;;;;:::i;:::-;:23;:25::i;:::-;62066:50;;62135:22;62160:26;:15;62168:6;62160:1;:7;;:15;;;;:::i;:::-;:24;:26::i;:::-;62135:51;;62244:8;62205:7;62218:1;62213:2;:6;;;;:::i;:::-;62205:15;;;;;;;;:::i;:::-;;;;;;;;;;;;:26;;62232:8;62205:36;;;;;;:::i;:::-;;;;;;;;;;;;;:47;;;;;;:::i;:::-;;62047:221;;62030:238;;;61832:450;;;61802:480;61671:618;;:::o;3254:191::-;3328:16;3347:6;;;;;;;;;;;3328:25;;3373:8;3364:6;;:17;;;;;;;;;;;;;;;;;;3428:8;3397:40;;3418:8;3397:40;;;;;;;;;;;;3317:128;3254:191;:::o;41693:465::-;41750:13;41776:14;41803:2;41793:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41776:30;;41822:9;41817:307;41841:2;41837:1;:6;41817:307;;;41865:8;41926:1;41921:2;:6;;;;:::i;:::-;41916:1;:12;;;;:::i;:::-;41912:1;:17;;;;:::i;:::-;41905:1;41889:19;;:41;;;;:::i;:::-;41876:56;;41865:67;;41947:9;41977:2;41972:1;41966:8;;:13;;;;:::i;:::-;41959:21;;41947:33;;41995:9;42036:2;42030:9;;42025:2;:14;;;;:::i;:::-;42020:1;42014:8;;:25;;;;:::i;:::-;42007:33;;41995:45;;42066:8;42071:2;42066:4;:8::i;:::-;42055:1;42061;42057;:5;;;;:::i;:::-;42055:8;;;;;;;;:::i;:::-;;;;;:19;;;;;;;;;;;42104:8;42109:2;42104:4;:8::i;:::-;42089:1;42099;42095;42091;:5;;;;:::i;:::-;:9;;;;:::i;:::-;42089:12;;;;;;;;:::i;:::-;;;;;:23;;;;;;;;;;;41850:274;;;41845:3;;;;;:::i;:::-;;;;41817:307;;;;42148:1;42134:16;;;41693:465;;;:::o;38238:127::-;38345:1;38327:7;:14;;;:19;;;;;;;;;;;38238:127;:::o;30872:110::-;30948:26;30958:2;30962:7;30948:26;;;;;;;;;;;;:9;:26::i;:::-;30872:110;;:::o;59577:464::-;59633:13;59659:22;59692:18;59727:1;59713:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59692:37;;59747:4;59740:1;59742;59740:4;;;;;;;;:::i;:::-;;;;;;;:11;;;;;;;;;;;59762:23;59788:3;;;;;;;;;;;:12;;;59801:1;59788:15;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59762:41;;59846:1;59824:7;59832:1;59824:10;;;;;;;;:::i;:::-;;;;;;;;59818:24;:29;59814:194;;59904:36;59935:4;59904:30;:36::i;:::-;59882:59;;;;;;;;:::i;:::-;;;;;;;;;;;;;59864:78;;59814:194;;;59986:7;59994:1;59986:10;;;;;;;;:::i;:::-;;;;;;;;59975:21;;59814:194;60025:8;60018:15;;;;;59577:464;;;:::o;29260:315::-;29417:28;29427:4;29433:2;29437:7;29417:9;:28::i;:::-;29464:48;29487:4;29493:2;29497:7;29506:5;29464:22;:48::i;:::-;29456:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29260:315;;;;:::o;64843:1803::-;64904:13;64930:19;64952:7;64963:1;64960:2;:4;;;;:::i;:::-;64952:13;;;;;;;;:::i;:::-;;;;;;;;;;;;64930:35;;64976:46;65025:10;;;;;;;;;;;:20;;;65046:5;:15;;;65025:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64976:86;;65270:1334;65480:6;:4;:6::i;:::-;65612:11;65706:17;65720:2;65706:13;:17::i;:::-;65883:9;:15;;;66048:9;:21;;;66213:9;:15;;;66373:5;:16;;66463:21;66481:2;66463:17;:21::i;:::-;65346:1208;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65270:13;:1334::i;:::-;65177:1446;;;;;;;;:::i;:::-;;;;;;;;;;;;;65145:1493;;;;64843:1803;;;:::o;67181:315::-;67363:1;67347:18;;:4;:18;;;:38;;;;67383:1;67369:16;;:2;:16;;;67347:38;67325:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;67443:45;67470:4;67476:2;67480:7;67443:26;:45::i;:::-;67181:315;;;:::o;34034:174::-;34136:2;34109:15;:24;34125:7;34109:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34192:7;34188:2;34154:46;;34163:23;34178:7;34163:14;:23::i;:::-;34154:46;;;;;;;;;;;;34034:174;;:::o;37112:125::-;;;;:::o;45170:216::-;45230:12;;:::i;:::-;45255:8;45315:4;45309;45305:15;45298:22;;45348:30;;;;;;;;45360:4;45354:18;45348:30;;;;45374:3;45348:30;;;45341:37;;;45170:216;;;:::o;49209:103::-;49266:4;49303:1;49290:4;:9;;;:14;49283:21;;49209:103;;;:::o;56523:143::-;56601:18;;:::i;:::-;56632:26;56638:4;56644:6;56652:5;56632;:26::i;:::-;;56523:143;;;;:::o;47623:272::-;47683:13;47709:17;47740:4;:9;;;47729:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47709:41;;47761:11;47813:2;47808:3;47804:12;47794:22;;47830:36;47837:6;47845:4;:9;;;47856:4;:9;;;47830:6;:36::i;:::-;47884:3;47877:10;;;;47623:272;;;:::o;41514:171::-;41561:8;41597:2;41592:1;41586:8;;:13;;;41582:95;;;41626:4;41621:1;41615:8;;:15;;;;:::i;:::-;41608:23;;41601:30;;;;41582:95;41672:4;41667:1;41661:8;;:15;;;;:::i;:::-;41654:23;;41647:30;;41514:171;;;;:::o;31209:321::-;31339:18;31345:2;31349:7;31339:5;:18::i;:::-;31390:54;31421:1;31425:2;31429:7;31438:5;31390:22;:54::i;:::-;31368:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31209:321;;;:::o;35230:799::-;35385:4;35406:15;:2;:13;;;:15::i;:::-;35402:620;;;35458:2;35442:36;;;35479:12;:10;:12::i;:::-;35493:4;35499:7;35508:5;35442:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35438:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35701:1;35684:6;:13;:18;35680:272;;35727:60;;;;;;;;;;:::i;:::-;;;;;;;;35680:272;35902:6;35896:13;35887:6;35883:2;35879:15;35872:38;35438:529;35575:41;;;35565:51;;;:6;:51;;;;35558:58;;;;;35402:620;36006:4;35999:11;;35230:799;;;;;;;:::o;64019:812::-;64076:13;64102:19;64124:7;64135:1;64132:2;:4;;;;:::i;:::-;64124:13;;;;;;;;:::i;:::-;;;;;;;;;;;;64102:35;;64158:46;64207:10;;;;;;;;;;;:20;;;64228:5;:15;;;64207:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64158:86;;64376:14;64437:9;:22;;;64512:9;:28;;;64587:9;:22;;;64657:5;:16;;64731:9;:26;;;64801:20;64818:2;64801:16;:20::i;:::-;64341:481;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64327:496;;;;64019:812;;;:::o;39496:1912::-;39554:13;39599:1;39584:4;:11;:16;39580:31;;39602:9;;;;;;;;;;;;;;;;39580:31;39663:19;39685:12;;;;;;;;;;;;;;;;;39663:34;;39749:18;39795:1;39790;39776:4;:11;:15;;;;:::i;:::-;39775:21;;;;:::i;:::-;39770:1;:27;;;;:::i;:::-;39749:48;;39880:20;39927:2;39914:10;:15;;;;:::i;:::-;39903:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39880:50;;40027:10;40019:6;40012:26;40122:1;40115:5;40111:13;40181:4;40232;40226:11;40217:7;40213:25;40328:2;40320:6;40316:15;40401:754;40420:6;40411:7;40408:19;40401:754;;;40520:1;40511:7;40507:15;40496:26;;40559:7;40553:14;40685:4;40677:5;40673:2;40669:14;40665:25;40655:8;40651:40;40645:47;40634:9;40626:67;40739:1;40728:9;40724:17;40711:30;;40818:4;40810:5;40806:2;40802:14;40798:25;40788:8;40784:40;40778:47;40767:9;40759:67;40872:1;40861:9;40857:17;40844:30;;40951:4;40943:5;40940:1;40935:14;40931:25;40921:8;40917:40;40911:47;40900:9;40892:67;41005:1;40994:9;40990:17;40977:30;;41084:4;41076:5;41064:25;41054:8;41050:40;41044:47;41033:9;41025:67;41138:1;41127:9;41123:17;41110:30;;40444:711;40401:754;;;41228:1;41221:4;41215:11;41211:19;41249:1;41244:54;;;;41317:1;41312:52;;;;41204:160;;41244:54;41288:6;41283:3;41279:16;41275:1;41264:9;41260:17;41253:43;41244:54;;41312:52;41356:4;41351:3;41347:14;41343:1;41332:9;41328:17;41321:41;41204:160;;39952:1423;;;;41394:6;41387:13;;;;;39496:1912;;;;:::o;36601:126::-;;;;:::o;55525:516::-;55623:12;;:::i;:::-;55648:8;55659:55;55667:4;:9;;;55678:4;:9;;;55689:6;:11;;;55702:6;:11;;;55659:7;:55::i;:::-;55648:66;;55738:4;:9;;;55725:5;:10;;:22;;;;;55777:4;:9;;;55771:3;:15;;;;:::i;:::-;55758:5;:10;;:28;;;;;55820:4;:9;;;55808:4;:9;;;:21;;;;:::i;:::-;55801:3;:28;55797:214;;55884:1;55872:4;:9;;:13;;;;;55797:214;;;55944:6;:11;;;55931:5;:10;;;:24;;;;:::i;:::-;55918:4;:9;;:37;;;;;;;:::i;:::-;;;;;;;;55988:6;:11;;;55982:3;:17;;;;:::i;:::-;55970:4;:9;;:29;;;;;55797:214;56028:5;56021:12;;;55525:516;;;;;:::o;44327:636::-;44449:170;44462:2;44455:3;:9;44449:170;;44539:3;44533:10;44527:4;44520:24;44581:2;44573:10;;;;;:::i;:::-;;;44605:2;44598:9;;;;;:::i;:::-;;;44473:2;44466:9;;;;;:::i;:::-;;;44449:170;;;44664:9;44676:14;44664:26;;44711:1;44705:3;:7;44701:68;;;44756:1;44749:3;44744:2;:8;;;;:::i;:::-;44736:3;:17;;;;:::i;:::-;:21;;;;:::i;:::-;44729:28;;44701:68;44838:4;44834:9;44828:3;44822:10;44818:26;44891:4;44884;44878:11;44874:22;44936:7;44926:8;44923:21;44917:4;44910:35;44788:168;;;44327:636;;;:::o;31866:439::-;31960:1;31946:16;;:2;:16;;;31938:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32019:16;32027:7;32019;:16::i;:::-;32018:17;32010:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32081:45;32110:1;32114:2;32118:7;32081:20;:45::i;:::-;32156:1;32139:9;:13;32149:2;32139:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32187:2;32168:7;:16;32176:7;32168:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32232:7;32228:2;32207:33;;32224:1;32207:33;;;;;;;;;;;;32253:44;32281:1;32285:2;32289:7;32253:19;:44::i;:::-;31866:439;;:::o;12304:326::-;12364:4;12621:1;12599:7;:19;;;:23;12592:30;;12304:326;;;:::o;52905:1493::-;53004:4;53021:8;53032:7;53021:18;;53050:8;53088:7;53075:9;:20;53071:1285;;53129:2;53116:9;:15;53112:1233;;53152:12;53199:1;53187:9;:13;53183:112;;;53272:1;53258:9;53253:2;:14;;;;:::i;:::-;53248:1;:20;;;;:::i;:::-;53242:1;:27;;;;:::i;:::-;:31;;;;:::i;:::-;53240:34;53232:43;;53225:50;;53183:112;53315:18;53399:4;53387:9;53381:16;53377:27;53363:41;;53426:8;53457:9;53447:7;53437;:17;;;;:::i;:::-;:29;;;;:::i;:::-;53426:40;;53485:15;53557:4;53551:3;53545:10;53541:21;53530:32;;53584:233;53602:10;53591:7;:21;53584:233;;53648:3;53641;:10;53637:65;;53695:7;53685;:17;;;;:::i;:::-;53678:24;;;;;;;;;;53637:65;53725:5;;;;;:::i;:::-;;;;53791:4;53785:3;53779:10;53775:21;53764:32;;53584:233;;;53842:3;53835:10;;;;;;;;;;53112:1233;53936:12;54007:9;53996;53986:31;53978:39;;54050:1;54044:7;;54039:291;54070:9;54060:7;:19;;;;:::i;:::-;54053:3;:26;54039:291;;54111:16;54188:9;54183:3;54173:25;54161:37;;54234:8;54226:4;:16;54222:57;;54276:3;54269:10;;;;;;;;54222:57;54309:1;54302:8;;;;;:::i;:::-;;;54088:242;54081:5;;;;;:::i;:::-;;;;54039:291;;;53867:478;53071:1285;54383:7;54373;:17;;;;:::i;:::-;54366:24;;;;52905:1493;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:329::-;4949:6;4998:2;4986:9;4977:7;4973:23;4969:32;4966:119;;;5004:79;;:::i;:::-;4966:119;5124:1;5149:53;5194:7;5185:6;5174:9;5170:22;5149:53;:::i;:::-;5139:63;;5095:117;4890:329;;;;:::o;5225:118::-;5312:24;5330:5;5312:24;:::i;:::-;5307:3;5300:37;5225:118;;:::o;5349:222::-;5442:4;5480:2;5469:9;5465:18;5457:26;;5493:71;5561:1;5550:9;5546:17;5537:6;5493:71;:::i;:::-;5349:222;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:117;6434:1;6431;6424:12;6448:180;6496:77;6493:1;6486:88;6593:4;6590:1;6583:15;6617:4;6614:1;6607:15;6634:281;6717:27;6739:4;6717:27;:::i;:::-;6709:6;6705:40;6847:6;6835:10;6832:22;6811:18;6799:10;6796:34;6793:62;6790:88;;;6858:18;;:::i;:::-;6790:88;6898:10;6894:2;6887:22;6677:238;6634:281;;:::o;6921:129::-;6955:6;6982:20;;:::i;:::-;6972:30;;7011:33;7039:4;7031:6;7011:33;:::i;:::-;6921:129;;;:::o;7056:308::-;7118:4;7208:18;7200:6;7197:30;7194:56;;;7230:18;;:::i;:::-;7194:56;7268:29;7290:6;7268:29;:::i;:::-;7260:37;;7352:4;7346;7342:15;7334:23;;7056:308;;;:::o;7370:146::-;7467:6;7462:3;7457;7444:30;7508:1;7499:6;7494:3;7490:16;7483:27;7370:146;;;:::o;7522:425::-;7600:5;7625:66;7641:49;7683:6;7641:49;:::i;:::-;7625:66;:::i;:::-;7616:75;;7714:6;7707:5;7700:21;7752:4;7745:5;7741:16;7790:3;7781:6;7776:3;7772:16;7769:25;7766:112;;;7797:79;;:::i;:::-;7766:112;7887:54;7934:6;7929:3;7924;7887:54;:::i;:::-;7606:341;7522:425;;;;;:::o;7967:340::-;8023:5;8072:3;8065:4;8057:6;8053:17;8049:27;8039:122;;8080:79;;:::i;:::-;8039:122;8197:6;8184:20;8222:79;8297:3;8289:6;8282:4;8274:6;8270:17;8222:79;:::i;:::-;8213:88;;8029:278;7967:340;;;;:::o;8313:307::-;8374:4;8464:18;8456:6;8453:30;8450:56;;;8486:18;;:::i;:::-;8450:56;8524:29;8546:6;8524:29;:::i;:::-;8516:37;;8608:4;8602;8598:15;8590:23;;8313:307;;;:::o;8626:423::-;8703:5;8728:65;8744:48;8785:6;8744:48;:::i;:::-;8728:65;:::i;:::-;8719:74;;8816:6;8809:5;8802:21;8854:4;8847:5;8843:16;8892:3;8883:6;8878:3;8874:16;8871:25;8868:112;;;8899:79;;:::i;:::-;8868:112;8989:54;9036:6;9031:3;9026;8989:54;:::i;:::-;8709:340;8626:423;;;;;:::o;9068:338::-;9123:5;9172:3;9165:4;9157:6;9153:17;9149:27;9139:122;;9180:79;;:::i;:::-;9139:122;9297:6;9284:20;9322:78;9396:3;9388:6;9381:4;9373:6;9369:17;9322:78;:::i;:::-;9313:87;;9129:277;9068:338;;;;:::o;9412:977::-;9508:6;9516;9524;9573:2;9561:9;9552:7;9548:23;9544:32;9541:119;;;9579:79;;:::i;:::-;9541:119;9699:1;9724:53;9769:7;9760:6;9749:9;9745:22;9724:53;:::i;:::-;9714:63;;9670:117;9854:2;9843:9;9839:18;9826:32;9885:18;9877:6;9874:30;9871:117;;;9907:79;;:::i;:::-;9871:117;10012:63;10067:7;10058:6;10047:9;10043:22;10012:63;:::i;:::-;10002:73;;9797:288;10152:2;10141:9;10137:18;10124:32;10183:18;10175:6;10172:30;10169:117;;;10205:79;;:::i;:::-;10169:117;10310:62;10364:7;10355:6;10344:9;10340:22;10310:62;:::i;:::-;10300:72;;10095:287;9412:977;;;;;:::o;10395:117::-;10504:1;10501;10494:12;10518:117;10627:1;10624;10617:12;10655:553;10713:8;10723:6;10773:3;10766:4;10758:6;10754:17;10750:27;10740:122;;10781:79;;:::i;:::-;10740:122;10894:6;10881:20;10871:30;;10924:18;10916:6;10913:30;10910:117;;;10946:79;;:::i;:::-;10910:117;11060:4;11052:6;11048:17;11036:29;;11114:3;11106:4;11098:6;11094:17;11084:8;11080:32;11077:41;11074:128;;;11121:79;;:::i;:::-;11074:128;10655:553;;;;;:::o;11214:529::-;11285:6;11293;11342:2;11330:9;11321:7;11317:23;11313:32;11310:119;;;11348:79;;:::i;:::-;11310:119;11496:1;11485:9;11481:17;11468:31;11526:18;11518:6;11515:30;11512:117;;;11548:79;;:::i;:::-;11512:117;11661:65;11718:7;11709:6;11698:9;11694:22;11661:65;:::i;:::-;11643:83;;;;11439:297;11214:529;;;;;:::o;11749:509::-;11818:6;11867:2;11855:9;11846:7;11842:23;11838:32;11835:119;;;11873:79;;:::i;:::-;11835:119;12021:1;12010:9;12006:17;11993:31;12051:18;12043:6;12040:30;12037:117;;;12073:79;;:::i;:::-;12037:117;12178:63;12233:7;12224:6;12213:9;12209:22;12178:63;:::i;:::-;12168:73;;11964:287;11749:509;;;;:::o;12264:116::-;12334:21;12349:5;12334:21;:::i;:::-;12327:5;12324:32;12314:60;;12370:1;12367;12360:12;12314:60;12264:116;:::o;12386:133::-;12429:5;12467:6;12454:20;12445:29;;12483:30;12507:5;12483:30;:::i;:::-;12386:133;;;;:::o;12525:468::-;12590:6;12598;12647:2;12635:9;12626:7;12622:23;12618:32;12615:119;;;12653:79;;:::i;:::-;12615:119;12773:1;12798:53;12843:7;12834:6;12823:9;12819:22;12798:53;:::i;:::-;12788:63;;12744:117;12900:2;12926:50;12968:7;12959:6;12948:9;12944:22;12926:50;:::i;:::-;12916:60;;12871:115;12525:468;;;;;:::o;12999:674::-;13079:6;13087;13095;13144:2;13132:9;13123:7;13119:23;13115:32;13112:119;;;13150:79;;:::i;:::-;13112:119;13270:1;13295:53;13340:7;13331:6;13320:9;13316:22;13295:53;:::i;:::-;13285:63;;13241:117;13425:2;13414:9;13410:18;13397:32;13456:18;13448:6;13445:30;13442:117;;;13478:79;;:::i;:::-;13442:117;13591:65;13648:7;13639:6;13628:9;13624:22;13591:65;:::i;:::-;13573:83;;;;13368:298;12999:674;;;;;:::o;13679:943::-;13774:6;13782;13790;13798;13847:3;13835:9;13826:7;13822:23;13818:33;13815:120;;;13854:79;;:::i;:::-;13815:120;13974:1;13999:53;14044:7;14035:6;14024:9;14020:22;13999:53;:::i;:::-;13989:63;;13945:117;14101:2;14127:53;14172:7;14163:6;14152:9;14148:22;14127:53;:::i;:::-;14117:63;;14072:118;14229:2;14255:53;14300:7;14291:6;14280:9;14276:22;14255:53;:::i;:::-;14245:63;;14200:118;14385:2;14374:9;14370:18;14357:32;14416:18;14408:6;14405:30;14402:117;;;14438:79;;:::i;:::-;14402:117;14543:62;14597:7;14588:6;14577:9;14573:22;14543:62;:::i;:::-;14533:72;;14328:287;13679:943;;;;;;;:::o;14628:474::-;14696:6;14704;14753:2;14741:9;14732:7;14728:23;14724:32;14721:119;;;14759:79;;:::i;:::-;14721:119;14879:1;14904:53;14949:7;14940:6;14929:9;14925:22;14904:53;:::i;:::-;14894:63;;14850:117;15006:2;15032:53;15077:7;15068:6;15057:9;15053:22;15032:53;:::i;:::-;15022:63;;14977:118;14628:474;;;;;:::o;15108:98::-;15159:6;15193:5;15187:12;15177:22;;15108:98;;;:::o;15212:168::-;15295:11;15329:6;15324:3;15317:19;15369:4;15364:3;15360:14;15345:29;;15212:168;;;;:::o;15386:373::-;15472:3;15500:38;15532:5;15500:38;:::i;:::-;15554:70;15617:6;15612:3;15554:70;:::i;:::-;15547:77;;15633:65;15691:6;15686:3;15679:4;15672:5;15668:16;15633:65;:::i;:::-;15723:29;15745:6;15723:29;:::i;:::-;15718:3;15714:39;15707:46;;15476:283;15386:373;;;;:::o;15765:953::-;16036:4;16074:3;16063:9;16059:19;16051:27;;16088:71;16156:1;16145:9;16141:17;16132:6;16088:71;:::i;:::-;16169:72;16237:2;16226:9;16222:18;16213:6;16169:72;:::i;:::-;16251;16319:2;16308:9;16304:18;16295:6;16251:72;:::i;:::-;16370:9;16364:4;16360:20;16355:2;16344:9;16340:18;16333:48;16398:78;16471:4;16462:6;16398:78;:::i;:::-;16390:86;;16524:9;16518:4;16514:20;16508:3;16497:9;16493:19;16486:49;16552:76;16623:4;16614:6;16552:76;:::i;:::-;16544:84;;16638:73;16706:3;16695:9;16691:19;16682:6;16638:73;:::i;:::-;15765:953;;;;;;;;;:::o;16724:180::-;16772:77;16769:1;16762:88;16869:4;16866:1;16859:15;16893:4;16890:1;16883:15;16910:320;16954:6;16991:1;16985:4;16981:12;16971:22;;17038:1;17032:4;17028:12;17059:18;17049:81;;17115:4;17107:6;17103:17;17093:27;;17049:81;17177:2;17169:6;17166:14;17146:18;17143:38;17140:84;;17196:18;;:::i;:::-;17140:84;16961:269;16910:320;;;:::o;17236:231::-;17376:34;17372:1;17364:6;17360:14;17353:58;17445:14;17440:2;17432:6;17428:15;17421:39;17236:231;:::o;17473:366::-;17615:3;17636:67;17700:2;17695:3;17636:67;:::i;:::-;17629:74;;17712:93;17801:3;17712:93;:::i;:::-;17830:2;17825:3;17821:12;17814:19;;17473:366;;;:::o;17845:419::-;18011:4;18049:2;18038:9;18034:18;18026:26;;18098:9;18092:4;18088:20;18084:1;18073:9;18069:17;18062:47;18126:131;18252:4;18126:131;:::i;:::-;18118:139;;17845:419;;;:::o;18270:182::-;18410:34;18406:1;18398:6;18394:14;18387:58;18270:182;:::o;18458:366::-;18600:3;18621:67;18685:2;18680:3;18621:67;:::i;:::-;18614:74;;18697:93;18786:3;18697:93;:::i;:::-;18815:2;18810:3;18806:12;18799:19;;18458:366;;;:::o;18830:419::-;18996:4;19034:2;19023:9;19019:18;19011:26;;19083:9;19077:4;19073:20;19069:1;19058:9;19054:17;19047:47;19111:131;19237:4;19111:131;:::i;:::-;19103:139;;18830:419;;;:::o;19255:236::-;19395:34;19391:1;19383:6;19379:14;19372:58;19464:19;19459:2;19451:6;19447:15;19440:44;19255:236;:::o;19497:366::-;19639:3;19660:67;19724:2;19719:3;19660:67;:::i;:::-;19653:74;;19736:93;19825:3;19736:93;:::i;:::-;19854:2;19849:3;19845:12;19838:19;;19497:366;;;:::o;19869:419::-;20035:4;20073:2;20062:9;20058:18;20050:26;;20122:9;20116:4;20112:20;20108:1;20097:9;20093:17;20086:47;20150:131;20276:4;20150:131;:::i;:::-;20142:139;;19869:419;;;:::o;20294:160::-;20434:12;20430:1;20422:6;20418:14;20411:36;20294:160;:::o;20460:366::-;20602:3;20623:67;20687:2;20682:3;20623:67;:::i;:::-;20616:74;;20699:93;20788:3;20699:93;:::i;:::-;20817:2;20812:3;20808:12;20801:19;;20460:366;;;:::o;20832:419::-;20998:4;21036:2;21025:9;21021:18;21013:26;;21085:9;21079:4;21075:20;21071:1;21060:9;21056:17;21049:47;21113:131;21239:4;21113:131;:::i;:::-;21105:139;;20832:419;;;:::o;21257:180::-;21305:77;21302:1;21295:88;21402:4;21399:1;21392:15;21426:4;21423:1;21416:15;21443:194;21483:4;21503:20;21521:1;21503:20;:::i;:::-;21498:25;;21537:20;21555:1;21537:20;:::i;:::-;21532:25;;21581:1;21578;21574:9;21566:17;;21605:1;21599:4;21596:11;21593:37;;;21610:18;;:::i;:::-;21593:37;21443:194;;;;:::o;21643:180::-;21691:77;21688:1;21681:88;21788:4;21785:1;21778:15;21812:4;21809:1;21802:15;21829:117;21938:1;21935;21928:12;21952:117;22061:1;22058;22051:12;22075:434;22164:5;22189:66;22205:49;22247:6;22205:49;:::i;:::-;22189:66;:::i;:::-;22180:75;;22278:6;22271:5;22264:21;22316:4;22309:5;22305:16;22354:3;22345:6;22340:3;22336:16;22333:25;22330:112;;;22361:79;;:::i;:::-;22330:112;22451:52;22496:6;22491:3;22486;22451:52;:::i;:::-;22170:339;22075:434;;;;;:::o;22529:355::-;22596:5;22645:3;22638:4;22630:6;22626:17;22622:27;22612:122;;22653:79;;:::i;:::-;22612:122;22763:6;22757:13;22788:90;22874:3;22866:6;22859:4;22851:6;22847:17;22788:90;:::i;:::-;22779:99;;22602:282;22529:355;;;;:::o;22890:321::-;22977:4;23067:18;23059:6;23056:30;23053:56;;;23089:18;;:::i;:::-;23053:56;23139:4;23131:6;23127:17;23119:25;;23199:4;23193;23189:15;23181:23;;22890:321;;;:::o;23233:960::-;23350:5;23375:91;23391:74;23458:6;23391:74;:::i;:::-;23375:91;:::i;:::-;23366:100;;23486:5;23515:6;23508:5;23501:21;23549:4;23542:5;23538:16;23531:23;;23602:4;23594:6;23590:17;23582:6;23578:30;23631:3;23623:6;23620:15;23617:122;;;23650:79;;:::i;:::-;23617:122;23765:6;23748:439;23782:6;23777:3;23774:15;23748:439;;;23864:3;23858:10;23900:18;23887:11;23884:35;23881:122;;;23922:79;;:::i;:::-;23881:122;24046:11;24038:6;24034:24;24084:58;24138:3;24126:10;24084:58;:::i;:::-;24079:3;24072:71;24172:4;24167:3;24163:14;24156:21;;23824:363;;23808:4;23803:3;23799:14;23792:21;;23748:439;;;23752:21;23356:837;;23233:960;;;;;:::o;24215:405::-;24307:5;24356:3;24349:4;24341:6;24337:17;24333:27;24323:122;;24364:79;;:::i;:::-;24323:122;24474:6;24468:13;24499:115;24610:3;24602:6;24595:4;24587:6;24583:17;24499:115;:::i;:::-;24490:124;;24313:307;24215:405;;;;:::o;24626:143::-;24683:5;24714:6;24708:13;24699:22;;24730:33;24757:5;24730:33;:::i;:::-;24626:143;;;;:::o;24819:3207::-;24906:5;24950:6;24938:9;24933:3;24929:19;24925:32;24922:119;;;24960:79;;:::i;:::-;24922:119;25059:23;25075:6;25059:23;:::i;:::-;25050:32;;25174:1;25163:9;25159:17;25153:24;25204:18;25196:6;25193:30;25190:117;;;25226:79;;:::i;:::-;25190:117;25346:70;25412:3;25403:6;25392:9;25388:22;25346:70;:::i;:::-;25339:4;25332:5;25328:16;25321:96;25092:336;25509:2;25498:9;25494:18;25488:25;25540:18;25532:6;25529:30;25526:117;;;25562:79;;:::i;:::-;25526:117;25682:70;25748:3;25739:6;25728:9;25724:22;25682:70;:::i;:::-;25675:4;25668:5;25664:16;25657:96;25438:326;25845:2;25834:9;25830:18;25824:25;25876:18;25868:6;25865:30;25862:117;;;25898:79;;:::i;:::-;25862:117;26018:70;26084:3;26075:6;26064:9;26060:22;26018:70;:::i;:::-;26011:4;26004:5;26000:16;25993:96;25774:326;26187:2;26176:9;26172:18;26166:25;26218:18;26210:6;26207:30;26204:117;;;26240:79;;:::i;:::-;26204:117;26360:70;26426:3;26417:6;26406:9;26402:22;26360:70;:::i;:::-;26353:4;26346:5;26342:16;26335:96;26110:332;26530:3;26519:9;26515:19;26509:26;26562:18;26554:6;26551:30;26548:117;;;26584:79;;:::i;:::-;26548:117;26704:70;26770:3;26761:6;26750:9;26746:22;26704:70;:::i;:::-;26697:4;26690:5;26686:16;26679:96;26452:334;26874:3;26863:9;26859:19;26853:26;26906:18;26898:6;26895:30;26892:117;;;26928:79;;:::i;:::-;26892:117;27048:70;27114:3;27105:6;27094:9;27090:22;27048:70;:::i;:::-;27041:4;27034:5;27030:16;27023:96;26796:334;27224:3;27213:9;27209:19;27203:26;27256:18;27248:6;27245:30;27242:117;;;27278:79;;:::i;:::-;27242:117;27398:70;27464:3;27455:6;27444:9;27440:22;27398:70;:::i;:::-;27391:4;27384:5;27380:16;27373:96;27140:340;27562:3;27551:9;27547:19;27541:26;27594:18;27586:6;27583:30;27580:117;;;27616:79;;:::i;:::-;27580:117;27736:95;27827:3;27818:6;27807:9;27803:22;27736:95;:::i;:::-;27729:4;27722:5;27718:16;27711:121;27490:353;27903:3;27947:60;28003:3;27994:6;27983:9;27979:22;27947:60;:::i;:::-;27938:6;27931:5;27927:18;27920:88;27853:166;24819:3207;;;;:::o;28032:558::-;28129:6;28178:2;28166:9;28157:7;28153:23;28149:32;28146:119;;;28184:79;;:::i;:::-;28146:119;28325:1;28314:9;28310:17;28304:24;28355:18;28347:6;28344:30;28341:117;;;28377:79;;:::i;:::-;28341:117;28482:91;28565:7;28556:6;28545:9;28541:22;28482:91;:::i;:::-;28472:101;;28275:308;28032:558;;;;:::o;28596:148::-;28698:11;28735:3;28720:18;;28596:148;;;;:::o;28750:390::-;28856:3;28884:39;28917:5;28884:39;:::i;:::-;28939:89;29021:6;29016:3;28939:89;:::i;:::-;28932:96;;29037:65;29095:6;29090:3;29083:4;29076:5;29072:16;29037:65;:::i;:::-;29127:6;29122:3;29118:16;29111:23;;28860:280;28750:390;;;;:::o;29146:435::-;29326:3;29348:95;29439:3;29430:6;29348:95;:::i;:::-;29341:102;;29460:95;29551:3;29542:6;29460:95;:::i;:::-;29453:102;;29572:3;29565:10;;29146:435;;;;;:::o;29587:731::-;29802:4;29840:3;29829:9;29825:19;29817:27;;29854:71;29922:1;29911:9;29907:17;29898:6;29854:71;:::i;:::-;29935:72;30003:2;29992:9;29988:18;29979:6;29935:72;:::i;:::-;30054:9;30048:4;30044:20;30039:2;30028:9;30024:18;30017:48;30082:78;30155:4;30146:6;30082:78;:::i;:::-;30074:86;;30207:9;30201:4;30197:20;30192:2;30181:9;30177:18;30170:48;30235:76;30306:4;30297:6;30235:76;:::i;:::-;30227:84;;29587:731;;;;;;;:::o;30324:137::-;30378:5;30409:6;30403:13;30394:22;;30425:30;30449:5;30425:30;:::i;:::-;30324:137;;;;:::o;30467:345::-;30534:6;30583:2;30571:9;30562:7;30558:23;30554:32;30551:119;;;30589:79;;:::i;:::-;30551:119;30709:1;30734:61;30787:7;30778:6;30767:9;30763:22;30734:61;:::i;:::-;30724:71;;30680:125;30467:345;;;;:::o;30818:140::-;30866:4;30889:3;30881:11;;30912:3;30909:1;30902:14;30946:4;30943:1;30933:18;30925:26;;30818:140;;;:::o;30964:93::-;31001:6;31048:2;31043;31036:5;31032:14;31028:23;31018:33;;30964:93;;;:::o;31063:107::-;31107:8;31157:5;31151:4;31147:16;31126:37;;31063:107;;;;:::o;31176:393::-;31245:6;31295:1;31283:10;31279:18;31318:97;31348:66;31337:9;31318:97;:::i;:::-;31436:39;31466:8;31455:9;31436:39;:::i;:::-;31424:51;;31508:4;31504:9;31497:5;31493:21;31484:30;;31557:4;31547:8;31543:19;31536:5;31533:30;31523:40;;31252:317;;31176:393;;;;;:::o;31575:60::-;31603:3;31624:5;31617:12;;31575:60;;;:::o;31641:142::-;31691:9;31724:53;31742:34;31751:24;31769:5;31751:24;:::i;:::-;31742:34;:::i;:::-;31724:53;:::i;:::-;31711:66;;31641:142;;;:::o;31789:75::-;31832:3;31853:5;31846:12;;31789:75;;;:::o;31870:269::-;31980:39;32011:7;31980:39;:::i;:::-;32041:91;32090:41;32114:16;32090:41;:::i;:::-;32082:6;32075:4;32069:11;32041:91;:::i;:::-;32035:4;32028:105;31946:193;31870:269;;;:::o;32145:73::-;32190:3;32145:73;:::o;32224:189::-;32301:32;;:::i;:::-;32342:65;32400:6;32392;32386:4;32342:65;:::i;:::-;32277:136;32224:189;;:::o;32419:186::-;32479:120;32496:3;32489:5;32486:14;32479:120;;;32550:39;32587:1;32580:5;32550:39;:::i;:::-;32523:1;32516:5;32512:13;32503:22;;32479:120;;;32419:186;;:::o;32611:541::-;32711:2;32706:3;32703:11;32700:445;;;32745:37;32776:5;32745:37;:::i;:::-;32828:29;32846:10;32828:29;:::i;:::-;32818:8;32814:44;33011:2;32999:10;32996:18;32993:49;;;33032:8;33017:23;;32993:49;33055:80;33111:22;33129:3;33111:22;:::i;:::-;33101:8;33097:37;33084:11;33055:80;:::i;:::-;32715:430;;32700:445;32611:541;;;:::o;33158:117::-;33212:8;33262:5;33256:4;33252:16;33231:37;;33158:117;;;;:::o;33281:169::-;33325:6;33358:51;33406:1;33402:6;33394:5;33391:1;33387:13;33358:51;:::i;:::-;33354:56;33439:4;33433;33429:15;33419:25;;33332:118;33281:169;;;;:::o;33455:295::-;33531:4;33677:29;33702:3;33696:4;33677:29;:::i;:::-;33669:37;;33739:3;33736:1;33732:11;33726:4;33723:21;33715:29;;33455:295;;;;:::o;33755:1390::-;33870:36;33902:3;33870:36;:::i;:::-;33971:18;33963:6;33960:30;33957:56;;;33993:18;;:::i;:::-;33957:56;34037:38;34069:4;34063:11;34037:38;:::i;:::-;34122:66;34181:6;34173;34167:4;34122:66;:::i;:::-;34215:1;34239:4;34226:17;;34271:2;34263:6;34260:14;34288:1;34283:617;;;;34944:1;34961:6;34958:77;;;35010:9;35005:3;35001:19;34995:26;34986:35;;34958:77;35061:67;35121:6;35114:5;35061:67;:::i;:::-;35055:4;35048:81;34917:222;34253:886;;34283:617;34335:4;34331:9;34323:6;34319:22;34369:36;34400:4;34369:36;:::i;:::-;34427:1;34441:208;34455:7;34452:1;34449:14;34441:208;;;34534:9;34529:3;34525:19;34519:26;34511:6;34504:42;34585:1;34577:6;34573:14;34563:24;;34632:2;34621:9;34617:18;34604:31;;34478:4;34475:1;34471:12;34466:17;;34441:208;;;34677:6;34668:7;34665:19;34662:179;;;34735:9;34730:3;34726:19;34720:26;34778:48;34820:4;34812:6;34808:17;34797:9;34778:48;:::i;:::-;34770:6;34763:64;34685:156;34662:179;34887:1;34883;34875:6;34871:14;34867:22;34861:4;34854:36;34290:610;;;34253:886;;33845:1300;;;33755:1390;;:::o;35151:228::-;35291:34;35287:1;35279:6;35275:14;35268:58;35360:11;35355:2;35347:6;35343:15;35336:36;35151:228;:::o;35385:366::-;35527:3;35548:67;35612:2;35607:3;35548:67;:::i;:::-;35541:74;;35624:93;35713:3;35624:93;:::i;:::-;35742:2;35737:3;35733:12;35726:19;;35385:366;;;:::o;35757:419::-;35923:4;35961:2;35950:9;35946:18;35938:26;;36010:9;36004:4;36000:20;35996:1;35985:9;35981:17;35974:47;36038:131;36164:4;36038:131;:::i;:::-;36030:139;;35757:419;;;:::o;36182:229::-;36322:34;36318:1;36310:6;36306:14;36299:58;36391:12;36386:2;36378:6;36374:15;36367:37;36182:229;:::o;36417:366::-;36559:3;36580:67;36644:2;36639:3;36580:67;:::i;:::-;36573:74;;36656:93;36745:3;36656:93;:::i;:::-;36774:2;36769:3;36765:12;36758:19;;36417:366;;;:::o;36789:419::-;36955:4;36993:2;36982:9;36978:18;36970:26;;37042:9;37036:4;37032:20;37028:1;37017:9;37013:17;37006:47;37070:131;37196:4;37070:131;:::i;:::-;37062:139;;36789:419;;;:::o;37214:154::-;37354:6;37350:1;37342:6;37338:14;37331:30;37214:154;:::o;37374:365::-;37516:3;37537:66;37601:1;37596:3;37537:66;:::i;:::-;37530:73;;37612:93;37701:3;37612:93;:::i;:::-;37730:2;37725:3;37721:12;37714:19;;37374:365;;;:::o;37745:419::-;37911:4;37949:2;37938:9;37934:18;37926:26;;37998:9;37992:4;37988:20;37984:1;37973:9;37969:17;37962:47;38026:131;38152:4;38026:131;:::i;:::-;38018:139;;37745:419;;;:::o;38170:152::-;38310:4;38306:1;38298:6;38294:14;38287:28;38170:152;:::o;38328:400::-;38488:3;38509:84;38591:1;38586:3;38509:84;:::i;:::-;38502:91;;38602:93;38691:3;38602:93;:::i;:::-;38720:1;38715:3;38711:11;38704:18;;38328:400;;;:::o;38734:861::-;39063:3;39085:148;39229:3;39085:148;:::i;:::-;39078:155;;39250:95;39341:3;39332:6;39250:95;:::i;:::-;39243:102;;39362:95;39453:3;39444:6;39362:95;:::i;:::-;39355:102;;39474:95;39565:3;39556:6;39474:95;:::i;:::-;39467:102;;39586:3;39579:10;;38734:861;;;;;;:::o;39601:191::-;39641:3;39660:20;39678:1;39660:20;:::i;:::-;39655:25;;39694:20;39712:1;39694:20;:::i;:::-;39689:25;;39737:1;39734;39730:9;39723:16;;39758:3;39755:1;39752:10;39749:36;;;39765:18;;:::i;:::-;39749:36;39601:191;;;;:::o;39798:141::-;39847:4;39870:3;39862:11;;39893:3;39890:1;39883:14;39927:4;39924:1;39914:18;39906:26;;39798:141;;;:::o;39945:543::-;40046:2;40041:3;40038:11;40035:446;;;40080:38;40112:5;40080:38;:::i;:::-;40164:29;40182:10;40164:29;:::i;:::-;40154:8;40150:44;40347:2;40335:10;40332:18;40329:49;;;40368:8;40353:23;;40329:49;40391:80;40447:22;40465:3;40447:22;:::i;:::-;40437:8;40433:37;40420:11;40391:80;:::i;:::-;40050:431;;40035:446;39945:543;;;:::o;40494:1395::-;40611:37;40644:3;40611:37;:::i;:::-;40713:18;40705:6;40702:30;40699:56;;;40735:18;;:::i;:::-;40699:56;40779:38;40811:4;40805:11;40779:38;:::i;:::-;40864:67;40924:6;40916;40910:4;40864:67;:::i;:::-;40958:1;40982:4;40969:17;;41014:2;41006:6;41003:14;41031:1;41026:618;;;;41688:1;41705:6;41702:77;;;41754:9;41749:3;41745:19;41739:26;41730:35;;41702:77;41805:67;41865:6;41858:5;41805:67;:::i;:::-;41799:4;41792:81;41661:222;40996:887;;41026:618;41078:4;41074:9;41066:6;41062:22;41112:37;41144:4;41112:37;:::i;:::-;41171:1;41185:208;41199:7;41196:1;41193:14;41185:208;;;41278:9;41273:3;41269:19;41263:26;41255:6;41248:42;41329:1;41321:6;41317:14;41307:24;;41376:2;41365:9;41361:18;41348:31;;41222:4;41219:1;41215:12;41210:17;;41185:208;;;41421:6;41412:7;41409:19;41406:179;;;41479:9;41474:3;41470:19;41464:26;41522:48;41564:4;41556:6;41552:17;41541:9;41522:48;:::i;:::-;41514:6;41507:64;41429:156;41406:179;41631:1;41627;41619:6;41615:14;41611:22;41605:4;41598:36;41033:611;;;40996:887;;40586:1303;;;40494:1395;;:::o;41895:275::-;42027:3;42049:95;42140:3;42131:6;42049:95;:::i;:::-;42042:102;;42161:3;42154:10;;41895:275;;;;:::o;42176:147::-;42277:11;42314:3;42299:18;;42176:147;;;;:::o;42329:386::-;42433:3;42461:38;42493:5;42461:38;:::i;:::-;42515:88;42596:6;42591:3;42515:88;:::i;:::-;42508:95;;42612:65;42670:6;42665:3;42658:4;42651:5;42647:16;42612:65;:::i;:::-;42702:6;42697:3;42693:16;42686:23;;42437:278;42329:386;;;;:::o;42721:214::-;42861:66;42857:1;42849:6;42845:14;42838:90;42721:214;:::o;42941:402::-;43101:3;43122:85;43204:2;43199:3;43122:85;:::i;:::-;43115:92;;43216:93;43305:3;43216:93;:::i;:::-;43334:2;43329:3;43325:12;43318:19;;42941:402;;;:::o;43349:214::-;43489:66;43485:1;43477:6;43473:14;43466:90;43349:214;:::o;43569:402::-;43729:3;43750:85;43832:2;43827:3;43750:85;:::i;:::-;43743:92;;43844:93;43933:3;43844:93;:::i;:::-;43962:2;43957:3;43953:12;43946:19;;43569:402;;;:::o;44001:874::-;44104:3;44141:5;44135:12;44170:36;44196:9;44170:36;:::i;:::-;44222:89;44304:6;44299:3;44222:89;:::i;:::-;44215:96;;44342:1;44331:9;44327:17;44358:1;44353:166;;;;44533:1;44528:341;;;;44320:549;;44353:166;44437:4;44433:9;44422;44418:25;44413:3;44406:38;44499:6;44492:14;44485:22;44477:6;44473:35;44468:3;44464:45;44457:52;;44353:166;;44528:341;44595:38;44627:5;44595:38;:::i;:::-;44655:1;44669:154;44683:6;44680:1;44677:13;44669:154;;;44757:7;44751:14;44747:1;44742:3;44738:11;44731:35;44807:1;44798:7;44794:15;44783:26;;44705:4;44702:1;44698:12;44693:17;;44669:154;;;44852:6;44847:3;44843:16;44836:23;;44535:334;;44320:549;;44108:767;;44001:874;;;;:::o;44881:214::-;45021:66;45017:1;45009:6;45005:14;44998:90;44881:214;:::o;45101:400::-;45261:3;45282:84;45364:1;45359:3;45282:84;:::i;:::-;45275:91;;45375:93;45464:3;45375:93;:::i;:::-;45493:1;45488:3;45484:11;45477:18;;45101:400;;;:::o;45507:1383::-;46033:3;46055:93;46144:3;46135:6;46055:93;:::i;:::-;46048:100;;46165:148;46309:3;46165:148;:::i;:::-;46158:155;;46330:95;46421:3;46412:6;46330:95;:::i;:::-;46323:102;;46442:148;46586:3;46442:148;:::i;:::-;46435:155;;46607:92;46695:3;46686:6;46607:92;:::i;:::-;46600:99;;46716:148;46860:3;46716:148;:::i;:::-;46709:155;;46881:3;46874:10;;45507:1383;;;;;;:::o;46896:233::-;46935:3;46958:24;46976:5;46958:24;:::i;:::-;46949:33;;47004:66;46997:5;46994:77;46991:103;;47074:18;;:::i;:::-;46991:103;47121:1;47114:5;47110:13;47103:20;;46896:233;;;:::o;47135:97::-;47194:6;47222:3;47212:13;;47135:97;;;;:::o;47238:1403::-;47362:44;47402:3;47397;47362:44;:::i;:::-;47471:18;47463:6;47460:30;47457:56;;;47493:18;;:::i;:::-;47457:56;47537:38;47569:4;47563:11;47537:38;:::i;:::-;47622:67;47682:6;47674;47668:4;47622:67;:::i;:::-;47716:1;47745:2;47737:6;47734:14;47762:1;47757:632;;;;48433:1;48450:6;48447:84;;;48506:9;48501:3;48497:19;48484:33;48475:42;;48447:84;48557:67;48617:6;48610:5;48557:67;:::i;:::-;48551:4;48544:81;48406:229;47727:908;;47757:632;47809:4;47805:9;47797:6;47793:22;47843:37;47875:4;47843:37;:::i;:::-;47902:1;47916:215;47930:7;47927:1;47924:14;47916:215;;;48016:9;48011:3;48007:19;47994:33;47986:6;47979:49;48067:1;48059:6;48055:14;48045:24;;48114:2;48103:9;48099:18;48086:31;;47953:4;47950:1;47946:12;47941:17;;47916:215;;;48159:6;48150:7;48147:19;48144:186;;;48224:9;48219:3;48215:19;48202:33;48267:48;48309:4;48301:6;48297:17;48286:9;48267:48;:::i;:::-;48259:6;48252:64;48167:163;48144:186;48376:1;48372;48364:6;48360:14;48356:22;48350:4;48343:36;47764:625;;;47727:908;;47337:1304;;;47238:1403;;;:::o;48671:330::-;48787:3;48808:89;48890:6;48885:3;48808:89;:::i;:::-;48801:96;;48907:56;48956:6;48951:3;48944:5;48907:56;:::i;:::-;48988:6;48983:3;48979:16;48972:23;;48671:330;;;;;:::o;49007:295::-;49149:3;49171:105;49272:3;49263:6;49255;49171:105;:::i;:::-;49164:112;;49293:3;49286:10;;49007:295;;;;;:::o;49308:225::-;49448:34;49444:1;49436:6;49432:14;49425:58;49517:8;49512:2;49504:6;49500:15;49493:33;49308:225;:::o;49539:366::-;49681:3;49702:67;49766:2;49761:3;49702:67;:::i;:::-;49695:74;;49778:93;49867:3;49778:93;:::i;:::-;49896:2;49891:3;49887:12;49880:19;;49539:366;;;:::o;49911:419::-;50077:4;50115:2;50104:9;50100:18;50092:26;;50164:9;50158:4;50154:20;50150:1;50139:9;50135:17;50128:47;50192:131;50318:4;50192:131;:::i;:::-;50184:139;;49911:419;;;:::o;50336:231::-;50476:34;50472:1;50464:6;50460:14;50453:58;50545:14;50540:2;50532:6;50528:15;50521:39;50336:231;:::o;50573:366::-;50715:3;50736:67;50800:2;50795:3;50736:67;:::i;:::-;50729:74;;50812:93;50901:3;50812:93;:::i;:::-;50930:2;50925:3;50921:12;50914:19;;50573:366;;;:::o;50945:419::-;51111:4;51149:2;51138:9;51134:18;51126:26;;51198:9;51192:4;51188:20;51184:1;51173:9;51169:17;51162:47;51226:131;51352:4;51226:131;:::i;:::-;51218:139;;50945:419;;;:::o;51370:224::-;51510:34;51506:1;51498:6;51494:14;51487:58;51579:7;51574:2;51566:6;51562:15;51555:32;51370:224;:::o;51600:366::-;51742:3;51763:67;51827:2;51822:3;51763:67;:::i;:::-;51756:74;;51839:93;51928:3;51839:93;:::i;:::-;51957:2;51952:3;51948:12;51941:19;;51600:366;;;:::o;51972:419::-;52138:4;52176:2;52165:9;52161:18;52153:26;;52225:9;52219:4;52215:20;52211:1;52200:9;52196:17;52189:47;52253:131;52379:4;52253:131;:::i;:::-;52245:139;;51972:419;;;:::o;52397:223::-;52537:34;52533:1;52525:6;52521:14;52514:58;52606:6;52601:2;52593:6;52589:15;52582:31;52397:223;:::o;52626:366::-;52768:3;52789:67;52853:2;52848:3;52789:67;:::i;:::-;52782:74;;52865:93;52954:3;52865:93;:::i;:::-;52983:2;52978:3;52974:12;52967:19;;52626:366;;;:::o;52998:419::-;53164:4;53202:2;53191:9;53187:18;53179:26;;53251:9;53245:4;53241:20;53237:1;53226:9;53222:17;53215:47;53279:131;53405:4;53279:131;:::i;:::-;53271:139;;52998:419;;;:::o;53423:180::-;53471:77;53468:1;53461:88;53568:4;53565:1;53558:15;53592:4;53589:1;53582:15;53609:185;53649:1;53666:20;53684:1;53666:20;:::i;:::-;53661:25;;53700:20;53718:1;53700:20;:::i;:::-;53695:25;;53739:1;53729:35;;53744:18;;:::i;:::-;53729:35;53786:1;53783;53779:9;53774:14;;53609:185;;;;:::o;53800:176::-;53832:1;53849:20;53867:1;53849:20;:::i;:::-;53844:25;;53883:20;53901:1;53883:20;:::i;:::-;53878:25;;53922:1;53912:35;;53927:18;;:::i;:::-;53912:35;53968:1;53965;53961:9;53956:14;;53800:176;;;;:::o;53982:410::-;54022:7;54045:20;54063:1;54045:20;:::i;:::-;54040:25;;54079:20;54097:1;54079:20;:::i;:::-;54074:25;;54134:1;54131;54127:9;54156:30;54174:11;54156:30;:::i;:::-;54145:41;;54335:1;54326:7;54322:15;54319:1;54316:22;54296:1;54289:9;54269:83;54246:139;;54365:18;;:::i;:::-;54246:139;54030:362;53982:410;;;;:::o;54398:102::-;54440:8;54487:5;54484:1;54480:13;54459:34;;54398:102;;;:::o;54506:848::-;54567:5;54574:4;54598:6;54589:15;;54622:5;54613:14;;54636:712;54657:1;54647:8;54644:15;54636:712;;;54752:4;54747:3;54743:14;54737:4;54734:24;54731:50;;;54761:18;;:::i;:::-;54731:50;54811:1;54801:8;54797:16;54794:451;;;55226:4;55219:5;55215:16;55206:25;;54794:451;55276:4;55270;55266:15;55258:23;;55306:32;55329:8;55306:32;:::i;:::-;55294:44;;54636:712;;;54506:848;;;;;;;:::o;55360:1073::-;55414:5;55605:8;55595:40;;55626:1;55617:10;;55628:5;;55595:40;55654:4;55644:36;;55671:1;55662:10;;55673:5;;55644:36;55740:4;55788:1;55783:27;;;;55824:1;55819:191;;;;55733:277;;55783:27;55801:1;55792:10;;55803:5;;;55819:191;55864:3;55854:8;55851:17;55848:43;;;55871:18;;:::i;:::-;55848:43;55920:8;55917:1;55913:16;55904:25;;55955:3;55948:5;55945:14;55942:40;;;55962:18;;:::i;:::-;55942:40;55995:5;;;55733:277;;56119:2;56109:8;56106:16;56100:3;56094:4;56091:13;56087:36;56069:2;56059:8;56056:16;56051:2;56045:4;56042:12;56038:35;56022:111;56019:246;;;56175:8;56169:4;56165:19;56156:28;;56210:3;56203:5;56200:14;56197:40;;;56217:18;;:::i;:::-;56197:40;56250:5;;56019:246;56290:42;56328:3;56318:8;56312:4;56309:1;56290:42;:::i;:::-;56275:57;;;;56364:4;56359:3;56355:14;56348:5;56345:25;56342:51;;;56373:18;;:::i;:::-;56342:51;56422:4;56415:5;56411:16;56402:25;;55360:1073;;;;;;:::o;56439:285::-;56499:5;56523:23;56541:4;56523:23;:::i;:::-;56515:31;;56567:27;56585:8;56567:27;:::i;:::-;56555:39;;56613:104;56650:66;56640:8;56634:4;56613:104;:::i;:::-;56604:113;;56439:285;;;;:::o;56730:86::-;56765:7;56805:4;56798:5;56794:16;56783:27;;56730:86;;;:::o;56822:179::-;56860:1;56877:18;56893:1;56877:18;:::i;:::-;56872:23;;56909:18;56925:1;56909:18;:::i;:::-;56904:23;;56946:1;56936:35;;56951:18;;:::i;:::-;56936:35;56993:1;56990;56986:9;56981:14;;56822:179;;;;:::o;57007:271::-;57045:7;57068:18;57084:1;57068:18;:::i;:::-;57063:23;;57100:18;57116:1;57100:18;:::i;:::-;57095:23;;57153:1;57150;57146:9;57175:28;57191:11;57175:28;:::i;:::-;57164:39;;57235:11;57226:7;57223:24;57213:58;;57251:18;;:::i;:::-;57213:58;57053:225;57007:271;;;;:::o;57284:191::-;57322:4;57342:18;57358:1;57342:18;:::i;:::-;57337:23;;57374:18;57390:1;57374:18;:::i;:::-;57369:23;;57416:1;57413;57409:9;57401:17;;57440:4;57434;57431:14;57428:40;;;57448:18;;:::i;:::-;57428:40;57284:191;;;;:::o;57481:114::-;57548:6;57582:5;57576:12;57566:22;;57481:114;;;:::o;57601:184::-;57700:11;57734:6;57729:3;57722:19;57774:4;57769:3;57765:14;57750:29;;57601:184;;;;:::o;57791:132::-;57858:4;57881:3;57873:11;;57911:4;57906:3;57902:14;57894:22;;57791:132;;;:::o;57929:108::-;58006:24;58024:5;58006:24;:::i;:::-;58001:3;57994:37;57929:108;;:::o;58043:179::-;58112:10;58133:46;58175:3;58167:6;58133:46;:::i;:::-;58211:4;58206:3;58202:14;58188:28;;58043:179;;;;:::o;58228:113::-;58298:4;58330;58325:3;58321:14;58313:22;;58228:113;;;:::o;58377:732::-;58496:3;58525:54;58573:5;58525:54;:::i;:::-;58595:86;58674:6;58669:3;58595:86;:::i;:::-;58588:93;;58705:56;58755:5;58705:56;:::i;:::-;58784:7;58815:1;58800:284;58825:6;58822:1;58819:13;58800:284;;;58901:6;58895:13;58928:63;58987:3;58972:13;58928:63;:::i;:::-;58921:70;;59014:60;59067:6;59014:60;:::i;:::-;59004:70;;58860:224;58847:1;58844;58840:9;58835:14;;58800:284;;;58804:14;59100:3;59093:10;;58501:608;;;58377:732;;;;:::o;59115:373::-;59258:4;59296:2;59285:9;59281:18;59273:26;;59345:9;59339:4;59335:20;59331:1;59320:9;59316:17;59309:47;59373:108;59476:4;59467:6;59373:108;:::i;:::-;59365:116;;59115:373;;;;:::o;59494:574::-;59599:6;59648:2;59636:9;59627:7;59623:23;59619:32;59616:119;;;59654:79;;:::i;:::-;59616:119;59795:1;59784:9;59780:17;59774:24;59825:18;59817:6;59814:30;59811:117;;;59847:79;;:::i;:::-;59811:117;59952:99;60043:7;60034:6;60023:9;60019:22;59952:99;:::i;:::-;59942:109;;59745:316;59494:574;;;;:::o;60074:541::-;60307:3;60329:148;60473:3;60329:148;:::i;:::-;60322:155;;60494:95;60585:3;60576:6;60494:95;:::i;:::-;60487:102;;60606:3;60599:10;;60074:541;;;;:::o;60621:237::-;60761:34;60757:1;60749:6;60745:14;60738:58;60830:20;60825:2;60817:6;60813:15;60806:45;60621:237;:::o;60864:366::-;61006:3;61027:67;61091:2;61086:3;61027:67;:::i;:::-;61020:74;;61103:93;61192:3;61103:93;:::i;:::-;61221:2;61216:3;61212:12;61205:19;;60864:366;;;:::o;61236:419::-;61402:4;61440:2;61429:9;61425:18;61417:26;;61489:9;61483:4;61479:20;61475:1;61464:9;61460:17;61453:47;61517:131;61643:4;61517:131;:::i;:::-;61509:139;;61236:419;;;:::o;61661:155::-;61801:3;61797:1;61789:6;61785:14;61778:27;61661:155;:::o;61826:416::-;61986:3;62011:84;62093:1;62088:3;62011:84;:::i;:::-;62004:91;;62108:93;62197:3;62108:93;:::i;:::-;62230:1;62225:3;62221:11;62214:18;;61826:416;;;:::o;62252:222::-;62396:66;62392:1;62384:6;62380:14;62373:90;62252:222;:::o;62484:416::-;62644:3;62669:84;62751:1;62746:3;62669:84;:::i;:::-;62662:91;;62766:93;62855:3;62766:93;:::i;:::-;62888:1;62883:3;62879:11;62872:18;;62484:416;;;:::o;62910:222::-;63054:66;63050:1;63042:6;63038:14;63031:90;62910:222;:::o;63142:416::-;63302:3;63327:84;63409:1;63404:3;63327:84;:::i;:::-;63320:91;;63424:93;63513:3;63424:93;:::i;:::-;63546:1;63541:3;63537:11;63530:18;;63142:416;;;:::o;63568:222::-;63712:66;63708:1;63700:6;63696:14;63689:90;63568:222;:::o;63800:418::-;63960:3;63985:85;64067:2;64062:3;63985:85;:::i;:::-;63978:92;;64083:93;64172:3;64083:93;:::i;:::-;64205:2;64200:3;64196:12;64189:19;;63800:418;;;:::o;64228:222::-;64372:66;64368:1;64360:6;64356:14;64349:90;64228:222;:::o;64460:418::-;64620:3;64645:85;64727:2;64722:3;64645:85;:::i;:::-;64638:92;;64743:93;64832:3;64743:93;:::i;:::-;64865:2;64860:3;64856:12;64849:19;;64460:418;;;:::o;64888:222::-;65032:66;65028:1;65020:6;65016:14;65009:90;64888:222;:::o;65120:418::-;65280:3;65305:85;65387:2;65382:3;65305:85;:::i;:::-;65298:92;;65403:93;65492:3;65403:93;:::i;:::-;65525:2;65520:3;65516:12;65509:19;;65120:418;;;:::o;65548:327::-;65692:66;65688:1;65680:6;65676:14;65669:90;65797:66;65792:2;65784:6;65780:15;65773:91;65548:327;:::o;65885:418::-;66045:3;66070:85;66152:2;66147:3;66070:85;:::i;:::-;66063:92;;66168:93;66257:3;66168:93;:::i;:::-;66290:2;66285:3;66281:12;66274:19;;65885:418;;;:::o;66313:222::-;66457:66;66453:1;66445:6;66441:14;66434:90;66313:222;:::o;66545:416::-;66705:3;66730:84;66812:1;66807:3;66730:84;:::i;:::-;66723:91;;66827:93;66916:3;66827:93;:::i;:::-;66949:1;66944:3;66940:11;66933:18;;66545:416;;;:::o;66971:327::-;67115:66;67111:1;67103:6;67099:14;67092:90;67220:66;67215:2;67207:6;67203:15;67196:91;66971:327;:::o;67308:418::-;67468:3;67493:85;67575:2;67570:3;67493:85;:::i;:::-;67486:92;;67591:93;67680:3;67591:93;:::i;:::-;67713:2;67708:3;67704:12;67697:19;;67308:418;;;:::o;67736:222::-;67880:66;67876:1;67868:6;67864:14;67857:90;67736:222;:::o;67968:418::-;68128:3;68153:85;68235:2;68230:3;68153:85;:::i;:::-;68146:92;;68251:93;68340:3;68251:93;:::i;:::-;68373:2;68368:3;68364:12;68357:19;;67968:418;;;:::o;68396:327::-;68540:66;68536:1;68528:6;68524:14;68517:90;68645:66;68640:2;68632:6;68628:15;68621:91;68396:327;:::o;68733:418::-;68893:3;68918:85;69000:2;68995:3;68918:85;:::i;:::-;68911:92;;69016:93;69105:3;69016:93;:::i;:::-;69138:2;69133:3;69129:12;69122:19;;68733:418;;;:::o;69161:152::-;69301:4;69297:1;69289:6;69285:14;69278:28;69161:152;:::o;69319:400::-;69479:3;69500:84;69582:1;69577:3;69500:84;:::i;:::-;69493:91;;69593:93;69682:3;69593:93;:::i;:::-;69711:1;69706:3;69702:11;69695:18;;69319:400;;;:::o;69725:5373::-;71702:3;71724:148;71868:3;71724:148;:::i;:::-;71717:155;;71889:148;72033:3;71889:148;:::i;:::-;71882:155;;72054:95;72145:3;72136:6;72054:95;:::i;:::-;72047:102;;72166:148;72310:3;72166:148;:::i;:::-;72159:155;;72331:148;72475:3;72331:148;:::i;:::-;72324:155;;72496:92;72584:3;72575:6;72496:92;:::i;:::-;72489:99;;72605:148;72749:3;72605:148;:::i;:::-;72598:155;;72770:95;72861:3;72852:6;72770:95;:::i;:::-;72763:102;;72882:148;73026:3;72882:148;:::i;:::-;72875:155;;73047:148;73191:3;73047:148;:::i;:::-;73040:155;;73212:95;73303:3;73294:6;73212:95;:::i;:::-;73205:102;;73324:148;73468:3;73324:148;:::i;:::-;73317:155;;73489:148;73633:3;73489:148;:::i;:::-;73482:155;;73654:95;73745:3;73736:6;73654:95;:::i;:::-;73647:102;;73766:148;73910:3;73766:148;:::i;:::-;73759:155;;73931:148;74075:3;73931:148;:::i;:::-;73924:155;;74096:95;74187:3;74178:6;74096:95;:::i;:::-;74089:102;;74208:148;74352:3;74208:148;:::i;:::-;74201:155;;74373:148;74517:3;74373:148;:::i;:::-;74366:155;;74538:92;74626:3;74617:6;74538:92;:::i;:::-;74531:99;;74647:148;74791:3;74647:148;:::i;:::-;74640:155;;74812:95;74903:3;74894:6;74812:95;:::i;:::-;74805:102;;74924:148;75068:3;74924:148;:::i;:::-;74917:155;;75089:3;75082:10;;69725:5373;;;;;;;;;;;:::o;75104:179::-;75244:31;75240:1;75232:6;75228:14;75221:55;75104:179;:::o;75289:402::-;75449:3;75470:85;75552:2;75547:3;75470:85;:::i;:::-;75463:92;;75564:93;75653:3;75564:93;:::i;:::-;75682:2;75677:3;75673:12;75666:19;;75289:402;;;:::o;75697:541::-;75930:3;75952:148;76096:3;75952:148;:::i;:::-;75945:155;;76117:95;76208:3;76199:6;76117:95;:::i;:::-;76110:102;;76229:3;76222:10;;75697:541;;;;:::o;76244:169::-;76384:21;76380:1;76372:6;76368:14;76361:45;76244:169;:::o;76419:366::-;76561:3;76582:67;76646:2;76641:3;76582:67;:::i;:::-;76575:74;;76658:93;76747:3;76658:93;:::i;:::-;76776:2;76771:3;76767:12;76760:19;;76419:366;;;:::o;76791:419::-;76957:4;76995:2;76984:9;76980:18;76972:26;;77044:9;77038:4;77034:20;77030:1;77019:9;77015:17;77008:47;77072:131;77198:4;77072:131;:::i;:::-;77064:139;;76791:419;;;:::o;77216:188::-;77254:3;77273:18;77289:1;77273:18;:::i;:::-;77268:23;;77305:18;77321:1;77305:18;:::i;:::-;77300:23;;77346:1;77343;77339:9;77332:16;;77369:4;77364:3;77361:13;77358:39;;;77377:18;;:::i;:::-;77358:39;77216:188;;;;:::o;77410:640::-;77605:4;77643:3;77632:9;77628:19;77620:27;;77657:71;77725:1;77714:9;77710:17;77701:6;77657:71;:::i;:::-;77738:72;77806:2;77795:9;77791:18;77782:6;77738:72;:::i;:::-;77820;77888:2;77877:9;77873:18;77864:6;77820:72;:::i;:::-;77939:9;77933:4;77929:20;77924:2;77913:9;77909:18;77902:48;77967:76;78038:4;78029:6;77967:76;:::i;:::-;77959:84;;77410:640;;;;;;;:::o;78056:141::-;78112:5;78143:6;78137:13;78128:22;;78159:32;78185:5;78159:32;:::i;:::-;78056:141;;;;:::o;78203:349::-;78272:6;78321:2;78309:9;78300:7;78296:23;78292:32;78289:119;;;78327:79;;:::i;:::-;78289:119;78447:1;78472:63;78527:7;78518:6;78507:9;78503:22;78472:63;:::i;:::-;78462:73;;78418:127;78203:349;;;;:::o;78558:157::-;78698:9;78694:1;78686:6;78682:14;78675:33;78558:157;:::o;78721:400::-;78881:3;78902:84;78984:1;78979:3;78902:84;:::i;:::-;78895:91;;78995:93;79084:3;78995:93;:::i;:::-;79113:1;79108:3;79104:11;79097:18;;78721:400;;;:::o;79127:163::-;79267:15;79263:1;79255:6;79251:14;79244:39;79127:163;:::o;79296:402::-;79456:3;79477:85;79559:2;79554:3;79477:85;:::i;:::-;79470:92;;79571:93;79660:3;79571:93;:::i;:::-;79689:2;79684:3;79680:12;79673:19;;79296:402;;;:::o;79704:157::-;79844:9;79840:1;79832:6;79828:14;79821:33;79704:157;:::o;79867:400::-;80027:3;80048:84;80130:1;80125:3;80048:84;:::i;:::-;80041:91;;80141:93;80230:3;80141:93;:::i;:::-;80259:1;80254:3;80250:11;80243:18;;79867:400;;;:::o;80273:158::-;80413:10;80409:1;80401:6;80397:14;80390:34;80273:158;:::o;80437:400::-;80597:3;80618:84;80700:1;80695:3;80618:84;:::i;:::-;80611:91;;80711:93;80800:3;80711:93;:::i;:::-;80829:1;80824:3;80820:11;80813:18;;80437:400;;;:::o;80843:168::-;80983:20;80979:1;80971:6;80967:14;80960:44;80843:168;:::o;81017:402::-;81177:3;81198:85;81280:2;81275:3;81198:85;:::i;:::-;81191:92;;81292:93;81381:3;81292:93;:::i;:::-;81410:2;81405:3;81401:12;81394:19;;81017:402;;;:::o;81425:154::-;81565:6;81561:1;81553:6;81549:14;81542:30;81425:154;:::o;81585:400::-;81745:3;81766:84;81848:1;81843:3;81766:84;:::i;:::-;81759:91;;81859:93;81948:3;81859:93;:::i;:::-;81977:1;81972:3;81968:11;81961:18;;81585:400;;;:::o;81991:2819::-;83011:3;83033:92;83121:3;83112:6;83033:92;:::i;:::-;83026:99;;83142:148;83286:3;83142:148;:::i;:::-;83135:155;;83307:95;83398:3;83389:6;83307:95;:::i;:::-;83300:102;;83419:148;83563:3;83419:148;:::i;:::-;83412:155;;83584:95;83675:3;83666:6;83584:95;:::i;:::-;83577:102;;83696:148;83840:3;83696:148;:::i;:::-;83689:155;;83861:95;83952:3;83943:6;83861:95;:::i;:::-;83854:102;;83973:148;84117:3;83973:148;:::i;:::-;83966:155;;84138:92;84226:3;84217:6;84138:92;:::i;:::-;84131:99;;84247:148;84391:3;84247:148;:::i;:::-;84240:155;;84412:95;84503:3;84494:6;84412:95;:::i;:::-;84405:102;;84524:148;84668:3;84524:148;:::i;:::-;84517:155;;84689:95;84780:3;84771:6;84689:95;:::i;:::-;84682:102;;84801:3;84794:10;;81991:2819;;;;;;;;;;:::o;84816:182::-;84956:34;84952:1;84944:6;84940:14;84933:58;84816:182;:::o;85004:366::-;85146:3;85167:67;85231:2;85226:3;85167:67;:::i;:::-;85160:74;;85243:93;85332:3;85243:93;:::i;:::-;85361:2;85356:3;85352:12;85345:19;;85004:366;;;:::o;85376:419::-;85542:4;85580:2;85569:9;85565:18;85557:26;;85629:9;85623:4;85619:20;85615:1;85604:9;85600:17;85593:47;85657:131;85783:4;85657:131;:::i;:::-;85649:139;;85376:419;;;:::o;85801:178::-;85941:30;85937:1;85929:6;85925:14;85918:54;85801:178;:::o;85985:366::-;86127:3;86148:67;86212:2;86207:3;86148:67;:::i;:::-;86141:74;;86224:93;86313:3;86224:93;:::i;:::-;86342:2;86337:3;86333:12;86326:19;;85985:366;;;:::o;86357:419::-;86523:4;86561:2;86550:9;86546:18;86538:26;;86610:9;86604:4;86600:20;86596:1;86585:9;86581:17;86574:47;86638:131;86764:4;86638:131;:::i;:::-;86630:139;;86357:419;;;:::o
Swarm Source
ipfs://e09edc06651da4c00b85699b22bd541916b5b88e1bbf8012baecfe539d0d345e
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.