ERC-1155
Overview
Max Total Supply
48
Holders
1
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 Source Code Verified (Exact Match)
Contract Name:
HypexlaBiennale2022
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-18 */ // SPDX-License-Identifier: MIT pragma solidity >=0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @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; // solhint-disable-next-line no-inline-assembly 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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; } /** * @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); } /** * _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); } /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { revert("ECDSA: invalid signature length"); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return recover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value"); require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) { return keccak256( abi.encode( typeHash, name, version, block.chainid, address(this) ) ); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "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] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } interface HasSecondarySaleFees { event SecondarySaleFees(uint256 tokenId, address[] recipients, uint[] bps); /* * bytes4(keccak256('getFeeBps(uint256)')) == 0x0ebd4c7f * bytes4(keccak256('getFeeRecipients(uint256)')) == 0xb9c4d9fb * * => 0x0ebd4c7f ^ 0xb9c4d9fb == 0xb7799584 * bytes4 internal constant _INTERFACE_ID_FEES = 0xb7799584; */ function getFeeRecipients(uint256 id) external view returns (address payable[] memory); function getFeeBps(uint256 id) external view returns (uint[] memory); } /** * * @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, HasSecondarySaleFees { using Address for address; using Strings for uint256; // 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 internal _uri; uint256 public constant FEE_DIVISIONER = 10000; /** * @dev See {_setURI}. */ constructor (string memory uri_) { _setURI(uri_); } struct Fee { address payable recipient; uint256 value; } mapping (uint256 => Fee[]) public secondaryFees; mapping (uint256 => Fee) public primaryFee; function getFeeRecipients(uint256 id) public view override returns (address payable[] memory) { Fee[] memory _fees = secondaryFees[id]; address payable[] memory result = new address payable[](_fees.length); for (uint i = 0; i < _fees.length; i++) { result[i] = _fees[i].recipient; } return result; } function getFeeBps(uint256 id) public view override returns (uint[] memory) { Fee[] memory _fees = secondaryFees[id]; uint[] memory result = new uint[](_fees.length); for (uint i = 0; i < _fees.length; i++) { result[i] = _fees[i].value; } return result; } /** * @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 || interfaceId == type(HasSecondarySaleFees).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 tokenId) external view virtual override returns (string memory) { return bytes(_uri).length > 0 ? string(abi.encodePacked(_uri, tokenId.toString())) : ''; } /** * @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 override { require(to != address(0), "ERC1155: transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); address operator = _msgSender(); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); _balances[id][from] = fromBalance - amount; _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } function _safeTransferWithSig( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); _balances[id][from] = fromBalance - amount; _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, 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 override { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); address operator = _msgSender(); 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"); _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, Fee memory _primaryFee, Fee[] memory _secondaryFees, bytes memory data) internal virtual { require(amount > 0, "Amount should be positive"); require(account != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); require(_primaryFee.recipient != address(0), "Primary Fee: Recipient should be present"); require(_primaryFee.value > 0 && _primaryFee.value <= FEE_DIVISIONER, "Primary Fee: Fee value should be positive and less or equal 100 percents"); primaryFee[id] = _primaryFee; address[] memory recipients = new address[](_secondaryFees.length); uint[] memory bps = new uint[](_secondaryFees.length); uint256 sumBps; for (uint i = 0; i < _secondaryFees.length; i++) { require(_secondaryFees[i].recipient != address(0), "Secondary Fee: Recipient should be present"); require(_secondaryFees[i].value > 0, "Secondary Fee: Fee value should be positive"); secondaryFees[id].push(_secondaryFees[i]); recipients[i] = _secondaryFees[i].recipient; bps[i] = _secondaryFees[i].value; sumBps += _secondaryFees[i].value; } require(sumBps <= FEE_DIVISIONER, "Secondary Fee: Fee percentage should be less or equal 100 percent"); if (_secondaryFees.length > 0) { emit SecondarySaleFees(id, recipients, bps); } _balances[id][account] += amount; emit TransferSingle(operator, address(0), account, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, 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(); uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); _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(); for (uint 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"); _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 _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(to).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(to).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; } } contract HypexlaBiennale2022 is ERC1155, Ownable, EIP712 { using SafeERC20 for IERC20; mapping (address => bool) public allowedTradingErc20Tokens; constructor (string memory _uri, address tradingToken, string memory eip712Name, string memory eip712Version) ERC1155(_uri) EIP712(eip712Name, eip712Version) { require(tradingToken != address(0) , "Hype x la Biennale 2022: Trading Token zero address"); allowedTradingErc20Tokens[tradingToken] = true; } string private constant FORWARD_DATA_TYPE = "ForwardData(address from,address to,address tradingTokenAddr,uint256 id,uint256 amount,uint256 value,uint256 nonce,uint256 deadline)"; bytes32 private constant FORWARD_DATA_TYPEHASH = keccak256(abi.encodePacked(FORWARD_DATA_TYPE)); struct ForwardData { address from; address to; address tradingTokenAddr; uint256 id; uint256 amount; uint256 value; uint256 nonce; uint256 deadline; } mapping(address => uint256) private nonces; function getNonce(address from) public view returns (uint256) { return nonces[from]; } function _verifyNonce(address account, uint256 nonce) internal view { require(nonces[account] == nonce, "nonce mismatch"); } function _verifySig(ForwardData memory data, bytes memory sig) internal view { bytes32 structHash = hashStruct(data); bytes32 digest = _hashTypedDataV4(structHash); require(ECDSA.recover(digest, sig) == data.from, "Hype x la Biennale 2022: signature mismatch"); } function _updateNonce(address account) internal { nonces[account]++; } function hashStruct(ForwardData memory data) private pure returns(bytes32) { return keccak256(abi.encode( FORWARD_DATA_TYPEHASH, data.from, data.to, data.tradingTokenAddr, data.id, data.amount, data.value, data.nonce, data.deadline )); } function mint(uint256 id, uint256 amount, Fee memory _primaryFee, Fee[] memory _secondaryFees) external onlyOwner { bytes memory data; _mint(owner(), id, amount, _primaryFee, _secondaryFees, data); } function burn(address account, uint256 id, uint256 amount) external onlyOwner { _burn(account, id, amount); } function burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) external onlyOwner { _burnBatch(account, ids, amounts); } function setBaseURI(string memory _uri) external onlyOwner { _setURI(_uri); } function tokenSaleFrom( //sig from buyer address from, address to, uint256 id, uint256 amount, uint256 price, uint256 _buyerNonce, address tradingTokenAddress, uint256 _deadline, bytes calldata sig ) external { require(allowedTradingErc20Tokens[tradingTokenAddress], "Hype x la Biennale 2022: trading token not allowed"); ForwardData memory data = ForwardData({ from: to, to: from, tradingTokenAddr: tradingTokenAddress, id: id, amount: amount, value: price, nonce: _buyerNonce, deadline: _deadline }); _verifyNonce(data.from, data.nonce); _verifySig(data, sig); _updateNonce(data.from); require(msg.sender == data.to, "Hype x la Biennale 2022: not allowed to sell"); require(block.timestamp <= data.deadline, "Hype x la Biennale 2022: signature is out-of-date"); require(data.to != address(0)); IERC20 tradingToken = IERC20(tradingTokenAddress); tradingToken.safeTransferFrom(data.from, address(this), data.value); if (data.to == owner()) { Fee memory _primaryFee = primaryFee[data.id]; uint256 toRealOwnerAmount = data.value / FEE_DIVISIONER * _primaryFee.value; uint256 toPlatformAmount = data.value - toRealOwnerAmount; tradingToken.safeTransfer(_primaryFee.recipient, toRealOwnerAmount); tradingToken.safeTransfer(owner(), toPlatformAmount); bytes memory transferData; safeTransferFrom(data.to, data.from, data.id, data.amount, transferData); } else { Fee[] memory _secondaryFees = secondaryFees[data.id]; uint256 feeSum; for (uint i = 0; i < _secondaryFees.length; i++) { uint256 toFeeRecipientAmount = data.value / FEE_DIVISIONER * _secondaryFees[i].value; feeSum += toFeeRecipientAmount; tradingToken.safeTransfer(_secondaryFees[i].recipient, toFeeRecipientAmount); } uint256 toAssetOwnerAmount = data.value - feeSum; tradingToken.safeTransfer(data.to, toAssetOwnerAmount); bytes memory transferData; safeTransferFrom(data.to, data.from, data.id, data.amount, transferData); } } function tokenSale( //sig from seller address from, address to, uint256 id, uint256 amount, uint256 price, uint256 _buyerNonce, address tradingTokenAddress, uint256 _deadline, bytes calldata sig ) external { require(allowedTradingErc20Tokens[tradingTokenAddress], "Hype x la Biennale 2022: trading token not allowed"); ForwardData memory data = ForwardData({ from: from, to: to, tradingTokenAddr: tradingTokenAddress, id: id, amount: amount, value: price, nonce: _buyerNonce, deadline: _deadline }); _verifyNonce(data.to, data.nonce); _verifySig(data, sig); _updateNonce(data.to); require(data.to != address(0)); require(msg.sender == data.to, "Hype x la Biennale 2022: not allowed to buy"); require(block.timestamp <= data.deadline, "Hype x la Biennale 2022: signature is out-of-date"); IERC20 tradingToken = IERC20(tradingTokenAddress); tradingToken.safeTransferFrom(data.to, address(this), data.value); if (data.from == owner()) { Fee memory _primaryFee = primaryFee[data.id]; uint256 toRealOwnerAmount = data.value / FEE_DIVISIONER * _primaryFee.value; uint256 toPlatformAmount = data.value - toRealOwnerAmount; tradingToken.safeTransfer(_primaryFee.recipient, toRealOwnerAmount); tradingToken.safeTransfer(owner(), toPlatformAmount); bytes memory transferData; _safeTransferWithSig(data.from, data.to, data.id, data.amount, transferData); } else { Fee[] memory _secondaryFees = secondaryFees[data.id]; uint256 feeSum; for (uint i = 0; i < _secondaryFees.length; i++) { uint256 toFeeRecipientAmount = data.value / FEE_DIVISIONER * _secondaryFees[i].value; feeSum += toFeeRecipientAmount; tradingToken.safeTransfer(_secondaryFees[i].recipient, toFeeRecipientAmount); } uint256 toAssetOwnerAmount = data.value - feeSum; tradingToken.safeTransfer(data.from, toAssetOwnerAmount); bytes memory transferData; _safeTransferWithSig(data.from, data.to, data.id, data.amount, transferData); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_uri","type":"string"},{"internalType":"address","name":"tradingToken","type":"address"},{"internalType":"string","name":"eip712Name","type":"string"},{"internalType":"string","name":"eip712Version","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"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":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"recipients","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"name":"SecondarySaleFees","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":"FEE_DIVISIONER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedTradingErc20Tokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getFeeBps","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getFeeRecipients","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"components":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct ERC1155.Fee","name":"_primaryFee","type":"tuple"},{"components":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct ERC1155.Fee[]","name":"_secondaryFees","type":"tuple[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"primaryFee","outputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"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":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"secondaryFees","outputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","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":[{"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":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"_buyerNonce","type":"uint256"},{"internalType":"address","name":"tradingTokenAddress","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"tokenSale","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":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"_buyerNonce","type":"uint256"},{"internalType":"address","name":"tradingTokenAddress","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"tokenSaleFrom","outputs":[],"stateMutability":"nonpayable","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"}]
Contract Creation Code
6101206040523480156200001257600080fd5b506040516200459938038062004599833981016040819052620000359162000300565b818185620000438162000156565b506000620000506200016f565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350815160208084019190912082519183019190912060c082905260e08190524660a0527f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ee81848462000173565b60805261010052505050506001600160a01b0383166200012b5760405162461bcd60e51b81526004016200012290620003da565b60405180910390fd5b50506001600160a01b03166000908152600660205260409020805460ff19166001179055506200048a565b80516200016b906002906020840190620001af565b5050565b3390565b6000838383463060405160200162000190959493929190620003ae565b6040516020818303038152906040528051906020012090509392505050565b828054620001bd9062000437565b90600052602060002090601f016020900481019282620001e157600085556200022c565b82601f10620001fc57805160ff19168380011785556200022c565b828001600101855582156200022c579182015b828111156200022c5782518255916020019190600101906200020f565b506200023a9291506200023e565b5090565b5b808211156200023a57600081556001016200023f565b600082601f83011262000266578081fd5b81516001600160401b038082111562000283576200028362000474565b6040516020601f8401601f1916820181018381118382101715620002ab57620002ab62000474565b6040528382528584018101871015620002c2578485fd5b8492505b83831015620002e55785830181015182840182015291820191620002c6565b83831115620002f657848185840101525b5095945050505050565b6000806000806080858703121562000316578384fd5b84516001600160401b03808211156200032d578586fd5b6200033b8883890162000255565b602088015190965091506001600160a01b03821682146200035a578485fd5b6040870151919450808211156200036f578384fd5b6200037d8883890162000255565b9350606087015191508082111562000393578283fd5b50620003a28782880162000255565b91505092959194509250565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60208082526033908201527f487970652078206c61204269656e6e616c6520323032323a2054726164696e6760408201527f20546f6b656e207a65726f206164647265737300000000000000000000000000606082015260800190565b6002810460018216806200044c57607f821691505b602082108114156200046e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160a05160c05160e051610100516140ca620004cf60003960006125f60152600061263801526000612617015260006125a4015260006125cd01526140ca6000f3fe608060405234801561001057600080fd5b50600436106101575760003560e01c8063821e94b1116100c3578063d053344c1161007c578063d053344c146102f8578063e3255d161461030b578063e985e9c51461031e578063f242432a14610331578063f2fde38b14610344578063f5298aca1461035757610157565b8063821e94b1146102695780638da5cb5b1461027c578063a22cb46514610291578063b59bd0d6146102a4578063b9c4d9fb146102c5578063bcce6f3d146102e557610157565b80632eb2c2d6116101155780632eb2c2d61461020d5780634e1273f41461022057806355f804b3146102335780636b20c45414610246578063715018a614610259578063737c1f931461026157610157565b8062fdd58e1461015c57806301ffc9a7146101855780630e89341c146101a55780630ebd4c7f146101c557806311bf77ad146101e55780632d0335ab146101fa575b600080fd5b61016f61016a366004612d82565b61036a565b60405161017c9190613d27565b60405180910390f35b610198610193366004612ebc565b6103c1565b60405161017c91906132f4565b6101b86101b3366004612f39565b610424565b60405161017c9190613397565b6101d86101d3366004612f39565b610483565b60405161017c91906132bc565b6101f86101f3366004612c0d565b6105ce565b005b61016f610208366004612aaa565b6109df565b6101f861021b366004612afe565b6109fa565b6101d861022e366004612de1565b610c52565b6101f8610241366004612ef4565b610d69565b6101f8610254366004612ce3565b610db4565b6101f8610e03565b61016f610e8c565b6101f8610277366004612c0d565b610e92565b610284611257565b60405161017c9190613186565b6101f861029f366004612d55565b611267565b6102b76102b2366004612f39565b611335565b60405161017c92919061319a565b6102d86102d3366004612f39565b61135a565b60405161017c919061326f565b6101986102f3366004612aaa565b6114aa565b6102b7610306366004612f51565b6114bf565b6101f8610319366004612f72565b611505565b61019861032c366004612ac6565b611562565b6101f861033f366004612ba7565b611590565b6101f8610352366004612aaa565b611709565b6101f8610365366004612dad565b6117ca565b60006001600160a01b03831661039b5760405162461bcd60e51b8152600401610392906134dc565b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806103f257506001600160e01b031982166303a24d0760e21b145b8061040d57506001600160e01b03198216632dde656160e21b145b8061041c575061041c82611814565b90505b919050565b606060006002805461043590613e81565b905011610451576040518060200160405280600081525061041c565b600261045c8361182d565b60405160200161046d9291906130ce565b6040516020818303038152906040529050919050565b6000818152600360209081526040808320805482518185028101850190935280835260609493849084015b828210156104f6576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001908101548284015290835290920191016104ae565b505050509050600081516001600160401b0381111561052557634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561054e578160200160208202803683370190505b50905060005b82518110156105c65782818151811061057d57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001518282815181106105a957634e487b7160e01b600052603260045260246000fd5b6020908102919091010152806105be81613ebc565b915050610554565b509392505050565b6001600160a01b03841660009081526006602052604090205460ff166106065760405162461bcd60e51b815260040161039290613720565b60006040518061010001604052808c6001600160a01b031681526020018b6001600160a01b03168152602001866001600160a01b031681526020018a815260200189815260200188815260200187815260200185815250905061067181602001518260c0015161194f565b6106b18184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061198a92505050565b6106be81602001516119e6565b60208101516001600160a01b03166106d557600080fd5b80602001516001600160a01b0316336001600160a01b03161461070a5760405162461bcd60e51b815260040161039290613929565b8060e0015142111561072e5760405162461bcd60e51b815260040161039290613772565b602081015160a08201518691610751916001600160a01b03841691903090611a12565b610759611257565b6001600160a01b031682600001516001600160a01b0316141561083d5760608201516000908152600460209081526040808320815180830190925280546001600160a01b031682526001015491810182905260a0850151909291906107c19061271090613e0b565b6107cb9190613e1f565b90506000818560a001516107df9190613e3e565b83519091506107f9906001600160a01b0386169084611a6a565b610815610804611257565b6001600160a01b0386169083611a6a565b6060610834866000015187602001518860600151896080015185611a89565b505050506109d1565b60006003600084606001518152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156108be576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101610876565b505050509050600080600090505b82518110156109805760008382815181106108f757634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516127108760a001516109159190613e0b565b61091f9190613e1f565b905061092b8184613df3565b925061096d84838151811061095057634e487b7160e01b600052603260045260246000fd5b6020908102919091010151516001600160a01b0387169083611a6a565b508061097881613ebc565b9150506108cc565b506000818560a001516109939190613e3e565b85519091506109ad906001600160a01b0386169083611a6a565b60606109cc866000015187602001518860600151896080015185611a89565b505050505b505050505050505050505050565b6001600160a01b031660009081526007602052604090205490565b8151835114610a1b5760405162461bcd60e51b815260040161039290613c09565b6001600160a01b038416610a415760405162461bcd60e51b8152600401610392906137c3565b610a49611aaf565b6001600160a01b0316856001600160a01b03161480610a6f5750610a6f8561032c611aaf565b610a8b5760405162461bcd60e51b815260040161039290613808565b6000610a95611aaf565b905060005b8451811015610be4576000858281518110610ac557634e487b7160e01b600052603260045260246000fd5b602002602001015190506000858381518110610af157634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610b415760405162461bcd60e51b8152600401610392906138df565b610b4b8282613e3e565b60008085815260200190815260200160002060008c6001600160a01b03166001600160a01b03168152602001908152602001600020819055508160008085815260200190815260200160002060008b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610bc99190613df3565b9250508190555050505080610bdd90613ebc565b9050610a9a565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610c349291906132cf565b60405180910390a4610c4a818787878787611ab3565b505050505050565b60608151835114610c755760405162461bcd60e51b815260040161039290613bc0565b600083516001600160401b03811115610c9e57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610cc7578160200160208202803683370190505b50905060005b84518110156105c657610d2e858281518110610cf957634e487b7160e01b600052603260045260246000fd5b6020026020010151858381518110610d2157634e487b7160e01b600052603260045260246000fd5b602002602001015161036a565b828281518110610d4e57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152610d6281613ebc565b9050610ccd565b610d71611aaf565b6001600160a01b0316610d82611257565b6001600160a01b031614610da85760405162461bcd60e51b815260040161039290613a07565b610db181611bc1565b50565b610dbc611aaf565b6001600160a01b0316610dcd611257565b6001600160a01b031614610df35760405162461bcd60e51b815260040161039290613a07565b610dfe838383611bd4565b505050565b610e0b611aaf565b6001600160a01b0316610e1c611257565b6001600160a01b031614610e425760405162461bcd60e51b815260040161039290613a07565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b61271081565b6001600160a01b03841660009081526006602052604090205460ff16610eca5760405162461bcd60e51b815260040161039290613720565b60006040518061010001604052808b6001600160a01b031681526020018c6001600160a01b03168152602001866001600160a01b031681526020018a8152602001898152602001888152602001878152602001858152509050610f3581600001518260c0015161194f565b610f758184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061198a92505050565b8051610f80906119e6565b80602001516001600160a01b0316336001600160a01b031614610fb55760405162461bcd60e51b815260040161039290613aaa565b8060e00151421115610fd95760405162461bcd60e51b815260040161039290613772565b60208101516001600160a01b0316610ff057600080fd5b805160a08201518691611010916001600160a01b03841691903090611a12565b611018611257565b6001600160a01b031682602001516001600160a01b031614156110e25760608201516000908152600460209081526040808320815180830190925280546001600160a01b031682526001015491810182905260a0850151909291906110809061271090613e0b565b61108a9190613e1f565b90506000818560a0015161109e9190613e3e565b83519091506110b8906001600160a01b0386169084611a6a565b6110c3610804611257565b6060610834866020015187600001518860600151896080015185611590565b60006003600084606001518152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611163576000848152602090819020604080518082019091526002850290910180546001600160a01b0316825260019081015482840152908352909201910161111b565b505050509050600080600090505b825181101561120857600083828151811061119c57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516127108760a001516111ba9190613e0b565b6111c49190613e1f565b90506111d08184613df3565b92506111f584838151811061095057634e487b7160e01b600052603260045260246000fd5b508061120081613ebc565b915050611171565b506000818560a0015161121b9190613e3e565b6020860151909150611238906001600160a01b0386169083611a6a565b60606109cc866020015187600001518860600151896080015185611590565b6005546001600160a01b03165b90565b816001600160a01b0316611279611aaf565b6001600160a01b031614156112a05760405162461bcd60e51b815260040161039290613b2d565b80600160006112ad611aaf565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556112f1611aaf565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161132991906132f4565b60405180910390a35050565b600460205260009081526040902080546001909101546001600160a01b039091169082565b6000818152600360209081526040808320805482518185028101850190935280835260609493849084015b828210156113cd576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101611385565b505050509050600081516001600160401b038111156113fc57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611425578160200160208202803683370190505b50905060005b82518110156105c65782818151811061145457634e487b7160e01b600052603260045260246000fd5b60200260200101516000015182828151811061148057634e487b7160e01b600052603260045260246000fd5b6001600160a01b0390921660209283029190910190910152806114a281613ebc565b91505061142b565b60066020526000908152604090205460ff1681565b600360205281600052604060002081815481106114db57600080fd5b6000918252602090912060029091020180546001909101546001600160a01b039091169250905082565b61150d611aaf565b6001600160a01b031661151e611257565b6001600160a01b0316146115445760405162461bcd60e51b815260040161039290613a07565b606061155b611551611257565b8686868686611d74565b5050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6001600160a01b0384166115b65760405162461bcd60e51b8152600401610392906137c3565b6115be611aaf565b6001600160a01b0316856001600160a01b031614806115e457506115e48561032c611aaf565b6116005760405162461bcd60e51b815260040161039290613618565b600061160a611aaf565b6000858152602081815260408083206001600160a01b038b1684529091529020549091508381101561164e5760405162461bcd60e51b8152600401610392906138df565b6116588482613e3e565b6000868152602081815260408083206001600160a01b038c81168552925280832093909355881681529081208054869290611694908490613df3565b92505081905550856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516116ea929190613d8d565b60405180910390a4611700828888888888612252565b50505050505050565b611711611aaf565b6001600160a01b0316611722611257565b6001600160a01b0316146117485760405162461bcd60e51b815260040161039290613a07565b6001600160a01b03811661176e5760405162461bcd60e51b815260040161039290613527565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6117d2611aaf565b6001600160a01b03166117e3611257565b6001600160a01b0316146118095760405162461bcd60e51b815260040161039290613a07565b610dfe838383612323565b6001600160e01b031981166301ffc9a760e01b14919050565b60608161185257506040805180820190915260018152600360fc1b602082015261041f565b8160005b811561187c578061186681613ebc565b91506118759050600a83613e0b565b9150611856565b6000816001600160401b038111156118a457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156118ce576020820181803683370190505b5090505b8415611947576118e3600183613e3e565b91506118f0600a86613ed7565b6118fb906030613df3565b60f81b81838151811061191e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611940600a86613e0b565b94506118d2565b949350505050565b6001600160a01b03821660009081526007602052604090205481146119865760405162461bcd60e51b8152600401610392906134b4565b5050565b60006119958361240f565b905060006119a2826124ad565b84519091506001600160a01b03166119ba82856124c0565b6001600160a01b0316146119e05760405162461bcd60e51b815260040161039290613c92565b50505050565b6001600160a01b0381166000908152600760205260408120805491611a0a83613ebc565b919050555050565b6119e0846323b872dd60e01b858585604051602401611a3393929190613211565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261250b565b610dfe8363a9059cbb60e01b8484604051602401611a3392919061319a565b6001600160a01b0384166116005760405162461bcd60e51b8152600401610392906137c3565b3390565b611ac5846001600160a01b031661259a565b15610c4a5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611afe90899089908890889088906004016131b3565b602060405180830381600087803b158015611b1857600080fd5b505af1925050508015611b48575060408051601f3d908101601f19168201909252611b4591810190612ed8565b60015b611b9157611b54613f33565b80611b5f5750611b79565b8060405162461bcd60e51b81526004016103929190613397565b60405162461bcd60e51b8152600401610392906133e1565b6001600160e01b0319811663bc197c8160e01b146117005760405162461bcd60e51b815260040161039290613435565b80516119869060029060208401906128d8565b6001600160a01b038316611bfa5760405162461bcd60e51b81526004016103929061389c565b8051825114611c1b5760405162461bcd60e51b815260040161039290613c09565b6000611c25611aaf565b905060005b8351811015611d15576000848281518110611c5557634e487b7160e01b600052603260045260246000fd5b602002602001015190506000848381518110611c8157634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038c168352909352919091205490915081811015611cd15760405162461bcd60e51b81526004016103929061356d565b611cdb8282613e3e565b6000938452602084815260408086206001600160a01b038c1687529091529093209290925550819050611d0d81613ebc565b915050611c2a565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611d669291906132cf565b60405180910390a450505050565b60008411611d945760405162461bcd60e51b8152600401610392906136a3565b6001600160a01b038616611dba5760405162461bcd60e51b815260040161039290613c51565b6000611dc4611aaf565b84519091506001600160a01b0316611dee5760405162461bcd60e51b815260040161039290613974565b60008460200151118015611e085750612710846020015111155b611e245760405162461bcd60e51b815260040161039290613a3c565b60008681526004602090815260408220865181546001600160a01b0319166001600160a01b039091161781559086015160019091015583516001600160401b03811115611e8157634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611eaa578160200160208202803683370190505b509050600084516001600160401b03811115611ed657634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611eff578160200160208202803683370190505b5090506000805b86518110156121425760006001600160a01b0316878281518110611f3a57634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b03161415611f6d5760405162461bcd60e51b815260040161039290613cdd565b6000878281518110611f8f57634e487b7160e01b600052603260045260246000fd5b60200260200101516020015111611fb85760405162461bcd60e51b8152600401610392906139bc565b60008a81526003602052604090208751889083908110611fe857634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018082018555600094855293839020825160029092020180546001600160a01b0319166001600160a01b03909216919091178155910151910155865187908290811061205357634e487b7160e01b600052603260045260246000fd5b60200260200101516000015184828151811061207f57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508681815181106120bf57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001518382815181106120eb57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505086818151811061211757634e487b7160e01b600052603260045260246000fd5b6020026020010151602001518261212e9190613df3565b91508061213a81613ebc565b915050611f06565b506127108111156121655760405162461bcd60e51b8152600401610392906135b1565b8551156121a8577f99aba1d63749cfd5ad1afda7c4663840924d54eb5f005bbbeadedc6ec13674b289848460405161219f93929190613d30565b60405180910390a15b6000898152602081815260408083206001600160a01b038e168452909152812080548a92906121d8908490613df3565b92505081905550896001600160a01b031660006001600160a01b0316856001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628c8c60405161222f929190613d8d565b60405180910390a46122468460008c8c8c8a612252565b50505050505050505050565b612264846001600160a01b031661259a565b15610c4a5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061229d9089908990889088908890600401613235565b602060405180830381600087803b1580156122b757600080fd5b505af19250505080156122e7575060408051601f3d908101601f191682019092526122e491810190612ed8565b60015b6122f357611b54613f33565b6001600160e01b0319811663f23a6e6160e01b146117005760405162461bcd60e51b815260040161039290613435565b6001600160a01b0383166123495760405162461bcd60e51b81526004016103929061389c565b6000612353611aaf565b6000848152602081815260408083206001600160a01b0389168452909152902054909150828110156123975760405162461bcd60e51b81526004016103929061356d565b6123a18382613e3e565b6000858152602081815260408083206001600160a01b03808b16808652919093528184209490945551919291908516907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906124009089908990613d8d565b60405180910390a45050505050565b60006040518060c00160405280608481526020016140116084913960405160200161243a91906130b2565b60405160208183030381529060405280519060200120826000015183602001518460400151856060015186608001518760a001518860c001518960e00151604051602001612490999897969594939291906132ff565b604051602081830303815290604052805190602001209050919050565b600061041c6124ba6125a0565b83612663565b600081516041146124e35760405162461bcd60e51b81526004016103929061347d565b60208201516040830151606084015160001a61250186828585612696565b9695505050505050565b6000612560826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661278c9092919063ffffffff16565b805190915015610dfe578080602001905181019061257e9190612ea0565b610dfe5760405162461bcd60e51b815260040161039290613b76565b3b151590565b60007f00000000000000000000000000000000000000000000000000000000000000004614156125f157507f0000000000000000000000000000000000000000000000000000000000000000611264565b61265c7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006127a5565b9050611264565b6000828260405160200161267892919061316b565b60405160208183030381529060405280519060200120905092915050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156126d85760405162461bcd60e51b815260040161039290613661565b8360ff16601b14806126ed57508360ff16601c145b6127095760405162461bcd60e51b81526004016103929061385a565b60006001868686866040516000815260200160405260405161272e9493929190613379565b6020604051602081039080840390855afa158015612750573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166127835760405162461bcd60e51b8152600401610392906133aa565b95945050505050565b606061279b84846000856127df565b90505b9392505050565b600083838346306040516020016127c095949392919061334d565b6040516020818303038152906040528051906020012090509392505050565b6060824710156128015760405162461bcd60e51b8152600401610392906136da565b61280a8561259a565b6128265760405162461bcd60e51b815260040161039290613af6565b600080866001600160a01b0316858760405161284291906130b2565b60006040518083038185875af1925050503d806000811461287f576040519150601f19603f3d011682016040523d82523d6000602084013e612884565b606091505b509150915061289482828661289f565b979650505050505050565b606083156128ae57508161279e565b8251156128be5782518084602001fd5b8160405162461bcd60e51b81526004016103929190613397565b8280546128e490613e81565b90600052602060002090601f016020900481019282612906576000855561294c565b82601f1061291f57805160ff191683800117855561294c565b8280016001018555821561294c579182015b8281111561294c578251825591602001919060010190612931565b5061295892915061295c565b5090565b5b80821115612958576000815560010161295d565b60006001600160401b0383111561298a5761298a613f17565b61299d601f8401601f1916602001613d9b565b90508281528383830111156129b157600080fd5b828260208301376000602084830101529392505050565b600082601f8301126129d8578081fd5b813560206129ed6129e883613dc4565b613d9b565b8281528181019085830183850287018401881015612a09578586fd5b855b85811015612a2757813584529284019290840190600101612a0b565b5090979650505050505050565b600082601f830112612a44578081fd5b61279e83833560208501612971565b600060408284031215612a64578081fd5b604051604081018181106001600160401b0382111715612a8657612a86613f17565b6040529050808235612a9781613fd7565b8152602092830135920191909152919050565b600060208284031215612abb578081fd5b813561279e81613fd7565b60008060408385031215612ad8578081fd5b8235612ae381613fd7565b91506020830135612af381613fd7565b809150509250929050565b600080600080600060a08688031215612b15578081fd5b8535612b2081613fd7565b94506020860135612b3081613fd7565b935060408601356001600160401b0380821115612b4b578283fd5b612b5789838a016129c8565b94506060880135915080821115612b6c578283fd5b612b7889838a016129c8565b93506080880135915080821115612b8d578283fd5b50612b9a88828901612a34565b9150509295509295909350565b600080600080600060a08688031215612bbe578081fd5b8535612bc981613fd7565b94506020860135612bd981613fd7565b9350604086013592506060860135915060808601356001600160401b03811115612c01578182fd5b612b9a88828901612a34565b6000806000806000806000806000806101208b8d031215612c2c578788fd5b8a35612c3781613fd7565b995060208b0135612c4781613fd7565b985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b0135612c7381613fd7565b935060e08b013592506101008b01356001600160401b0380821115612c96578384fd5b818d0191508d601f830112612ca9578384fd5b813581811115612cb7578485fd5b8e6020828501011115612cc8578485fd5b6020830194508093505050509295989b9194979a5092959850565b600080600060608486031215612cf7578081fd5b8335612d0281613fd7565b925060208401356001600160401b0380821115612d1d578283fd5b612d29878388016129c8565b93506040860135915080821115612d3e578283fd5b50612d4b868287016129c8565b9150509250925092565b60008060408385031215612d67578182fd5b8235612d7281613fd7565b91506020830135612af381613fec565b60008060408385031215612d94578182fd5b8235612d9f81613fd7565b946020939093013593505050565b600080600060608486031215612dc1578081fd5b8335612dcc81613fd7565b95602085013595506040909401359392505050565b60008060408385031215612df3578182fd5b82356001600160401b0380821115612e09578384fd5b818501915085601f830112612e1c578384fd5b81356020612e2c6129e883613dc4565b82815281810190858301838502870184018b1015612e48578889fd5b8896505b84871015612e73578035612e5f81613fd7565b835260019690960195918301918301612e4c565b5096505086013592505080821115612e89578283fd5b50612e96858286016129c8565b9150509250929050565b600060208284031215612eb1578081fd5b815161279e81613fec565b600060208284031215612ecd578081fd5b813561279e81613ffa565b600060208284031215612ee9578081fd5b815161279e81613ffa565b600060208284031215612f05578081fd5b81356001600160401b03811115612f1a578182fd5b8201601f81018413612f2a578182fd5b61194784823560208401612971565b600060208284031215612f4a578081fd5b5035919050565b60008060408385031215612f63578182fd5b50508035926020909101359150565b60008060008060a08587031215612f87578182fd5b8435935060208086013593506040612fa188828901612a53565b935060808701356001600160401b03811115612fbb578384fd5b8701601f81018913612fcb578384fd5b8035612fd96129e882613dc4565b81815284810190838601858402850187018d1015612ff5578788fd5b8794505b8385101561301f5761300b8d82612a53565b835260019490940193918601918501612ff9565b50989b979a50959850505050505050565b6000815180845260208085019450808401835b8381101561305f57815187529582019590820190600101613043565b509495945050505050565b60008151808452613082816020860160208601613e55565b601f01601f19169290920160200192915050565b600081516130a8818560208601613e55565b9290920192915050565b600082516130c4818460208701613e55565b9190910192915050565b82546000908190600281046001808316806130ea57607f831692505b602080841082141561310a57634e487b7160e01b87526022600452602487fd5b81801561311e576001811461312f5761315b565b60ff1986168952848901965061315b565b6131388b613de7565b885b868110156131535781548b82015290850190830161313a565b505084890196505b5050505050506127838185613096565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0386811682528516602082015260a0604082018190526000906131df90830186613030565b82810360608401526131f18186613030565b90508281036080840152613205818561306a565b98975050505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906128949083018461306a565b6020808252825182820181905260009190848201906040850190845b818110156132b05783516001600160a01b03168352928401929184019160010161328b565b50909695505050505050565b60006020825261279e6020830184613030565b6000604082526132e26040830185613030565b82810360208401526127838185613030565b901515815260200190565b9889526001600160a01b0397881660208a01529587166040890152939095166060870152608086019190915260a085015260c084019290925260e08301919091526101008201526101200190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825261279e602083018461306a565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b6020808252600e908201526d0dcdedcc6ca40dad2e6dac2e8c6d60931b604082015260600190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526041908201527f5365636f6e64617279204665653a204665652070657263656e7461676520736860408201527f6f756c64206265206c657373206f7220657175616c203130302070657263656e6060820152601d60fa1b608082015260a00190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b60208082526019908201527f416d6f756e742073686f756c6420626520706f73697469766500000000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526032908201527f487970652078206c61204269656e6e616c6520323032323a2074726164696e67604082015271081d1bdad95b881b9bdd08185b1b1bddd95960721b606082015260800190565b60208082526031908201527f487970652078206c61204269656e6e616c6520323032323a207369676e6174756040820152707265206973206f75742d6f662d6461746560781b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526032908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252602b908201527f487970652078206c61204269656e6e616c6520323032323a206e6f7420616c6c60408201526a6f77656420746f2062757960a81b606082015260800190565b60208082526028908201527f5072696d617279204665653a20526563697069656e742073686f756c64206265604082015267081c1c995cd95b9d60c21b606082015260800190565b6020808252602b908201527f5365636f6e64617279204665653a204665652076616c75652073686f756c642060408201526a626520706f73697469766560a81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526048908201527f5072696d617279204665653a204665652076616c75652073686f756c6420626560408201527f20706f73697469766520616e64206c657373206f7220657175616c203130302060608201526770657263656e747360c01b608082015260a00190565b6020808252602c908201527f487970652078206c61204269656e6e616c6520323032323a206e6f7420616c6c60408201526b1bddd959081d1bc81cd95b1b60a21b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252602b908201527f487970652078206c61204269656e6e616c6520323032323a207369676e61747560408201526a0e4ca40dad2e6dac2e8c6d60ab1b606082015260800190565b6020808252602a908201527f5365636f6e64617279204665653a20526563697069656e742073686f756c64206040820152691899481c1c995cd95b9d60b21b606082015260800190565b90815260200190565b60006060820185835260206060818501528186518084526080860191508288019350845b81811015613d795784516001600160a01b031683529383019391830191600101613d54565b505084810360408601526132058187613030565b918252602082015260400190565b6040518181016001600160401b0381118282101715613dbc57613dbc613f17565b604052919050565b60006001600160401b03821115613ddd57613ddd613f17565b5060209081020190565b60009081526020902090565b60008219821115613e0657613e06613eeb565b500190565b600082613e1a57613e1a613f01565b500490565b6000816000190483118215151615613e3957613e39613eeb565b500290565b600082821015613e5057613e50613eeb565b500390565b60005b83811015613e70578181015183820152602001613e58565b838111156119e05750506000910152565b600281046001821680613e9557607f821691505b60208210811415613eb657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613ed057613ed0613eeb565b5060010190565b600082613ee657613ee6613f01565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60e01c90565b600060443d1015613f4357611264565b600481823e6308c379a0613f578251613f2d565b14613f6157611264565b6040513d600319016004823e80513d6001600160401b038160248401118184111715613f905750505050611264565b82840192508251915080821115613faa5750505050611264565b503d83016020828401011115613fc257505050611264565b601f01601f1916810160200160405291505090565b6001600160a01b0381168114610db157600080fd5b8015158114610db157600080fd5b6001600160e01b031981168114610db157600080fdfe466f72776172644461746128616464726573732066726f6d2c6164647265737320746f2c616464726573732074726164696e67546f6b656e416464722c75696e743235362069642c75696e7432353620616d6f756e742c75696e743235362076616c75652c75696e74323536206e6f6e63652c75696e7432353620646561646c696e6529a2646970667358221220124a76011d089b6dbbd5eb628a2cf7cf142e1ff79cb8c5257ad403e40e9680b264736f6c634300080000330000000000000000000000000000000000000000000000000000000000000080000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000071687474703a2f2f6563322d332d36392d3135302d3139372e65752d63656e7472616c2d312e636f6d707574652e616d617a6f6e6177732e636f6d2f6170692f746f6b656e732f3078463132386539443835413744353142653330354633313342433936613965423331304632416337432f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017487970652078206c61204269656e6e616c6520323032320000000000000000000000000000000000000000000000000000000000000000000000000000000017487970652078206c61204269656e6e616c652032303232000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101575760003560e01c8063821e94b1116100c3578063d053344c1161007c578063d053344c146102f8578063e3255d161461030b578063e985e9c51461031e578063f242432a14610331578063f2fde38b14610344578063f5298aca1461035757610157565b8063821e94b1146102695780638da5cb5b1461027c578063a22cb46514610291578063b59bd0d6146102a4578063b9c4d9fb146102c5578063bcce6f3d146102e557610157565b80632eb2c2d6116101155780632eb2c2d61461020d5780634e1273f41461022057806355f804b3146102335780636b20c45414610246578063715018a614610259578063737c1f931461026157610157565b8062fdd58e1461015c57806301ffc9a7146101855780630e89341c146101a55780630ebd4c7f146101c557806311bf77ad146101e55780632d0335ab146101fa575b600080fd5b61016f61016a366004612d82565b61036a565b60405161017c9190613d27565b60405180910390f35b610198610193366004612ebc565b6103c1565b60405161017c91906132f4565b6101b86101b3366004612f39565b610424565b60405161017c9190613397565b6101d86101d3366004612f39565b610483565b60405161017c91906132bc565b6101f86101f3366004612c0d565b6105ce565b005b61016f610208366004612aaa565b6109df565b6101f861021b366004612afe565b6109fa565b6101d861022e366004612de1565b610c52565b6101f8610241366004612ef4565b610d69565b6101f8610254366004612ce3565b610db4565b6101f8610e03565b61016f610e8c565b6101f8610277366004612c0d565b610e92565b610284611257565b60405161017c9190613186565b6101f861029f366004612d55565b611267565b6102b76102b2366004612f39565b611335565b60405161017c92919061319a565b6102d86102d3366004612f39565b61135a565b60405161017c919061326f565b6101986102f3366004612aaa565b6114aa565b6102b7610306366004612f51565b6114bf565b6101f8610319366004612f72565b611505565b61019861032c366004612ac6565b611562565b6101f861033f366004612ba7565b611590565b6101f8610352366004612aaa565b611709565b6101f8610365366004612dad565b6117ca565b60006001600160a01b03831661039b5760405162461bcd60e51b8152600401610392906134dc565b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806103f257506001600160e01b031982166303a24d0760e21b145b8061040d57506001600160e01b03198216632dde656160e21b145b8061041c575061041c82611814565b90505b919050565b606060006002805461043590613e81565b905011610451576040518060200160405280600081525061041c565b600261045c8361182d565b60405160200161046d9291906130ce565b6040516020818303038152906040529050919050565b6000818152600360209081526040808320805482518185028101850190935280835260609493849084015b828210156104f6576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001908101548284015290835290920191016104ae565b505050509050600081516001600160401b0381111561052557634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561054e578160200160208202803683370190505b50905060005b82518110156105c65782818151811061057d57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001518282815181106105a957634e487b7160e01b600052603260045260246000fd5b6020908102919091010152806105be81613ebc565b915050610554565b509392505050565b6001600160a01b03841660009081526006602052604090205460ff166106065760405162461bcd60e51b815260040161039290613720565b60006040518061010001604052808c6001600160a01b031681526020018b6001600160a01b03168152602001866001600160a01b031681526020018a815260200189815260200188815260200187815260200185815250905061067181602001518260c0015161194f565b6106b18184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061198a92505050565b6106be81602001516119e6565b60208101516001600160a01b03166106d557600080fd5b80602001516001600160a01b0316336001600160a01b03161461070a5760405162461bcd60e51b815260040161039290613929565b8060e0015142111561072e5760405162461bcd60e51b815260040161039290613772565b602081015160a08201518691610751916001600160a01b03841691903090611a12565b610759611257565b6001600160a01b031682600001516001600160a01b0316141561083d5760608201516000908152600460209081526040808320815180830190925280546001600160a01b031682526001015491810182905260a0850151909291906107c19061271090613e0b565b6107cb9190613e1f565b90506000818560a001516107df9190613e3e565b83519091506107f9906001600160a01b0386169084611a6a565b610815610804611257565b6001600160a01b0386169083611a6a565b6060610834866000015187602001518860600151896080015185611a89565b505050506109d1565b60006003600084606001518152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156108be576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101610876565b505050509050600080600090505b82518110156109805760008382815181106108f757634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516127108760a001516109159190613e0b565b61091f9190613e1f565b905061092b8184613df3565b925061096d84838151811061095057634e487b7160e01b600052603260045260246000fd5b6020908102919091010151516001600160a01b0387169083611a6a565b508061097881613ebc565b9150506108cc565b506000818560a001516109939190613e3e565b85519091506109ad906001600160a01b0386169083611a6a565b60606109cc866000015187602001518860600151896080015185611a89565b505050505b505050505050505050505050565b6001600160a01b031660009081526007602052604090205490565b8151835114610a1b5760405162461bcd60e51b815260040161039290613c09565b6001600160a01b038416610a415760405162461bcd60e51b8152600401610392906137c3565b610a49611aaf565b6001600160a01b0316856001600160a01b03161480610a6f5750610a6f8561032c611aaf565b610a8b5760405162461bcd60e51b815260040161039290613808565b6000610a95611aaf565b905060005b8451811015610be4576000858281518110610ac557634e487b7160e01b600052603260045260246000fd5b602002602001015190506000858381518110610af157634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610b415760405162461bcd60e51b8152600401610392906138df565b610b4b8282613e3e565b60008085815260200190815260200160002060008c6001600160a01b03166001600160a01b03168152602001908152602001600020819055508160008085815260200190815260200160002060008b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610bc99190613df3565b9250508190555050505080610bdd90613ebc565b9050610a9a565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610c349291906132cf565b60405180910390a4610c4a818787878787611ab3565b505050505050565b60608151835114610c755760405162461bcd60e51b815260040161039290613bc0565b600083516001600160401b03811115610c9e57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610cc7578160200160208202803683370190505b50905060005b84518110156105c657610d2e858281518110610cf957634e487b7160e01b600052603260045260246000fd5b6020026020010151858381518110610d2157634e487b7160e01b600052603260045260246000fd5b602002602001015161036a565b828281518110610d4e57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152610d6281613ebc565b9050610ccd565b610d71611aaf565b6001600160a01b0316610d82611257565b6001600160a01b031614610da85760405162461bcd60e51b815260040161039290613a07565b610db181611bc1565b50565b610dbc611aaf565b6001600160a01b0316610dcd611257565b6001600160a01b031614610df35760405162461bcd60e51b815260040161039290613a07565b610dfe838383611bd4565b505050565b610e0b611aaf565b6001600160a01b0316610e1c611257565b6001600160a01b031614610e425760405162461bcd60e51b815260040161039290613a07565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b61271081565b6001600160a01b03841660009081526006602052604090205460ff16610eca5760405162461bcd60e51b815260040161039290613720565b60006040518061010001604052808b6001600160a01b031681526020018c6001600160a01b03168152602001866001600160a01b031681526020018a8152602001898152602001888152602001878152602001858152509050610f3581600001518260c0015161194f565b610f758184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061198a92505050565b8051610f80906119e6565b80602001516001600160a01b0316336001600160a01b031614610fb55760405162461bcd60e51b815260040161039290613aaa565b8060e00151421115610fd95760405162461bcd60e51b815260040161039290613772565b60208101516001600160a01b0316610ff057600080fd5b805160a08201518691611010916001600160a01b03841691903090611a12565b611018611257565b6001600160a01b031682602001516001600160a01b031614156110e25760608201516000908152600460209081526040808320815180830190925280546001600160a01b031682526001015491810182905260a0850151909291906110809061271090613e0b565b61108a9190613e1f565b90506000818560a0015161109e9190613e3e565b83519091506110b8906001600160a01b0386169084611a6a565b6110c3610804611257565b6060610834866020015187600001518860600151896080015185611590565b60006003600084606001518152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611163576000848152602090819020604080518082019091526002850290910180546001600160a01b0316825260019081015482840152908352909201910161111b565b505050509050600080600090505b825181101561120857600083828151811061119c57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516127108760a001516111ba9190613e0b565b6111c49190613e1f565b90506111d08184613df3565b92506111f584838151811061095057634e487b7160e01b600052603260045260246000fd5b508061120081613ebc565b915050611171565b506000818560a0015161121b9190613e3e565b6020860151909150611238906001600160a01b0386169083611a6a565b60606109cc866020015187600001518860600151896080015185611590565b6005546001600160a01b03165b90565b816001600160a01b0316611279611aaf565b6001600160a01b031614156112a05760405162461bcd60e51b815260040161039290613b2d565b80600160006112ad611aaf565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556112f1611aaf565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161132991906132f4565b60405180910390a35050565b600460205260009081526040902080546001909101546001600160a01b039091169082565b6000818152600360209081526040808320805482518185028101850190935280835260609493849084015b828210156113cd576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101611385565b505050509050600081516001600160401b038111156113fc57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611425578160200160208202803683370190505b50905060005b82518110156105c65782818151811061145457634e487b7160e01b600052603260045260246000fd5b60200260200101516000015182828151811061148057634e487b7160e01b600052603260045260246000fd5b6001600160a01b0390921660209283029190910190910152806114a281613ebc565b91505061142b565b60066020526000908152604090205460ff1681565b600360205281600052604060002081815481106114db57600080fd5b6000918252602090912060029091020180546001909101546001600160a01b039091169250905082565b61150d611aaf565b6001600160a01b031661151e611257565b6001600160a01b0316146115445760405162461bcd60e51b815260040161039290613a07565b606061155b611551611257565b8686868686611d74565b5050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6001600160a01b0384166115b65760405162461bcd60e51b8152600401610392906137c3565b6115be611aaf565b6001600160a01b0316856001600160a01b031614806115e457506115e48561032c611aaf565b6116005760405162461bcd60e51b815260040161039290613618565b600061160a611aaf565b6000858152602081815260408083206001600160a01b038b1684529091529020549091508381101561164e5760405162461bcd60e51b8152600401610392906138df565b6116588482613e3e565b6000868152602081815260408083206001600160a01b038c81168552925280832093909355881681529081208054869290611694908490613df3565b92505081905550856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516116ea929190613d8d565b60405180910390a4611700828888888888612252565b50505050505050565b611711611aaf565b6001600160a01b0316611722611257565b6001600160a01b0316146117485760405162461bcd60e51b815260040161039290613a07565b6001600160a01b03811661176e5760405162461bcd60e51b815260040161039290613527565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6117d2611aaf565b6001600160a01b03166117e3611257565b6001600160a01b0316146118095760405162461bcd60e51b815260040161039290613a07565b610dfe838383612323565b6001600160e01b031981166301ffc9a760e01b14919050565b60608161185257506040805180820190915260018152600360fc1b602082015261041f565b8160005b811561187c578061186681613ebc565b91506118759050600a83613e0b565b9150611856565b6000816001600160401b038111156118a457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156118ce576020820181803683370190505b5090505b8415611947576118e3600183613e3e565b91506118f0600a86613ed7565b6118fb906030613df3565b60f81b81838151811061191e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611940600a86613e0b565b94506118d2565b949350505050565b6001600160a01b03821660009081526007602052604090205481146119865760405162461bcd60e51b8152600401610392906134b4565b5050565b60006119958361240f565b905060006119a2826124ad565b84519091506001600160a01b03166119ba82856124c0565b6001600160a01b0316146119e05760405162461bcd60e51b815260040161039290613c92565b50505050565b6001600160a01b0381166000908152600760205260408120805491611a0a83613ebc565b919050555050565b6119e0846323b872dd60e01b858585604051602401611a3393929190613211565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261250b565b610dfe8363a9059cbb60e01b8484604051602401611a3392919061319a565b6001600160a01b0384166116005760405162461bcd60e51b8152600401610392906137c3565b3390565b611ac5846001600160a01b031661259a565b15610c4a5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611afe90899089908890889088906004016131b3565b602060405180830381600087803b158015611b1857600080fd5b505af1925050508015611b48575060408051601f3d908101601f19168201909252611b4591810190612ed8565b60015b611b9157611b54613f33565b80611b5f5750611b79565b8060405162461bcd60e51b81526004016103929190613397565b60405162461bcd60e51b8152600401610392906133e1565b6001600160e01b0319811663bc197c8160e01b146117005760405162461bcd60e51b815260040161039290613435565b80516119869060029060208401906128d8565b6001600160a01b038316611bfa5760405162461bcd60e51b81526004016103929061389c565b8051825114611c1b5760405162461bcd60e51b815260040161039290613c09565b6000611c25611aaf565b905060005b8351811015611d15576000848281518110611c5557634e487b7160e01b600052603260045260246000fd5b602002602001015190506000848381518110611c8157634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038c168352909352919091205490915081811015611cd15760405162461bcd60e51b81526004016103929061356d565b611cdb8282613e3e565b6000938452602084815260408086206001600160a01b038c1687529091529093209290925550819050611d0d81613ebc565b915050611c2a565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611d669291906132cf565b60405180910390a450505050565b60008411611d945760405162461bcd60e51b8152600401610392906136a3565b6001600160a01b038616611dba5760405162461bcd60e51b815260040161039290613c51565b6000611dc4611aaf565b84519091506001600160a01b0316611dee5760405162461bcd60e51b815260040161039290613974565b60008460200151118015611e085750612710846020015111155b611e245760405162461bcd60e51b815260040161039290613a3c565b60008681526004602090815260408220865181546001600160a01b0319166001600160a01b039091161781559086015160019091015583516001600160401b03811115611e8157634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611eaa578160200160208202803683370190505b509050600084516001600160401b03811115611ed657634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611eff578160200160208202803683370190505b5090506000805b86518110156121425760006001600160a01b0316878281518110611f3a57634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b03161415611f6d5760405162461bcd60e51b815260040161039290613cdd565b6000878281518110611f8f57634e487b7160e01b600052603260045260246000fd5b60200260200101516020015111611fb85760405162461bcd60e51b8152600401610392906139bc565b60008a81526003602052604090208751889083908110611fe857634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018082018555600094855293839020825160029092020180546001600160a01b0319166001600160a01b03909216919091178155910151910155865187908290811061205357634e487b7160e01b600052603260045260246000fd5b60200260200101516000015184828151811061207f57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508681815181106120bf57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001518382815181106120eb57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505086818151811061211757634e487b7160e01b600052603260045260246000fd5b6020026020010151602001518261212e9190613df3565b91508061213a81613ebc565b915050611f06565b506127108111156121655760405162461bcd60e51b8152600401610392906135b1565b8551156121a8577f99aba1d63749cfd5ad1afda7c4663840924d54eb5f005bbbeadedc6ec13674b289848460405161219f93929190613d30565b60405180910390a15b6000898152602081815260408083206001600160a01b038e168452909152812080548a92906121d8908490613df3565b92505081905550896001600160a01b031660006001600160a01b0316856001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628c8c60405161222f929190613d8d565b60405180910390a46122468460008c8c8c8a612252565b50505050505050505050565b612264846001600160a01b031661259a565b15610c4a5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061229d9089908990889088908890600401613235565b602060405180830381600087803b1580156122b757600080fd5b505af19250505080156122e7575060408051601f3d908101601f191682019092526122e491810190612ed8565b60015b6122f357611b54613f33565b6001600160e01b0319811663f23a6e6160e01b146117005760405162461bcd60e51b815260040161039290613435565b6001600160a01b0383166123495760405162461bcd60e51b81526004016103929061389c565b6000612353611aaf565b6000848152602081815260408083206001600160a01b0389168452909152902054909150828110156123975760405162461bcd60e51b81526004016103929061356d565b6123a18382613e3e565b6000858152602081815260408083206001600160a01b03808b16808652919093528184209490945551919291908516907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906124009089908990613d8d565b60405180910390a45050505050565b60006040518060c00160405280608481526020016140116084913960405160200161243a91906130b2565b60405160208183030381529060405280519060200120826000015183602001518460400151856060015186608001518760a001518860c001518960e00151604051602001612490999897969594939291906132ff565b604051602081830303815290604052805190602001209050919050565b600061041c6124ba6125a0565b83612663565b600081516041146124e35760405162461bcd60e51b81526004016103929061347d565b60208201516040830151606084015160001a61250186828585612696565b9695505050505050565b6000612560826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661278c9092919063ffffffff16565b805190915015610dfe578080602001905181019061257e9190612ea0565b610dfe5760405162461bcd60e51b815260040161039290613b76565b3b151590565b60007f00000000000000000000000000000000000000000000000000000000000000014614156125f157507f568bb7fbc920cb8bbac1c3ce849a4b9abf2bfc632131c54e486d1cee8a48dd69611264565b61265c7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f2d6548e43573849648d2bcdcd80741ee43b091d0c5c2ba71b8b6d47ed871946a7f2d6548e43573849648d2bcdcd80741ee43b091d0c5c2ba71b8b6d47ed871946a6127a5565b9050611264565b6000828260405160200161267892919061316b565b60405160208183030381529060405280519060200120905092915050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156126d85760405162461bcd60e51b815260040161039290613661565b8360ff16601b14806126ed57508360ff16601c145b6127095760405162461bcd60e51b81526004016103929061385a565b60006001868686866040516000815260200160405260405161272e9493929190613379565b6020604051602081039080840390855afa158015612750573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166127835760405162461bcd60e51b8152600401610392906133aa565b95945050505050565b606061279b84846000856127df565b90505b9392505050565b600083838346306040516020016127c095949392919061334d565b6040516020818303038152906040528051906020012090509392505050565b6060824710156128015760405162461bcd60e51b8152600401610392906136da565b61280a8561259a565b6128265760405162461bcd60e51b815260040161039290613af6565b600080866001600160a01b0316858760405161284291906130b2565b60006040518083038185875af1925050503d806000811461287f576040519150601f19603f3d011682016040523d82523d6000602084013e612884565b606091505b509150915061289482828661289f565b979650505050505050565b606083156128ae57508161279e565b8251156128be5782518084602001fd5b8160405162461bcd60e51b81526004016103929190613397565b8280546128e490613e81565b90600052602060002090601f016020900481019282612906576000855561294c565b82601f1061291f57805160ff191683800117855561294c565b8280016001018555821561294c579182015b8281111561294c578251825591602001919060010190612931565b5061295892915061295c565b5090565b5b80821115612958576000815560010161295d565b60006001600160401b0383111561298a5761298a613f17565b61299d601f8401601f1916602001613d9b565b90508281528383830111156129b157600080fd5b828260208301376000602084830101529392505050565b600082601f8301126129d8578081fd5b813560206129ed6129e883613dc4565b613d9b565b8281528181019085830183850287018401881015612a09578586fd5b855b85811015612a2757813584529284019290840190600101612a0b565b5090979650505050505050565b600082601f830112612a44578081fd5b61279e83833560208501612971565b600060408284031215612a64578081fd5b604051604081018181106001600160401b0382111715612a8657612a86613f17565b6040529050808235612a9781613fd7565b8152602092830135920191909152919050565b600060208284031215612abb578081fd5b813561279e81613fd7565b60008060408385031215612ad8578081fd5b8235612ae381613fd7565b91506020830135612af381613fd7565b809150509250929050565b600080600080600060a08688031215612b15578081fd5b8535612b2081613fd7565b94506020860135612b3081613fd7565b935060408601356001600160401b0380821115612b4b578283fd5b612b5789838a016129c8565b94506060880135915080821115612b6c578283fd5b612b7889838a016129c8565b93506080880135915080821115612b8d578283fd5b50612b9a88828901612a34565b9150509295509295909350565b600080600080600060a08688031215612bbe578081fd5b8535612bc981613fd7565b94506020860135612bd981613fd7565b9350604086013592506060860135915060808601356001600160401b03811115612c01578182fd5b612b9a88828901612a34565b6000806000806000806000806000806101208b8d031215612c2c578788fd5b8a35612c3781613fd7565b995060208b0135612c4781613fd7565b985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b0135612c7381613fd7565b935060e08b013592506101008b01356001600160401b0380821115612c96578384fd5b818d0191508d601f830112612ca9578384fd5b813581811115612cb7578485fd5b8e6020828501011115612cc8578485fd5b6020830194508093505050509295989b9194979a5092959850565b600080600060608486031215612cf7578081fd5b8335612d0281613fd7565b925060208401356001600160401b0380821115612d1d578283fd5b612d29878388016129c8565b93506040860135915080821115612d3e578283fd5b50612d4b868287016129c8565b9150509250925092565b60008060408385031215612d67578182fd5b8235612d7281613fd7565b91506020830135612af381613fec565b60008060408385031215612d94578182fd5b8235612d9f81613fd7565b946020939093013593505050565b600080600060608486031215612dc1578081fd5b8335612dcc81613fd7565b95602085013595506040909401359392505050565b60008060408385031215612df3578182fd5b82356001600160401b0380821115612e09578384fd5b818501915085601f830112612e1c578384fd5b81356020612e2c6129e883613dc4565b82815281810190858301838502870184018b1015612e48578889fd5b8896505b84871015612e73578035612e5f81613fd7565b835260019690960195918301918301612e4c565b5096505086013592505080821115612e89578283fd5b50612e96858286016129c8565b9150509250929050565b600060208284031215612eb1578081fd5b815161279e81613fec565b600060208284031215612ecd578081fd5b813561279e81613ffa565b600060208284031215612ee9578081fd5b815161279e81613ffa565b600060208284031215612f05578081fd5b81356001600160401b03811115612f1a578182fd5b8201601f81018413612f2a578182fd5b61194784823560208401612971565b600060208284031215612f4a578081fd5b5035919050565b60008060408385031215612f63578182fd5b50508035926020909101359150565b60008060008060a08587031215612f87578182fd5b8435935060208086013593506040612fa188828901612a53565b935060808701356001600160401b03811115612fbb578384fd5b8701601f81018913612fcb578384fd5b8035612fd96129e882613dc4565b81815284810190838601858402850187018d1015612ff5578788fd5b8794505b8385101561301f5761300b8d82612a53565b835260019490940193918601918501612ff9565b50989b979a50959850505050505050565b6000815180845260208085019450808401835b8381101561305f57815187529582019590820190600101613043565b509495945050505050565b60008151808452613082816020860160208601613e55565b601f01601f19169290920160200192915050565b600081516130a8818560208601613e55565b9290920192915050565b600082516130c4818460208701613e55565b9190910192915050565b82546000908190600281046001808316806130ea57607f831692505b602080841082141561310a57634e487b7160e01b87526022600452602487fd5b81801561311e576001811461312f5761315b565b60ff1986168952848901965061315b565b6131388b613de7565b885b868110156131535781548b82015290850190830161313a565b505084890196505b5050505050506127838185613096565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0386811682528516602082015260a0604082018190526000906131df90830186613030565b82810360608401526131f18186613030565b90508281036080840152613205818561306a565b98975050505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906128949083018461306a565b6020808252825182820181905260009190848201906040850190845b818110156132b05783516001600160a01b03168352928401929184019160010161328b565b50909695505050505050565b60006020825261279e6020830184613030565b6000604082526132e26040830185613030565b82810360208401526127838185613030565b901515815260200190565b9889526001600160a01b0397881660208a01529587166040890152939095166060870152608086019190915260a085015260c084019290925260e08301919091526101008201526101200190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825261279e602083018461306a565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b6020808252600e908201526d0dcdedcc6ca40dad2e6dac2e8c6d60931b604082015260600190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526041908201527f5365636f6e64617279204665653a204665652070657263656e7461676520736860408201527f6f756c64206265206c657373206f7220657175616c203130302070657263656e6060820152601d60fa1b608082015260a00190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b60208082526019908201527f416d6f756e742073686f756c6420626520706f73697469766500000000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526032908201527f487970652078206c61204269656e6e616c6520323032323a2074726164696e67604082015271081d1bdad95b881b9bdd08185b1b1bddd95960721b606082015260800190565b60208082526031908201527f487970652078206c61204269656e6e616c6520323032323a207369676e6174756040820152707265206973206f75742d6f662d6461746560781b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526032908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252602b908201527f487970652078206c61204269656e6e616c6520323032323a206e6f7420616c6c60408201526a6f77656420746f2062757960a81b606082015260800190565b60208082526028908201527f5072696d617279204665653a20526563697069656e742073686f756c64206265604082015267081c1c995cd95b9d60c21b606082015260800190565b6020808252602b908201527f5365636f6e64617279204665653a204665652076616c75652073686f756c642060408201526a626520706f73697469766560a81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526048908201527f5072696d617279204665653a204665652076616c75652073686f756c6420626560408201527f20706f73697469766520616e64206c657373206f7220657175616c203130302060608201526770657263656e747360c01b608082015260a00190565b6020808252602c908201527f487970652078206c61204269656e6e616c6520323032323a206e6f7420616c6c60408201526b1bddd959081d1bc81cd95b1b60a21b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252602b908201527f487970652078206c61204269656e6e616c6520323032323a207369676e61747560408201526a0e4ca40dad2e6dac2e8c6d60ab1b606082015260800190565b6020808252602a908201527f5365636f6e64617279204665653a20526563697069656e742073686f756c64206040820152691899481c1c995cd95b9d60b21b606082015260800190565b90815260200190565b60006060820185835260206060818501528186518084526080860191508288019350845b81811015613d795784516001600160a01b031683529383019391830191600101613d54565b505084810360408601526132058187613030565b918252602082015260400190565b6040518181016001600160401b0381118282101715613dbc57613dbc613f17565b604052919050565b60006001600160401b03821115613ddd57613ddd613f17565b5060209081020190565b60009081526020902090565b60008219821115613e0657613e06613eeb565b500190565b600082613e1a57613e1a613f01565b500490565b6000816000190483118215151615613e3957613e39613eeb565b500290565b600082821015613e5057613e50613eeb565b500390565b60005b83811015613e70578181015183820152602001613e58565b838111156119e05750506000910152565b600281046001821680613e9557607f821691505b60208210811415613eb657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613ed057613ed0613eeb565b5060010190565b600082613ee657613ee6613f01565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60e01c90565b600060443d1015613f4357611264565b600481823e6308c379a0613f578251613f2d565b14613f6157611264565b6040513d600319016004823e80513d6001600160401b038160248401118184111715613f905750505050611264565b82840192508251915080821115613faa5750505050611264565b503d83016020828401011115613fc257505050611264565b601f01601f1916810160200160405291505090565b6001600160a01b0381168114610db157600080fd5b8015158114610db157600080fd5b6001600160e01b031981168114610db157600080fdfe466f72776172644461746128616464726573732066726f6d2c6164647265737320746f2c616464726573732074726164696e67546f6b656e416464722c75696e743235362069642c75696e7432353620616d6f756e742c75696e743235362076616c75652c75696e74323536206e6f6e63652c75696e7432353620646561646c696e6529a2646970667358221220124a76011d089b6dbbd5eb628a2cf7cf142e1ff79cb8c5257ad403e40e9680b264736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000071687474703a2f2f6563322d332d36392d3135302d3139372e65752d63656e7472616c2d312e636f6d707574652e616d617a6f6e6177732e636f6d2f6170692f746f6b656e732f3078463132386539443835413744353142653330354633313342433936613965423331304632416337432f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017487970652078206c61204269656e6e616c6520323032320000000000000000000000000000000000000000000000000000000000000000000000000000000017487970652078206c61204269656e6e616c652032303232000000000000000000
-----Decoded View---------------
Arg [0] : _uri (string): http://ec2-3-69-150-197.eu-central-1.compute.amazonaws.com/api/tokens/0xF128e9D85A7D51Be305F313BC96a9eB310F2Ac7C/
Arg [1] : tradingToken (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [2] : eip712Name (string): Hype x la Biennale 2022
Arg [3] : eip712Version (string): Hype x la Biennale 2022
-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000071
Arg [5] : 687474703a2f2f6563322d332d36392d3135302d3139372e65752d63656e7472
Arg [6] : 616c2d312e636f6d707574652e616d617a6f6e6177732e636f6d2f6170692f74
Arg [7] : 6f6b656e732f3078463132386539443835413744353142653330354633313342
Arg [8] : 433936613965423331304632416337432f000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [10] : 487970652078206c61204269656e6e616c652032303232000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [12] : 487970652078206c61204269656e6e616c652032303232000000000000000000
Deployed Bytecode Sourcemap
52332:8125:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40358:231;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39212:367;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;39990:217::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38822:318::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57818:2630::-;;;;;;:::i;:::-;;:::i;:::-;;53468:100;;;;;;:::i;:::-;;:::i;43637:1149::-;;;;;;:::i;:::-;;:::i;40755:549::-;;;;;;:::i;:::-;;:::i;55086:91::-;;;;;;:::i;:::-;;:::i;54919:155::-;;;;;;:::i;:::-;;:::i;4219:148::-;;;:::i;38070:46::-;;;:::i;55189:2617::-;;;;;;:::i;:::-;;:::i;3568:87::-;;;:::i;:::-;;;;;;;:::i;41377:311::-;;;;;;:::i;:::-;;:::i;38393:42::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;38448:362::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;52435:58::-;;;;;;:::i;:::-;;:::i;38339:47::-;;;;;;:::i;:::-;;:::i;54550:222::-;;;;;;:::i;:::-;;:::i;41760:168::-;;;;;;:::i;:::-;;:::i;42000:858::-;;;;;;:::i;:::-;;:::i;4522:244::-;;;;;;:::i;:::-;;:::i;54784:123::-;;;;;;:::i;:::-;;:::i;40358:231::-;40444:7;-1:-1:-1;;;;;40472:21:0;;40464:77;;;;-1:-1:-1;;;40464:77:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;40559:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;40559:22:0;;;;;;;;;;;;40358:231::o;39212:367::-;39314:4;-1:-1:-1;;;;;;39338:41:0;;-1:-1:-1;;;39338:41:0;;:110;;-1:-1:-1;;;;;;;39396:52:0;;-1:-1:-1;;;39396:52:0;39338:110;:180;;;-1:-1:-1;;;;;;;39465:53:0;;-1:-1:-1;;;39465:53:0;39338:180;:233;;;;39535:36;39559:11;39535:23;:36::i;:::-;39331:240;;39212:367;;;;:::o;39990:217::-;40060:13;40114:1;40099:4;40093:18;;;;;:::i;:::-;;;:22;:106;;;;;;;;;;;;;;;;;40155:4;40161:18;:7;:16;:18::i;:::-;40138:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40086:113;;39990:217;;;:::o;38822:318::-;38909:18;38930:17;;;:13;:17;;;;;;;;38909:38;;;;;;;;;;;;;;;;;38883:13;;38909:18;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38909:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38958:20;38992:5;:12;-1:-1:-1;;;;;38981:24:0;;;;;-1:-1:-1;;;38981:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38981:24:0;;38958:47;;39021:6;39016:93;39037:5;:12;39033:1;:16;39016:93;;;39083:5;39089:1;39083:8;;;;;;-1:-1:-1;;;39083:8:0;;;;;;;;;;;;;;;:14;;;39071:6;39078:1;39071:9;;;;;;-1:-1:-1;;;39071:9:0;;;;;;;;;;;;;;;;;;:26;39051:3;;;;:::i;:::-;;;;39016:93;;;-1:-1:-1;39126:6:0;38822:318;-1:-1:-1;;;38822:318:0:o;57818:2630::-;-1:-1:-1;;;;;58156:46:0;;;;;;:25;:46;;;;;;;;58148:109;;;;-1:-1:-1;;;58148:109:0;;;;;;;:::i;:::-;58268:23;58294:266;;;;;;;;58327:4;-1:-1:-1;;;;;58294:266:0;;;;;58350:2;-1:-1:-1;;;;;58294:266:0;;;;;58385:19;-1:-1:-1;;;;;58294:266:0;;;;;58423:2;58294:266;;;;58448:6;58294:266;;;;58476:5;58294:266;;;;58503:11;58294:266;;;;58539:9;58294:266;;;58268:292;;58571:33;58584:4;:7;;;58593:4;:10;;;58571:12;:33::i;:::-;58615:21;58626:4;58632:3;;58615:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58615:10:0;;-1:-1:-1;;;58615:21:0:i;:::-;58647;58660:4;:7;;;58647:12;:21::i;:::-;58687:7;;;;-1:-1:-1;;;;;58687:21:0;58679:30;;;;;;58742:4;:7;;;-1:-1:-1;;;;;58728:21:0;:10;-1:-1:-1;;;;;58728:21:0;;58720:77;;;;-1:-1:-1;;;58720:77:0;;;;;;;:::i;:::-;58835:4;:13;;;58816:15;:32;;58808:94;;;;-1:-1:-1;;;58808:94:0;;;;;;;:::i;:::-;59033:7;;;;59057:10;;;;58972:19;;59003:65;;-1:-1:-1;;;;;59003:29:0;;;59033:7;59050:4;;59003:29;:65::i;:::-;59116:7;:5;:7::i;:::-;-1:-1:-1;;;;;59103:20:0;:4;:9;;;-1:-1:-1;;;;;59103:20:0;;59099:1342;;;59176:7;;;;59140:22;59165:19;;;:10;:19;;;;;;;;59140:44;;;;;;;;;;-1:-1:-1;;;;;59140:44:0;;;;;;;;;;;;59241:10;;;;59140:44;;:22;:44;59241:27;;38111:5;;59241:27;:::i;:::-;:47;;;;:::i;:::-;59213:75;;59303:24;59343:17;59330:4;:10;;;:30;;;;:::i;:::-;59415:21;;59303:57;;-1:-1:-1;59389:67:0;;-1:-1:-1;;;;;59389:25:0;;;59438:17;59389:25;:67::i;:::-;59471:52;59497:7;:5;:7::i;:::-;-1:-1:-1;;;;;59471:25:0;;;59506:16;59471:25;:52::i;:::-;59552:25;59592:76;59613:4;:9;;;59624:4;:7;;;59633:4;:7;;;59642:4;:11;;;59655:12;59592:20;:76::i;:::-;59099:1342;;;;;;;59701:27;59731:13;:22;59745:4;:7;;;59731:22;;;;;;;;;;;59701:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59701:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59768:14;59816:6;59825:1;59816:10;;59811:312;59832:14;:21;59828:1;:25;59811:312;;;59879:28;59940:14;59955:1;59940:17;;;;;;-1:-1:-1;;;59940:17:0;;;;;;;;;;;;;;;:23;;;38111:5;59910:4;:10;;;:27;;;;:::i;:::-;:53;;;;:::i;:::-;59879:84;-1:-1:-1;59982:30:0;59879:84;59982:30;;:::i;:::-;;;60031:76;60057:14;60072:1;60057:17;;;;;;-1:-1:-1;;;60057:17:0;;;;;;;;;;;;;;;;;;;:27;-1:-1:-1;;;;;60031:25:0;;;60086:20;60031:25;:76::i;:::-;-1:-1:-1;59855:3:0;;;;:::i;:::-;;;;59811:312;;;;60151:26;60193:6;60180:4;:10;;;:19;;;;:::i;:::-;60254:9;;60151:48;;-1:-1:-1;60228:56:0;;-1:-1:-1;;;;;60228:25:0;;;60151:48;60228:25;:56::i;:::-;60313:25;60353:76;60374:4;:9;;;60385:4;:7;;;60394:4;:7;;;60403:4;:11;;;60416:12;60353:20;:76::i;:::-;59099:1342;;;;;57818:2630;;;;;;;;;;;;:::o;53468:100::-;-1:-1:-1;;;;;53548:12:0;53521:7;53548:12;;;:6;:12;;;;;;;53468:100::o;43637:1149::-;43885:7;:14;43871:3;:10;:28;43863:81;;;;-1:-1:-1;;;43863:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43963:16:0;;43955:66;;;;-1:-1:-1;;;43955:66:0;;;;;;;:::i;:::-;44062:12;:10;:12::i;:::-;-1:-1:-1;;;;;44054:20:0;:4;-1:-1:-1;;;;;44054:20:0;;:60;;;;44078:36;44095:4;44101:12;:10;:12::i;44078:36::-;44032:160;;;;-1:-1:-1;;;44032:160:0;;;;;;;:::i;:::-;44205:16;44224:12;:10;:12::i;:::-;44205:31;;44254:9;44249:377;44273:3;:10;44269:1;:14;44249:377;;;44305:10;44318:3;44322:1;44318:6;;;;;;-1:-1:-1;;;44318:6:0;;;;;;;;;;;;;;;44305:19;;44339:14;44356:7;44364:1;44356:10;;;;;;-1:-1:-1;;;44356:10:0;;;;;;;;;;;;;;;;;;;;44383:19;44405:13;;;;;;;;;;-1:-1:-1;;;;;44405:19:0;;;;;;;;;;;;44356:10;;-1:-1:-1;44447:21:0;;;;44439:76;;;;-1:-1:-1;;;44439:76:0;;;;;;;:::i;:::-;44552:20;44566:6;44552:11;:20;:::i;:::-;44530:9;:13;44540:2;44530:13;;;;;;;;;;;:19;44544:4;-1:-1:-1;;;;;44530:19:0;-1:-1:-1;;;;;44530:19:0;;;;;;;;;;;;:42;;;;44608:6;44587:9;:13;44597:2;44587:13;;;;;;;;;;;:17;44601:2;-1:-1:-1;;;;;44587:17:0;-1:-1:-1;;;;;44587:17:0;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;44249:377;;;44285:3;;;;:::i;:::-;;;44249:377;;;;44673:2;-1:-1:-1;;;;;44643:47:0;44667:4;-1:-1:-1;;;;;44643:47:0;44657:8;-1:-1:-1;;;;;44643:47:0;;44677:3;44682:7;44643:47;;;;;;;:::i;:::-;;;;;;;;44703:75;44739:8;44749:4;44755:2;44759:3;44764:7;44773:4;44703:35;:75::i;:::-;43637:1149;;;;;;:::o;40755:549::-;40936:16;40997:3;:10;40978:8;:15;:29;40970:83;;;;-1:-1:-1;;;40970:83:0;;;;;;;:::i;:::-;41066:30;41113:8;:15;-1:-1:-1;;;;;41099:30:0;;;;;-1:-1:-1;;;41099:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41099:30:0;;41066:63;;41147:9;41142:122;41166:8;:15;41162:1;:19;41142:122;;;41222:30;41232:8;41241:1;41232:11;;;;;;-1:-1:-1;;;41232:11:0;;;;;;;;;;;;;;;41245:3;41249:1;41245:6;;;;;;-1:-1:-1;;;41245:6:0;;;;;;;;;;;;;;;41222:9;:30::i;:::-;41203:13;41217:1;41203:16;;;;;;-1:-1:-1;;;41203:16:0;;;;;;;;;;;;;;;;;;:49;41183:3;;;:::i;:::-;;;41142:122;;55086:91;3799:12;:10;:12::i;:::-;-1:-1:-1;;;;;3788:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;3788:23:0;;3780:68;;;;-1:-1:-1;;;3780:68:0;;;;;;;:::i;:::-;55156:13:::1;55164:4;55156:7;:13::i;:::-;55086:91:::0;:::o;54919:155::-;3799:12;:10;:12::i;:::-;-1:-1:-1;;;;;3788:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;3788:23:0;;3780:68;;;;-1:-1:-1;;;3780:68:0;;;;;;;:::i;:::-;55033:33:::1;55044:7;55053:3;55058:7;55033:10;:33::i;:::-;54919:155:::0;;;:::o;4219:148::-;3799:12;:10;:12::i;:::-;-1:-1:-1;;;;;3788:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;3788:23:0;;3780:68;;;;-1:-1:-1;;;3780:68:0;;;;;;;:::i;:::-;4310:6:::1;::::0;4289:40:::1;::::0;4326:1:::1;::::0;-1:-1:-1;;;;;4310:6:0::1;::::0;4289:40:::1;::::0;4326:1;;4289:40:::1;4340:6;:19:::0;;-1:-1:-1;;;;;;4340:19:0::1;::::0;;4219:148::o;38070:46::-;38111:5;38070:46;:::o;55189:2617::-;-1:-1:-1;;;;;55529:46:0;;;;;;:25;:46;;;;;;;;55521:109;;;;-1:-1:-1;;;55521:109:0;;;;;;;:::i;:::-;55641:23;55667:266;;;;;;;;55700:2;-1:-1:-1;;;;;55667:266:0;;;;;55721:4;-1:-1:-1;;;;;55667:266:0;;;;;55758:19;-1:-1:-1;;;;;55667:266:0;;;;;55796:2;55667:266;;;;55821:6;55667:266;;;;55849:5;55667:266;;;;55876:11;55667:266;;;;55912:9;55667:266;;;55641:292;;55944:35;55957:4;:9;;;55968:4;:10;;;55944:12;:35::i;:::-;55990:21;56001:4;56007:3;;55990:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55990:10:0;;-1:-1:-1;;;55990:21:0:i;:::-;56035:9;;56022:23;;:12;:23::i;:::-;56078:4;:7;;;-1:-1:-1;;;;;56064:21:0;:10;-1:-1:-1;;;;;56064:21:0;;56056:78;;;;-1:-1:-1;;;56056:78:0;;;;;;;:::i;:::-;56172:4;:13;;;56153:15;:32;;56145:94;;;;-1:-1:-1;;;56145:94:0;;;;;;;:::i;:::-;56258:7;;;;-1:-1:-1;;;;;56258:21:0;56250:30;;;;;;56401:9;;56427:10;;;;56340:19;;56371:67;;-1:-1:-1;;;;;56371:29:0;;;56401:9;56420:4;;56371:29;:67::i;:::-;56484:7;:5;:7::i;:::-;-1:-1:-1;;;;;56473:18:0;:4;:7;;;-1:-1:-1;;;;;56473:18:0;;56469:1330;;;56544:7;;;;56508:22;56533:19;;;:10;:19;;;;;;;;56508:44;;;;;;;;;;-1:-1:-1;;;;;56508:44:0;;;;;;;;;;;;56609:10;;;;56508:44;;:22;:44;56609:27;;38111:5;;56609:27;:::i;:::-;:47;;;;:::i;:::-;56581:75;;56671:24;56711:17;56698:4;:10;;;:30;;;;:::i;:::-;56783:21;;56671:57;;-1:-1:-1;56757:67:0;;-1:-1:-1;;;;;56757:25:0;;;56806:17;56757:25;:67::i;:::-;56839:52;56865:7;:5;:7::i;56839:52::-;56920:25;56960:72;56977:4;:7;;;56986:4;:9;;;56997:4;:7;;;57006:4;:11;;;57019:12;56960:16;:72::i;56469:1330::-;57065:27;57095:13;:22;57109:4;:7;;;57095:22;;;;;;;;;;;57065:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57065:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57132:14;57180:6;57189:1;57180:10;;57175:312;57196:14;:21;57192:1;:25;57175:312;;;57243:28;57304:14;57319:1;57304:17;;;;;;-1:-1:-1;;;57304:17:0;;;;;;;;;;;;;;;:23;;;38111:5;57274:4;:10;;;:27;;;;:::i;:::-;:53;;;;:::i;:::-;57243:84;-1:-1:-1;57346:30:0;57243:84;57346:30;;:::i;:::-;;;57395:76;57421:14;57436:1;57421:17;;;;;;-1:-1:-1;;;57421:17:0;;;;;;;;57395:76;-1:-1:-1;57219:3:0;;;;:::i;:::-;;;;57175:312;;;;57515:26;57557:6;57544:4;:10;;;:19;;;;:::i;:::-;57618:7;;;;57515:48;;-1:-1:-1;57592:54:0;;-1:-1:-1;;;;;57592:25:0;;;57515:48;57592:25;:54::i;:::-;57675:25;57715:72;57732:4;:7;;;57741:4;:9;;;57752:4;:7;;;57761:4;:11;;;57774:12;57715:16;:72::i;3568:87::-;3641:6;;-1:-1:-1;;;;;3641:6:0;3568:87;;:::o;41377:311::-;41496:8;-1:-1:-1;;;;;41480:24:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;41480:24:0;;;41472:78;;;;-1:-1:-1;;;41472:78:0;;;;;;;:::i;:::-;41608:8;41563:18;:32;41582:12;:10;:12::i;:::-;-1:-1:-1;;;;;41563:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;41563:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;41563:53:0;;;;;;;;;;;41647:12;:10;:12::i;:::-;-1:-1:-1;;;;;41632:48:0;;41671:8;41632:48;;;;;;:::i;:::-;;;;;;;;41377:311;;:::o;38393:42::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38393:42:0;;;;;:::o;38448:362::-;38553:18;38574:17;;;:13;:17;;;;;;;;38553:38;;;;;;;;;;;;;;;;;38516:24;;38553:18;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38553:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38602:31;38658:5;:12;-1:-1:-1;;;;;38636:35:0;;;;;-1:-1:-1;;;38636:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38636:35:0;;38602:69;;38687:6;38682:97;38703:5;:12;38699:1;:16;38682:97;;;38749:5;38755:1;38749:8;;;;;;-1:-1:-1;;;38749:8:0;;;;;;;;;;;;;;;:18;;;38737:6;38744:1;38737:9;;;;;;-1:-1:-1;;;38737:9:0;;;;;;;;;-1:-1:-1;;;;;38737:30:0;;;:9;;;;;;;;;;;:30;38717:3;;;;:::i;:::-;;;;38682:97;;52435:58;;;;;;;;;;;;;;;:::o;38339:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38339:47:0;;;;-1:-1:-1;38339:47:0;-1:-1:-1;38339:47:0;:::o;54550:222::-;3799:12;:10;:12::i;:::-;-1:-1:-1;;;;;3788:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;3788:23:0;;3780:68;;;;-1:-1:-1;;;3780:68:0;;;;;;;:::i;:::-;54675:17:::1;54703:61;54709:7;:5;:7::i;:::-;54718:2;54722:6;54730:11;54743:14;54759:4;54703:5;:61::i;:::-;3859:1;54550:222:::0;;;;:::o;41760:168::-;-1:-1:-1;;;;;41883:27:0;;;41859:4;41883:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;41760:168::o;42000:858::-;-1:-1:-1;;;;;42209:16:0;;42201:66;;;;-1:-1:-1;;;42201:66:0;;;;;;;:::i;:::-;42308:12;:10;:12::i;:::-;-1:-1:-1;;;;;42300:20:0;:4;-1:-1:-1;;;;;42300:20:0;;:60;;;;42324:36;42341:4;42347:12;:10;:12::i;42324:36::-;42278:151;;;;-1:-1:-1;;;42278:151:0;;;;;;;:::i;:::-;42442:16;42461:12;:10;:12::i;:::-;42486:19;42508:13;;;;;;;;;;;-1:-1:-1;;;;;42508:19:0;;;;;;;;;;42442:31;;-1:-1:-1;42546:21:0;;;;42538:76;;;;-1:-1:-1;;;42538:76:0;;;;;;;:::i;:::-;42647:20;42661:6;42647:11;:20;:::i;:::-;42625:9;:13;;;;;;;;;;;-1:-1:-1;;;;;42625:19:0;;;;;;;;;;:42;;;;42678:17;;;;;;;:27;;42699:6;;42625:9;42678:27;;42699:6;;42678:27;:::i;:::-;;;;;;;;42754:2;-1:-1:-1;;;;;42723:46:0;42748:4;-1:-1:-1;;;;;42723:46:0;42738:8;-1:-1:-1;;;;;42723:46:0;;42758:2;42762:6;42723:46;;;;;;;:::i;:::-;;;;;;;;42782:68;42813:8;42823:4;42829:2;42833;42837:6;42845:4;42782:30;:68::i;:::-;42000:858;;;;;;;:::o;4522:244::-;3799:12;:10;:12::i;:::-;-1:-1:-1;;;;;3788:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;3788:23:0;;3780:68;;;;-1:-1:-1;;;3780:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4611:22:0;::::1;4603:73;;;;-1:-1:-1::0;;;4603:73:0::1;;;;;;;:::i;:::-;4713:6;::::0;4692:38:::1;::::0;-1:-1:-1;;;;;4692:38:0;;::::1;::::0;4713:6:::1;::::0;4692:38:::1;::::0;4713:6:::1;::::0;4692:38:::1;4741:6;:17:::0;;-1:-1:-1;;;;;;4741:17:0::1;-1:-1:-1::0;;;;;4741:17:0;;;::::1;::::0;;;::::1;::::0;;4522:244::o;54784:123::-;3799:12;:10;:12::i;:::-;-1:-1:-1;;;;;3788:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;3788:23:0;;3780:68;;;;-1:-1:-1;;;3780:68:0;;;;;;;:::i;:::-;54873:26:::1;54879:7;54888:2;54892:6;54873:5;:26::i;1509:157::-:0;-1:-1:-1;;;;;;1618:40:0;;-1:-1:-1;;;1618:40:0;1509:157;;;:::o;34957:723::-;35013:13;35234:10;35230:53;;-1:-1:-1;35261:10:0;;;;;;;;;;;;-1:-1:-1;;;35261:10:0;;;;;;35230:53;35308:5;35293:12;35349:78;35356:9;;35349:78;;35382:8;;;;:::i;:::-;;-1:-1:-1;35405:10:0;;-1:-1:-1;35413:2:0;35405:10;;:::i;:::-;;;35349:78;;;35437:19;35469:6;-1:-1:-1;;;;;35459:17:0;;;;;-1:-1:-1;;;35459:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35459:17:0;;35437:39;;35487:154;35494:10;;35487:154;;35521:11;35531:1;35521:11;;:::i;:::-;;-1:-1:-1;35590:10:0;35598:2;35590:5;:10;:::i;:::-;35577:24;;:2;:24;:::i;:::-;35564:39;;35547:6;35554;35547:14;;;;;;-1:-1:-1;;;35547:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;35547:56:0;;;;;;;;-1:-1:-1;35618:11:0;35627:2;35618:11;;:::i;:::-;;;35487:154;;;35665:6;34957:723;-1:-1:-1;;;;34957:723:0:o;53576:138::-;-1:-1:-1;;;;;53663:15:0;;;;;;:6;:15;;;;;;:24;;53655:51;;;;-1:-1:-1;;;53655:51:0;;;;;;;:::i;:::-;53576:138;;:::o;53722:295::-;53810:18;53831:16;53842:4;53831:10;:16::i;:::-;53810:37;;53858:14;53875:28;53892:10;53875:16;:28::i;:::-;53952:9;;53858:45;;-1:-1:-1;;;;;;53922:39:0;:26;53858:45;53944:3;53922:13;:26::i;:::-;-1:-1:-1;;;;;53922:39:0;;53914:95;;;;-1:-1:-1;;;53914:95:0;;;;;;;:::i;:::-;53722:295;;;;:::o;54025:84::-;-1:-1:-1;;;;;54084:15:0;;;;;;:6;:15;;;;;:17;;;;;;:::i;:::-;;;;;;54025:84;:::o;31718:205::-;31819:96;31839:5;31869:27;;;31898:4;31904:2;31908:5;31846:68;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;31846:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;31846:68:0;-1:-1:-1;;;;;;31846:68:0;;;;;;;;;;31819:19;:96::i;31533:177::-;31616:86;31636:5;31666:23;;;31691:2;31695:5;31643:58;;;;;;;;;:::i;42866:694::-;-1:-1:-1;;;;;43073:16:0;;43065:66;;;;-1:-1:-1;;;43065:66:0;;;;;;;:::i;2212:98::-;2292:10;2212:98;:::o;51320:799::-;51574:15;:2;-1:-1:-1;;;;;51574:13:0;;:15::i;:::-;51570:542;;;51610:79;;-1:-1:-1;;;51610:79:0;;-1:-1:-1;;;;;51610:43:0;;;;;:79;;51654:8;;51664:4;;51670:3;;51675:7;;51684:4;;51610:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51610:79:0;;;;;;;;-1:-1:-1;;51610:79:0;;;;;;;;;;;;:::i;:::-;;;51606:495;;;;:::i;:::-;;;;;;;;51974:6;51967:14;;-1:-1:-1;;;51967:14:0;;;;;;;;:::i;51606:495::-;52023:62;;-1:-1:-1;;;52023:62:0;;;;;;;:::i;51606:495::-;-1:-1:-1;;;;;;51739:64:0;;-1:-1:-1;;;51739:64:0;51735:163;;51828:50;;-1:-1:-1;;;51828:50:0;;;;;;;:::i;45630:88::-;45697:13;;;;:4;;:13;;;;;:::i;48837:755::-;-1:-1:-1;;;;;48958:21:0;;48950:69;;;;-1:-1:-1;;;48950:69:0;;;;;;;:::i;:::-;49052:7;:14;49038:3;:10;:28;49030:81;;;;-1:-1:-1;;;49030:81:0;;;;;;;:::i;:::-;49124:16;49143:12;:10;:12::i;:::-;49124:31;;49173:6;49168:341;49189:3;:10;49185:1;:14;49168:341;;;49221:10;49234:3;49238:1;49234:6;;;;;;-1:-1:-1;;;49234:6:0;;;;;;;;;;;;;;;49221:19;;49255:14;49272:7;49280:1;49272:10;;;;;;-1:-1:-1;;;49272:10:0;;;;;;;;;;;;;;;;;;;;49299:22;49324:13;;;;;;;;;;-1:-1:-1;;;;;49324:22:0;;;;;;;;;;;;49272:10;;-1:-1:-1;49369:24:0;;;;49361:73;;;;-1:-1:-1;;;49361:73:0;;;;;;;:::i;:::-;49474:23;49491:6;49474:14;:23;:::i;:::-;49449:9;:13;;;;;;;;;;;-1:-1:-1;;;;;49449:22:0;;;;;;;;;;:48;;;;-1:-1:-1;49201:3:0;;-1:-1:-1;49201:3:0;;;:::i;:::-;;;;49168:341;;;;49567:1;-1:-1:-1;;;;;49526:58:0;49550:7;-1:-1:-1;;;;;49526:58:0;49540:8;-1:-1:-1;;;;;49526:58:0;;49571:3;49576:7;49526:58;;;;;;;:::i;:::-;;;;;;;;48837:755;;;;:::o;46119:1761::-;46296:1;46287:6;:10;46279:48;;;;-1:-1:-1;;;46279:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46346:21:0;;46338:67;;;;-1:-1:-1;;;46338:67:0;;;;;;;:::i;:::-;46418:16;46437:12;:10;:12::i;:::-;46478:21;;46418:31;;-1:-1:-1;;;;;;46478:35:0;46470:88;;;;-1:-1:-1;;;46470:88:0;;;;;;;:::i;:::-;46597:1;46577:11;:17;;;:21;:60;;;;;38111:5;46602:11;:17;;;:35;;46577:60;46569:145;;;;-1:-1:-1;;;46569:145:0;;;;;;;:::i;:::-;46735:14;;;;:10;:14;;;;;;;:28;;;;-1:-1:-1;;;;;;46735:28:0;-1:-1:-1;;;;;46735:28:0;;;;;;;;;;-1:-1:-1;46735:28:0;;;;46828:21;;-1:-1:-1;;;;;46814:36:0;;;;;-1:-1:-1;;;46814:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46814:36:0;;46784:66;;46861:17;46892:14;:21;-1:-1:-1;;;;;46881:33:0;;;;;-1:-1:-1;;;46881:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46881:33:0;-1:-1:-1;46861:53:0;-1:-1:-1;46925:14:0;;46960:479;46981:14;:21;46977:1;:25;46960:479;;;47071:1;-1:-1:-1;;;;;47032:41:0;:14;47047:1;47032:17;;;;;;-1:-1:-1;;;47032:17:0;;;;;;;;;;;;;;;:27;;;-1:-1:-1;;;;;47032:41:0;;;47024:96;;;;-1:-1:-1;;;47024:96:0;;;;;;;:::i;:::-;47169:1;47143:14;47158:1;47143:17;;;;;;-1:-1:-1;;;47143:17:0;;;;;;;;;;;;;;;:23;;;:27;47135:83;;;;-1:-1:-1;;;47135:83:0;;;;;;;:::i;:::-;47233:17;;;;:13;:17;;;;;47256;;:14;;47271:1;;47256:17;;;;-1:-1:-1;;;47256:17:0;;;;;;;;;;;;;;;;;;;;47233:41;;;;;;;;-1:-1:-1;47233:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;47233:41:0;-1:-1:-1;;;;;47233:41:0;;;;;;;;;;;;;;;47305:17;;;;47320:1;;47305:17;;;;-1:-1:-1;;;47305:17:0;;;;;;;;;;;;;;;:27;;;47289:10;47300:1;47289:13;;;;;;-1:-1:-1;;;47289:13:0;;;;;;;;;;;;;;:43;-1:-1:-1;;;;;47289:43:0;;;-1:-1:-1;;;;;47289:43:0;;;;;47356:14;47371:1;47356:17;;;;;;-1:-1:-1;;;47356:17:0;;;;;;;;;;;;;;;:23;;;47347:3;47351:1;47347:6;;;;;;-1:-1:-1;;;47347:6:0;;;;;;;;;;;;;;:32;;;;;47404:14;47419:1;47404:17;;;;;;-1:-1:-1;;;47404:17:0;;;;;;;;;;;;;;;:23;;;47394:33;;;;;:::i;:::-;;-1:-1:-1;47004:3:0;;;;:::i;:::-;;;;46960:479;;;;38111:5;47457:6;:24;;47449:102;;;;-1:-1:-1;;;47449:102:0;;;;;;;:::i;:::-;47566:21;;:25;47562:101;;47613:38;47631:2;47635:10;47647:3;47613:38;;;;;;;;:::i;:::-;;;;;;;;47562:101;47675:9;:13;;;;;;;;;;;-1:-1:-1;;;;;47675:22:0;;;;;;;;;:32;;47701:6;;47675:9;:32;;47701:6;;47675:32;:::i;:::-;;;;;;;;47760:7;-1:-1:-1;;;;;47723:57:0;47756:1;-1:-1:-1;;;;;47723:57:0;47738:8;-1:-1:-1;;;;;47723:57:0;;47769:2;47773:6;47723:57;;;;;;;:::i;:::-;;;;;;;;47793:79;47824:8;47842:1;47846:7;47855:2;47859:6;47867:4;47793:30;:79::i;:::-;46119:1761;;;;;;;;;;:::o;50550:762::-;50779:15;:2;-1:-1:-1;;;;;50779:13:0;;:15::i;:::-;50775:530;;;50815:72;;-1:-1:-1;;;50815:72:0;;-1:-1:-1;;;;;50815:38:0;;;;;:72;;50854:8;;50864:4;;50870:2;;50874:6;;50882:4;;50815:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50815:72:0;;;;;;;;-1:-1:-1;;50815:72:0;;;;;;;;;;;;:::i;:::-;;;50811:483;;;;:::i;:::-;-1:-1:-1;;;;;;50937:59:0;;-1:-1:-1;;;50937:59:0;50933:158;;51021:50;;-1:-1:-1;;;51021:50:0;;;;;;;:::i;48147:487::-;-1:-1:-1;;;;;48243:21:0;;48235:69;;;;-1:-1:-1;;;48235:69:0;;;;;;;:::i;:::-;48317:16;48336:12;:10;:12::i;:::-;48361:22;48386:13;;;;;;;;;;;-1:-1:-1;;;;;48386:22:0;;;;;;;;;;48317:31;;-1:-1:-1;48427:24:0;;;;48419:73;;;;-1:-1:-1;;;48419:73:0;;;;;;;:::i;:::-;48528:23;48545:6;48528:14;:23;:::i;:::-;48503:9;:13;;;;;;;;;;;-1:-1:-1;;;;;48503:22:0;;;;;;;;;;;;;:48;;;;48569:57;48503:9;;:22;48569:57;;;;;;;;48513:2;;48619:6;;48569:57;:::i;:::-;;;;;;;;48147:487;;;;;:::o;54121:417::-;54187:7;53142:17;;;;;;;;;;;;;;;;;53125:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;53115:46;;;;;;54293:4;:9;;;54321:4;:7;;;54347:4;:21;;;54387:4;:7;;;54413:4;:11;;;54443:4;:10;;;54472:4;:10;;;54501:4;:13;;;54224:305;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54214:316;;;;;;54207:323;;54121:417;;;:::o;28120:167::-;28197:7;28224:55;28246:20;:18;:20::i;:::-;28268:10;28224:21;:55::i;20455:761::-;20533:7;20596:9;:16;20616:2;20596:22;20592:96;;20635:41;;-1:-1:-1;;;20635:41:0;;;;;;;:::i;20592:96::-;21049:4;21034:20;;21028:27;21095:4;21080:20;;21074:27;21149:4;21134:20;;21128:27;20757:9;21120:36;21186:22;21194:4;21120:36;21028:27;21074;21186:7;:22::i;:::-;21179:29;20455:761;-1:-1:-1;;;;;;20455:761:0:o;33967:::-;34391:23;34417:69;34445:4;34417:69;;;;;;;;;;;;;;;;;34425:5;-1:-1:-1;;;;;34417:27:0;;;:69;;;;;:::i;:::-;34501:17;;34391:95;;-1:-1:-1;34501:21:0;34497:224;;34643:10;34632:30;;;;;;;;;;;;:::i;:::-;34624:85;;;;-1:-1:-1;;;34624:85:0;;;;;;;:::i;5454:422::-;5821:20;5860:8;;;5454:422::o;26852:281::-;26905:7;26946:16;26929:13;:33;26925:201;;;-1:-1:-1;26986:24:0;26979:31;;26925:201;27050:64;27072:10;27084:12;27098:15;27050:21;:64::i;:::-;27043:71;;;;23706:196;23799:7;23865:15;23882:10;23836:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23826:68;;;;;;23819:75;;23706:196;;;;:::o;21355:1432::-;21440:7;22365:66;22351:80;;;22343:127;;;;-1:-1:-1;;;22343:127:0;;;;;;;:::i;:::-;22489:1;:7;;22494:2;22489:7;:18;;;;22500:1;:7;;22505:2;22500:7;22489:18;22481:65;;;;-1:-1:-1;;;22481:65:0;;;;;;;:::i;:::-;22644:14;22661:24;22671:4;22677:1;22680;22683;22661:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22661:24:0;;-1:-1:-1;;22661:24:0;;;-1:-1:-1;;;;;;;22704:20:0;;22696:57;;;;-1:-1:-1;;;22696:57:0;;;;;;;:::i;:::-;22773:6;21355:1432;-1:-1:-1;;;;;21355:1432:0:o;8372:195::-;8475:12;8507:52;8529:6;8537:4;8543:1;8546:12;8507:21;:52::i;:::-;8500:59;;8372:195;;;;;;:::o;27141:337::-;27243:7;27323:8;27350:4;27373:7;27399:13;27439:4;27294:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27270:200;;;;;;27263:207;;27141:337;;;;;:::o;9424:530::-;9551:12;9609:5;9584:21;:30;;9576:81;;;;-1:-1:-1;;;9576:81:0;;;;;;;:::i;:::-;9676:18;9687:6;9676:10;:18::i;:::-;9668:60;;;;-1:-1:-1;;;9668:60:0;;;;;;;:::i;:::-;9802:12;9816:23;9843:6;-1:-1:-1;;;;;9843:11:0;9863:5;9871:4;9843:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9801:75;;;;9894:52;9912:7;9921:10;9933:12;9894:17;:52::i;:::-;9887:59;9424:530;-1:-1:-1;;;;;;;9424:530:0:o;11964:742::-;12079:12;12108:7;12104:595;;;-1:-1:-1;12139:10:0;12132:17;;12104:595;12253:17;;:21;12249:439;;12516:10;12510:17;12577:15;12564:10;12560:2;12556:19;12549:44;12464:148;12659:12;12652:20;;-1:-1:-1;;;12652:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:409:1;;-1:-1:-1;;;;;106:6:1;103:30;100:2;;;136:18;;:::i;:::-;174:58;220:2;197:17;;-1:-1:-1;;193:31:1;226:4;189:42;174:58;:::i;:::-;165:67;;255:6;248:5;241:21;295:3;286:6;281:3;277:16;274:25;271:2;;;312:1;309;302:12;271:2;361:6;356:3;349:4;342:5;338:16;325:43;415:1;408:4;399:6;392:5;388:18;384:29;377:40;90:333;;;;;:::o;428:705::-;;541:3;534:4;526:6;522:17;518:27;508:2;;563:5;556;549:20;508:2;603:6;590:20;629:4;653:65;668:49;714:2;668:49;:::i;:::-;653:65;:::i;:::-;752:15;;;783:12;;;;815:15;;;861:11;;;849:24;;845:33;;842:42;-1:-1:-1;839:2:1;;;901:5;894;887:20;839:2;927:5;941:163;955:2;952:1;949:9;941:163;;;1012:17;;1000:30;;1050:12;;;;1082;;;;973:1;966:9;941:163;;;-1:-1:-1;1122:5:1;;498:635;-1:-1:-1;;;;;;;498:635:1:o;1138:232::-;;1235:3;1228:4;1220:6;1216:17;1212:27;1202:2;;1257:5;1250;1243:20;1202:2;1283:81;1360:3;1351:6;1338:20;1331:4;1323:6;1319:17;1283:81;:::i;1375:558::-;;1476:4;1464:9;1459:3;1455:19;1451:30;1448:2;;;1498:5;1491;1484:20;1448:2;1535:4;1529:11;1579:4;1571:6;1567:17;1650:6;1638:10;1635:22;-1:-1:-1;;;;;1602:10:1;1599:34;1596:62;1593:2;;;1661:18;;:::i;:::-;1697:4;1690:24;1732:6;-1:-1:-1;1732:6:1;1762:23;;1794:35;1762:23;1794:35;:::i;:::-;1838:23;;1922:2;1907:18;;;1894:32;1877:15;;1870:57;;;;1438:495;;-1:-1:-1;1438:495:1:o;1938:259::-;;2050:2;2038:9;2029:7;2025:23;2021:32;2018:2;;;2071:6;2063;2056:22;2018:2;2115:9;2102:23;2134:33;2161:5;2134:33;:::i;2202:402::-;;;2331:2;2319:9;2310:7;2306:23;2302:32;2299:2;;;2352:6;2344;2337:22;2299:2;2396:9;2383:23;2415:33;2442:5;2415:33;:::i;:::-;2467:5;-1:-1:-1;2524:2:1;2509:18;;2496:32;2537:35;2496:32;2537:35;:::i;:::-;2591:7;2581:17;;;2289:315;;;;;:::o;2609:1129::-;;;;;;2848:3;2836:9;2827:7;2823:23;2819:33;2816:2;;;2870:6;2862;2855:22;2816:2;2914:9;2901:23;2933:33;2960:5;2933:33;:::i;:::-;2985:5;-1:-1:-1;3042:2:1;3027:18;;3014:32;3055:35;3014:32;3055:35;:::i;:::-;3109:7;-1:-1:-1;3167:2:1;3152:18;;3139:32;-1:-1:-1;;;;;3220:14:1;;;3217:2;;;3252:6;3244;3237:22;3217:2;3280:67;3339:7;3330:6;3319:9;3315:22;3280:67;:::i;:::-;3270:77;;3400:2;3389:9;3385:18;3372:32;3356:48;;3429:2;3419:8;3416:16;3413:2;;;3450:6;3442;3435:22;3413:2;3478:69;3539:7;3528:8;3517:9;3513:24;3478:69;:::i;:::-;3468:79;;3600:3;3589:9;3585:19;3572:33;3556:49;;3630:2;3620:8;3617:16;3614:2;;;3651:6;3643;3636:22;3614:2;;3679:53;3724:7;3713:8;3702:9;3698:24;3679:53;:::i;:::-;3669:63;;;2806:932;;;;;;;;:::o;3743:760::-;;;;;;3932:3;3920:9;3911:7;3907:23;3903:33;3900:2;;;3954:6;3946;3939:22;3900:2;3998:9;3985:23;4017:33;4044:5;4017:33;:::i;:::-;4069:5;-1:-1:-1;4126:2:1;4111:18;;4098:32;4139:35;4098:32;4139:35;:::i;:::-;4193:7;-1:-1:-1;4247:2:1;4232:18;;4219:32;;-1:-1:-1;4298:2:1;4283:18;;4270:32;;-1:-1:-1;4353:3:1;4338:19;;4325:33;-1:-1:-1;;;;;4370:30:1;;4367:2;;;4418:6;4410;4403:22;4367:2;4446:51;4489:7;4480:6;4469:9;4465:22;4446:51;:::i;4508:1410::-;;;;;;;;;;;4775:3;4763:9;4754:7;4750:23;4746:33;4743:2;;;4797:6;4789;4782:22;4743:2;4841:9;4828:23;4860:33;4887:5;4860:33;:::i;:::-;4912:5;-1:-1:-1;4969:2:1;4954:18;;4941:32;4982:35;4941:32;4982:35;:::i;:::-;5036:7;-1:-1:-1;5090:2:1;5075:18;;5062:32;;-1:-1:-1;5141:2:1;5126:18;;5113:32;;-1:-1:-1;5192:3:1;5177:19;;5164:33;;-1:-1:-1;5244:3:1;5229:19;;5216:33;;-1:-1:-1;5301:3:1;5286:19;;5273:33;5315:35;5273:33;5315:35;:::i;:::-;5369:7;-1:-1:-1;5423:3:1;5408:19;;5395:33;;-1:-1:-1;5479:3:1;5464:19;;5451:33;-1:-1:-1;;;;;5533:14:1;;;5530:2;;;5565:6;5557;5550:22;5530:2;5608:6;5597:9;5593:22;5583:32;;5653:7;5646:4;5642:2;5638:13;5634:27;5624:2;;5680:6;5672;5665:22;5624:2;5725;5712:16;5751:2;5743:6;5740:14;5737:2;;;5772:6;5764;5757:22;5737:2;5822:7;5817:2;5808:6;5804:2;5800:15;5796:24;5793:37;5790:2;;;5848:6;5840;5833:22;5790:2;5884;5880;5876:11;5866:21;;5906:6;5896:16;;;;;4733:1185;;;;;;;;;;;;;:::o;5923:774::-;;;;6119:2;6107:9;6098:7;6094:23;6090:32;6087:2;;;6140:6;6132;6125:22;6087:2;6184:9;6171:23;6203:33;6230:5;6203:33;:::i;:::-;6255:5;-1:-1:-1;6311:2:1;6296:18;;6283:32;-1:-1:-1;;;;;6364:14:1;;;6361:2;;;6396:6;6388;6381:22;6361:2;6424:67;6483:7;6474:6;6463:9;6459:22;6424:67;:::i;:::-;6414:77;;6544:2;6533:9;6529:18;6516:32;6500:48;;6573:2;6563:8;6560:16;6557:2;;;6594:6;6586;6579:22;6557:2;;6622:69;6683:7;6672:8;6661:9;6657:24;6622:69;:::i;:::-;6612:79;;;6077:620;;;;;:::o;6702:396::-;;;6828:2;6816:9;6807:7;6803:23;6799:32;6796:2;;;6849:6;6841;6834:22;6796:2;6893:9;6880:23;6912:33;6939:5;6912:33;:::i;:::-;6964:5;-1:-1:-1;7021:2:1;7006:18;;6993:32;7034;6993;7034;:::i;7103:327::-;;;7232:2;7220:9;7211:7;7207:23;7203:32;7200:2;;;7253:6;7245;7238:22;7200:2;7297:9;7284:23;7316:33;7343:5;7316:33;:::i;:::-;7368:5;7420:2;7405:18;;;;7392:32;;-1:-1:-1;;;7190:240:1:o;7435:395::-;;;;7581:2;7569:9;7560:7;7556:23;7552:32;7549:2;;;7602:6;7594;7587:22;7549:2;7646:9;7633:23;7665:33;7692:5;7665:33;:::i;:::-;7717:5;7769:2;7754:18;;7741:32;;-1:-1:-1;7820:2:1;7805:18;;;7792:32;;7539:291;-1:-1:-1;;;7539:291:1:o;7835:1295::-;;;8014:2;8002:9;7993:7;7989:23;7985:32;7982:2;;;8035:6;8027;8020:22;7982:2;8080:9;8067:23;-1:-1:-1;;;;;8150:2:1;8142:6;8139:14;8136:2;;;8171:6;8163;8156:22;8136:2;8214:6;8203:9;8199:22;8189:32;;8259:7;8252:4;8248:2;8244:13;8240:27;8230:2;;8286:6;8278;8271:22;8230:2;8327;8314:16;8349:4;8373:65;8388:49;8434:2;8388:49;:::i;8373:65::-;8472:15;;;8503:12;;;;8535:11;;;8573;;;8565:20;;8561:29;;8558:42;-1:-1:-1;8555:2:1;;;8618:6;8610;8603:22;8555:2;8645:6;8636:15;;8660:240;8674:2;8671:1;8668:9;8660:240;;;8745:3;8732:17;8762:33;8789:5;8762:33;:::i;:::-;8808:18;;8692:1;8685:9;;;;;8846:12;;;;8878;;8660:240;;;-1:-1:-1;8919:5:1;-1:-1:-1;;8962:18:1;;8949:32;;-1:-1:-1;;8993:16:1;;;8990:2;;;9027:6;9019;9012:22;8990:2;;9055:69;9116:7;9105:8;9094:9;9090:24;9055:69;:::i;:::-;9045:79;;;7972:1158;;;;;:::o;9135:257::-;;9255:2;9243:9;9234:7;9230:23;9226:32;9223:2;;;9276:6;9268;9261:22;9223:2;9313:9;9307:16;9332:30;9356:5;9332:30;:::i;9397:257::-;;9508:2;9496:9;9487:7;9483:23;9479:32;9476:2;;;9529:6;9521;9514:22;9476:2;9573:9;9560:23;9592:32;9618:5;9592:32;:::i;9659:261::-;;9781:2;9769:9;9760:7;9756:23;9752:32;9749:2;;;9802:6;9794;9787:22;9749:2;9839:9;9833:16;9858:32;9884:5;9858:32;:::i;9925:482::-;;10047:2;10035:9;10026:7;10022:23;10018:32;10015:2;;;10068:6;10060;10053:22;10015:2;10113:9;10100:23;-1:-1:-1;;;;;10138:6:1;10135:30;10132:2;;;10183:6;10175;10168:22;10132:2;10211:22;;10264:4;10256:13;;10252:27;-1:-1:-1;10242:2:1;;10298:6;10290;10283:22;10242:2;10326:75;10393:7;10388:2;10375:16;10370:2;10366;10362:11;10326:75;:::i;10412:190::-;;10524:2;10512:9;10503:7;10499:23;10495:32;10492:2;;;10545:6;10537;10530:22;10492:2;-1:-1:-1;10573:23:1;;10482:120;-1:-1:-1;10482:120:1:o;10607:258::-;;;10736:2;10724:9;10715:7;10711:23;10707:32;10704:2;;;10757:6;10749;10742:22;10704:2;-1:-1:-1;;10785:23:1;;;10855:2;10840:18;;;10827:32;;-1:-1:-1;10694:171:1:o;10870:1264::-;;;;;11100:3;11088:9;11079:7;11075:23;11071:33;11068:2;;;11122:6;11114;11107:22;11068:2;11163:9;11150:23;11140:33;;11192:2;11241;11230:9;11226:18;11213:32;11203:42;;11264:2;11285:53;11330:7;11325:2;11314:9;11310:18;11285:53;:::i;:::-;11275:63;;11389:3;11378:9;11374:19;11361:33;-1:-1:-1;;;;;11409:6:1;11406:30;11403:2;;;11454:6;11446;11439:22;11403:2;11482:22;;11535:4;11527:13;;11523:27;-1:-1:-1;11513:2:1;;11569:6;11561;11554:22;11513:2;11610;11597:16;11633:65;11648:49;11694:2;11648:49;:::i;11633:65::-;11732:15;;;11763:12;;;;11795:11;;;11833;;;11825:20;;11821:29;;11818:42;-1:-1:-1;11815:2:1;;;11878:6;11870;11863:22;11815:2;11905:6;11896:15;;11920:184;11934:2;11931:1;11928:9;11920:184;;;11991:38;12021:7;12016:3;11991:38;:::i;:::-;11979:51;;11952:1;11945:9;;;;;12050:12;;;;12082;;11920:184;;;-1:-1:-1;11058:1076:1;;;;-1:-1:-1;11058:1076:1;;-1:-1:-1;;;;;;;11058:1076:1:o;12139:443::-;;12236:5;12230:12;12263:6;12258:3;12251:19;12289:4;12318:2;12313:3;12309:12;12302:19;;12355:2;12348:5;12344:14;12376:3;12388:169;12402:6;12399:1;12396:13;12388:169;;;12463:13;;12451:26;;12497:12;;;;12532:15;;;;12424:1;12417:9;12388:169;;;-1:-1:-1;12573:3:1;;12206:376;-1:-1:-1;;;;;12206:376:1:o;12587:270::-;;12679:5;12673:12;12706:6;12701:3;12694:19;12722:63;12778:6;12771:4;12766:3;12762:14;12755:4;12748:5;12744:16;12722:63;:::i;:::-;12839:2;12818:15;-1:-1:-1;;12814:29:1;12805:39;;;;12846:4;12801:50;;12649:208;-1:-1:-1;;12649:208:1:o;12862:186::-;;12943:5;12937:12;12958:52;13003:6;12998:3;12991:4;12984:5;12980:16;12958:52;:::i;:::-;13026:16;;;;;12913:135;-1:-1:-1;;12913:135:1:o;13053:274::-;;13220:6;13214:13;13236:53;13282:6;13277:3;13270:4;13262:6;13258:17;13236:53;:::i;:::-;13305:16;;;;;13190:137;-1:-1:-1;;13190:137:1:o;13613:1180::-;13847:13;;13613:1180;;;;13920:1;13905:17;;13941:1;13977:18;;;;14004:2;;14058:4;14050:6;14046:17;14036:27;;14004:2;14084;14132;14124:6;14121:14;14101:18;14098:38;14095:2;;;-1:-1:-1;;;14159:33:1;;14215:4;14212:1;14205:15;14245:4;14166:3;14233:17;14095:2;14276:18;14303:104;;;;14421:1;14416:324;;;;14269:471;;14303:104;-1:-1:-1;;14336:24:1;;14324:37;;14381:16;;;;-1:-1:-1;14303:104:1;;14416:324;14452:39;14484:6;14452:39;:::i;:::-;14513:3;14529:165;14543:6;14540:1;14537:13;14529:165;;;14621:14;;14608:11;;;14601:35;14664:16;;;;14558:10;;14529:165;;;14533:3;;14723:6;14718:3;14714:16;14707:23;;14269:471;;;;;;;14756:31;14783:3;14775:6;14756:31;:::i;14798:392::-;-1:-1:-1;;;15056:27:1;;15108:1;15099:11;;15092:27;;;;15144:2;15135:12;;15128:28;15181:2;15172:12;;15046:144::o;15195:203::-;-1:-1:-1;;;;;15359:32:1;;;;15341:51;;15329:2;15314:18;;15296:102::o;15403:290::-;-1:-1:-1;;;;;15611:32:1;;;;15593:51;;15675:2;15660:18;;15653:34;15581:2;15566:18;;15548:145::o;15698:851::-;-1:-1:-1;;;;;16095:15:1;;;16077:34;;16147:15;;16142:2;16127:18;;16120:43;16057:3;16194:2;16179:18;;16172:31;;;15698:851;;16226:63;;16269:19;;16261:6;16226:63;:::i;:::-;16337:9;16329:6;16325:22;16320:2;16309:9;16305:18;16298:50;16371;16414:6;16406;16371:50;:::i;:::-;16357:64;;16470:9;16462:6;16458:22;16452:3;16441:9;16437:19;16430:51;16498:45;16536:6;16528;16498:45;:::i;:::-;16490:53;16029:520;-1:-1:-1;;;;;;;;16029:520:1:o;16554:375::-;-1:-1:-1;;;;;16812:15:1;;;16794:34;;16864:15;;;;16859:2;16844:18;;16837:43;16911:2;16896:18;;16889:34;;;;16744:2;16729:18;;16711:218::o;16934:573::-;-1:-1:-1;;;;;17231:15:1;;;17213:34;;17283:15;;17278:2;17263:18;;17256:43;17330:2;17315:18;;17308:34;;;17373:2;17358:18;;17351:34;;;17193:3;17416;17401:19;;17394:32;;;16934:573;;17443:58;;17481:19;;17473:6;17443:58;:::i;17791:677::-;17978:2;18030:21;;;18100:13;;18003:18;;;18122:22;;;17791:677;;17978:2;18201:15;;;;18175:2;18160:18;;;17791:677;18247:195;18261:6;18258:1;18255:13;18247:195;;;18326:13;;-1:-1:-1;;;;;18322:39:1;18310:52;;18417:15;;;;18382:12;;;;18358:1;18276:9;18247:195;;;-1:-1:-1;18459:3:1;;17958:510;-1:-1:-1;;;;;;17958:510:1:o;18473:267::-;;18652:2;18641:9;18634:21;18672:62;18730:2;18719:9;18715:18;18707:6;18672:62;:::i;18745:477::-;;19002:2;18991:9;18984:21;19028:62;19086:2;19075:9;19071:18;19063:6;19028:62;:::i;:::-;19138:9;19130:6;19126:22;19121:2;19110:9;19106:18;19099:50;19166;19209:6;19201;19166:50;:::i;19227:187::-;19392:14;;19385:22;19367:41;;19355:2;19340:18;;19322:92::o;19419:816::-;19790:25;;;-1:-1:-1;;;;;19889:15:1;;;19884:2;19869:18;;19862:43;19941:15;;;19936:2;19921:18;;19914:43;19993:15;;;;19988:2;19973:18;;19966:43;20040:3;20025:19;;20018:35;;;;19842:3;20069:19;;20062:35;20128:3;20113:19;;20106:35;;;;20172:3;20157:19;;20150:35;;;;20216:3;20201:19;;20194:35;19777:3;19762:19;;19744:491::o;20240:489::-;20499:25;;;20555:2;20540:18;;20533:34;;;;20598:2;20583:18;;20576:34;;;;20641:2;20626:18;;20619:34;-1:-1:-1;;;;;20690:32:1;20684:3;20669:19;;20662:61;20486:3;20471:19;;20453:276::o;20734:398::-;20961:25;;;21034:4;21022:17;;;;21017:2;21002:18;;20995:45;21071:2;21056:18;;21049:34;21114:2;21099:18;;21092:34;20948:3;20933:19;;20915:217::o;21137:232::-;;21286:2;21275:9;21268:21;21306:57;21359:2;21348:9;21344:18;21336:6;21306:57;:::i;21374:348::-;21576:2;21558:21;;;21615:2;21595:18;;;21588:30;21654:26;21649:2;21634:18;;21627:54;21713:2;21698:18;;21548:174::o;21727:416::-;21929:2;21911:21;;;21968:2;21948:18;;;21941:30;22007:34;22002:2;21987:18;;21980:62;-1:-1:-1;;;22073:2:1;22058:18;;22051:50;22133:3;22118:19;;21901:242::o;22148:404::-;22350:2;22332:21;;;22389:2;22369:18;;;22362:30;22428:34;22423:2;22408:18;;22401:62;-1:-1:-1;;;22494:2:1;22479:18;;22472:38;22542:3;22527:19;;22322:230::o;22557:355::-;22759:2;22741:21;;;22798:2;22778:18;;;22771:30;22837:33;22832:2;22817:18;;22810:61;22903:2;22888:18;;22731:181::o;22917:338::-;23119:2;23101:21;;;23158:2;23138:18;;;23131:30;-1:-1:-1;;;23192:2:1;23177:18;;23170:44;23246:2;23231:18;;23091:164::o;23260:407::-;23462:2;23444:21;;;23501:2;23481:18;;;23474:30;23540:34;23535:2;23520:18;;23513:62;-1:-1:-1;;;23606:2:1;23591:18;;23584:41;23657:3;23642:19;;23434:233::o;23672:402::-;23874:2;23856:21;;;23913:2;23893:18;;;23886:30;23952:34;23947:2;23932:18;;23925:62;-1:-1:-1;;;24018:2:1;24003:18;;23996:36;24064:3;24049:19;;23846:228::o;24079:400::-;24281:2;24263:21;;;24320:2;24300:18;;;24293:30;24359:34;24354:2;24339:18;;24332:62;-1:-1:-1;;;24425:2:1;24410:18;;24403:34;24469:3;24454:19;;24253:226::o;24484:469::-;24686:2;24668:21;;;24725:2;24705:18;;;24698:30;24764:34;24759:2;24744:18;;24737:62;24835:34;24830:2;24815:18;;24808:62;-1:-1:-1;;;24901:3:1;24886:19;;24879:32;24943:3;24928:19;;24658:295::o;24958:405::-;25160:2;25142:21;;;25199:2;25179:18;;;25172:30;25238:34;25233:2;25218:18;;25211:62;-1:-1:-1;;;25304:2:1;25289:18;;25282:39;25353:3;25338:19;;25132:231::o;25368:398::-;25570:2;25552:21;;;25609:2;25589:18;;;25582:30;25648:34;25643:2;25628:18;;25621:62;-1:-1:-1;;;25714:2:1;25699:18;;25692:32;25756:3;25741:19;;25542:224::o;25771:349::-;25973:2;25955:21;;;26012:2;25992:18;;;25985:30;26051:27;26046:2;26031:18;;26024:55;26111:2;26096:18;;25945:175::o;26125:402::-;26327:2;26309:21;;;26366:2;26346:18;;;26339:30;26405:34;26400:2;26385:18;;26378:62;-1:-1:-1;;;26471:2:1;26456:18;;26449:36;26517:3;26502:19;;26299:228::o;26532:414::-;26734:2;26716:21;;;26773:2;26753:18;;;26746:30;26812:34;26807:2;26792:18;;26785:62;-1:-1:-1;;;26878:2:1;26863:18;;26856:48;26936:3;26921:19;;26706:240::o;26951:413::-;27153:2;27135:21;;;27192:2;27172:18;;;27165:30;27231:34;27226:2;27211:18;;27204:62;-1:-1:-1;;;27297:2:1;27282:18;;27275:47;27354:3;27339:19;;27125:239::o;27369:401::-;27571:2;27553:21;;;27610:2;27590:18;;;27583:30;27649:34;27644:2;27629:18;;27622:62;-1:-1:-1;;;27715:2:1;27700:18;;27693:35;27760:3;27745:19;;27543:227::o;27775:414::-;27977:2;27959:21;;;28016:2;27996:18;;;27989:30;28055:34;28050:2;28035:18;;28028:62;-1:-1:-1;;;28121:2:1;28106:18;;28099:48;28179:3;28164:19;;27949:240::o;28194:398::-;28396:2;28378:21;;;28435:2;28415:18;;;28408:30;28474:34;28469:2;28454:18;;28447:62;-1:-1:-1;;;28540:2:1;28525:18;;28518:32;28582:3;28567:19;;28368:224::o;28597:399::-;28799:2;28781:21;;;28838:2;28818:18;;;28811:30;28877:34;28872:2;28857:18;;28850:62;-1:-1:-1;;;28943:2:1;28928:18;;28921:33;28986:3;28971:19;;28771:225::o;29001:406::-;29203:2;29185:21;;;29242:2;29222:18;;;29215:30;29281:34;29276:2;29261:18;;29254:62;-1:-1:-1;;;29347:2:1;29332:18;;29325:40;29397:3;29382:19;;29175:232::o;29412:407::-;29614:2;29596:21;;;29653:2;29633:18;;;29626:30;29692:34;29687:2;29672:18;;29665:62;-1:-1:-1;;;29758:2:1;29743:18;;29736:41;29809:3;29794:19;;29586:233::o;29824:404::-;30026:2;30008:21;;;30065:2;30045:18;;;30038:30;30104:34;30099:2;30084:18;;30077:62;-1:-1:-1;;;30170:2:1;30155:18;;30148:38;30218:3;30203:19;;29998:230::o;30233:407::-;30435:2;30417:21;;;30474:2;30454:18;;;30447:30;30513:34;30508:2;30493:18;;30486:62;-1:-1:-1;;;30579:2:1;30564:18;;30557:41;30630:3;30615:19;;30407:233::o;30645:356::-;30847:2;30829:21;;;30866:18;;;30859:30;30925:34;30920:2;30905:18;;30898:62;30992:2;30977:18;;30819:182::o;31006:476::-;31208:2;31190:21;;;31247:2;31227:18;;;31220:30;31286:34;31281:2;31266:18;;31259:62;31357:34;31352:2;31337:18;;31330:62;-1:-1:-1;;;31423:3:1;31408:19;;31401:39;31472:3;31457:19;;31180:302::o;31487:408::-;31689:2;31671:21;;;31728:2;31708:18;;;31701:30;31767:34;31762:2;31747:18;;31740:62;-1:-1:-1;;;31833:2:1;31818:18;;31811:42;31885:3;31870:19;;31661:234::o;31900:353::-;32102:2;32084:21;;;32141:2;32121:18;;;32114:30;32180:31;32175:2;32160:18;;32153:59;32244:2;32229:18;;32074:179::o;32258:405::-;32460:2;32442:21;;;32499:2;32479:18;;;32472:30;32538:34;32533:2;32518:18;;32511:62;-1:-1:-1;;;32604:2:1;32589:18;;32582:39;32653:3;32638:19;;32432:231::o;32668:406::-;32870:2;32852:21;;;32909:2;32889:18;;;32882:30;32948:34;32943:2;32928:18;;32921:62;-1:-1:-1;;;33014:2:1;32999:18;;32992:40;33064:3;33049:19;;32842:232::o;33079:405::-;33281:2;33263:21;;;33320:2;33300:18;;;33293:30;33359:34;33354:2;33339:18;;33332:62;-1:-1:-1;;;33425:2:1;33410:18;;33403:39;33474:3;33459:19;;33253:231::o;33489:404::-;33691:2;33673:21;;;33730:2;33710:18;;;33703:30;33769:34;33764:2;33749:18;;33742:62;-1:-1:-1;;;33835:2:1;33820:18;;33813:38;33883:3;33868:19;;33663:230::o;33898:397::-;34100:2;34082:21;;;34139:2;34119:18;;;34112:30;34178:34;34173:2;34158:18;;34151:62;-1:-1:-1;;;34244:2:1;34229:18;;34222:31;34285:3;34270:19;;34072:223::o;34300:407::-;34502:2;34484:21;;;34541:2;34521:18;;;34514:30;34580:34;34575:2;34560:18;;34553:62;-1:-1:-1;;;34646:2:1;34631:18;;34624:41;34697:3;34682:19;;34474:233::o;34712:406::-;34914:2;34896:21;;;34953:2;34933:18;;;34926:30;34992:34;34987:2;34972:18;;34965:62;-1:-1:-1;;;35058:2:1;35043:18;;35036:40;35108:3;35093:19;;34886:232::o;35123:177::-;35269:25;;;35257:2;35242:18;;35224:76::o;35305:911::-;;35601:2;35590:9;35586:18;35631:6;35620:9;35613:25;35657:2;35695;35690;35679:9;35675:18;35668:30;35718:6;35753;35747:13;35784:6;35776;35769:22;35822:3;35811:9;35807:19;35800:26;;35861:2;35853:6;35849:15;35835:29;;35882:4;35895:195;35909:6;35906:1;35903:13;35895:195;;;35974:13;;-1:-1:-1;;;;;35970:39:1;35958:52;;36065:15;;;;36030:12;;;;36006:1;35924:9;35895:195;;;35899:3;;36135:9;36130:3;36126:19;36121:2;36110:9;36106:18;36099:47;36163;36206:3;36198:6;36163:47;:::i;36221:248::-;36395:25;;;36451:2;36436:18;;36429:34;36383:2;36368:18;;36350:119::o;36474:251::-;36544:2;36538:9;36574:17;;;-1:-1:-1;;;;;36606:34:1;;36642:22;;;36603:62;36600:2;;;36668:18;;:::i;:::-;36704:2;36697:22;36518:207;;-1:-1:-1;36518:207:1:o;36730:192::-;;-1:-1:-1;;;;;36821:6:1;36818:30;36815:2;;;36851:18;;:::i;:::-;-1:-1:-1;36911:4:1;36892:17;;;36888:28;;36805:117::o;36927:129::-;;36995:17;;;37045:4;37029:21;;;36985:71::o;37061:128::-;;37132:1;37128:6;37125:1;37122:13;37119:2;;;37138:18;;:::i;:::-;-1:-1:-1;37174:9:1;;37109:80::o;37194:120::-;;37260:1;37250:2;;37265:18;;:::i;:::-;-1:-1:-1;37299:9:1;;37240:74::o;37319:168::-;;37425:1;37421;37417:6;37413:14;37410:1;37407:21;37402:1;37395:9;37388:17;37384:45;37381:2;;;37432:18;;:::i;:::-;-1:-1:-1;37472:9:1;;37371:116::o;37492:125::-;;37560:1;37557;37554:8;37551:2;;;37565:18;;:::i;:::-;-1:-1:-1;37602:9:1;;37541:76::o;37622:258::-;37694:1;37704:113;37718:6;37715:1;37712:13;37704:113;;;37794:11;;;37788:18;37775:11;;;37768:39;37740:2;37733:10;37704:113;;;37835:6;37832:1;37829:13;37826:2;;;-1:-1:-1;;37870:1:1;37852:16;;37845:27;37675:205::o;37885:380::-;37970:1;37960:12;;38017:1;38007:12;;;38028:2;;38082:4;38074:6;38070:17;38060:27;;38028:2;38135;38127:6;38124:14;38104:18;38101:38;38098:2;;;38181:10;38176:3;38172:20;38169:1;38162:31;38216:4;38213:1;38206:15;38244:4;38241:1;38234:15;38098:2;;37940:325;;;:::o;38270:135::-;;-1:-1:-1;;38330:17:1;;38327:2;;;38350:18;;:::i;:::-;-1:-1:-1;38397:1:1;38386:13;;38317:88::o;38410:112::-;;38468:1;38458:2;;38473:18;;:::i;:::-;-1:-1:-1;38507:9:1;;38448:74::o;38527:127::-;38588:10;38583:3;38579:20;38576:1;38569:31;38619:4;38616:1;38609:15;38643:4;38640:1;38633:15;38659:127;38720:10;38715:3;38711:20;38708:1;38701:31;38751:4;38748:1;38741:15;38775:4;38772:1;38765:15;38791:127;38852:10;38847:3;38843:20;38840:1;38833:31;38883:4;38880:1;38873:15;38907:4;38904:1;38897:15;38923:88;38998:3;38994:15;;38980:31::o;39016:764::-;;39097:4;39079:16;39076:26;39073:2;;;39105:5;;39073:2;39146:1;39141:3;39136;39121:27;39208:10;39170:36;39201:3;39195:10;39170:36;:::i;:::-;39167:52;39157:2;;39223:5;;39157:2;39257;39251:9;39297:16;-1:-1:-1;;39293:29:1;39290:1;39251:9;39269:54;39352:4;39346:11;39376:16;-1:-1:-1;;;;;39482:2:1;39475:4;39467:6;39463:17;39460:25;39455:2;39447:6;39444:14;39441:45;39438:2;;;39489:5;;;;;;39438:2;39526:6;39520:4;39516:17;39505:28;;39562:3;39556:10;39542:24;;39589:2;39581:6;39578:14;39575:2;;;39595:5;;;;;;39575:2;;39656:16;39650:4;39646:27;39639:4;39630:6;39625:3;39621:16;39617:27;39614:60;39611:2;;;39677:5;;;;;39611:2;39742;39721:15;-1:-1:-1;;39717:29:1;39708:39;;39749:4;39704:50;39700:2;39693:62;39712:3;-1:-1:-1;;39063:717:1;:::o;39785:133::-;-1:-1:-1;;;;;39862:31:1;;39852:42;;39842:2;;39908:1;39905;39898:12;39923:120;40011:5;40004:13;39997:21;39990:5;39987:32;39977:2;;40033:1;40030;40023:12;40048:133;-1:-1:-1;;;;;;40124:32:1;;40114:43;;40104:2;;40171:1;40168;40161:12
Swarm Source
ipfs://124a76011d089b6dbbd5eb628a2cf7cf142e1ff79cb8c5257ad403e40e9680b2
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.