Feature Tip: Add private address tag to any address under My Name Tag !
ERC-1155
NFT
Overview
Max Total Supply
8,039 CYBORG
Holders
2,083
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CyborgMercenariesCm
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-06 */ /** *Submitted for verification at Etherscan.io on 2021-12-30 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.4; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol /** * @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/utils/introspection/ERC165.sol /** * @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/ERC1155/IERC1155Receiver.sol /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor() { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(_msgSender() != operator, "ERC1155: setting approval status for self"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`. * * Emits a {TransferSingle} event. * * Requirements: * * - `account` cannot be the zero address. * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address account, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(account != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][account] += amount; emit TransferSingle(operator, address(0), account, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `account` * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens of token type `id`. */ function _burn( address account, uint256 id, uint256 amount ) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][account] = accountBalance - amount; } emit TransferSingle(operator, account, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address account, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][account] = accountBalance - amount; } } emit TransferBatch(operator, account, address(0), ids, amounts); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } /** * @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); } } contract CyborgMercenariesCm is ERC1155, Ownable { string public constant name = "CyborgMercenariesCm"; string public constant symbol = "CYBORG"; using SafeMath for uint256; using Strings for uint256; uint256 public totalSupply = 0; string private baseURI; string private blindURI; uint256 public constant MAX_NFT_PUBLIC = 8738; uint256 private constant MAX_NFT = 8888; uint256 public constant maxGiveaway=150; uint256 public WHITELIST_MAX_MINT = 2; mapping(address => uint256) private whiteListClaimed; uint256 public NFTPrice = 100000000000000000; // 0.10 ETH uint256 public MAX_NFT_PRICE = 150000000000000000; // 0.15 ETH bool public reveal; bool public isActive; bool public isPresaleActive; bytes32 public root; uint256 public giveawayCount; /* * Function to reveal all NFTs */ function revealNow() external onlyOwner { reveal = true; } /* * Function to mint NFTs */ function mint(address to, uint32 count) internal { if (count > 1) { uint256[] memory ids = new uint256[](uint256(count)); uint256[] memory amounts = new uint256[](uint256(count)); for (uint32 i = 0; i < count; i++) { ids[i] = totalSupply + i; amounts[i] = 1; } _mintBatch(to, ids, amounts, ""); } else { _mint(to, totalSupply, 1, ""); } totalSupply += count; } /* * Function setIsActive to activate/desactivate the smart contract */ function setIsActive( bool _isActive ) external onlyOwner { isActive = _isActive; } /* * Function setPrice allow the owner to set the price of an NFT */ function setPriceAndMax( uint256 _price,uint256 _max ) external onlyOwner { require(_price <= MAX_NFT_PRICE, 'The price must be smaller or equal to MAX_NFT_PRICE'); require(_price > 0, 'The price must be greater than 0'); NFTPrice = _price; WHITELIST_MAX_MINT=_max; } /* * Function setPresaleActive to activate/desactivate the presale */ function setPresaleActive( bool _isActive ) external onlyOwner { isPresaleActive = _isActive; } /* * Function to set Base and Blind URI */ function setURIs( string memory _blindURI, string memory _URI ) external onlyOwner { blindURI = _blindURI; baseURI = _URI; } /* * Function to withdraw collected amount during minting by the owner */ function withdraw( ) public onlyOwner { uint balance = address(this).balance; require(balance > 0, "Balance should be more then zero"); payable(owner()).transfer(balance); } /* * Function to mint new NFTs during the public sale * It is payable. Amount is calculated as per (NFTPrice.mul(_numOfTokens)) */ function mintNFT( uint32 _numOfTokens ) public payable { require(isActive, 'Contract is not active'); require(!isPresaleActive, 'Presale still active'); require(totalSupply.add(_numOfTokens).sub(giveawayCount) <= MAX_NFT_PUBLIC, "Purchase would exceed max public supply of NFTs"); require( msg.value >= NFTPrice.mul(_numOfTokens), "Ether value sent is not correct"); mint(msg.sender,_numOfTokens); } /* * Function to mint new NFTs during the presale * It is payable. Amount is calculated as per (NFTPrice.mul(_numOfTokens)) */ function mintNFTDuringPresale( uint32 _numOfTokens, bytes32[] memory _proof ) public payable { require(isActive, 'Contract is not active'); require(isPresaleActive, 'Presale not active'); require(verify(_proof, bytes32(uint256(uint160(msg.sender)))), "Not whitelisted"); require(totalSupply.sub(giveawayCount) < MAX_NFT_PUBLIC, 'All public tokens have been minted'); require(totalSupply.add(_numOfTokens).sub(giveawayCount) <= MAX_NFT_PUBLIC, 'Purchase would exceed max public supply of NFTs'); require( msg.value >= NFTPrice.mul(_numOfTokens), "Ether value sent is not correct"); require(whiteListClaimed[msg.sender].add(_numOfTokens) <= WHITELIST_MAX_MINT, "Purchase exceeds max whitelisted"); mint(msg.sender,_numOfTokens); whiteListClaimed[msg.sender] += _numOfTokens; } /* * Function to mint all NFTs for giveaway and partnerships */ function mintByOwner( address _to ) public onlyOwner { require(totalSupply.add(1) < MAX_NFT, "Tokens number to mint cannot exceed number of MAX tokens"); mint(_to,1); } /* * Function to mint all NFTs for giveaway and partnerships */ function mintMultipleByOwner( address[] memory _to ) public onlyOwner { require(totalSupply.add(_to.length) < MAX_NFT, "Tokens number to mint cannot exceed number of MAX tokens"); require(giveawayCount.add(_to.length)<=maxGiveaway,"Cannot do that much giveaway"); for(uint256 i = 0; i < _to.length; i++){ mint(_to[i],1); } giveawayCount=giveawayCount.add(_to.length); } /* * Function to get token URI of given token ID * URI will be blank untill totalSupply reaches MAX_NFT_PUBLIC */ function uri( uint256 _tokenId ) public view virtual override returns (string memory) { require(_tokenId<totalSupply, "ERC1155Metadata: URI query for nonexistent token"); if (!reveal) { return string(abi.encodePacked(blindURI)); } else { return string(abi.encodePacked(baseURI, _tokenId.toString())); } } /* * Function to set the merkle root */ function setRoot(uint256 _root) onlyOwner() public { root = bytes32(_root); } /* * Function to verify the proof */ function verify(bytes32[] memory proof, bytes32 leaf) public view returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = sha256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = sha256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"MAX_NFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveawayCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGiveaway","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"}],"name":"mintMultipleByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_numOfTokens","type":"uint32"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_numOfTokens","type":"uint32"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintNFTDuringPresale","outputs":[],"stateMutability":"payable","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealNow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setPresaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setPriceAndMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_root","type":"uint256"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_blindURI","type":"string"},{"internalType":"string","name":"_URI","type":"string"}],"name":"setURIs","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600455600260075567016345785d8a0000600955670214e8348c4f0000600a5534801561003257600080fd5b5061003c33610041565b610093565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61332080620000a36000396000f3fe60806040526004361061024e5760003560e01c8063715018a611610138578063b533731d116100b0578063e9be0f3f1161007f578063f242432a11610064578063f242432a146106a2578063f2f5a7e5146106c2578063f2fde38b146106e257600080fd5b8063e9be0f3f14610676578063ebf0c7171461068c57600080fd5b8063b533731d146105d7578063d1d80f30146105f7578063e82541741461060d578063e985e9c51461062d57600080fd5b8063972a2a6211610107578063a38bffda116100ec578063a38bffda14610591578063a475b5dd146105a7578063aeb16768146105c157600080fd5b8063972a2a6214610551578063a22cb4651461057157600080fd5b8063715018a6146104b55780638cdb9069146104ca5780638da5cb5b146104e057806395d89b411461050857600080fd5b80633f8121a2116101cb5780634e1273f41161019a578063566d00f41161017f578063566d00f4146104605780635f0f45b21461048057806360d938dc1461049557600080fd5b80634e1273f414610420578063560b26081461044d57600080fd5b80633f8121a2146103b857806341de0e52146103d8578063459ba3ae146103eb5780634cdb44001461040057600080fd5b806318160ddd116102225780632750fc78116102075780632750fc78146103615780632eb2c2d6146103835780633ccfd60b146103a357600080fd5b806318160ddd1461032c57806322f3e2d41461034257600080fd5b8062fdd58e1461025357806301ffc9a71461028657806306fdde03146102b65780630e89341c1461030c575b600080fd5b34801561025f57600080fd5b5061027361026e366004612bc9565b610702565b6040519081526020015b60405180910390f35b34801561029257600080fd5b506102a66102a1366004612cfb565b6107ab565b604051901515815260200161027d565b3480156102c257600080fd5b506102ff6040518060400160405280601381526020017f4379626f72674d657263656e6172696573436d0000000000000000000000000081525081565b60405161027d919061304c565b34801561031857600080fd5b506102ff610327366004612d8a565b610848565b34801561033857600080fd5b5061027360045481565b34801561034e57600080fd5b50600b546102a690610100900460ff1681565b34801561036d57600080fd5b5061038161037c366004612cc9565b610914565b005b34801561038f57600080fd5b5061038161039e366004612a97565b610976565b3480156103af57600080fd5b50610381610a18565b3480156103c457600080fd5b506103816103d3366004612cc9565b610aec565b6103816103e6366004612dc3565b610b50565b3480156103f757600080fd5b50610273609681565b34801561040c57600080fd5b5061038161041b366004612bf2565b610d10565b34801561042c57600080fd5b5061044061043b366004612c25565b610eaf565b60405161027d919061300b565b61038161045b366004612ddd565b611025565b34801561046c57600080fd5b5061038161047b366004612da2565b611360565b34801561048c57600080fd5b5061038161147b565b3480156104a157600080fd5b50600b546102a69062010000900460ff1681565b3480156104c157600080fd5b506103816114d2565b3480156104d657600080fd5b50610273600a5481565b3480156104ec57600080fd5b506003546040516001600160a01b03909116815260200161027d565b34801561051457600080fd5b506102ff6040518060400160405280600681526020017f4359424f5247000000000000000000000000000000000000000000000000000081525081565b34801561055d57600080fd5b506102a661056c366004612c86565b611526565b34801561057d57600080fd5b5061038161058c366004612ba0565b611672565b34801561059d57600080fd5b5061027360095481565b3480156105b357600080fd5b50600b546102a69060ff1681565b3480156105cd57600080fd5b5061027360075481565b3480156105e357600080fd5b506103816105f2366004612a4b565b61175d565b34801561060357600080fd5b5061027361222281565b34801561061957600080fd5b50610381610628366004612d33565b611835565b34801561063957600080fd5b506102a6610648366004612a65565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561068257600080fd5b50610273600d5481565b34801561069857600080fd5b50610273600c5481565b3480156106ae57600080fd5b506103816106bd366004612b3d565b6118a9565b3480156106ce57600080fd5b506103816106dd366004612d8a565b611944565b3480156106ee57600080fd5b506103816106fd366004612a4b565b611991565b60006001600160a01b0383166107855760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b031982167fd9b67a2600000000000000000000000000000000000000000000000000000000148061080e57506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061084257507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b606060045482106108c15760405162461bcd60e51b815260206004820152603060248201527f455243313135354d657461646174613a2055524920717565727920666f72206e60448201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000606482015260840161077c565b600b5460ff166108f35760066040516020016108dd9190612f39565b6040516020818303038152906040529050919050565b60056108fe83611a5e565b6040516020016108dd929190612f45565b919050565b6003546001600160a01b0316331461095c5760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b600b80549115156101000261ff0019909216919091179055565b6001600160a01b03851633148061099257506109928533610648565b610a045760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000606482015260840161077c565b610a118585858585611bb4565b5050505050565b6003546001600160a01b03163314610a605760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b4780610aae5760405162461bcd60e51b815260206004820181905260248201527f42616c616e63652073686f756c64206265206d6f7265207468656e207a65726f604482015260640161077c565b6003546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610ae8573d6000803e3d6000fd5b5050565b6003546001600160a01b03163314610b345760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b600b8054911515620100000262ff000019909216919091179055565b600b54610100900460ff16610ba75760405162461bcd60e51b815260206004820152601660248201527f436f6e7472616374206973206e6f742061637469766500000000000000000000604482015260640161077c565b600b5462010000900460ff1615610c005760405162461bcd60e51b815260206004820152601460248201527f50726573616c65207374696c6c20616374697665000000000000000000000000604482015260640161077c565b612222610c2a600d54610c248463ffffffff16600454611e2e90919063ffffffff16565b90611e41565b1115610c9e5760405162461bcd60e51b815260206004820152602f60248201527f507572636861736520776f756c6420657863656564206d6178207075626c696360448201527f20737570706c79206f66204e4654730000000000000000000000000000000000606482015260840161077c565b600954610cb49063ffffffff80841690611e4d16565b341015610d035760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161077c565b610d0d3382611e59565b50565b6003546001600160a01b03163314610d585760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b6122b8610d718251600454611e2e90919063ffffffff16565b10610de45760405162461bcd60e51b815260206004820152603860248201527f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360448201527f656564206e756d626572206f66204d415820746f6b656e730000000000000000606482015260840161077c565b6096610dfc8251600d54611e2e90919063ffffffff16565b1115610e4a5760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f7420646f2074686174206d75636820676976656177617900000000604482015260640161077c565b60005b8151811015610e9a57610e88828281518110610e7957634e487b7160e01b600052603260045260246000fd5b60200260200101516001611e59565b80610e928161317d565b915050610e4d565b508051600d54610ea991611e2e565b600d5550565b60608151835114610f285760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d617463680000000000000000000000000000000000000000000000606482015260840161077c565b6000835167ffffffffffffffff811115610f5257634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610f7b578160200160208202803683370190505b50905060005b845181101561101d57610fe2858281518110610fad57634e487b7160e01b600052603260045260246000fd5b6020026020010151858381518110610fd557634e487b7160e01b600052603260045260246000fd5b6020026020010151610702565b82828151811061100257634e487b7160e01b600052603260045260246000fd5b60209081029190910101526110168161317d565b9050610f81565b509392505050565b600b54610100900460ff1661107c5760405162461bcd60e51b815260206004820152601660248201527f436f6e7472616374206973206e6f742061637469766500000000000000000000604482015260640161077c565b600b5462010000900460ff166110d45760405162461bcd60e51b815260206004820152601260248201527f50726573616c65206e6f74206163746976650000000000000000000000000000604482015260640161077c565b6110de8133611526565b61112a5760405162461bcd60e51b815260206004820152600f60248201527f4e6f742077686974656c69737465640000000000000000000000000000000000604482015260640161077c565b612222611144600d54600454611e4190919063ffffffff16565b106111b75760405162461bcd60e51b815260206004820152602260248201527f416c6c207075626c696320746f6b656e732068617665206265656e206d696e7460448201527f6564000000000000000000000000000000000000000000000000000000000000606482015260840161077c565b6122226111db600d54610c248563ffffffff16600454611e2e90919063ffffffff16565b111561124f5760405162461bcd60e51b815260206004820152602f60248201527f507572636861736520776f756c6420657863656564206d6178207075626c696360448201527f20737570706c79206f66204e4654730000000000000000000000000000000000606482015260840161077c565b6009546112659063ffffffff80851690611e4d16565b3410156112b45760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161077c565b600754336000908152600860205260409020546112da9063ffffffff80861690611e2e16565b11156113285760405162461bcd60e51b815260206004820181905260248201527f50757263686173652065786365656473206d61782077686974656c6973746564604482015260640161077c565b6113323383611e59565b336000908152600860205260408120805463ffffffff85169290611357908490613083565b90915550505050565b6003546001600160a01b031633146113a85760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b600a548211156114205760405162461bcd60e51b815260206004820152603360248201527f546865207072696365206d75737420626520736d616c6c6572206f722065717560448201527f616c20746f204d41585f4e46545f505249434500000000000000000000000000606482015260840161077c565b600082116114705760405162461bcd60e51b815260206004820181905260248201527f546865207072696365206d7573742062652067726561746572207468616e2030604482015260640161077c565b600991909155600755565b6003546001600160a01b031633146114c35760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b600b805460ff19166001179055565b6003546001600160a01b0316331461151a5760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b6115246000612019565b565b600081815b845181101561166657600085828151811061155657634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116115df57604080516020810185905290810182905260029060600160408051601f198184030181529082905261159891612f1d565b602060405180830381855afa1580156115b5573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906115d89190612ce3565b9250611653565b604080516020810183905290810184905260029060600160408051601f198184030181529082905261161091612f1d565b602060405180830381855afa15801561162d573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906116509190612ce3565b92505b508061165e8161317d565b91505061152b565b50600c54149392505050565b336001600160a01b03831614156116f15760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c660000000000000000000000000000000000000000000000606482015260840161077c565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6003546001600160a01b031633146117a55760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b6004546122b8906117b7906001611e2e565b1061182a5760405162461bcd60e51b815260206004820152603860248201527f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360448201527f656564206e756d626572206f66204d415820746f6b656e730000000000000000606482015260840161077c565b610d0d816001611e59565b6003546001600160a01b0316331461187d5760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b8151611890906006906020850190612826565b5080516118a4906005906020840190612826565b505050565b6001600160a01b0385163314806118c557506118c58533610648565b6119375760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f7665640000000000000000000000000000000000000000000000606482015260840161077c565b610a118585858585612083565b6003546001600160a01b0316331461198c5760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b600c55565b6003546001600160a01b031633146119d95760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b6001600160a01b038116611a555760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161077c565b610d0d81612019565b606081611a9e57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611ac85780611ab28161317d565b9150611ac19050600a8361309b565b9150611aa2565b60008167ffffffffffffffff811115611af157634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611b1b576020820181803683370190505b5090505b8415611bac57611b306001836130ce565b9150611b3d600a866131bc565b611b48906030613083565b60f81b818381518110611b6b57634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611ba5600a8661309b565b9450611b1f565b949350505050565b8151835114611c165760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840161077c565b6001600160a01b038416611c7a5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161077c565b3360005b8451811015611dc0576000858281518110611ca957634e487b7160e01b600052603260045260246000fd5b602002602001015190506000858381518110611cd557634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015611d685760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161077c565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611da5908490613083565b9250508190555050505080611db99061317d565b9050611c7e565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611e1092919061301e565b60405180910390a4611e2681878787878761222a565b505050505050565b6000611e3a8284613083565b9392505050565b6000611e3a82846130ce565b6000611e3a82846130af565b60018163ffffffff161115611fe35760008163ffffffff1667ffffffffffffffff811115611e9757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611ec0578160200160208202803683370190505b50905060008263ffffffff1667ffffffffffffffff811115611ef257634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611f1b578160200160208202803683370190505b50905060005b8363ffffffff168163ffffffff161015611fc0578063ffffffff16600454611f499190613083565b838263ffffffff1681518110611f6f57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250506001828263ffffffff1681518110611fa357634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611fb881613198565b915050611f21565b50611fdc848383604051806020016040528060008152506123df565b5050612001565b612001826004546001604051806020016040528060008152506125c1565b8063ffffffff16600460008282546113579190613083565b600380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166120e75760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161077c565b336121008187876120f7886126c2565b610a11886126c2565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156121845760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161077c565b6000858152602081815260408083206001600160a01b038b81168552925280832087850390559088168252812080548692906121c1908490613083565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461222182888888888861271b565b50505050505050565b6001600160a01b0384163b15611e265760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061226e9089908990889088908890600401612f6a565b602060405180830381600087803b15801561228857600080fd5b505af19250505080156122b8575060408051601f3d908101601f191682019092526122b591810190612d17565b60015b61236e576122c4613212565b806308c379a014156122fe57506122d961322a565b806122e45750612300565b8060405162461bcd60e51b815260040161077c919061304c565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e746572000000000000000000000000606482015260840161077c565b6001600160e01b0319811663bc197c8160e01b146122215760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840161077c565b6001600160a01b03841661243f5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161077c565b81518351146124a15760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840161077c565b3360005b8451811015612559578381815181106124ce57634e487b7160e01b600052603260045260246000fd5b60200260200101516000808784815181106124f957634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546125419190613083565b909155508190506125518161317d565b9150506124a5565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516125aa92919061301e565b60405180910390a4610a118160008787878761222a565b6001600160a01b0384166126215760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161077c565b33612632816000876120f7886126c2565b6000848152602081815260408083206001600160a01b038916845290915281208054859290612662908490613083565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610a118160008787878761271b565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061270a57634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b6001600160a01b0384163b15611e265760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061275f9089908990889088908890600401612fc8565b602060405180830381600087803b15801561277957600080fd5b505af19250505080156127a9575060408051601f3d908101601f191682019092526127a691810190612d17565b60015b6127b5576122c4613212565b6001600160e01b0319811663f23a6e6160e01b146122215760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840161077c565b82805461283290613115565b90600052602060002090601f016020900481019282612854576000855561289a565b82601f1061286d57805160ff191683800117855561289a565b8280016001018555821561289a579182015b8281111561289a57825182559160200191906001019061287f565b506128a69291506128aa565b5090565b5b808211156128a657600081556001016128ab565b80356001600160a01b038116811461090f57600080fd5b600082601f8301126128e6578081fd5b813560206128f38261305f565b6040516129008282613150565b8381528281019150858301600585901b8701840188101561291f578586fd5b855b8581101561294457612932826128bf565b84529284019290840190600101612921565b5090979650505050505050565b600082601f830112612961578081fd5b8135602061296e8261305f565b60405161297b8282613150565b8381528281019150858301600585901b8701840188101561299a578586fd5b855b858110156129445781358452928401929084019060010161299c565b8035801515811461090f57600080fd5b600082601f8301126129d8578081fd5b813567ffffffffffffffff8111156129f2576129f26131fc565b604051612a09601f8301601f191660200182613150565b818152846020838601011115612a1d578283fd5b816020850160208301379081016020019190915292915050565b803563ffffffff8116811461090f57600080fd5b600060208284031215612a5c578081fd5b611e3a826128bf565b60008060408385031215612a77578081fd5b612a80836128bf565b9150612a8e602084016128bf565b90509250929050565b600080600080600060a08688031215612aae578081fd5b612ab7866128bf565b9450612ac5602087016128bf565b9350604086013567ffffffffffffffff80821115612ae1578283fd5b612aed89838a01612951565b94506060880135915080821115612b02578283fd5b612b0e89838a01612951565b93506080880135915080821115612b23578283fd5b50612b30888289016129c8565b9150509295509295909350565b600080600080600060a08688031215612b54578081fd5b612b5d866128bf565b9450612b6b602087016128bf565b93506040860135925060608601359150608086013567ffffffffffffffff811115612b94578182fd5b612b30888289016129c8565b60008060408385031215612bb2578081fd5b612bbb836128bf565b9150612a8e602084016129b8565b60008060408385031215612bdb578182fd5b612be4836128bf565b946020939093013593505050565b600060208284031215612c03578081fd5b813567ffffffffffffffff811115612c19578182fd5b611bac848285016128d6565b60008060408385031215612c37578182fd5b823567ffffffffffffffff80821115612c4e578384fd5b612c5a868387016128d6565b93506020850135915080821115612c6f578283fd5b50612c7c85828601612951565b9150509250929050565b60008060408385031215612c98578182fd5b823567ffffffffffffffff811115612cae578283fd5b612cba85828601612951565b95602094909401359450505050565b600060208284031215612cda578081fd5b611e3a826129b8565b600060208284031215612cf4578081fd5b5051919050565b600060208284031215612d0c578081fd5b8135611e3a816132b4565b600060208284031215612d28578081fd5b8151611e3a816132b4565b60008060408385031215612d45578182fd5b823567ffffffffffffffff80821115612d5c578384fd5b612d68868387016129c8565b93506020850135915080821115612d7d578283fd5b50612c7c858286016129c8565b600060208284031215612d9b578081fd5b5035919050565b60008060408385031215612db4578182fd5b50508035926020909101359150565b600060208284031215612dd4578081fd5b611e3a82612a37565b60008060408385031215612def578182fd5b612df883612a37565b9150602083013567ffffffffffffffff811115612e13578182fd5b612c7c85828601612951565b6000815180845260208085019450808401835b83811015612e4e57815187529582019590820190600101612e32565b509495945050505050565b60008151808452612e718160208601602086016130e5565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680612e9f57607f831692505b6020808410821415612ebf57634e487b7160e01b86526022600452602486fd5b818015612ed35760018114612ee457612f11565b60ff19861689528489019650612f11565b60008881526020902060005b86811015612f095781548b820152908501908301612ef0565b505084890196505b50505050505092915050565b60008251612f2f8184602087016130e5565b9190910192915050565b6000611e3a8284612e85565b6000612f518285612e85565b8351612f618183602088016130e5565b01949350505050565b60006001600160a01b03808816835280871660208401525060a06040830152612f9660a0830186612e1f565b8281036060840152612fa88186612e1f565b90508281036080840152612fbc8185612e59565b98975050505050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261300060a0830184612e59565b979650505050505050565b602081526000611e3a6020830184612e1f565b6040815260006130316040830185612e1f565b82810360208401526130438185612e1f565b95945050505050565b602081526000611e3a6020830184612e59565b600067ffffffffffffffff821115613079576130796131fc565b5060051b60200190565b60008219821115613096576130966131d0565b500190565b6000826130aa576130aa6131e6565b500490565b60008160001904831182151516156130c9576130c96131d0565b500290565b6000828210156130e0576130e06131d0565b500390565b60005b838110156131005781810151838201526020016130e8565b8381111561310f576000848401525b50505050565b600181811c9082168061312957607f821691505b6020821081141561314a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715613176576131766131fc565b6040525050565b6000600019821415613191576131916131d0565b5060010190565b600063ffffffff808316818114156131b2576131b26131d0565b6001019392505050565b6000826131cb576131cb6131e6565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d111561322757600481823e5160e01c5b90565b600060443d10156132385790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561326857505050505090565b82850191508151818111156132805750505050505090565b843d870101602082850101111561329a5750505050505090565b6132a960208286010187613150565b509095945050505050565b6001600160e01b031981168114610d0d57600080fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220aab21d2172f81b0d402fbd27be4d0787715ebbe09c75bccee449066f7f6f0ff064736f6c63430008040033
Deployed Bytecode
0x60806040526004361061024e5760003560e01c8063715018a611610138578063b533731d116100b0578063e9be0f3f1161007f578063f242432a11610064578063f242432a146106a2578063f2f5a7e5146106c2578063f2fde38b146106e257600080fd5b8063e9be0f3f14610676578063ebf0c7171461068c57600080fd5b8063b533731d146105d7578063d1d80f30146105f7578063e82541741461060d578063e985e9c51461062d57600080fd5b8063972a2a6211610107578063a38bffda116100ec578063a38bffda14610591578063a475b5dd146105a7578063aeb16768146105c157600080fd5b8063972a2a6214610551578063a22cb4651461057157600080fd5b8063715018a6146104b55780638cdb9069146104ca5780638da5cb5b146104e057806395d89b411461050857600080fd5b80633f8121a2116101cb5780634e1273f41161019a578063566d00f41161017f578063566d00f4146104605780635f0f45b21461048057806360d938dc1461049557600080fd5b80634e1273f414610420578063560b26081461044d57600080fd5b80633f8121a2146103b857806341de0e52146103d8578063459ba3ae146103eb5780634cdb44001461040057600080fd5b806318160ddd116102225780632750fc78116102075780632750fc78146103615780632eb2c2d6146103835780633ccfd60b146103a357600080fd5b806318160ddd1461032c57806322f3e2d41461034257600080fd5b8062fdd58e1461025357806301ffc9a71461028657806306fdde03146102b65780630e89341c1461030c575b600080fd5b34801561025f57600080fd5b5061027361026e366004612bc9565b610702565b6040519081526020015b60405180910390f35b34801561029257600080fd5b506102a66102a1366004612cfb565b6107ab565b604051901515815260200161027d565b3480156102c257600080fd5b506102ff6040518060400160405280601381526020017f4379626f72674d657263656e6172696573436d0000000000000000000000000081525081565b60405161027d919061304c565b34801561031857600080fd5b506102ff610327366004612d8a565b610848565b34801561033857600080fd5b5061027360045481565b34801561034e57600080fd5b50600b546102a690610100900460ff1681565b34801561036d57600080fd5b5061038161037c366004612cc9565b610914565b005b34801561038f57600080fd5b5061038161039e366004612a97565b610976565b3480156103af57600080fd5b50610381610a18565b3480156103c457600080fd5b506103816103d3366004612cc9565b610aec565b6103816103e6366004612dc3565b610b50565b3480156103f757600080fd5b50610273609681565b34801561040c57600080fd5b5061038161041b366004612bf2565b610d10565b34801561042c57600080fd5b5061044061043b366004612c25565b610eaf565b60405161027d919061300b565b61038161045b366004612ddd565b611025565b34801561046c57600080fd5b5061038161047b366004612da2565b611360565b34801561048c57600080fd5b5061038161147b565b3480156104a157600080fd5b50600b546102a69062010000900460ff1681565b3480156104c157600080fd5b506103816114d2565b3480156104d657600080fd5b50610273600a5481565b3480156104ec57600080fd5b506003546040516001600160a01b03909116815260200161027d565b34801561051457600080fd5b506102ff6040518060400160405280600681526020017f4359424f5247000000000000000000000000000000000000000000000000000081525081565b34801561055d57600080fd5b506102a661056c366004612c86565b611526565b34801561057d57600080fd5b5061038161058c366004612ba0565b611672565b34801561059d57600080fd5b5061027360095481565b3480156105b357600080fd5b50600b546102a69060ff1681565b3480156105cd57600080fd5b5061027360075481565b3480156105e357600080fd5b506103816105f2366004612a4b565b61175d565b34801561060357600080fd5b5061027361222281565b34801561061957600080fd5b50610381610628366004612d33565b611835565b34801561063957600080fd5b506102a6610648366004612a65565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561068257600080fd5b50610273600d5481565b34801561069857600080fd5b50610273600c5481565b3480156106ae57600080fd5b506103816106bd366004612b3d565b6118a9565b3480156106ce57600080fd5b506103816106dd366004612d8a565b611944565b3480156106ee57600080fd5b506103816106fd366004612a4b565b611991565b60006001600160a01b0383166107855760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b031982167fd9b67a2600000000000000000000000000000000000000000000000000000000148061080e57506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061084257507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b606060045482106108c15760405162461bcd60e51b815260206004820152603060248201527f455243313135354d657461646174613a2055524920717565727920666f72206e60448201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000606482015260840161077c565b600b5460ff166108f35760066040516020016108dd9190612f39565b6040516020818303038152906040529050919050565b60056108fe83611a5e565b6040516020016108dd929190612f45565b919050565b6003546001600160a01b0316331461095c5760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b600b80549115156101000261ff0019909216919091179055565b6001600160a01b03851633148061099257506109928533610648565b610a045760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000606482015260840161077c565b610a118585858585611bb4565b5050505050565b6003546001600160a01b03163314610a605760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b4780610aae5760405162461bcd60e51b815260206004820181905260248201527f42616c616e63652073686f756c64206265206d6f7265207468656e207a65726f604482015260640161077c565b6003546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610ae8573d6000803e3d6000fd5b5050565b6003546001600160a01b03163314610b345760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b600b8054911515620100000262ff000019909216919091179055565b600b54610100900460ff16610ba75760405162461bcd60e51b815260206004820152601660248201527f436f6e7472616374206973206e6f742061637469766500000000000000000000604482015260640161077c565b600b5462010000900460ff1615610c005760405162461bcd60e51b815260206004820152601460248201527f50726573616c65207374696c6c20616374697665000000000000000000000000604482015260640161077c565b612222610c2a600d54610c248463ffffffff16600454611e2e90919063ffffffff16565b90611e41565b1115610c9e5760405162461bcd60e51b815260206004820152602f60248201527f507572636861736520776f756c6420657863656564206d6178207075626c696360448201527f20737570706c79206f66204e4654730000000000000000000000000000000000606482015260840161077c565b600954610cb49063ffffffff80841690611e4d16565b341015610d035760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161077c565b610d0d3382611e59565b50565b6003546001600160a01b03163314610d585760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b6122b8610d718251600454611e2e90919063ffffffff16565b10610de45760405162461bcd60e51b815260206004820152603860248201527f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360448201527f656564206e756d626572206f66204d415820746f6b656e730000000000000000606482015260840161077c565b6096610dfc8251600d54611e2e90919063ffffffff16565b1115610e4a5760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f7420646f2074686174206d75636820676976656177617900000000604482015260640161077c565b60005b8151811015610e9a57610e88828281518110610e7957634e487b7160e01b600052603260045260246000fd5b60200260200101516001611e59565b80610e928161317d565b915050610e4d565b508051600d54610ea991611e2e565b600d5550565b60608151835114610f285760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d617463680000000000000000000000000000000000000000000000606482015260840161077c565b6000835167ffffffffffffffff811115610f5257634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610f7b578160200160208202803683370190505b50905060005b845181101561101d57610fe2858281518110610fad57634e487b7160e01b600052603260045260246000fd5b6020026020010151858381518110610fd557634e487b7160e01b600052603260045260246000fd5b6020026020010151610702565b82828151811061100257634e487b7160e01b600052603260045260246000fd5b60209081029190910101526110168161317d565b9050610f81565b509392505050565b600b54610100900460ff1661107c5760405162461bcd60e51b815260206004820152601660248201527f436f6e7472616374206973206e6f742061637469766500000000000000000000604482015260640161077c565b600b5462010000900460ff166110d45760405162461bcd60e51b815260206004820152601260248201527f50726573616c65206e6f74206163746976650000000000000000000000000000604482015260640161077c565b6110de8133611526565b61112a5760405162461bcd60e51b815260206004820152600f60248201527f4e6f742077686974656c69737465640000000000000000000000000000000000604482015260640161077c565b612222611144600d54600454611e4190919063ffffffff16565b106111b75760405162461bcd60e51b815260206004820152602260248201527f416c6c207075626c696320746f6b656e732068617665206265656e206d696e7460448201527f6564000000000000000000000000000000000000000000000000000000000000606482015260840161077c565b6122226111db600d54610c248563ffffffff16600454611e2e90919063ffffffff16565b111561124f5760405162461bcd60e51b815260206004820152602f60248201527f507572636861736520776f756c6420657863656564206d6178207075626c696360448201527f20737570706c79206f66204e4654730000000000000000000000000000000000606482015260840161077c565b6009546112659063ffffffff80851690611e4d16565b3410156112b45760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161077c565b600754336000908152600860205260409020546112da9063ffffffff80861690611e2e16565b11156113285760405162461bcd60e51b815260206004820181905260248201527f50757263686173652065786365656473206d61782077686974656c6973746564604482015260640161077c565b6113323383611e59565b336000908152600860205260408120805463ffffffff85169290611357908490613083565b90915550505050565b6003546001600160a01b031633146113a85760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b600a548211156114205760405162461bcd60e51b815260206004820152603360248201527f546865207072696365206d75737420626520736d616c6c6572206f722065717560448201527f616c20746f204d41585f4e46545f505249434500000000000000000000000000606482015260840161077c565b600082116114705760405162461bcd60e51b815260206004820181905260248201527f546865207072696365206d7573742062652067726561746572207468616e2030604482015260640161077c565b600991909155600755565b6003546001600160a01b031633146114c35760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b600b805460ff19166001179055565b6003546001600160a01b0316331461151a5760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b6115246000612019565b565b600081815b845181101561166657600085828151811061155657634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116115df57604080516020810185905290810182905260029060600160408051601f198184030181529082905261159891612f1d565b602060405180830381855afa1580156115b5573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906115d89190612ce3565b9250611653565b604080516020810183905290810184905260029060600160408051601f198184030181529082905261161091612f1d565b602060405180830381855afa15801561162d573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906116509190612ce3565b92505b508061165e8161317d565b91505061152b565b50600c54149392505050565b336001600160a01b03831614156116f15760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c660000000000000000000000000000000000000000000000606482015260840161077c565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6003546001600160a01b031633146117a55760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b6004546122b8906117b7906001611e2e565b1061182a5760405162461bcd60e51b815260206004820152603860248201527f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360448201527f656564206e756d626572206f66204d415820746f6b656e730000000000000000606482015260840161077c565b610d0d816001611e59565b6003546001600160a01b0316331461187d5760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b8151611890906006906020850190612826565b5080516118a4906005906020840190612826565b505050565b6001600160a01b0385163314806118c557506118c58533610648565b6119375760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f7665640000000000000000000000000000000000000000000000606482015260840161077c565b610a118585858585612083565b6003546001600160a01b0316331461198c5760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b600c55565b6003546001600160a01b031633146119d95760405162461bcd60e51b815260206004820181905260248201526000805160206132cb833981519152604482015260640161077c565b6001600160a01b038116611a555760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161077c565b610d0d81612019565b606081611a9e57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611ac85780611ab28161317d565b9150611ac19050600a8361309b565b9150611aa2565b60008167ffffffffffffffff811115611af157634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611b1b576020820181803683370190505b5090505b8415611bac57611b306001836130ce565b9150611b3d600a866131bc565b611b48906030613083565b60f81b818381518110611b6b57634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611ba5600a8661309b565b9450611b1f565b949350505050565b8151835114611c165760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840161077c565b6001600160a01b038416611c7a5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161077c565b3360005b8451811015611dc0576000858281518110611ca957634e487b7160e01b600052603260045260246000fd5b602002602001015190506000858381518110611cd557634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015611d685760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161077c565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611da5908490613083565b9250508190555050505080611db99061317d565b9050611c7e565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611e1092919061301e565b60405180910390a4611e2681878787878761222a565b505050505050565b6000611e3a8284613083565b9392505050565b6000611e3a82846130ce565b6000611e3a82846130af565b60018163ffffffff161115611fe35760008163ffffffff1667ffffffffffffffff811115611e9757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611ec0578160200160208202803683370190505b50905060008263ffffffff1667ffffffffffffffff811115611ef257634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611f1b578160200160208202803683370190505b50905060005b8363ffffffff168163ffffffff161015611fc0578063ffffffff16600454611f499190613083565b838263ffffffff1681518110611f6f57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250506001828263ffffffff1681518110611fa357634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611fb881613198565b915050611f21565b50611fdc848383604051806020016040528060008152506123df565b5050612001565b612001826004546001604051806020016040528060008152506125c1565b8063ffffffff16600460008282546113579190613083565b600380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166120e75760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161077c565b336121008187876120f7886126c2565b610a11886126c2565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156121845760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161077c565b6000858152602081815260408083206001600160a01b038b81168552925280832087850390559088168252812080548692906121c1908490613083565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461222182888888888861271b565b50505050505050565b6001600160a01b0384163b15611e265760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061226e9089908990889088908890600401612f6a565b602060405180830381600087803b15801561228857600080fd5b505af19250505080156122b8575060408051601f3d908101601f191682019092526122b591810190612d17565b60015b61236e576122c4613212565b806308c379a014156122fe57506122d961322a565b806122e45750612300565b8060405162461bcd60e51b815260040161077c919061304c565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e746572000000000000000000000000606482015260840161077c565b6001600160e01b0319811663bc197c8160e01b146122215760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840161077c565b6001600160a01b03841661243f5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161077c565b81518351146124a15760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840161077c565b3360005b8451811015612559578381815181106124ce57634e487b7160e01b600052603260045260246000fd5b60200260200101516000808784815181106124f957634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546125419190613083565b909155508190506125518161317d565b9150506124a5565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516125aa92919061301e565b60405180910390a4610a118160008787878761222a565b6001600160a01b0384166126215760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161077c565b33612632816000876120f7886126c2565b6000848152602081815260408083206001600160a01b038916845290915281208054859290612662908490613083565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610a118160008787878761271b565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061270a57634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b6001600160a01b0384163b15611e265760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061275f9089908990889088908890600401612fc8565b602060405180830381600087803b15801561277957600080fd5b505af19250505080156127a9575060408051601f3d908101601f191682019092526127a691810190612d17565b60015b6127b5576122c4613212565b6001600160e01b0319811663f23a6e6160e01b146122215760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840161077c565b82805461283290613115565b90600052602060002090601f016020900481019282612854576000855561289a565b82601f1061286d57805160ff191683800117855561289a565b8280016001018555821561289a579182015b8281111561289a57825182559160200191906001019061287f565b506128a69291506128aa565b5090565b5b808211156128a657600081556001016128ab565b80356001600160a01b038116811461090f57600080fd5b600082601f8301126128e6578081fd5b813560206128f38261305f565b6040516129008282613150565b8381528281019150858301600585901b8701840188101561291f578586fd5b855b8581101561294457612932826128bf565b84529284019290840190600101612921565b5090979650505050505050565b600082601f830112612961578081fd5b8135602061296e8261305f565b60405161297b8282613150565b8381528281019150858301600585901b8701840188101561299a578586fd5b855b858110156129445781358452928401929084019060010161299c565b8035801515811461090f57600080fd5b600082601f8301126129d8578081fd5b813567ffffffffffffffff8111156129f2576129f26131fc565b604051612a09601f8301601f191660200182613150565b818152846020838601011115612a1d578283fd5b816020850160208301379081016020019190915292915050565b803563ffffffff8116811461090f57600080fd5b600060208284031215612a5c578081fd5b611e3a826128bf565b60008060408385031215612a77578081fd5b612a80836128bf565b9150612a8e602084016128bf565b90509250929050565b600080600080600060a08688031215612aae578081fd5b612ab7866128bf565b9450612ac5602087016128bf565b9350604086013567ffffffffffffffff80821115612ae1578283fd5b612aed89838a01612951565b94506060880135915080821115612b02578283fd5b612b0e89838a01612951565b93506080880135915080821115612b23578283fd5b50612b30888289016129c8565b9150509295509295909350565b600080600080600060a08688031215612b54578081fd5b612b5d866128bf565b9450612b6b602087016128bf565b93506040860135925060608601359150608086013567ffffffffffffffff811115612b94578182fd5b612b30888289016129c8565b60008060408385031215612bb2578081fd5b612bbb836128bf565b9150612a8e602084016129b8565b60008060408385031215612bdb578182fd5b612be4836128bf565b946020939093013593505050565b600060208284031215612c03578081fd5b813567ffffffffffffffff811115612c19578182fd5b611bac848285016128d6565b60008060408385031215612c37578182fd5b823567ffffffffffffffff80821115612c4e578384fd5b612c5a868387016128d6565b93506020850135915080821115612c6f578283fd5b50612c7c85828601612951565b9150509250929050565b60008060408385031215612c98578182fd5b823567ffffffffffffffff811115612cae578283fd5b612cba85828601612951565b95602094909401359450505050565b600060208284031215612cda578081fd5b611e3a826129b8565b600060208284031215612cf4578081fd5b5051919050565b600060208284031215612d0c578081fd5b8135611e3a816132b4565b600060208284031215612d28578081fd5b8151611e3a816132b4565b60008060408385031215612d45578182fd5b823567ffffffffffffffff80821115612d5c578384fd5b612d68868387016129c8565b93506020850135915080821115612d7d578283fd5b50612c7c858286016129c8565b600060208284031215612d9b578081fd5b5035919050565b60008060408385031215612db4578182fd5b50508035926020909101359150565b600060208284031215612dd4578081fd5b611e3a82612a37565b60008060408385031215612def578182fd5b612df883612a37565b9150602083013567ffffffffffffffff811115612e13578182fd5b612c7c85828601612951565b6000815180845260208085019450808401835b83811015612e4e57815187529582019590820190600101612e32565b509495945050505050565b60008151808452612e718160208601602086016130e5565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680612e9f57607f831692505b6020808410821415612ebf57634e487b7160e01b86526022600452602486fd5b818015612ed35760018114612ee457612f11565b60ff19861689528489019650612f11565b60008881526020902060005b86811015612f095781548b820152908501908301612ef0565b505084890196505b50505050505092915050565b60008251612f2f8184602087016130e5565b9190910192915050565b6000611e3a8284612e85565b6000612f518285612e85565b8351612f618183602088016130e5565b01949350505050565b60006001600160a01b03808816835280871660208401525060a06040830152612f9660a0830186612e1f565b8281036060840152612fa88186612e1f565b90508281036080840152612fbc8185612e59565b98975050505050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261300060a0830184612e59565b979650505050505050565b602081526000611e3a6020830184612e1f565b6040815260006130316040830185612e1f565b82810360208401526130438185612e1f565b95945050505050565b602081526000611e3a6020830184612e59565b600067ffffffffffffffff821115613079576130796131fc565b5060051b60200190565b60008219821115613096576130966131d0565b500190565b6000826130aa576130aa6131e6565b500490565b60008160001904831182151516156130c9576130c96131d0565b500290565b6000828210156130e0576130e06131d0565b500390565b60005b838110156131005781810151838201526020016130e8565b8381111561310f576000848401525b50505050565b600181811c9082168061312957607f821691505b6020821081141561314a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715613176576131766131fc565b6040525050565b6000600019821415613191576131916131d0565b5060010190565b600063ffffffff808316818114156131b2576131b26131d0565b6001019392505050565b6000826131cb576131cb6131e6565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d111561322757600481823e5160e01c5b90565b600060443d10156132385790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561326857505050505090565b82850191508151818111156132805750505050505090565b843d870101602082850101111561329a5750505050505090565b6132a960208286010187613150565b509095945050505050565b6001600160e01b031981168114610d0d57600080fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220aab21d2172f81b0d402fbd27be4d0787715ebbe09c75bccee449066f7f6f0ff064736f6c63430008040033
Deployed Bytecode Sourcemap
42866:7362:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20880:231;;;;;;;;;;-1:-1:-1;20880:231:0;;;;;:::i;:::-;;:::i;:::-;;;15693:25:1;;;15681:2;15666:18;20880:231:0;;;;;;;;19903:310;;;;;;;;;;-1:-1:-1;19903:310:0;;;;;:::i;:::-;;:::i;:::-;;;15520:14:1;;15513:22;15495:41;;15483:2;15468:18;19903:310:0;15450:92:1;42922:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;48774:441::-;;;;;;;;;;-1:-1:-1;48774:441:0;;;;;:::i;:::-;;:::i;43098:30::-;;;;;;;;;;;;;;;;43599:20;;;;;;;;;;-1:-1:-1;43599:20:0;;;;;;;;;;;44548:137;;;;;;;;;;-1:-1:-1;44548:137:0;;;;;:::i;:::-;;:::i;:::-;;22975:442;;;;;;;;;;-1:-1:-1;22975:442:0;;;;;:::i;:::-;;:::i;45760:236::-;;;;;;;;;;;;;:::i;45231:158::-;;;;;;;;;;-1:-1:-1;45231:158:0;;;;;:::i;:::-;;:::i;46163:495::-;;;;;;:::i;:::-;;:::i;43292:39::-;;;;;;;;;;;;43328:3;43292:39;;48155:471;;;;;;;;;;-1:-1:-1;48155:471:0;;;;;:::i;:::-;;:::i;21277:524::-;;;;;;;;;;-1:-1:-1;21277:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46820:921::-;;;;;;:::i;:::-;;:::i;44784:341::-;;;;;;;;;;-1:-1:-1;44784:341:0;;;;;:::i;:::-;;:::i;43773:98::-;;;;;;;;;;;;;:::i;43626:27::-;;;;;;;;;;-1:-1:-1;43626:27:0;;;;;;;;;;;1433:94;;;;;;;;;;;;;:::i;43505:49::-;;;;;;;;;;;;;;;;782:87;;;;;;;;;;-1:-1:-1;855:6:0;;782:87;;-1:-1:-1;;;;;855:6:0;;;13092:74:1;;13080:2;13065:18;782:87:0;13047:125:1;42980:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49439:786;;;;;;;;;;-1:-1:-1;49439:786:0;;;;;:::i;:::-;;:::i;21874:311::-;;;;;;;;;;-1:-1:-1;21874:311:0;;;;;:::i;:::-;;:::i;43441:44::-;;;;;;;;;;;;;;;;43574:18;;;;;;;;;;-1:-1:-1;43574:18:0;;;;;;;;43338:37;;;;;;;;;;;;;;;;47833:230;;;;;;;;;;-1:-1:-1;47833:230:0;;;;;:::i;:::-;;:::i;43194:45::-;;;;;;;;;;;;43235:4;43194:45;;45461:197;;;;;;;;;;-1:-1:-1;45461:197:0;;;;;:::i;:::-;;:::i;22257:168::-;;;;;;;;;;-1:-1:-1;22257:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;22380:27:0;;;22356:4;22380:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;22257:168;43686:28;;;;;;;;;;;;;;;;43660:19;;;;;;;;;;;;;;;;22497:401;;;;;;;;;;-1:-1:-1;22497:401:0;;;;;:::i;:::-;;:::i;49283:91::-;;;;;;;;;;-1:-1:-1;49283:91:0;;;;;:::i;:::-;;:::i;1682:192::-;;;;;;;;;;-1:-1:-1;1682:192:0;;;;;:::i;:::-;;:::i;20880:231::-;20966:7;-1:-1:-1;;;;;20994:21:0;;20986:77;;;;-1:-1:-1;;;20986:77:0;;16985:2:1;20986:77:0;;;16967:21:1;17024:2;17004:18;;;16997:30;17063:34;17043:18;;;17036:62;17134:13;17114:18;;;17107:41;17165:19;;20986:77:0;;;;;;;;;-1:-1:-1;21081:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;21081:22:0;;;;;;;;;;;;20880:231::o;19903:310::-;20005:4;-1:-1:-1;;;;;;20042:41:0;;20057:26;20042:41;;:110;;-1:-1:-1;;;;;;;20100:52:0;;20115:37;20100:52;20042:110;:163;;;-1:-1:-1;11837:25:0;-1:-1:-1;;;;;;11822:40:0;;;20169:36;20022:183;19903:310;-1:-1:-1;;19903:310:0:o;48774:441::-;48909:13;48958:11;;48949:8;:20;48941:81;;;;-1:-1:-1;;;48941:81:0;;23129:2:1;48941:81:0;;;23111:21:1;23168:2;23148:18;;;23141:30;23207:34;23187:18;;;23180:62;23278:18;23258;;;23251:46;23314:19;;48941:81:0;23101:238:1;48941:81:0;49038:6;;;;49033:175;;49092:8;49075:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;49061:41;;48774:441;;;:::o;49033:175::-;49166:7;49175:19;:8;:17;:19::i;:::-;49149:46;;;;;;;;;:::i;49033:175::-;48774:441;;;:::o;44548:137::-;855:6;;-1:-1:-1;;;;;855:6:0;245:10;1002:23;994:68;;;;-1:-1:-1;;;994:68:0;;22768:2:1;994:68:0;;;22750:21:1;;;22787:18;;;22780:30;-1:-1:-1;;;;;;;;;;;22826:18:1;;;22819:62;22898:18;;994:68:0;22740:182:1;994:68:0;44657:8:::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;44657:20:0;;::::1;::::0;;;::::1;::::0;;44548:137::o;22975:442::-;-1:-1:-1;;;;;23208:20:0;;245:10;23208:20;;:60;;-1:-1:-1;23232:36:0;23249:4;245:10;22257:168;:::i;23232:36::-;23186:160;;;;-1:-1:-1;;;23186:160:0;;20457:2:1;23186:160:0;;;20439:21:1;20496:2;20476:18;;;20469:30;20535:34;20515:18;;;20508:62;20606:20;20586:18;;;20579:48;20644:19;;23186:160:0;20429:240:1;23186:160:0;23357:52;23380:4;23386:2;23390:3;23395:7;23404:4;23357:22;:52::i;:::-;22975:442;;;;;:::o;45760:236::-;855:6;;-1:-1:-1;;;;;855:6:0;245:10;1002:23;994:68;;;;-1:-1:-1;;;994:68:0;;22768:2:1;994:68:0;;;22750:21:1;;;22787:18;;;22780:30;-1:-1:-1;;;;;;;;;;;22826:18:1;;;22819:62;22898:18;;994:68:0;22740:182:1;994:68:0;45855:21:::1;45895:11:::0;45887:56:::1;;;::::0;-1:-1:-1;;;45887:56:0;;19690:2:1;45887:56:0::1;::::0;::::1;19672:21:1::0;;;19709:18;;;19702:30;19768:34;19748:18;;;19741:62;19820:18;;45887:56:0::1;19662:182:1::0;45887:56:0::1;855:6:::0;;45954:34:::1;::::0;-1:-1:-1;;;;;855:6:0;;;;45954:34;::::1;;;::::0;45980:7;;45954:34:::1;::::0;;;45980:7;855:6;45954:34;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;1073:1;45760:236::o:0;45231:158::-;855:6;;-1:-1:-1;;;;;855:6:0;245:10;1002:23;994:68;;;;-1:-1:-1;;;994:68:0;;22768:2:1;994:68:0;;;22750:21:1;;;22787:18;;;22780:30;-1:-1:-1;;;;;;;;;;;22826:18:1;;;22819:62;22898:18;;994:68:0;22740:182:1;994:68:0;45354:15:::1;:27:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;45354:27:0;;::::1;::::0;;;::::1;::::0;;45231:158::o;46163:495::-;46283:8;;;;;;;46275:43;;;;-1:-1:-1;;;46275:43:0;;22056:2:1;46275:43:0;;;22038:21:1;22095:2;22075:18;;;22068:30;22134:24;22114:18;;;22107:52;22176:18;;46275:43:0;22028:172:1;46275:43:0;46338:15;;;;;;;46337:16;46329:49;;;;-1:-1:-1;;;46329:49:0;;17804:2:1;46329:49:0;;;17786:21:1;17843:2;17823:18;;;17816:30;17882:22;17862:18;;;17855:50;17922:18;;46329:49:0;17776:170:1;46329:49:0;43235:4;46397:48;46431:13;;46397:29;46413:12;46397:29;;:11;;:15;;:29;;;;:::i;:::-;:33;;:48::i;:::-;:66;;46389:126;;;;-1:-1:-1;;;46389:126:0;;23546:2:1;46389:126:0;;;23528:21:1;23585:2;23565:18;;;23558:30;23624:34;23604:18;;;23597:62;23695:17;23675:18;;;23668:45;23730:19;;46389:126:0;23518:237:1;46389:126:0;46548:8;;:26;;;;;;;:12;:26;:::i;:::-;46535:9;:39;;46526:84;;;;-1:-1:-1;;;46526:84:0;;19330:2:1;46526:84:0;;;19312:21:1;19369:2;19349:18;;;19342:30;19408:33;19388:18;;;19381:61;19459:18;;46526:84:0;19302:181:1;46526:84:0;46621:29;46626:10;46637:12;46621:4;:29::i;:::-;46163:495;:::o;48155:471::-;855:6;;-1:-1:-1;;;;;855:6:0;245:10;1002:23;994:68;;;;-1:-1:-1;;;994:68:0;;22768:2:1;994:68:0;;;22750:21:1;;;22787:18;;;22780:30;-1:-1:-1;;;;;;;;;;;22826:18:1;;;22819:62;22898:18;;994:68:0;22740:182:1;994:68:0;43281:4:::1;48283:27;48299:3;:10;48283:11;;:15;;:27;;;;:::i;:::-;:37;48275:106;;;::::0;-1:-1:-1;;;48275:106:0;;21220:2:1;48275:106:0::1;::::0;::::1;21202:21:1::0;21259:2;21239:18;;;21232:30;21298:34;21278:18;;;21271:62;21369:26;21349:18;;;21342:54;21413:19;;48275:106:0::1;21192:246:1::0;48275:106:0::1;43328:3;48400:29;48418:3;:10;48400:13;;:17;;:29;;;;:::i;:::-;:42;;48392:82;;;::::0;-1:-1:-1;;;48392:82:0;;26357:2:1;48392:82:0::1;::::0;::::1;26339:21:1::0;26396:2;26376:18;;;26369:30;26435;26415:18;;;26408:58;26483:18;;48392:82:0::1;26329:178:1::0;48392:82:0::1;48489:9;48485:80;48508:3;:10;48504:1;:14;48485:80;;;48539:14;48544:3;48548:1;48544:6;;;;;;-1:-1:-1::0;;;48544:6:0::1;;;;;;;;;;;;;;;48551:1;48539:4;:14::i;:::-;48520:3:::0;::::1;::::0;::::1;:::i;:::-;;;;48485:80;;;-1:-1:-1::0;48607:10:0;;48589:13:::1;::::0;:29:::1;::::0;:17:::1;:29::i;:::-;48575:13;:43:::0;-1:-1:-1;48155:471:0:o;21277:524::-;21433:16;21494:3;:10;21475:8;:15;:29;21467:83;;;;-1:-1:-1;;;21467:83:0;;24733:2:1;21467:83:0;;;24715:21:1;24772:2;24752:18;;;24745:30;24811:34;24791:18;;;24784:62;24882:11;24862:18;;;24855:39;24911:19;;21467:83:0;24705:231:1;21467:83:0;21563:30;21610:8;:15;21596:30;;;;;;-1:-1:-1;;;21596:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21596:30:0;;21563:63;;21644:9;21639:122;21663:8;:15;21659:1;:19;21639:122;;;21719:30;21729:8;21738:1;21729:11;;;;;;-1:-1:-1;;;21729:11:0;;;;;;;;;;;;;;;21742:3;21746:1;21742:6;;;;;;-1:-1:-1;;;21742:6:0;;;;;;;;;;;;;;;21719:9;:30::i;:::-;21700:13;21714:1;21700:16;;;;;;-1:-1:-1;;;21700:16:0;;;;;;;;;;;;;;;;;;:49;21680:3;;;:::i;:::-;;;21639:122;;;-1:-1:-1;21780:13:0;21277:524;-1:-1:-1;;;21277:524:0:o;46820:921::-;46980:8;;;;;;;46972:43;;;;-1:-1:-1;;;46972:43:0;;22056:2:1;46972:43:0;;;22038:21:1;22095:2;22075:18;;;22068:30;22134:24;22114:18;;;22107:52;22176:18;;46972:43:0;22028:172:1;46972:43:0;47034:15;;;;;;;47026:46;;;;-1:-1:-1;;;47026:46:0;;18983:2:1;47026:46:0;;;18965:21:1;19022:2;19002:18;;;18995:30;19061:20;19041:18;;;19034:48;19099:18;;47026:46:0;18955:168:1;47026:46:0;47091:53;47098:6;47130:10;47091:6;:53::i;:::-;47083:81;;;;-1:-1:-1;;;47083:81:0;;20876:2:1;47083:81:0;;;20858:21:1;20915:2;20895:18;;;20888:30;20954:17;20934:18;;;20927:45;20989:18;;47083:81:0;20848:165:1;47083:81:0;43235:4;47183:30;47199:13;;47183:11;;:15;;:30;;;;:::i;:::-;:47;47175:94;;;;-1:-1:-1;;;47175:94:0;;25143:2:1;47175:94:0;;;25125:21:1;25182:2;25162:18;;;25155:30;25221:34;25201:18;;;25194:62;25292:4;25272:18;;;25265:32;25314:19;;47175:94:0;25115:224:1;47175:94:0;43235:4;47288:48;47322:13;;47288:29;47304:12;47288:29;;:11;;:15;;:29;;;;:::i;:48::-;:66;;47280:126;;;;-1:-1:-1;;;47280:126:0;;23546:2:1;47280:126:0;;;23528:21:1;23585:2;23565:18;;;23558:30;23624:34;23604:18;;;23597:62;23695:17;23675:18;;;23668:45;23730:19;;47280:126:0;23518:237:1;47280:126:0;47439:8;;:26;;;;;;;:12;:26;:::i;:::-;47426:9;:39;;47417:84;;;;-1:-1:-1;;;47417:84:0;;19330:2:1;47417:84:0;;;19312:21:1;19369:2;19349:18;;;19342:30;19408:33;19388:18;;;19381:61;19459:18;;47417:84:0;19302:181:1;47417:84:0;47570:18;;47537:10;47520:28;;;;:16;:28;;;;;;:46;;;;;;;:32;:46;:::i;:::-;:68;;47512:113;;;;-1:-1:-1;;;47512:113:0;;23962:2:1;47512:113:0;;;23944:21:1;;;23981:18;;;23974:30;24040:34;24020:18;;;24013:62;24092:18;;47512:113:0;23934:182:1;47512:113:0;47636:29;47641:10;47652:12;47636:4;:29::i;:::-;47693:10;47676:28;;;;:16;:28;;;;;:44;;;;;;:28;:44;;;;;:::i;:::-;;;;-1:-1:-1;;;;46820:921:0:o;44784:341::-;855:6;;-1:-1:-1;;;;;855:6:0;245:10;1002:23;994:68;;;;-1:-1:-1;;;994:68:0;;22768:2:1;994:68:0;;;22750:21:1;;;22787:18;;;22780:30;-1:-1:-1;;;;;;;;;;;22826:18:1;;;22819:62;22898:18;;994:68:0;22740:182:1;994:68:0;44920:13:::1;;44910:6;:23;;44902:87;;;::::0;-1:-1:-1;;;44902:87:0;;18153:2:1;44902:87:0::1;::::0;::::1;18135:21:1::0;18192:2;18172:18;;;18165:30;18231:34;18211:18;;;18204:62;18302:21;18282:18;;;18275:49;18341:19;;44902:87:0::1;18125:241:1::0;44902:87:0::1;45017:1;45008:6;:10;45000:55;;;::::0;-1:-1:-1;;;45000:55:0;;22407:2:1;45000:55:0::1;::::0;::::1;22389:21:1::0;;;22426:18;;;22419:30;22485:34;22465:18;;;22458:62;22537:18;;45000:55:0::1;22379:182:1::0;45000:55:0::1;45066:8;:17:::0;;;;45094:18:::1;:23:::0;44784:341::o;43773:98::-;855:6;;-1:-1:-1;;;;;855:6:0;245:10;1002:23;994:68;;;;-1:-1:-1;;;994:68:0;;22768:2:1;994:68:0;;;22750:21:1;;;22787:18;;;22780:30;-1:-1:-1;;;;;;;;;;;22826:18:1;;;22819:62;22898:18;;994:68:0;22740:182:1;994:68:0;43850:6:::1;:13:::0;;-1:-1:-1;;43850:13:0::1;43859:4;43850:13;::::0;;43773:98::o;1433:94::-;855:6;;-1:-1:-1;;;;;855:6:0;245:10;1002:23;994:68;;;;-1:-1:-1;;;994:68:0;;22768:2:1;994:68:0;;;22750:21:1;;;22787:18;;;22780:30;-1:-1:-1;;;;;;;;;;;22826:18:1;;;22819:62;22898:18;;994:68:0;22740:182:1;994:68:0;1498:21:::1;1516:1;1498:9;:21::i;:::-;1433:94::o:0;49439:786::-;49514:4;49554;49514;49571:531;49595:5;:12;49591:1;:16;49571:531;;;49629:20;49652:5;49658:1;49652:8;;;;;;-1:-1:-1;;;49652:8:0;;;;;;;;;;;;;;;49629:31;;49709:12;49693;:28;49689:402;;49843:44;;;;;;11989:19:1;;;12024:12;;;12017:28;;;49836:52:0;;12061:12:1;;49843:44:0;;;-1:-1:-1;;49843:44:0;;;;;;;;;;49836:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49821:67;;49689:402;;;50030:44;;;;;;11989:19:1;;;12024:12;;;12017:28;;;50023:52:0;;12061:12:1;;50030:44:0;;;-1:-1:-1;;50030:44:0;;;;;;;;;;50023:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50008:67;;49689:402;-1:-1:-1;49609:3:0;;;;:::i;:::-;;;;49571:531;;;-1:-1:-1;50213:4:0;;50197:20;;49439:786;-1:-1:-1;;;49439:786:0:o;21874:311::-;245:10;-1:-1:-1;;;;;21977:24:0;;;;21969:78;;;;-1:-1:-1;;;21969:78:0;;24323:2:1;21969:78:0;;;24305:21:1;24362:2;24342:18;;;24335:30;24401:34;24381:18;;;24374:62;24472:11;24452:18;;;24445:39;24501:19;;21969:78:0;24295:231:1;21969:78:0;245:10;22060:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;22060:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;22060:53:0;;;;;;;;;;22129:48;;15495:41:1;;;22060:42:0;;245:10;22129:48;;15468:18:1;22129:48:0;;;;;;;21874:311;;:::o;47833:230::-;855:6;;-1:-1:-1;;;;;855:6:0;245:10;1002:23;994:68;;;;-1:-1:-1;;;994:68:0;;22768:2:1;994:68:0;;;22750:21:1;;;22787:18;;;22780:30;-1:-1:-1;;;;;;;;;;;22826:18:1;;;22819:62;22898:18;;994:68:0;22740:182:1;994:68:0;47944:11:::1;::::0;43281:4:::1;::::0;47944:18:::1;::::0;47960:1:::1;47944:15;:18::i;:::-;:28;47936:97;;;::::0;-1:-1:-1;;;47936:97:0;;21220:2:1;47936:97:0::1;::::0;::::1;21202:21:1::0;21259:2;21239:18;;;21232:30;21298:34;21278:18;;;21271:62;21369:26;21349:18;;;21342:54;21413:19;;47936:97:0::1;21192:246:1::0;47936:97:0::1;48044:11;48049:3;48053:1;48044:4;:11::i;45461:197::-:0;855:6;;-1:-1:-1;;;;;855:6:0;245:10;1002:23;994:68;;;;-1:-1:-1;;;994:68:0;;22768:2:1;994:68:0;;;22750:21:1;;;22787:18;;;22780:30;-1:-1:-1;;;;;;;;;;;22826:18:1;;;22819:62;22898:18;;994:68:0;22740:182:1;994:68:0;45605:20;;::::1;::::0;:8:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;45636:14:0;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;:::-;;45461:197:::0;;:::o;22497:401::-;-1:-1:-1;;;;;22705:20:0;;245:10;22705:20;;:60;;-1:-1:-1;22729:36:0;22746:4;245:10;22257:168;:::i;22729:36::-;22683:151;;;;-1:-1:-1;;;22683:151:0;;18573:2:1;22683:151:0;;;18555:21:1;18612:2;18592:18;;;18585:30;18651:34;18631:18;;;18624:62;18722:11;18702:18;;;18695:39;18751:19;;22683:151:0;18545:231:1;22683:151:0;22845:45;22863:4;22869:2;22873;22877:6;22885:4;22845:17;:45::i;49283:91::-;855:6;;-1:-1:-1;;;;;855:6:0;245:10;1002:23;994:68;;;;-1:-1:-1;;;994:68:0;;22768:2:1;994:68:0;;;22750:21:1;;;22787:18;;;22780:30;-1:-1:-1;;;;;;;;;;;22826:18:1;;;22819:62;22898:18;;994:68:0;22740:182:1;994:68:0;49345:4:::1;:21:::0;49283:91::o;1682:192::-;855:6;;-1:-1:-1;;;;;855:6:0;245:10;1002:23;994:68;;;;-1:-1:-1;;;994:68:0;;22768:2:1;994:68:0;;;22750:21:1;;;22787:18;;;22780:30;-1:-1:-1;;;;;;;;;;;22826:18:1;;;22819:62;22898:18;;994:68:0;22740:182:1;994:68:0;-1:-1:-1;;;;;1771:22:0;::::1;1763:73;;;::::0;-1:-1:-1;;;1763:73:0;;17397:2:1;1763:73:0::1;::::0;::::1;17379:21:1::0;17436:2;17416:18;;;17409:30;17475:34;17455:18;;;17448:62;17546:8;17526:18;;;17519:36;17572:19;;1763:73:0::1;17369:228:1::0;1763:73:0::1;1847:19;1857:8;1847:9;:19::i;41109:723::-:0;41165:13;41386:10;41382:53;;-1:-1:-1;;41413:10:0;;;;;;;;;;;;;;;;;;41109:723::o;41382:53::-;41460:5;41445:12;41501:78;41508:9;;41501:78;;41534:8;;;;:::i;:::-;;-1:-1:-1;41557:10:0;;-1:-1:-1;41565:2:0;41557:10;;:::i;:::-;;;41501:78;;;41589:19;41621:6;41611:17;;;;;;-1:-1:-1;;;41611:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41611:17:0;;41589:39;;41639:154;41646:10;;41639:154;;41673:11;41683:1;41673:11;;:::i;:::-;;-1:-1:-1;41742:10:0;41750:2;41742:5;:10;:::i;:::-;41729:24;;:2;:24;:::i;:::-;41716:39;;41699:6;41706;41699:14;;;;;;-1:-1:-1;;;41699:14:0;;;;;;;;;;;;:56;;;;;;;;;;-1:-1:-1;41770:11:0;41779:2;41770:11;;:::i;:::-;;;41639:154;;;41817:6;41109:723;-1:-1:-1;;;;41109:723:0:o;25059:1074::-;25286:7;:14;25272:3;:10;:28;25264:81;;;;-1:-1:-1;;;25264:81:0;;25546:2:1;25264:81:0;;;25528:21:1;25585:2;25565:18;;;25558:30;25624:34;25604:18;;;25597:62;-1:-1:-1;;;25675:18:1;;;25668:38;25723:19;;25264:81:0;25518:230:1;25264:81:0;-1:-1:-1;;;;;25364:16:0;;25356:66;;;;-1:-1:-1;;;25356:66:0;;20051:2:1;25356:66:0;;;20033:21:1;20090:2;20070:18;;;20063:30;20129:34;20109:18;;;20102:62;-1:-1:-1;;;20180:18:1;;;20173:35;20225:19;;25356:66:0;20023:227:1;25356:66:0;245:10;25435:16;25552:421;25576:3;:10;25572:1;:14;25552:421;;;25608:10;25621:3;25625:1;25621:6;;;;;;-1:-1:-1;;;25621:6:0;;;;;;;;;;;;;;;25608:19;;25642:14;25659:7;25667:1;25659:10;;;;;;-1:-1:-1;;;25659:10:0;;;;;;;;;;;;;;;;;;;;25686:19;25708:13;;;;;;;;;;-1:-1:-1;;;;;25708:19:0;;;;;;;;;;;;25659:10;;-1:-1:-1;25750:21:0;;;;25742:76;;;;-1:-1:-1;;;25742:76:0;;21645:2:1;25742:76:0;;;21627:21:1;21684:2;21664:18;;;21657:30;21723:34;21703:18;;;21696:62;-1:-1:-1;;;21774:18:1;;;21767:40;21824:19;;25742:76:0;21617:232:1;25742:76:0;25862:9;:13;;;;;;;;;;;-1:-1:-1;;;;;25862:19:0;;;;;;;;;;25884:20;;;25862:42;;25934:17;;;;;;;:27;;25884:20;;25862:9;25934:27;;25884:20;;25934:27;:::i;:::-;;;;;;;;25552:421;;;25588:3;;;;:::i;:::-;;;25552:421;;;;26020:2;-1:-1:-1;;;;;25990:47:0;26014:4;-1:-1:-1;;;;;25990:47:0;26004:8;-1:-1:-1;;;;;25990:47:0;;26024:3;26029:7;25990:47;;;;;;;:::i;:::-;;;;;;;;26050:75;26086:8;26096:4;26102:2;26106:3;26111:7;26120:4;26050:35;:75::i;:::-;25059:1074;;;;;;:::o;36718:98::-;36776:7;36803:5;36807:1;36803;:5;:::i;:::-;36796:12;36718:98;-1:-1:-1;;;36718:98:0:o;37099:::-;37157:7;37184:5;37188:1;37184;:5;:::i;37456:98::-;37514:7;37541:5;37545:1;37541;:5;:::i;43929:519::-;44001:1;43993:5;:9;;;43989:419;;;44019:20;44064:5;44056:14;;44042:29;;;;;;-1:-1:-1;;;44042:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44042:29:0;;44019:52;;44086:24;44135:5;44127:14;;44113:29;;;;;;-1:-1:-1;;;44113:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44113:29:0;;44086:56;;44164:8;44159:127;44182:5;44178:9;;:1;:9;;;44159:127;;;44236:1;44222:15;;:11;;:15;;;;:::i;:::-;44213:3;44217:1;44213:6;;;;;;;;-1:-1:-1;;;44213:6:0;;;;;;;;;;;;;;:24;;;;;44269:1;44256:7;44264:1;44256:10;;;;;;;;-1:-1:-1;;;44256:10:0;;;;;;;;;;;;;;;;;;:14;44189:3;;;;:::i;:::-;;;;44159:127;;;;44302:32;44313:2;44317:3;44322:7;44302:32;;;;;;;;;;;;:10;:32::i;:::-;43989:419;;;;;44367:29;44373:2;44377:11;;44390:1;44367:29;;;;;;;;;;;;:5;:29::i;:::-;44435:5;44420:20;;:11;;:20;;;;;;;:::i;1882:173::-;1957:6;;;-1:-1:-1;;;;;1974:17:0;;;;;;;;;;;2007:40;;1957:6;;;1974:17;1957:6;;2007:40;;1938:16;;2007:40;1882:173;;:::o;23881:820::-;-1:-1:-1;;;;;24069:16:0;;24061:66;;;;-1:-1:-1;;;24061:66:0;;20051:2:1;24061:66:0;;;20033:21:1;20090:2;20070:18;;;20063:30;20129:34;20109:18;;;20102:62;-1:-1:-1;;;20180:18:1;;;20173:35;20225:19;;24061:66:0;20023:227:1;24061:66:0;245:10;24184:96;245:10;24215:4;24221:2;24225:21;24243:2;24225:17;:21::i;:::-;24248:25;24266:6;24248:17;:25::i;24184:96::-;24293:19;24315:13;;;;;;;;;;;-1:-1:-1;;;;;24315:19:0;;;;;;;;;;24353:21;;;;24345:76;;;;-1:-1:-1;;;24345:76:0;;21645:2:1;24345:76:0;;;21627:21:1;21684:2;21664:18;;;21657:30;21723:34;21703:18;;;21696:62;-1:-1:-1;;;21774:18:1;;;21767:40;21824:19;;24345:76:0;21617:232:1;24345:76:0;24457:9;:13;;;;;;;;;;;-1:-1:-1;;;;;24457:19:0;;;;;;;;;;24479:20;;;24457:42;;24521:17;;;;;;;:27;;24479:20;;24457:9;24521:27;;24479:20;;24521:27;:::i;:::-;;;;-1:-1:-1;;24566:46:0;;;26868:25:1;;;26924:2;26909:18;;26902:34;;;-1:-1:-1;;;;;24566:46:0;;;;;;;;;;;;;;26841:18:1;24566:46:0;;;;;;;24625:68;24656:8;24666:4;24672:2;24676;24680:6;24688:4;24625:30;:68::i;:::-;23881:820;;;;;;;:::o;33148:813::-;-1:-1:-1;;;;;33388:13:0;;3120:20;3168:8;33384:570;;33424:79;;-1:-1:-1;;;33424:79:0;;-1:-1:-1;;;;;33424:43:0;;;;;:79;;33468:8;;33478:4;;33484:3;;33489:7;;33498:4;;33424:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33424:79:0;;;;;;;;-1:-1:-1;;33424:79:0;;;;;;;;;;;;:::i;:::-;;;33420:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;33816:6;33809:14;;-1:-1:-1;;;33809:14:0;;;;;;;;:::i;33420:523::-;;;33865:62;;-1:-1:-1;;;33865:62:0;;16155:2:1;33865:62:0;;;16137:21:1;16194:2;16174:18;;;16167:30;16233:34;16213:18;;;16206:62;16304:22;16284:18;;;16277:50;16344:19;;33865:62:0;16127:242:1;33420:523:0;-1:-1:-1;;;;;;33585:60:0;;-1:-1:-1;;;33585:60:0;33581:159;;33670:50;;-1:-1:-1;;;33670:50:0;;16576:2:1;33670:50:0;;;16558:21:1;16615:2;16595:18;;;16588:30;16654:34;16634:18;;;16627:62;-1:-1:-1;;;16705:18:1;;;16698:38;16753:19;;33670:50:0;16548:230:1;28421:735:0;-1:-1:-1;;;;;28599:16:0;;28591:62;;;;-1:-1:-1;;;28591:62:0;;25955:2:1;28591:62:0;;;25937:21:1;25994:2;25974:18;;;25967:30;26033:34;26013:18;;;26006:62;-1:-1:-1;;;26084:18:1;;;26077:31;26125:19;;28591:62:0;25927:223:1;28591:62:0;28686:7;:14;28672:3;:10;:28;28664:81;;;;-1:-1:-1;;;28664:81:0;;25546:2:1;28664:81:0;;;25528:21:1;25585:2;25565:18;;;25558:30;25624:34;25604:18;;;25597:62;-1:-1:-1;;;25675:18:1;;;25668:38;25723:19;;28664:81:0;25518:230:1;28664:81:0;245:10;28758:16;28881:103;28905:3;:10;28901:1;:14;28881:103;;;28962:7;28970:1;28962:10;;;;;;-1:-1:-1;;;28962:10:0;;;;;;;;;;;;;;;28937:9;:17;28947:3;28951:1;28947:6;;;;;;-1:-1:-1;;;28947:6:0;;;;;;;;;;;;;;;28937:17;;;;;;;;;;;:21;28955:2;-1:-1:-1;;;;;28937:21:0;-1:-1:-1;;;;;28937:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;28917:3:0;;-1:-1:-1;28917:3:0;;;:::i;:::-;;;;28881:103;;;;29037:2;-1:-1:-1;;;;;29001:53:0;29033:1;-1:-1:-1;;;;;29001:53:0;29015:8;-1:-1:-1;;;;;29001:53:0;;29041:3;29046:7;29001:53;;;;;;;:::i;:::-;;;;;;;;29067:81;29103:8;29121:1;29125:2;29129:3;29134:7;29143:4;29067:35;:81::i;27466:599::-;-1:-1:-1;;;;;27624:21:0;;27616:67;;;;-1:-1:-1;;;27616:67:0;;25955:2:1;27616:67:0;;;25937:21:1;25994:2;25974:18;;;25967:30;26033:34;26013:18;;;26006:62;-1:-1:-1;;;26084:18:1;;;26077:31;26125:19;;27616:67:0;25927:223:1;27616:67:0;245:10;27740:107;245:10;27696:16;27783:7;27792:21;27810:2;27792:17;:21::i;27740:107::-;27860:9;:13;;;;;;;;;;;-1:-1:-1;;;;;27860:22:0;;;;;;;;;:32;;27886:6;;27860:9;:32;;27886:6;;27860:32;:::i;:::-;;;;-1:-1:-1;;27908:57:0;;;26868:25:1;;;26924:2;26909:18;;26902:34;;;-1:-1:-1;;;;;27908:57:0;;;;27941:1;;27908:57;;;;;;26841:18:1;27908:57:0;;;;;;;27978:79;28009:8;28027:1;28031:7;28040:2;28044:6;28052:4;27978:30;:79::i;33969:198::-;34089:16;;;34103:1;34089:16;;;;;;;;;34035;;34064:22;;34089:16;;;;;;;;;;;;-1:-1:-1;34089:16:0;34064:41;;34127:7;34116:5;34122:1;34116:8;;;;;;-1:-1:-1;;;34116:8:0;;;;;;;;;;;;;;;;;;:18;34154:5;33969:198;-1:-1:-1;;33969:198:0:o;32396:744::-;-1:-1:-1;;;;;32611:13:0;;3120:20;3168:8;32607:526;;32647:72;;-1:-1:-1;;;32647:72:0;;-1:-1:-1;;;;;32647:38:0;;;;;:72;;32686:8;;32696:4;;32702:2;;32706:6;;32714:4;;32647:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32647:72:0;;;;;;;;-1:-1:-1;;32647:72:0;;;;;;;;;;;;:::i;:::-;;;32643:479;;;;:::i;:::-;-1:-1:-1;;;;;;32769:55:0;;-1:-1:-1;;;32769:55:0;32765:154;;32849:50;;-1:-1:-1;;;32849:50:0;;16576:2:1;32849:50:0;;;16558:21:1;16615:2;16595:18;;;16588:30;16654:34;16634:18;;;16627:62;-1:-1:-1;;;16705:18:1;;;16698:38;16753:19;;32849:50:0;16548:230:1;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:196:1;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:2;;200:1;197;190:12;215:761;269:5;322:3;315:4;307:6;303:17;299:27;289:2;;344:5;337;330:20;289:2;384:6;371:20;410:4;433:43;473:2;433:43;:::i;:::-;505:2;499:9;517:31;545:2;537:6;517:31;:::i;:::-;583:18;;;617:15;;;;-1:-1:-1;652:15:1;;;702:1;698:10;;;686:23;;682:32;;679:41;-1:-1:-1;676:2:1;;;737:5;730;723:20;676:2;763:5;777:169;791:2;788:1;785:9;777:169;;;848:23;867:3;848:23;:::i;:::-;836:36;;892:12;;;;924;;;;809:1;802:9;777:169;;;-1:-1:-1;964:6:1;;279:697;-1:-1:-1;;;;;;;279:697:1:o;981:755::-;1035:5;1088:3;1081:4;1073:6;1069:17;1065:27;1055:2;;1110:5;1103;1096:20;1055:2;1150:6;1137:20;1176:4;1199:43;1239:2;1199:43;:::i;:::-;1271:2;1265:9;1283:31;1311:2;1303:6;1283:31;:::i;:::-;1349:18;;;1383:15;;;;-1:-1:-1;1418:15:1;;;1468:1;1464:10;;;1452:23;;1448:32;;1445:41;-1:-1:-1;1442:2:1;;;1503:5;1496;1489:20;1442:2;1529:5;1543:163;1557:2;1554:1;1551:9;1543:163;;;1614:17;;1602:30;;1652:12;;;;1684;;;;1575:1;1568:9;1543:163;;2501:160;2566:20;;2622:13;;2615:21;2605:32;;2595:2;;2651:1;2648;2641:12;2666:575;2708:5;2761:3;2754:4;2746:6;2742:17;2738:27;2728:2;;2783:5;2776;2769:20;2728:2;2823:6;2810:20;2849:18;2845:2;2842:26;2839:2;;;2871:18;;:::i;:::-;2920:2;2914:9;2932:67;2987:2;2968:13;;-1:-1:-1;;2964:27:1;2993:4;2960:38;2914:9;2932:67;:::i;:::-;3023:2;3015:6;3008:18;3069:3;3062:4;3057:2;3049:6;3045:15;3041:26;3038:35;3035:2;;;3090:5;3083;3076:20;3035:2;3158;3151:4;3143:6;3139:17;3132:4;3124:6;3120:17;3107:54;3181:15;;;3198:4;3177:26;3170:41;;;;3185:6;2718:523;-1:-1:-1;;2718:523:1:o;3246:163::-;3313:20;;3373:10;3362:22;;3352:33;;3342:2;;3399:1;3396;3389:12;3414:196;3473:6;3526:2;3514:9;3505:7;3501:23;3497:32;3494:2;;;3547:6;3539;3532:22;3494:2;3575:29;3594:9;3575:29;:::i;3615:270::-;3683:6;3691;3744:2;3732:9;3723:7;3719:23;3715:32;3712:2;;;3765:6;3757;3750:22;3712:2;3793:29;3812:9;3793:29;:::i;:::-;3783:39;;3841:38;3875:2;3864:9;3860:18;3841:38;:::i;:::-;3831:48;;3702:183;;;;;:::o;3890:983::-;4044:6;4052;4060;4068;4076;4129:3;4117:9;4108:7;4104:23;4100:33;4097:2;;;4151:6;4143;4136:22;4097:2;4179:29;4198:9;4179:29;:::i;:::-;4169:39;;4227:38;4261:2;4250:9;4246:18;4227:38;:::i;:::-;4217:48;;4316:2;4305:9;4301:18;4288:32;4339:18;4380:2;4372:6;4369:14;4366:2;;;4401:6;4393;4386:22;4366:2;4429:61;4482:7;4473:6;4462:9;4458:22;4429:61;:::i;:::-;4419:71;;4543:2;4532:9;4528:18;4515:32;4499:48;;4572:2;4562:8;4559:16;4556:2;;;4593:6;4585;4578:22;4556:2;4621:63;4676:7;4665:8;4654:9;4650:24;4621:63;:::i;:::-;4611:73;;4737:3;4726:9;4722:19;4709:33;4693:49;;4767:2;4757:8;4754:16;4751:2;;;4788:6;4780;4773:22;4751:2;;4816:51;4859:7;4848:8;4837:9;4833:24;4816:51;:::i;:::-;4806:61;;;4087:786;;;;;;;;:::o;4878:626::-;4982:6;4990;4998;5006;5014;5067:3;5055:9;5046:7;5042:23;5038:33;5035:2;;;5089:6;5081;5074:22;5035:2;5117:29;5136:9;5117:29;:::i;:::-;5107:39;;5165:38;5199:2;5188:9;5184:18;5165:38;:::i;:::-;5155:48;;5250:2;5239:9;5235:18;5222:32;5212:42;;5301:2;5290:9;5286:18;5273:32;5263:42;;5356:3;5345:9;5341:19;5328:33;5384:18;5376:6;5373:30;5370:2;;;5421:6;5413;5406:22;5370:2;5449:49;5490:7;5481:6;5470:9;5466:22;5449:49;:::i;5509:264::-;5574:6;5582;5635:2;5623:9;5614:7;5610:23;5606:32;5603:2;;;5656:6;5648;5641:22;5603:2;5684:29;5703:9;5684:29;:::i;:::-;5674:39;;5732:35;5763:2;5752:9;5748:18;5732:35;:::i;5778:264::-;5846:6;5854;5907:2;5895:9;5886:7;5882:23;5878:32;5875:2;;;5928:6;5920;5913:22;5875:2;5956:29;5975:9;5956:29;:::i;:::-;5946:39;6032:2;6017:18;;;;6004:32;;-1:-1:-1;;;5865:177:1:o;6047:368::-;6131:6;6184:2;6172:9;6163:7;6159:23;6155:32;6152:2;;;6205:6;6197;6190:22;6152:2;6250:9;6237:23;6283:18;6275:6;6272:30;6269:2;;;6320:6;6312;6305:22;6269:2;6348:61;6401:7;6392:6;6381:9;6377:22;6348:61;:::i;6420:625::-;6538:6;6546;6599:2;6587:9;6578:7;6574:23;6570:32;6567:2;;;6620:6;6612;6605:22;6567:2;6665:9;6652:23;6694:18;6735:2;6727:6;6724:14;6721:2;;;6756:6;6748;6741:22;6721:2;6784:61;6837:7;6828:6;6817:9;6813:22;6784:61;:::i;:::-;6774:71;;6898:2;6887:9;6883:18;6870:32;6854:48;;6927:2;6917:8;6914:16;6911:2;;;6948:6;6940;6933:22;6911:2;;6976:63;7031:7;7020:8;7009:9;7005:24;6976:63;:::i;:::-;6966:73;;;6557:488;;;;;:::o;7050:436::-;7143:6;7151;7204:2;7192:9;7183:7;7179:23;7175:32;7172:2;;;7225:6;7217;7210:22;7172:2;7270:9;7257:23;7303:18;7295:6;7292:30;7289:2;;;7340:6;7332;7325:22;7289:2;7368:61;7421:7;7412:6;7401:9;7397:22;7368:61;:::i;:::-;7358:71;7476:2;7461:18;;;;7448:32;;-1:-1:-1;;;;7162:324:1:o;7491:190::-;7547:6;7600:2;7588:9;7579:7;7575:23;7571:32;7568:2;;;7621:6;7613;7606:22;7568:2;7649:26;7665:9;7649:26;:::i;7686:194::-;7756:6;7809:2;7797:9;7788:7;7784:23;7780:32;7777:2;;;7830:6;7822;7815:22;7777:2;-1:-1:-1;7858:16:1;;7767:113;-1:-1:-1;7767:113:1:o;7885:255::-;7943:6;7996:2;7984:9;7975:7;7971:23;7967:32;7964:2;;;8017:6;8009;8002:22;7964:2;8061:9;8048:23;8080:30;8104:5;8080:30;:::i;8145:259::-;8214:6;8267:2;8255:9;8246:7;8242:23;8238:32;8235:2;;;8288:6;8280;8273:22;8235:2;8325:9;8319:16;8344:30;8368:5;8344:30;:::i;8409:571::-;8497:6;8505;8558:2;8546:9;8537:7;8533:23;8529:32;8526:2;;;8579:6;8571;8564:22;8526:2;8624:9;8611:23;8653:18;8694:2;8686:6;8683:14;8680:2;;;8715:6;8707;8700:22;8680:2;8743:49;8784:7;8775:6;8764:9;8760:22;8743:49;:::i;:::-;8733:59;;8845:2;8834:9;8830:18;8817:32;8801:48;;8874:2;8864:8;8861:16;8858:2;;;8895:6;8887;8880:22;8858:2;;8923:51;8966:7;8955:8;8944:9;8940:24;8923:51;:::i;8985:190::-;9044:6;9097:2;9085:9;9076:7;9072:23;9068:32;9065:2;;;9118:6;9110;9103:22;9065:2;-1:-1:-1;9146:23:1;;9055:120;-1:-1:-1;9055:120:1:o;9180:258::-;9248:6;9256;9309:2;9297:9;9288:7;9284:23;9280:32;9277:2;;;9330:6;9322;9315:22;9277:2;-1:-1:-1;;9358:23:1;;;9428:2;9413:18;;;9400:32;;-1:-1:-1;9267:171:1:o;9443:194::-;9501:6;9554:2;9542:9;9533:7;9529:23;9525:32;9522:2;;;9575:6;9567;9560:22;9522:2;9603:28;9621:9;9603:28;:::i;9642:440::-;9734:6;9742;9795:2;9783:9;9774:7;9770:23;9766:32;9763:2;;;9816:6;9808;9801:22;9763:2;9844:28;9862:9;9844:28;:::i;:::-;9834:38;;9923:2;9912:9;9908:18;9895:32;9950:18;9942:6;9939:30;9936:2;;;9987:6;9979;9972:22;9936:2;10015:61;10068:7;10059:6;10048:9;10044:22;10015:61;:::i;10087:437::-;10140:3;10178:5;10172:12;10205:6;10200:3;10193:19;10231:4;10260:2;10255:3;10251:12;10244:19;;10297:2;10290:5;10286:14;10318:3;10330:169;10344:6;10341:1;10338:13;10330:169;;;10405:13;;10393:26;;10439:12;;;;10474:15;;;;10366:1;10359:9;10330:169;;;-1:-1:-1;10515:3:1;;10148:376;-1:-1:-1;;;;;10148:376:1:o;10529:257::-;10570:3;10608:5;10602:12;10635:6;10630:3;10623:19;10651:63;10707:6;10700:4;10695:3;10691:14;10684:4;10677:5;10673:16;10651:63;:::i;:::-;10768:2;10747:15;-1:-1:-1;;10743:29:1;10734:39;;;;10775:4;10730:50;;10578:208;-1:-1:-1;;10578:208:1:o;10791:1036::-;10876:12;;10841:3;;10933:1;10953:18;;;;11006;;;;11033:2;;11087:4;11079:6;11075:17;11065:27;;11033:2;11113;11161;11153:6;11150:14;11130:18;11127:38;11124:2;;;-1:-1:-1;;;11195:3:1;11188:90;11301:4;11298:1;11291:15;11331:4;11326:3;11319:17;11124:2;11362:18;11389:104;;;;11507:1;11502:319;;;;11355:466;;11389:104;-1:-1:-1;;11422:24:1;;11410:37;;11467:16;;;;-1:-1:-1;11389:104:1;;11502:319;27182:4;27201:17;;;27251:4;27235:21;;11596:1;11610:165;11624:6;11621:1;11618:13;11610:165;;;11702:14;;11689:11;;;11682:35;11745:16;;;;11639:10;;11610:165;;;11614:3;;11804:6;11799:3;11795:16;11788:23;;11355:466;;;;;;;10849:978;;;;:::o;12084:274::-;12213:3;12251:6;12245:13;12267:53;12313:6;12308:3;12301:4;12293:6;12289:17;12267:53;:::i;:::-;12336:16;;;;;12221:137;-1:-1:-1;;12221:137:1:o;12363:197::-;12491:3;12516:38;12550:3;12542:6;12516:38;:::i;12565:376::-;12741:3;12769:38;12803:3;12795:6;12769:38;:::i;:::-;12836:6;12830:13;12852:52;12897:6;12893:2;12886:4;12878:6;12874:17;12852:52;:::i;:::-;12920:15;;12749:192;-1:-1:-1;;;;12749:192:1:o;13177:849::-;13499:4;-1:-1:-1;;;;;13609:2:1;13601:6;13597:15;13586:9;13579:34;13661:2;13653:6;13649:15;13644:2;13633:9;13629:18;13622:43;;13701:3;13696:2;13685:9;13681:18;13674:31;13728:57;13780:3;13769:9;13765:19;13757:6;13728:57;:::i;:::-;13833:9;13825:6;13821:22;13816:2;13805:9;13801:18;13794:50;13867:44;13904:6;13896;13867:44;:::i;:::-;13853:58;;13960:9;13952:6;13948:22;13942:3;13931:9;13927:19;13920:51;13988:32;14013:6;14005;13988:32;:::i;:::-;13980:40;13508:518;-1:-1:-1;;;;;;;;13508:518:1:o;14031:583::-;14253:4;-1:-1:-1;;;;;14363:2:1;14355:6;14351:15;14340:9;14333:34;14415:2;14407:6;14403:15;14398:2;14387:9;14383:18;14376:43;;14455:6;14450:2;14439:9;14435:18;14428:34;14498:6;14493:2;14482:9;14478:18;14471:34;14542:3;14536;14525:9;14521:19;14514:32;14563:45;14603:3;14592:9;14588:19;14580:6;14563:45;:::i;:::-;14555:53;14262:352;-1:-1:-1;;;;;;;14262:352:1:o;14619:261::-;14798:2;14787:9;14780:21;14761:4;14818:56;14870:2;14859:9;14855:18;14847:6;14818:56;:::i;14885:465::-;15142:2;15131:9;15124:21;15105:4;15168:56;15220:2;15209:9;15205:18;15197:6;15168:56;:::i;:::-;15272:9;15264:6;15260:22;15255:2;15244:9;15240:18;15233:50;15300:44;15337:6;15329;15300:44;:::i;:::-;15292:52;15114:236;-1:-1:-1;;;;;15114:236:1:o;15729:219::-;15878:2;15867:9;15860:21;15841:4;15898:44;15938:2;15927:9;15923:18;15915:6;15898:44;:::i;26947:183::-;27007:4;27040:18;27032:6;27029:30;27026:2;;;27062:18;;:::i;:::-;-1:-1:-1;27107:1:1;27103:14;27119:4;27099:25;;27016:114::o;27267:128::-;27307:3;27338:1;27334:6;27331:1;27328:13;27325:2;;;27344:18;;:::i;:::-;-1:-1:-1;27380:9:1;;27315:80::o;27400:120::-;27440:1;27466;27456:2;;27471:18;;:::i;:::-;-1:-1:-1;27505:9:1;;27446:74::o;27525:168::-;27565:7;27631:1;27627;27623:6;27619:14;27616:1;27613:21;27608:1;27601:9;27594:17;27590:45;27587:2;;;27638:18;;:::i;:::-;-1:-1:-1;27678:9:1;;27577:116::o;27698:125::-;27738:4;27766:1;27763;27760:8;27757:2;;;27771:18;;:::i;:::-;-1:-1:-1;27808:9:1;;27747:76::o;27828:258::-;27900:1;27910:113;27924:6;27921:1;27918:13;27910:113;;;28000:11;;;27994:18;27981:11;;;27974:39;27946:2;27939:10;27910:113;;;28041:6;28038:1;28035:13;28032:2;;;28076:1;28067:6;28062:3;28058:16;28051:27;28032:2;;27881:205;;;:::o;28091:437::-;28170:1;28166:12;;;;28213;;;28234:2;;28288:4;28280:6;28276:17;28266:27;;28234:2;28341;28333:6;28330:14;28310:18;28307:38;28304:2;;;-1:-1:-1;;;28375:1:1;28368:88;28479:4;28476:1;28469:15;28507:4;28504:1;28497:15;28304:2;;28146:382;;;:::o;28533:249::-;28643:2;28624:13;;-1:-1:-1;;28620:27:1;28608:40;;28678:18;28663:34;;28699:22;;;28660:62;28657:2;;;28725:18;;:::i;:::-;28761:2;28754:22;-1:-1:-1;;28580:202:1:o;28787:135::-;28826:3;-1:-1:-1;;28847:17:1;;28844:2;;;28867:18;;:::i;:::-;-1:-1:-1;28914:1:1;28903:13;;28834:88::o;28927:201::-;28965:3;28993:10;29038:2;29031:5;29027:14;29065:2;29056:7;29053:15;29050:2;;;29071:18;;:::i;:::-;29120:1;29107:15;;28973:155;-1:-1:-1;;;28973:155:1:o;29133:112::-;29165:1;29191;29181:2;;29196:18;;:::i;:::-;-1:-1:-1;29230:9:1;;29171:74::o;29250:184::-;-1:-1:-1;;;29299:1:1;29292:88;29399:4;29396:1;29389:15;29423:4;29420:1;29413:15;29439:184;-1:-1:-1;;;29488:1:1;29481:88;29588:4;29585:1;29578:15;29612:4;29609:1;29602:15;29628:184;-1:-1:-1;;;29677:1:1;29670:88;29777:4;29774:1;29767:15;29801:4;29798:1;29791:15;29817:185;29852:3;29894:1;29876:16;29873:23;29870:2;;;29944:1;29939:3;29934;29919:27;29975:10;29970:3;29966:20;29870:2;29860:142;:::o;30007:671::-;30046:3;30088:4;30070:16;30067:26;30064:2;;;30054:624;:::o;30064:2::-;30130;30124:9;-1:-1:-1;;30195:16:1;30191:25;;30188:1;30124:9;30167:50;30246:4;30240:11;30270:16;30305:18;30376:2;30369:4;30361:6;30357:17;30354:25;30349:2;30341:6;30338:14;30335:45;30332:2;;;30383:5;;;;;30054:624;:::o;30332:2::-;30420:6;30414:4;30410:17;30399:28;;30456:3;30450:10;30483:2;30475:6;30472:14;30469:2;;;30489:5;;;;;;30054:624;:::o;30469:2::-;30573;30554:16;30548:4;30544:27;30540:36;30533:4;30524:6;30519:3;30515:16;30511:27;30508:69;30505:2;;;30580:5;;;;;;30054:624;:::o;30505:2::-;30596:57;30647:4;30638:6;30630;30626:19;30622:30;30616:4;30596:57;:::i;:::-;-1:-1:-1;30669:3:1;;30054:624;-1:-1:-1;;;;;30054:624:1:o;30683:177::-;-1:-1:-1;;;;;;30761:5:1;30757:78;30750:5;30747:89;30737:2;;30850:1;30847;30840:12
Swarm Source
ipfs://aab21d2172f81b0d402fbd27be4d0787715ebbe09c75bccee449066f7f6f0ff0
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.