Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 15237968 | 833 days ago | IN | 0 ETH | 0.13079472 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TokenTraxxNFT1155
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-29 */ // Sources flattened with hardhat v2.8.3 https://hardhat.org // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) // 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 IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts-upgradeable/token/ERC1155/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @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 IERC1155Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle( address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value ); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll( address indexed account, address indexed operator, bool approved ); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File @openzeppelin/contracts-upgradeable/token/ERC1155/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155ReceiverUpgradeable is IERC165Upgradeable { /** * @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. * * NOTE: 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. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts-upgradeable/token/ERC1155/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @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 IERC1155MetadataURIUpgradeable is IERC1155Upgradeable { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require( _initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized" ); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing {} function __Context_init_unchained() internal onlyInitializing {} function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing {} function __ERC165_init_unchained() internal onlyInitializing {} /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC1155/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @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 ERC1155Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC1155Upgradeable, IERC1155MetadataURIUpgradeable { using AddressUpgradeable for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ function __ERC1155_init(string memory uri_) internal onlyInitializing { __ERC1155_init_unchained(uri_); } function __ERC1155_init_unchained(string memory uri_) internal onlyInitializing { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC1155Upgradeable).interfaceId || interfaceId == type(IERC1155MetadataURIUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require( account != address(0), "ERC1155: balance query for the zero address" ); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require( accounts.length == ids.length, "ERC1155: accounts and ids length mismatch" ); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer( operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data ); uint256 fromBalance = _balances[id][from]; require( fromBalance >= amount, "ERC1155: insufficient balance for transfer" ); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require( fromBalance >= amount, "ERC1155: insufficient balance for transfer" ); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck( operator, from, to, ids, amounts, data ); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer( operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data ); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _doSafeTransferAcceptanceCheck( operator, address(0), to, id, amount, data ); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck( operator, address(0), to, ids, amounts, data ); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer( operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "" ); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, 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 from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); 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: burn amount exceeds balance" ); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155ReceiverUpgradeable(to).onERC1155Received( operator, from, id, amount, data ) returns (bytes4 response) { if ( response != IERC1155ReceiverUpgradeable.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 IERC1155ReceiverUpgradeable(to).onERC1155BatchReceived( operator, from, ids, amounts, data ) returns (bytes4 response) { if ( response != IERC1155ReceiverUpgradeable.onERC1155BatchReceived.selector ) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[47] private __gap; } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File contracts/utils/Errors.sol pragma solidity ^0.8.2; // Library /** * @dev Abstarct for managing error messages. * */ abstract contract ErrorCodes { int32 internal constant ONLY_ADMIN = 0; int32 internal constant ONLY_MINTER = 1; int32 internal constant ONLY_WHITE_LISTER = 2; int32 internal constant ONLY_TOKEN_OWNER = 3; int32 internal constant ZERO_ADDRESS = 4; int32 internal constant BPS_EXCEEDS_10000 = 5; int32 internal constant TOKEN_NOT_EXISTS = 6; int32 internal constant URI_QUERY_NON_EXISTENT_TOKEN = 7; int32 internal constant URI_NOT_SET = 8; int32 internal constant ASSET_NOT_WHITELISTED = 9; int32 internal constant CURRENCY_NOT_WHITELISTED = 10; int32 internal constant INVALID_TOKEN_AMOUNT = 11; int32 internal constant CANT_MODIFY_LISTING_ASSET = 12; int32 internal constant CANT_MODIFY_LISTING_TOKEN_ID = 13; int32 internal constant CANT_MODIFY_LISTING_TOKEN_TYPE = 14; int32 internal constant INVALID_CURRENCY_FROM_LISTING = 15; int32 internal constant OWNER_BUYER_CONFLICT = 16; int32 internal constant ASSET_INSUFFICIENT_ALLOWANCE_BALANCE = 17; int32 internal constant FEES_EXCEEDS_PRICE = 18; int32 internal constant TRANSFER_FAILED = 19; int32 internal constant BID_AMOUNT_MISMATCH_FROM_LISTING = 20; int32 internal constant INVALID_ASSET_OWNERSHIP_OR_INSUFFICIENT_ALLOWANCE_BALANCE = 21; int32 internal constant INSUFFICIENT_ALLOWANCE_BALANCE_FOR_MARKET = 22; int32 internal constant CANT_BUY_LISTING_FROM_AUCTION = 23; int32 internal constant BUYING_INVALID_ASSET_AMOUNT = 24; int32 internal constant NATIVE_TOKEN_AMOUNT_MISMATCH_FROM_LISTING = 25; int32 internal constant TOKEN_INSUFFICIENT_ALLOWANCE_BALANCE = 26; int32 internal constant WITHDRAW_ZERO_AMOUNT = 27; int32 internal constant WITHDRAW_FAILED = 28; int32 internal constant ASSET_ALREADY_WHITELISTED = 29; int32 internal constant CURRENCY_ALREADY_WHITELISTED = 30; int32 internal constant EITHER_ADMIN_OR_FIRST_OWNER = 31; int32 internal constant BURN_AMOUNT_EXCEEDS_BALANCE_OR_ID_NOT_FOUND = 32; int32 internal constant INSUFFICIENT_BALANCE_FOR_TRANSFER_OR_ID_NOT_FOUND = 33; int32 internal constant TOKEN_ID_NOT_FOUND = 34; int32 internal constant NO_IDS_FOUND = 35; int32 internal constant ALREADY_LISTED = 36; int32 internal constant SECONDARY_SALE_NOT_SUPPORTED = 37; int32 internal constant MARKET_ADDRESS_CANNOT_BE_ZERO_ADDRESS = 38; int32 internal constant LISTING_ID_NOT_FOUND = 39; int32 internal constant FUNCTION_NOT_EXECUTABLE = 40; int32 internal constant UNAUTHORISED_ACCESS = 41; int32 internal constant CANNOT_MODIFY_INACTIVE_SALE = 42; int32 internal constant QUANTITY_MUST_BE_GREATER_THAN_EQUAL_TO_ONE = 43; int32 internal constant TOKEN_ID_DOESNOT_EXIST = 44; int32 internal constant MAX_QUANTITY_MUST_BE_GREATER_THAN_ZERO = 45; int32 internal constant MAX_QUANTITY_ALLOWANCE_LIMIT_REACHED = 46; int32 internal constant ONLY_MAINTAINER = 47; int32 internal constant INVALID_TOKEN_OWNER = 48; int32 internal constant ADDRESS_NOT_WHITELISTED = 49; int32 internal constant EXCEEDED_PRIMARY_PURCHASE_LIMIT = 50; int32 internal constant INVALID_COLLECTION_DETAIL = 51; int32 internal constant COLLECTION_ID_CANNOT_BE_LESS_THAN_ZERO = 52; int32 internal constant INVALID_OWNER = 53; int32 internal constant INVALID_WHITELIST_PARAMS = 54; int32 internal constant TOKEN_IDS_REQUIRED = 55; int32 internal constant SENDER_SHOULD_BE_MARKETPLACE_CONTRACT = 56; int32 internal constant INVALID_FUNCTION_PARAMS = 57; function throwError(int32 _errCode) public pure returns (string memory) { return Strings.toString(uint32(_errCode)); } } // File contracts/utils/ERC1155EnumerableUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC1155} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC1155EnumerableUpgradeable is Initializable, ERC1155Upgradeable, ErrorCodes { function __ERC1155EnumerableUpgradeable_init() internal onlyInitializing {} function __ERC1155EnumerableUpgradeable_init_unchained() internal onlyInitializing {} // Mapping from owner to list of owned token IDs i.e. owner => [tokenids] mapping(address => uint256[]) _ownedTokens; function tokensOfOwner(address owner) public view returns (uint256[] memory) { return _ownedTokens[owner]; } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) internal { if (balanceOf(to, tokenId) == 0) { _ownedTokens[to].push(tokenId); } } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration( address from, uint256 tokenId, uint256 amount ) internal { if (balanceOf(from, tokenId) == amount) { uint256 _tokenIndex = _ownedTokensIndex(from, tokenId); _ownedTokens[from][_tokenIndex] = _ownedTokens[from][ _ownedTokens[from].length - 1 ]; _ownedTokens[from].pop(); } } function _ownedTokensIndex(address owner, uint256 tokenId) internal virtual returns (uint256 index) { uint256 length = _ownedTokens[owner].length; bool found; for (index = 0; index < length; index++) { if (_ownedTokens[owner][index] == tokenId) { found = true; return index; } } require(found, throwError(TOKEN_ID_NOT_FOUND)); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File contracts/utils/ERC1155URIStorageUpgradeable.sol // OpenZeppelin Contracts (last updated v4.6.0-rc.0) (token/ERC1155/extensions/ERC1155URIStorage.sol) pragma solidity ^0.8.0; // Extensions /** * @dev ERC1155 token with storage based token URI management. * Inspired by the ERC721URIStorage extension * * _Available since v4.6._ */ /** * @dev ERC1155 token with storage based token URI management. * Inspired by the ERC721URIStorage extension * * _Available since v4.6._ */ abstract contract ERC1155URIStorageUpgradeable is Initializable, ERC1155Upgradeable { function __ERC1155URIStorage_init() internal onlyInitializing { __ERC1155URIStorage_init_unchained(); } function __ERC1155URIStorage_init_unchained() internal onlyInitializing { _baseURI = ""; } using StringsUpgradeable for uint256; // Optional base URI string private _baseURI; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the concatenation of the `_baseURI` * and the token-specific uri if the latter is set * * This enables the following behaviors: * * - if `_tokenURIs[tokenId]` is set, then the result is the concatenation * of `_baseURI` and `_tokenURIs[tokenId]` (keep in mind that `_baseURI` * is empty per default); * * - if `_tokenURIs[tokenId]` is NOT set then we fallback to `super.uri()` * which in most cases will contain `ERC1155._uri`; * * - if `_tokenURIs[tokenId]` is NOT set, and if the parents do not have a * uri value set, then the result is empty. */ function uri(uint256 tokenId) public view virtual override returns (string memory) { string memory tokenURI = _tokenURIs[tokenId]; // If token URI is set, concatenate base URI and tokenURI (via abi.encodePacked). return bytes(tokenURI).length > 0 ? string(abi.encodePacked(_baseURI, tokenURI)) : super.uri(tokenId); } /** * @dev Sets `tokenURI` as the tokenURI of `tokenId`. */ function _setURI(uint256 tokenId, string memory tokenURI) internal virtual { _tokenURIs[tokenId] = tokenURI; emit URI(uri(tokenId), tokenId); } /** * @dev Sets `baseURI` as the `_baseURI` for all tokens */ function _setBaseURI(string memory baseURI) internal virtual { _baseURI = baseURI; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[48] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC1155/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Supply.sol) pragma solidity ^0.8.0; /** * @dev Extension of ERC1155 that adds tracking of total supply per id. * * Useful for scenarios where Fungible and Non-fungible tokens have to be * clearly identified. Note: While a totalSupply of 1 might mean the * corresponding is an NFT, there is no guarantees that no other token with the * same id are not going to be minted. */ abstract contract ERC1155SupplyUpgradeable is Initializable, ERC1155Upgradeable { function __ERC1155Supply_init() internal onlyInitializing {} function __ERC1155Supply_init_unchained() internal onlyInitializing {} mapping(uint256 => uint256) private _totalSupply; /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155SupplyUpgradeable.totalSupply(id) > 0; } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] -= amounts[i]; } } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC1155/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC1155} that allows token holders to destroy both their * own tokens and those that they have been approved to use. * * _Available since v3.1._ */ abstract contract ERC1155BurnableUpgradeable is Initializable, ERC1155Upgradeable { function __ERC1155Burnable_init() internal onlyInitializing {} function __ERC1155Burnable_init_unchained() internal onlyInitializing {} function burn( address account, uint256 id, uint256 value ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved" ); _burn(account, id, value); } function burnBatch( address account, uint256[] memory ids, uint256[] memory values ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved" ); _burnBatch(account, ids, values); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC1155/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Pausable.sol) pragma solidity ^0.8.0; /** * @dev ERC1155 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. * * _Available since v3.1._ */ abstract contract ERC1155PausableUpgradeable is Initializable, ERC1155Upgradeable, PausableUpgradeable { function __ERC1155Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __ERC1155Pausable_init_unchained() internal onlyInitializing {} /** * @dev See {ERC1155-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); require(!paused(), "ERC1155Pausable: token transfer while paused"); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControlUpgradeable { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged( bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole ); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted( bytes32 indexed role, address indexed account, address indexed sender ); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked( bytes32 indexed role, address indexed account, address indexed sender ); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerableUpgradeable is IAccessControlUpgradeable { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } // File @openzeppelin/contracts-upgradeable/access/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable { function __AccessControl_init() internal onlyInitializing {} function __AccessControl_init_unchained() internal onlyInitializing {} struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", StringsUpgradeable.toHexString(uint160(account), 20), " is missing role ", StringsUpgradeable.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require( account == _msgSender(), "AccessControl: can only renounce roles for self" ); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/structs/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSetUpgradeable { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } // File @openzeppelin/contracts-upgradeable/access/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerableUpgradeable is Initializable, IAccessControlEnumerableUpgradeable, AccessControlUpgradeable { function __AccessControlEnumerable_init() internal onlyInitializing {} function __AccessControlEnumerable_init_unchained() internal onlyInitializing {} using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; mapping(bytes32 => EnumerableSetUpgradeable.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override { super._grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _roleMembers[role].remove(account); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library CountersUpgradeable { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/interfaces/[email protected] // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; // File @openzeppelin/contracts/interfaces/[email protected] // OpenZeppelin Contracts v4.4.1 (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard */ interface IERC2981 is IERC165 { /** * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File contracts/interfaces/IERC1155Custom.sol pragma solidity ^0.8.0; interface IERC1155Custom { function maxQuantityToPurchaseLimit() external view returns (uint256 maxQuantityAllowed); struct WhitelistParams { bytes32 merkleRoot; uint256 endTime; // absolute value in UNIX time, can be used as is for 1155; uint256 startTime; } struct Collection { string title; string description; string thumbnail; string bgImage; string bgColor; uint256[] tokenIds; address owner; uint256 createdAt; uint256 updatedAt; int256 userPurchaseLimit; int256 allowedPurchaseLimit; uint256 primarySoldCount; WhitelistParams[] whitelistParams; // mapping(address => uint256) primarySaleUserCount; } function getFirstOwner(uint256 _id) external returns (address); function getCollectionData(uint256 _id) external returns (Collection memory); function getNFTCollectionId(uint256 _id) external returns (uint256); // Different signature for 1155 to update userPurchase and totalAllowedPurchase by quantity function updateCollectionAfterPrimarySale( address account, uint256 _collectionId, uint256 _quantity ) external returns (bool); function getPrimarySaleUserCount(address account, uint256 _collectionId) external view returns (uint256); } // File contracts/TokenTraxxNFT1155.sol pragma solidity ^0.8.2; // ERC1155 // Extensions // Access Control // Utils // Royalties // Proxy contract TokenTraxxNFT1155 is Initializable, ERC1155Upgradeable, AccessControlEnumerableUpgradeable, ERC1155URIStorageUpgradeable, ERC1155SupplyUpgradeable, ERC1155BurnableUpgradeable, ERC1155PausableUpgradeable, IERC2981, ErrorCodes, ERC1155EnumerableUpgradeable, IERC1155Custom { using CountersUpgradeable for CountersUpgradeable.Counter; CountersUpgradeable.Counter public _tokenIdTracker; bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); bytes32 public constant MAINTAINER_ROLE = keccak256("MAINTAINER_ROLE"); bytes32 public constant MINTER_ROLE_ADMIN = keccak256("MINTER_ROLE_ADMIN"); /// @dev Storing the mapping of token ids to the token uris. mapping(uint256 => string) private _uris; /// @dev Storing the first owner of the token. mapping(uint256 => address) public firstOwner; /// @dev Stores the market address address public market; /// @dev Stores the contract uri string private _contractURI; /// @dev Used for custom enumerable implementation struct TokenBalance { uint256 id; uint256 quantity; } /// @dev Storing the mapping of token ids to the token uris. mapping(uint256 => string) private _tokenURIs; /// @dev Base uri for the token uri's. string private _baseURI; /// @dev Setting maximum royalty percentage. uint128 private constant MAX_BPS = 10_000; /// @dev Pack sale royalties -- see EIP 2981. uint256 public royaltyBps; /// @dev Owner of the contract (purpose: OpenSea compatibility, etc.) address public owner; /// @dev Event Emitted when an NFT is minted or burned; event TraxxMinted( address indexed creator, address indexed to, uint256 tokenId, string tokenURI, uint256 quantity ); event BatchTraxxMinted( address account, uint256[] tokenIds, uint256[] quantity ); event TokensBurned(address account, uint256 tokenId, uint256 quantity); // event BatchTokensBurned( // address account, // uint256[] tokenIds, // uint256[] quantity // ); /// @dev Event Emitted when the royalty percentage is changed. event RoyaltyUpdated(uint256 royaltyBps); ///@dev Event Emitted when the contract uri is updated. event TraxxContractURIUpdated(string contractURI); event CollectionCreated(uint256 indexed id); event CollectionUpdated(uint256 indexed id); event TransferredCollectionOwnership( address indexed newOwner, uint256 collectionId ); function getFirstOwner(uint256 _id) public view override returns (address) { return firstOwner[_id]; } function getCollectionData(uint256 _id) public view override returns (Collection memory) { return _collections[_id]; } function getPrimarySaleUserCount(address account, uint256 _collectionId) public view override returns (uint256) { return _primarySaleUserCount[account][_collectionId]; } function getNFTCollectionId(uint256 _id) public view override returns (uint256) { return _nftCollectionId[_id]; } function createCollection(Collection calldata _collection) external onlyRole(MINTER_ROLE) returns (uint256 id) { require( bytes(_collection.title).length > 0, throwError(INVALID_COLLECTION_DETAIL) ); require( bytes(_collection.description).length > 0, throwError(INVALID_COLLECTION_DETAIL) ); require( bytes(_collection.thumbnail).length > 0, throwError(INVALID_COLLECTION_DETAIL) ); require( bytes(_collection.bgImage).length > 0, throwError(INVALID_COLLECTION_DETAIL) ); require( bytes(_collection.bgColor).length > 0, throwError(INVALID_COLLECTION_DETAIL) ); //require(_tokenIds.length > 0, "tokenIds is required"); require(_collection.owner != address(0), throwError(ZERO_ADDRESS)); require( _collection.userPurchaseLimit > 0 || _collection.userPurchaseLimit == -1, throwError(INVALID_COLLECTION_DETAIL) ); require( _collection.allowedPurchaseLimit > 0 || _collection.allowedPurchaseLimit == -1, throwError(INVALID_COLLECTION_DETAIL) ); id = _collectionIdTracker.current(); _collections[id].title = _collection.title; _collections[id].description = _collection.description; _collections[id].thumbnail = _collection.thumbnail; _collections[id].bgImage = _collection.bgImage; _collections[id].bgColor = _collection.bgColor; _collections[id].tokenIds = _collection.tokenIds; _collections[id].owner = _collection.owner; _collections[id].createdAt = block.timestamp; _collections[id].updatedAt = 0; _collections[id].userPurchaseLimit = _collection.userPurchaseLimit; _collections[id].allowedPurchaseLimit = _collection .allowedPurchaseLimit; _collections[id].primarySoldCount = 0; for (uint256 i = 0; i < _collection.whitelistParams.length; i++) { _collections[id].whitelistParams.push( _collection.whitelistParams[i] ); } _collectionIdTracker.increment(); emit CollectionCreated(id); return id; } function addTokensToCollection( uint256 _collectionId, uint256[] calldata _tokenIds ) external onlyRole(MINTER_ROLE) { require( _collectionId >= 0, throwError(COLLECTION_ID_CANNOT_BE_LESS_THAN_ZERO) ); require( msg.sender == _collections[_collectionId].owner, throwError(INVALID_OWNER) ); require(_tokenIds.length > 0, throwError(TOKEN_IDS_REQUIRED)); _collections[_collectionId].tokenIds = _tokenIds; _collections[_collectionId].updatedAt = block.timestamp; emit CollectionUpdated(_collectionId); for (uint256 i = 0; i < _tokenIds.length; i++) { _nftCollectionId[_tokenIds[i]] = _collectionId; } } /** @dev For 1155, this function needs quantity passed as well, and _primarySaleUserCount, *** _collections[_collectionId].primarySoldCount are updated with purchase quantity */ function updateCollectionAfterPrimarySale( address account, uint256 _collectionId, uint256 _quantity ) external override returns (bool) { require( msg.sender == market, throwError(SENDER_SHOULD_BE_MARKETPLACE_CONTRACT) ); _collections[_collectionId].primarySoldCount += _quantity; // to track allowedPurchaseLimit - collection-level _primarySaleUserCount[account][_collectionId] += _quantity; // to track userPurchaseLimit - user-level return true; } function updateCollection(uint256 _id, Collection calldata _collection) external onlyRole(MINTER_ROLE) returns (bool) { require(_id >= 0, throwError(COLLECTION_ID_CANNOT_BE_LESS_THAN_ZERO)); require( msg.sender == _collections[_id].owner, throwError(INVALID_OWNER) ); require( bytes(_collection.title).length > 0, throwError(INVALID_COLLECTION_DETAIL) ); require( bytes(_collection.description).length > 0, throwError(INVALID_COLLECTION_DETAIL) ); require( bytes(_collection.thumbnail).length > 0, throwError(INVALID_COLLECTION_DETAIL) ); require( bytes(_collection.bgImage).length > 0, throwError(INVALID_COLLECTION_DETAIL) ); require( bytes(_collection.bgColor).length > 0, throwError(INVALID_COLLECTION_DETAIL) ); require( _collection.tokenIds.length > 0, throwError(INVALID_COLLECTION_DETAIL) ); require( _collection.allowedPurchaseLimit > 0 || _collection.allowedPurchaseLimit == -1, throwError(INVALID_COLLECTION_DETAIL) ); // require(_whitelistParams.length > 0, "whitelistParams is required"); // should we remove this and add a separate setter for whitelist params? _collections[_id].title = _collection.title; _collections[_id].description = _collection.description; _collections[_id].thumbnail = _collection.thumbnail; _collections[_id].bgImage = _collection.bgImage; _collections[_id].bgColor = _collection.bgColor; _collections[_id].tokenIds = _collection.tokenIds; _collections[_id].userPurchaseLimit = _collection.userPurchaseLimit; _collections[_id].allowedPurchaseLimit = _collection .allowedPurchaseLimit; _collections[_id].updatedAt = block.timestamp; for (uint256 i = 0; i < _collection.whitelistParams.length; i++) { _collections[_id].whitelistParams.push( _collection.whitelistParams[i] ); } emit CollectionUpdated(_id); return true; } // added separate setter for collection - whitelists function addWhitelistToCollection( uint256 _id, WhitelistParams[] memory _whitelistParams ) external onlyRole(MINTER_ROLE) returns (bool) { require( _whitelistParams.length > 0, throwError(INVALID_WHITELIST_PARAMS) ); for (uint256 i = 0; i < _whitelistParams.length; i++) { _collections[_id].whitelistParams.push(_whitelistParams[i]); } emit CollectionUpdated(_id); return true; } function transferCollectionOwnership(uint256 _id, address _owner) external onlyRole(MINTER_ROLE) returns (bool) { require(_id >= 0, throwError(COLLECTION_ID_CANNOT_BE_LESS_THAN_ZERO)); require( msg.sender == _collections[_id].owner, throwError(INVALID_OWNER) ); // check if this condition required require(_owner != msg.sender, throwError(OWNER_BUYER_CONFLICT)); _collections[_id].owner = _owner; _collections[_id].updatedAt = block.timestamp; emit TransferredCollectionOwnership(_owner, _id); return true; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyAdmin() { require( hasRole(DEFAULT_ADMIN_ROLE, msg.sender), throwError(ONLY_ADMIN) ); _; } modifier onlyMinter() { require(hasRole(MINTER_ROLE, msg.sender), throwError(ONLY_MINTER)); _; } modifier onlyMaintainer() { require( hasRole(MAINTAINER_ROLE, msg.sender), throwError(ONLY_MAINTAINER) ); _; } function initialize( string memory _uri, uint256 _royaltyBps, address _market, address _owner, address _maintainer ) external initializer { require( _market != address(0), throwError(MARKET_ADDRESS_CANNOT_BE_ZERO_ADDRESS) ); __ERC1155_init(_uri); __AccessControl_init(); __ERC1155EnumerableUpgradeable_init(); __ERC1155URIStorage_init(); __ERC1155Supply_init(); __ERC1155Pausable_init(); __ERC1155Burnable_init(); // Set contract uri. _contractURI = _uri; // Set empty base uri. _baseURI = ""; // Grant ownership and setup roles. owner = _owner; // Adding Market address. market = _market; // Setting up Admin, minter and pauser role. _setupRole(DEFAULT_ADMIN_ROLE, _owner); // Setting up the royalty percentage. setRoyaltyBps(_royaltyBps); //Setting up other roles _setupRole(MAINTAINER_ROLE, _owner); _setupRole(MAINTAINER_ROLE, _maintainer); _setupRole(MINTER_ROLE_ADMIN, _owner); _setupRole(MINTER_ROLE_ADMIN, _maintainer); _setRoleAdmin(MINTER_ROLE_ADMIN, MINTER_ROLE_ADMIN); _setupRole(MINTER_ROLE, _owner); _setupRole(MINTER_ROLE, _maintainer); _setRoleAdmin(MINTER_ROLE, MINTER_ROLE_ADMIN); _setupRole(PAUSER_ROLE, _owner); } /** * @dev Lets a protocol admin update the royalties paid on token sales. */ function setRoyaltyBps(uint256 _royaltyBps) public onlyAdmin { require(_royaltyBps <= MAX_BPS, throwError(BPS_EXCEEDS_10000)); royaltyBps = _royaltyBps; emit RoyaltyUpdated(_royaltyBps); } /** * @dev Used to calculate the royalty amount. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual override returns (address receiver, uint256 royaltyAmount) { receiver = firstOwner[tokenId]; royaltyAmount = (salePrice * royaltyBps) / MAX_BPS; } /** * @dev Overriding the hook initialised in imported libraries. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override( ERC1155Upgradeable, ERC1155SupplyUpgradeable, ERC1155PausableUpgradeable ) { for (uint256 i = 0; i < ids.length; ++i) { uint256 tokenId = ids[i]; uint256 amount = amounts[i]; if (to == address(0)) { //burn require( balanceOf(from, tokenId) >= amount, throwError(BURN_AMOUNT_EXCEEDS_BALANCE_OR_ID_NOT_FOUND) ); } else if (from != address(0) && to != address(0)) { //transfer require( balanceOf(from, tokenId) >= amount, throwError( INSUFFICIENT_BALANCE_FOR_TRANSFER_OR_ID_NOT_FOUND ) ); } } // Goes to SupplyUpgradeable super._beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 tokenId = ids[i]; uint256 amount = amounts[i]; if (from == address(0)) { //mint _addTokenToOwnerEnumeration(to, tokenId); } else if (to == address(0)) { //burn _removeTokenFromOwnerEnumeration(from, tokenId, amount); } else if (from != to) { //transfer _addTokenToOwnerEnumeration(to, tokenId); _removeTokenFromOwnerEnumeration(from, tokenId, amount); } } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override( AccessControlEnumerableUpgradeable, ERC1155Upgradeable, IERC165 ) returns (bool) { return super.supportsInterface(interfaceId) || interfaceId == type(IERC2981).interfaceId; } /** * @dev Mints an ERC1155 token. */ function mintTraxx( address _to, uint256 amount, string memory _uri, uint256 _collectionId ) external onlyMinter { require( _collectionId >= 0, throwError(COLLECTION_ID_CANNOT_BE_LESS_THAN_ZERO) ); uint256 id = _tokenIdTracker.current(); _mint(_to, id, amount, ""); _tokenURIs[id] = _uri; firstOwner[id] = _to; // add tokens to collection _nftCollectionId[id] = _collectionId; _collections[_collectionId].tokenIds.push(id); emit TraxxMinted(msg.sender, _to, id, _uri, amount); if (msg.sender != _to) _setApprovalForAll(_to, msg.sender, true); _setApprovalForAll(_to, market, true); _tokenIdTracker.increment(); } /** * @dev Used to mint more tokens later. */ function addQuantity( uint256 id, address _to, uint256 amount ) external { require( hasRole(DEFAULT_ADMIN_ROLE, msg.sender) || firstOwner[id] == msg.sender, throwError(EITHER_ADMIN_OR_FIRST_OWNER) ); string memory tokenURI = _tokenURIs[id]; require(bytes(tokenURI).length > 0, throwError(URI_NOT_SET)); _mint(_to, id, amount, ""); emit TraxxMinted(msg.sender, _to, id, tokenURI, amount); if (msg.sender != _to) _setApprovalForAll(_to, msg.sender, true); _setApprovalForAll(_to, market, true); _tokenIdTracker.increment(); } /** * @dev Mints multiple tokens to a single address. * TODO: Need to fix the issue in overriding the tokens on each call * _tokenURIs[ids[i]] = uris[i]; overrides on each call */ function batchMintTraxx( address to, uint256[] memory ids, uint256[] memory amounts, string[] memory uris, bytes memory data, uint256[] memory collectionIds ) external onlyMinter { require( collectionIds.length == ids.length, throwError(INVALID_FUNCTION_PARAMS) ); _mintBatch(to, ids, amounts, data); uint256 arrayLen = uris.length; for (uint256 i = 0; i < arrayLen; ++i) { _tokenURIs[ids[i]] = uris[i]; _tokenIdTracker.increment(); // update nftCollectionId and the collection with the tokenIds _nftCollectionId[ids[i]] = collectionIds[i]; _collections[collectionIds[i]].tokenIds.push(ids[i]); } if (msg.sender != to) _setApprovalForAll(to, msg.sender, true); _setApprovalForAll(to, market, true); emit BatchTraxxMinted(to, ids, amounts); } function setURI(uint256 tokenId, string memory tokenURI) external virtual onlyMaintainer { _tokenURIs[tokenId] = tokenURI; emit URI(uri(tokenId), tokenId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the concatenation of the `_baseURI` * and the token-specific uri if the latter is set * * This enables the following behaviors: * * - if `_tokenURIs[tokenId]` is set, then the result is the concatenation * of `_baseURI` and `_tokenURIs[tokenId]` (keep in mind that `_baseURI` * is empty per default); * * - if `_tokenURIs[tokenId]` is NOT set, and if the parents do not have a * uri value set, then the result is empty. */ function uri(uint256 tokenId) public view virtual override(ERC1155Upgradeable, ERC1155URIStorageUpgradeable) returns (string memory) { string memory tokenURI = _tokenURIs[tokenId]; // If token URI is set, concatenate base URI and tokenURI (via abi.encodePacked). return bytes(tokenURI).length > 0 ? string(abi.encodePacked(_baseURI, tokenURI)) : ""; } /** * @dev Set contract uri */ function setContractURI(string memory contractUri) external onlyMaintainer { _contractURI = contractUri; emit TraxxContractURIUpdated(_contractURI); } /** * @dev Read the current contract uri value */ function contractURI() external view returns (string memory) { return _contractURI; } /** * @dev Sets `baseURI` as the `_baseURI` for all tokens * TODO : Unable to set baseUri in URIStorage, need to figure this out */ function setBaseURI(string memory baseUri) external virtual onlyMaintainer { // super._setBaseURI(baseUri); _baseURI = baseUri; } /** * @dev Returns base uri. */ function baseURI() external view returns (string memory) { return _baseURI; } /** * @dev Triggers stopped state, when called by the address that is assigned the pauser role. * * Requirements: * * - The contract must not be paused. */ function pause() external virtual onlyRole(PAUSER_ROLE) { _pause(); } /** * @dev Returns to normal state, when called by the address that is assigned the pauser role. * * Requirements: * * - The contract must be paused. */ function unpause() external virtual onlyRole(PAUSER_ROLE) { _unpause(); } /** * @dev Burn's ERC1155 tokens */ function burnTraxx( address account, uint256 id, uint256 value ) external virtual { require( hasRole(DEFAULT_ADMIN_ROLE, msg.sender) || firstOwner[id] == msg.sender, throwError(EITHER_ADMIN_OR_FIRST_OWNER) ); _burn(account, id, value); emit TokensBurned(account, id, value); } /** * @dev Burn's ERC1155 tokens in batch. */ // TODO in future // function batchBurnTraxx( // address account, // uint256[] memory ids, // uint256[] memory values // ) public virtual onlyAdmin { // require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender) || firstOwner[id] == msg.sender, "only Admin or First Owner can burn the token."); // _burnBatch(account, ids, values); // emit BatchTokensBurned(account, ids, values); // } /** * @dev Return two array's of ( tokenIds owned by the owner and quatities associated to the tokenIds ) */ function tokenIdAndQuantityByOwner(address _owner) public view returns (TokenBalance[] memory) { require(tokensOfOwner(_owner).length > 0, throwError(NO_IDS_FOUND)); uint256[] memory ids = tokensOfOwner(_owner); uint256 position = 0; TokenBalance[] memory tokenDetails = new TokenBalance[](ids.length); for (uint256 i = 0; i < ids.length; i++) { TokenBalance memory token = TokenBalance( ids[i], balanceOf(_owner, ids[i]) ); tokenDetails[position] = token; position += 1; } return tokenDetails; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. */ uint256[48] private __gap; uint256 public maxQuantityToPurchaseLimit; CountersUpgradeable.Counter public _collectionIdTracker; mapping(uint256 => Collection) private _collections; /// @dev Mapping from owner address => collection id => no of tokens purchased in primary sale mapping(address => mapping(uint256 => uint256)) private _primarySaleUserCount; /// @dev Mapping from tokenid => collectionid mapping(uint256 => uint256) private _nftCollectionId; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"quantity","type":"uint256[]"}],"name":"BatchTraxxMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"CollectionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"CollectionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"royaltyBps","type":"uint256"}],"name":"RoyaltyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"TokensBurned","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":true,"internalType":"address","name":"newOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"TransferredCollectionOwnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"contractURI","type":"string"}],"name":"TraxxContractURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"TraxxMinted","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAINTAINER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE_ADMIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_collectionIdTracker","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenIdTracker","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addQuantity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionId","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"addTokensToCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"components":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"}],"internalType":"struct IERC1155Custom.WhitelistParams[]","name":"_whitelistParams","type":"tuple[]"}],"name":"addWhitelistToCollection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"string[]","name":"uris","type":"string[]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256[]","name":"collectionIds","type":"uint256[]"}],"name":"batchMintTraxx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","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":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnTraxx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"thumbnail","type":"string"},{"internalType":"string","name":"bgImage","type":"string"},{"internalType":"string","name":"bgColor","type":"string"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"int256","name":"userPurchaseLimit","type":"int256"},{"internalType":"int256","name":"allowedPurchaseLimit","type":"int256"},{"internalType":"uint256","name":"primarySoldCount","type":"uint256"},{"components":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"}],"internalType":"struct IERC1155Custom.WhitelistParams[]","name":"whitelistParams","type":"tuple[]"}],"internalType":"struct IERC1155Custom.Collection","name":"_collection","type":"tuple"}],"name":"createCollection","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"firstOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getCollectionData","outputs":[{"components":[{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"thumbnail","type":"string"},{"internalType":"string","name":"bgImage","type":"string"},{"internalType":"string","name":"bgColor","type":"string"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"int256","name":"userPurchaseLimit","type":"int256"},{"internalType":"int256","name":"allowedPurchaseLimit","type":"int256"},{"internalType":"uint256","name":"primarySoldCount","type":"uint256"},{"components":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"}],"internalType":"struct IERC1155Custom.WhitelistParams[]","name":"whitelistParams","type":"tuple[]"}],"internalType":"struct IERC1155Custom.Collection","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getFirstOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getNFTCollectionId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"_collectionId","type":"uint256"}],"name":"getPrimarySaleUserCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"},{"internalType":"uint256","name":"_royaltyBps","type":"uint256"},{"internalType":"address","name":"_market","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_maintainer","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"market","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxQuantityToPurchaseLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"uint256","name":"_collectionId","type":"uint256"}],"name":"mintTraxx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"contractUri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_royaltyBps","type":"uint256"}],"name":"setRoyaltyBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"setURI","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":"int32","name":"_errCode","type":"int32"}],"name":"throwError","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokenIdAndQuantityByOwner","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"internalType":"struct TokenTraxxNFT1155.TokenBalance[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"_owner","type":"address"}],"name":"transferCollectionOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"components":[{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"thumbnail","type":"string"},{"internalType":"string","name":"bgImage","type":"string"},{"internalType":"string","name":"bgColor","type":"string"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"int256","name":"userPurchaseLimit","type":"int256"},{"internalType":"int256","name":"allowedPurchaseLimit","type":"int256"},{"internalType":"uint256","name":"primarySoldCount","type":"uint256"},{"components":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"}],"internalType":"struct IERC1155Custom.WhitelistParams[]","name":"whitelistParams","type":"tuple[]"}],"internalType":"struct IERC1155Custom.Collection","name":"_collection","type":"tuple"}],"name":"updateCollection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"_collectionId","type":"uint256"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"updateCollectionAfterPrimarySale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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
608060405234801561001057600080fd5b50615daa80620000216000396000f3fe608060405234801561001057600080fd5b50600436106103985760003560e01c806398bcede9116101e9578063d53913931161010f578063e63ab1e9116100ad578063f3ccd6981161007c578063f3ccd69814610893578063f3d5c2af146108b4578063f5298aca146108c7578063f8742254146108da57600080fd5b8063e63ab1e914610827578063e8a3d4851461083c578063e985e9c514610844578063f242432a1461088057600080fd5b8063ddb94643116100e9578063ddb946431461079d578063ded25153146107d4578063df6f5b20146107e7578063e4e97e3c1461080757600080fd5b8063d539139314610762578063d547741f14610777578063d9fb5bed1461078a57600080fd5b8063aa7c75c811610187578063bdc24b2011610156578063bdc24b2014610727578063c63adb2b14610732578063ca15c8731461073c578063d46f506c1461074f57600080fd5b8063aa7c75c8146106cd578063b83ef2d7146106e0578063ba9fa963146106f3578063bd85b0391461070657600080fd5b8063a217fddf116101c3578063a217fddf14610695578063a22cb4651461069d578063a6e4bafb146106b0578063a7d2b743146106c357600080fd5b806398bcede91461064d5780639afb97de146106585780639c7e5a8f1461066b57600080fd5b806340a58a32116102ce57806380f556051161026c5780638da5cb5b1161023b5780638da5cb5b146106005780639010d07c1461061457806391d1485414610627578063938e3d7b1461063a57600080fd5b806380f55605146105be5780638456cb59146105d25780638462151c146105da578063862440e2146105ed57600080fd5b806355f804b3116102a857806355f804b3146105845780635c975abb146105975780636b20c454146105a35780636c0360eb146105b657600080fd5b806340a58a32146104ff5780634e1273f4146105415780634f558e791461056157600080fd5b806327d6cc421161033b5780632f2ff15d116103155780632f2ff15d146104be57806336568abe146104d1578063389403d8146104e45780633f4ba83a146104f757600080fd5b806327d6cc42146104665780632a55205a146104795780632eb2c2d6146104ab57600080fd5b80630e89341c116103775780630e89341c146103fb57806311d15e7a1461041b5780631f72d83114610430578063248a9ca31461044357600080fd5b8062fdd58e1461039d57806301ffc9a7146103c357806305325160146103e6575b600080fd5b6103b06103ab36600461486f565b6108ef565b6040519081526020015b60405180910390f35b6103d66103d13660046148af565b61098b565b60405190151581526020016103ba565b6103f96103f43660046148cc565b6109b6565b005b61040e6104093660046148ff565b610a66565b6040516103ba9190614970565b6103b0600080516020615d1583398151915281565b6103f961043e3660046148ff565b610b4f565b6103b06104513660046148ff565b60009081526065602052604090206001015490565b6103f9610474366004614b7b565b610bef565b61048c610487366004614c5b565b610e18565b604080516001600160a01b0390931683526020830191909152016103ba565b6103f96104b9366004614c7d565b610e5a565b6103f96104cc366004614d26565b610ef1565b6103f96104df366004614d26565b610f1c565b6103f96104f2366004614d49565b610f9a565b6103f961112d565b61052961050d3660046148ff565b600090815261022a60205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016103ba565b61055461054f366004614da7565b611151565b6040516103ba9190614eac565b6103d661056f3660046148ff565b600090815261012d6020526040902054151590565b6103f9610592366004614ebf565b61127a565b6101915460ff166103d6565b6103f96105b1366004614ef3565b6112cf565b61040e611312565b61022b54610529906001600160a01b031681565b6103f96113a5565b6105546105e8366004614f66565b6113c6565b6103f96105fb366004614f81565b611433565b61023054610529906001600160a01b031681565b610529610622366004614c5b565b6114d9565b6103d6610635366004614d26565b6114f1565b6103f9610648366004614ebf565b61151c565b610228546103b09081565b6103d66106663660046148cc565b6115a3565b6105296106793660046148ff565b61022a602052600090815260409020546001600160a01b031681565b6103b0600081565b6103f96106ab366004614fbd565b611648565b6103d66106be36600461500c565b611653565b6103b06102615481565b6103f96106db366004615048565b611a87565b6103f96106ee36600461507d565b611c5a565b6103f96107013660046150fb565b611dbb565b6103b06107143660046148ff565b600090815261012d602052604090205490565b610262546103b09081565b6103b061022f5481565b6103b061074a3660046148ff565b612048565b6103d661075d366004614d26565b61205f565b6103b0600080516020615d3583398151915281565b6103f9610785366004614d26565b612199565b6103b0610798366004615173565b6121bf565b6103b06107ab36600461486f565b6001600160a01b0391909116600090815261026460209081526040808320938352929052205490565b61040e6107e23660046151a7565b612622565b6107fa6107f53660046148ff565b612633565b6040516103ba9190615210565b61081a610815366004614f66565b612ad7565b6040516103ba9190615345565b6103b0600080516020615cf583398151915281565b61040e612c1b565b6103d6610852366004615394565b6001600160a01b03918216600090815260986020908152604080832093909416825291909152205460ff1690565b6103f961088e3660046153be565b612c2b565b6103b06108a13660046148ff565b6000908152610265602052604090205490565b6103d66108c2366004615422565b612c70565b6103f96108d53660046148cc565b612d40565b6103b0600080516020615d5583398151915281565b60006001600160a01b0383166109605760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b5060008181526097602090815260408083206001600160a01b03861684529091529020545b92915050565b600061099682612d83565b8061098557506001600160e01b0319821663152a902d60e11b1492915050565b6109c16000336114f1565b806109e35750600082815261022a60205260409020546001600160a01b031633145b6109ed601f612622565b90610a0b5760405162461bcd60e51b81526004016109579190614970565b50610a17838383612da8565b604080516001600160a01b0385168152602081018490529081018290527fccbea4088a3b7ae9ca2d15fab9a9742a4075b4d7247768a1eecea917565aba009060600160405180910390a1505050565b600081815261022d6020526040812080546060929190610a85906154f7565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab1906154f7565b8015610afe5780601f10610ad357610100808354040283529160200191610afe565b820191906000526020600020905b815481529060010190602001808311610ae157829003601f168201915b505050505090506000815111610b235760405180602001604052806000815250610b48565b61022e81604051602001610b3892919061552c565b6040516020818303038152906040525b9392505050565b610b5a6000336114f1565b610b646000612622565b90610b825760405162461bcd60e51b81526004016109579190614970565b50612710811115610b936005612622565b90610bb15760405162461bcd60e51b81526004016109579190614970565b5061022f8190556040518181527f244ea8d7627f5a08f4299862bd5a45752842c183aee5b0fb0d1e4887bfa605b3906020015b60405180910390a150565b610c07600080516020615d35833981519152336114f1565b610c116001612622565b90610c2f5760405162461bcd60e51b81526004016109579190614970565b508451815114610c3f6039612622565b90610c5d5760405162461bcd60e51b81526004016109579190614970565b50610c6a86868685612ead565b825160005b81811015610d9d57848181518110610c8957610c896155af565b602002602001015161022d6000898481518110610ca857610ca86155af565b602002602001015181526020019081526020016000209080519060200190610cd192919061470c565b50610ce161022880546001019055565b828181518110610cf357610cf36155af565b60200260200101516102656000898481518110610d1257610d126155af565b60200260200101518152602001908152602001600020819055506102636000848381518110610d4357610d436155af565b60200260200101518152602001908152602001600020600501878281518110610d6e57610d6e6155af565b60209081029190910181015182546001810184556000938452919092200155610d96816155db565b9050610c6f565b50336001600160a01b03881614610dba57610dba87336001613008565b61022b54610dd49088906001600160a01b03166001613008565b7fe40aa106f1fdba1313cdeb0ea7585b400d2be7b73e4674bc47a82df1767a5219878787604051610e07939291906155f6565b60405180910390a150505050505050565b600082815261022a602052604081205461022f546001600160a01b03909116919061271090610e47908561562c565b610e519190615661565b90509250929050565b6001600160a01b038516331480610e765750610e768533610852565b610edd5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610957565b610eea85858585856130e9565b5050505050565b600082815260656020526040902060010154610f0d813361328e565b610f1783836132f2565b505050565b6001600160a01b0381163314610f8c5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610957565b610f968282613314565b5050565b610fb2600080516020615d35833981519152336114f1565b610fbc6001612622565b90610fda5760405162461bcd60e51b81526004016109579190614970565b506001610fe76034612622565b906110055760405162461bcd60e51b81526004016109579190614970565b5060006110126102285490565b905061102f85828660405180602001604052806000815250613336565b600081815261022d60209081526040909120845161104f9286019061470c565b50600081815261022a6020908152604080832080546001600160a01b0319166001600160a01b038a16908117909155610265835281842086905585845261026383528184206005018054600181018255908552929093209091018390555133907f6fdefa1cffd10a72dc6bcde65472c7a120fb3bfedf2ca686ca4a660a13788de6906110e090859088908a90615675565b60405180910390a3336001600160a01b038616146111045761110485336001613008565b61022b5461111e9086906001600160a01b03166001613008565b610eea61022880546001019055565b600080516020615cf5833981519152611146813361328e565b61114e61340e565b50565b606081518351146111b65760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610957565b600083516001600160401b038111156111d1576111d1614983565b6040519080825280602002602001820160405280156111fa578160200160208202803683370190505b50905060005b84518110156112725761124585828151811061121e5761121e6155af565b6020026020010151858381518110611238576112386155af565b60200260200101516108ef565b828281518110611257576112576155af565b602090810291909101015261126b816155db565b9050611200565b509392505050565b611292600080516020615d55833981519152336114f1565b61129c602f612622565b906112ba5760405162461bcd60e51b81526004016109579190614970565b508051610f969061022e90602084019061470c565b6001600160a01b0383163314806112eb57506112eb8333610852565b6113075760405162461bcd60e51b81526004016109579061569e565b610f178383836134a3565b606061022e8054611322906154f7565b80601f016020809104026020016040519081016040528092919081815260200182805461134e906154f7565b801561139b5780601f106113705761010080835404028352916020019161139b565b820191906000526020600020905b81548152906001019060200180831161137e57829003601f168201915b5050505050905090565b600080516020615cf58339815191526113be813361328e565b61114e613634565b6001600160a01b03811660009081526101f5602090815260409182902080548351818402810184019094528084526060939283018282801561142757602002820191906000526020600020905b815481526020019060010190808311611413575b50505050509050919050565b61144b600080516020615d55833981519152336114f1565b611455602f612622565b906114735760405162461bcd60e51b81526004016109579190614970565b50600082815261022d6020908152604090912082516114949284019061470c565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b6114c084610a66565b6040516114cd9190614970565b60405180910390a25050565b600082815260c960205260408120610b4890836136b1565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b611534600080516020615d55833981519152336114f1565b61153e602f612622565b9061155c5760405162461bcd60e51b81526004016109579190614970565b5080516115719061022c90602084019061470c565b507fa92622edb95b29422aac14da4f6e70d32d35451fbdf30b467c0ddf78d5c70e5761022c604051610be491906156e7565b61022b546000906001600160a01b031633146115bf6038612622565b906115dd5760405162461bcd60e51b81526004016109579190614970565b50600083815261026360205260408120600b01805484929061160090849061576c565b90915550506001600160a01b0384166000908152610264602090815260408083208684529091528120805484929061163990849061576c565b90915550600195945050505050565b610f96338383613008565b6000600080516020615d3583398151915261166e813361328e565b600161167a6034612622565b906116985760405162461bcd60e51b81526004016109579190614970565b50600084815261026360205260409020600601546001600160a01b031633146116c16035612622565b906116df5760405162461bcd60e51b81526004016109579190614970565b5060006116ec8480615784565b9050116116f96033612622565b906117175760405162461bcd60e51b81526004016109579190614970565b5060006117276020850185615784565b9050116117346033612622565b906117525760405162461bcd60e51b81526004016109579190614970565b5060006117626040850185615784565b90501161176f6033612622565b9061178d5760405162461bcd60e51b81526004016109579190614970565b50600061179d6060850185615784565b9050116117aa6033612622565b906117c85760405162461bcd60e51b81526004016109579190614970565b5060006117d86080850185615784565b9050116117e56033612622565b906118035760405162461bcd60e51b81526004016109579190614970565b50600061181360a08501856157d1565b9050116118206033612622565b9061183e5760405162461bcd60e51b81526004016109579190614970565b50600083610140013513806118595750826101400135600019145b6118636033612622565b906118815760405162461bcd60e51b81526004016109579190614970565b5061188c8380615784565b6000868152610263602052604090206118a6929091614790565b506118b46020840184615784565b6000868152610263602052604090206118d292600190910191614790565b506118e06040840184615784565b6000868152610263602052604090206118fe92600290910191614790565b5061190c6060840184615784565b60008681526102636020526040902061192a92600390910191614790565b506119386080840184615784565b60008681526102636020526040902061195692600490910191614790565b5061196460a08401846157d1565b60008681526102636020526040902061198292600590910191614804565b506000848152610263602052604081206101208501356009820155610140850135600a820155426008909101555b6119be61018085018561581a565b9050811015611a5157600085815261026360205260409020600c016119e761018086018661581a565b838181106119f7576119f76155af565b835460018101855560009485526020909420606090910292909201926003029091019050611a3c82828135815560208201356001820155604082013560028201555050565b50508080611a49906155db565b9150506119b0565b5060405184907f0c0a12217294d82ef047e3eaa23502d376a77d0df8d33543cd321e17668192f790600090a25060019392505050565b611a926000336114f1565b80611ab45750600083815261022a60205260409020546001600160a01b031633145b611abe601f612622565b90611adc5760405162461bcd60e51b81526004016109579190614970565b50600083815261022d602052604081208054611af7906154f7565b80601f0160208091040260200160405190810160405280929190818152602001828054611b23906154f7565b8015611b705780601f10611b4557610100808354040283529160200191611b70565b820191906000526020600020905b815481529060010190602001808311611b5357829003601f168201915b505050505090506000815111611b866008612622565b90611ba45760405162461bcd60e51b81526004016109579190614970565b50611bc083858460405180602001604052806000815250613336565b826001600160a01b0316336001600160a01b03167f6fdefa1cffd10a72dc6bcde65472c7a120fb3bfedf2ca686ca4a660a13788de6868486604051611c0793929190615675565b60405180910390a3336001600160a01b03841614611c2b57611c2b83336001613008565b61022b54611c459084906001600160a01b03166001613008565b611c5461022880546001019055565b50505050565b600080516020615d35833981519152611c73813361328e565b6001611c7f6034612622565b90611c9d5760405162461bcd60e51b81526004016109579190614970565b50600084815261026360205260409020600601546001600160a01b03163314611cc66035612622565b90611ce45760405162461bcd60e51b81526004016109579190614970565b50811515611cf26037612622565b90611d105760405162461bcd60e51b81526004016109579190614970565b50600084815261026360205260409020611d2e906005018484614804565b5060008481526102636020526040808220426008909101555185917f0c0a12217294d82ef047e3eaa23502d376a77d0df8d33543cd321e17668192f791a260005b82811015610eea57846102656000868685818110611d8f57611d8f6155af565b905060200201358152602001908152602001600020819055508080611db3906155db565b915050611d6f565b600054610100900460ff16611dd65760005460ff1615611dda565b303b155b611e3d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610957565b600054610100900460ff16158015611e5f576000805461ffff19166101011790555b6001600160a01b0384161515611e756026612622565b90611e935760405162461bcd60e51b81526004016109579190614970565b50611e9d866136bd565b611ea56136ed565b611ead6136ed565b611eb5613716565b611ebd6136ed565b611ec5613745565b611ecd6136ed565b8551611ee19061022c90602089019061470c565b50604080516020810191829052600090819052611f019161022e9161470c565b5061023080546001600160a01b038086166001600160a01b03199283161790925561022b805492871692909116919091179055611f3f600084613774565b611f4885610b4f565b611f60600080516020615d5583398151915284613774565b611f78600080516020615d5583398151915283613774565b611f90600080516020615d1583398151915284613774565b611fa8600080516020615d1583398151915283613774565b611fc0600080516020615d158339815191528061377e565b611fd8600080516020615d3583398151915284613774565b611ff0600080516020615d3583398151915283613774565b612016600080516020615d35833981519152600080516020615d1583398151915261377e565b61202e600080516020615cf583398151915284613774565b8015612040576000805461ff00191690555b505050505050565b600081815260c960205260408120610985906137c9565b6000600080516020615d3583398151915261207a813361328e565b60016120866034612622565b906120a45760405162461bcd60e51b81526004016109579190614970565b50600084815261026360205260409020600601546001600160a01b031633146120cd6035612622565b906120eb5760405162461bcd60e51b81526004016109579190614970565b506001600160a01b0383163314156121036010612622565b906121215760405162461bcd60e51b81526004016109579190614970565b50600084815261026360209081526040918290206006810180546001600160a01b0319166001600160a01b0388169081179091554260089092019190915591518681527f9a02c0776a798089d5d1632873810b35836961155d75791f4ef7b3779b1a4f17910160405180910390a25060019392505050565b6000828152606560205260409020600101546121b5813361328e565b610f178383613314565b6000600080516020615d358339815191526121da813361328e565b60006121e68480615784565b9050116121f36033612622565b906122115760405162461bcd60e51b81526004016109579190614970565b5060006122216020850185615784565b90501161222e6033612622565b9061224c5760405162461bcd60e51b81526004016109579190614970565b50600061225c6040850185615784565b9050116122696033612622565b906122875760405162461bcd60e51b81526004016109579190614970565b5060006122976060850185615784565b9050116122a46033612622565b906122c25760405162461bcd60e51b81526004016109579190614970565b5060006122d26080850185615784565b9050116122df6033612622565b906122fd5760405162461bcd60e51b81526004016109579190614970565b50600061231060e0850160c08601614f66565b6001600160a01b031614156123256004612622565b906123435760405162461bcd60e51b81526004016109579190614970565b506000836101200135138061235e5750826101200135600019145b6123686033612622565b906123865760405162461bcd60e51b81526004016109579190614970565b50600083610140013513806123a15750826101400135600019145b6123ab6033612622565b906123c95760405162461bcd60e51b81526004016109579190614970565b506102625491506123da8380615784565b6000848152610263602052604090206123f4929091614790565b506124026020840184615784565b60008481526102636020526040902061242092600190910191614790565b5061242e6040840184615784565b60008481526102636020526040902061244c92600290910191614790565b5061245a6060840184615784565b60008481526102636020526040902061247892600390910191614790565b506124866080840184615784565b6000848152610263602052604090206124a492600490910191614790565b506124b260a08401846157d1565b6000848152610263602052604090206124d092600590910191614804565b506124e160e0840160c08501614f66565b6000838152610263602052604081206006810180546001600160a01b0319166001600160a01b039490941693909317909255426007830155600882018190556101208501356009830155610140850135600a830155600b9091018190555b61254d61018085018561581a565b90508110156125e057600083815261026360205260409020600c0161257661018086018661581a565b83818110612586576125866155af565b8354600181018555600094855260209094206060909102929092019260030290910190506125cb82828135815560208201356001820155604082013560028201555050565b505080806125d8906155db565b91505061253f565b506125f061026280546001019055565b60405182907f5baee347cce9899b119eb4f42984958a6e25dc5b505f4f1ab8f3837120cf241f90600090a25b50919050565b60606109858263ffffffff166137d3565b6126a7604051806101a0016040528060608152602001606081526020016060815260200160608152602001606081526020016060815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001606081525090565b600082815261026360205260409081902081516101a081019092528054829082906126d1906154f7565b80601f01602080910402602001604051908101604052809291908181526020018280546126fd906154f7565b801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b50505050508152602001600182018054612763906154f7565b80601f016020809104026020016040519081016040528092919081815260200182805461278f906154f7565b80156127dc5780601f106127b1576101008083540402835291602001916127dc565b820191906000526020600020905b8154815290600101906020018083116127bf57829003601f168201915b505050505081526020016002820180546127f5906154f7565b80601f0160208091040260200160405190810160405280929190818152602001828054612821906154f7565b801561286e5780601f106128435761010080835404028352916020019161286e565b820191906000526020600020905b81548152906001019060200180831161285157829003601f168201915b50505050508152602001600382018054612887906154f7565b80601f01602080910402602001604051908101604052809291908181526020018280546128b3906154f7565b80156129005780601f106128d557610100808354040283529160200191612900565b820191906000526020600020905b8154815290600101906020018083116128e357829003601f168201915b50505050508152602001600482018054612919906154f7565b80601f0160208091040260200160405190810160405280929190818152602001828054612945906154f7565b80156129925780601f1061296757610100808354040283529160200191612992565b820191906000526020600020905b81548152906001019060200180831161297557829003601f168201915b50505050508152602001600582018054806020026020016040519081016040528092919081815260200182805480156129ea57602002820191906000526020600020905b8154815260200190600101908083116129d6575b505050505081526020016006820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201805480602002602001604051908101604052809291908181526020016000905b82821015612ac95783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190612a79565b505050915250909392505050565b60606000612ae4836113c6565b5111612af06023612622565b90612b0e5760405162461bcd60e51b81526004016109579190614970565b506000612b1a836113c6565b905060008082516001600160401b03811115612b3857612b38614983565b604051908082528060200260200182016040528015612b7d57816020015b6040805180820190915260008082526020820152815260200190600190039081612b565790505b50905060005b8351811015612c125760006040518060400160405280868481518110612bab57612bab6155af565b60200260200101518152602001612bce89888681518110611238576112386155af565b815250905080838581518110612be657612be66155af565b6020908102919091010152612bfc60018561576c565b9350508080612c0a906155db565b915050612b83565b50949350505050565b606061022c8054611322906154f7565b6001600160a01b038516331480612c475750612c478533610852565b612c635760405162461bcd60e51b81526004016109579061569e565b610eea85858585856138d8565b6000600080516020615d35833981519152612c8b813361328e565b6000835111612c9a6036612622565b90612cb85760405162461bcd60e51b81526004016109579190614970565b5060005b8351811015611a51576102636000868152602001908152602001600020600c01848281518110612cee57612cee6155af565b6020908102919091018101518254600181810185556000948552938390208251600390920201908155918101519282019290925560409091015160029091015580612d38816155db565b915050612cbc565b6001600160a01b038316331480612d5c5750612d5c8333610852565b612d785760405162461bcd60e51b81526004016109579061569e565b610f17838383612da8565b60006001600160e01b03198216635a05180f60e01b14806109855750610985826139f9565b6001600160a01b038316612dce5760405162461bcd60e51b815260040161095790615862565b33612dfd81856000612ddf87613a39565b612de887613a39565b60405180602001604052806000815250613a84565b60008381526097602090815260408083206001600160a01b038816845290915290205482811015612e405760405162461bcd60e51b8152600401610957906158a5565b60008481526097602090815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b6001600160a01b038416612ed35760405162461bcd60e51b8152600401610957906158e9565b8151835114612ef45760405162461bcd60e51b81526004016109579061592a565b33612f0481600087878787613a84565b60005b8451811015612fa057838181518110612f2257612f226155af565b602002602001015160976000878481518110612f4057612f406155af565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254612f88919061576c565b90915550819050612f98816155db565b915050612f07565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612ff1929190615972565b60405180910390a4610eea81600087878787613c6c565b816001600160a01b0316836001600160a01b0316141561307c5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610957565b6001600160a01b03838116600081815260986020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b815183511461310a5760405162461bcd60e51b81526004016109579061592a565b6001600160a01b0384166131305760405162461bcd60e51b8152600401610957906159a0565b3361313f818787878787613a84565b60005b845181101561322857600085828151811061315f5761315f6155af565b60200260200101519050600085838151811061317d5761317d6155af565b60209081029190910181015160008481526097835260408082206001600160a01b038e1683529093529190912054909150818110156131ce5760405162461bcd60e51b8152600401610957906159e5565b60008381526097602090815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061320d90849061576c565b9250508190555050505080613221906155db565b9050613142565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051613278929190615972565b60405180910390a4612040818787878787613c6c565b61329882826114f1565b610f96576132b0816001600160a01b03166014613dd7565b6132bb836020613dd7565b6040516020016132cc929190615a2f565b60408051601f198184030181529082905262461bcd60e51b825261095791600401614970565b6132fc8282613f72565b600082815260c960205260409020610f179082613ff8565b61331e828261400d565b600082815260c960205260409020610f179082614074565b6001600160a01b03841661335c5760405162461bcd60e51b8152600401610957906158e9565b3361337c8160008761336d88613a39565b61337688613a39565b87613a84565b60008481526097602090815260408083206001600160a01b0389168452909152812080548592906133ae90849061576c565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610eea81600087878787614089565b6101915460ff166134585760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610957565b610191805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0383166134c95760405162461bcd60e51b815260040161095790615862565b80518251146134ea5760405162461bcd60e51b81526004016109579061592a565b600033905061350d81856000868660405180602001604052806000815250613a84565b60005b83518110156135d557600084828151811061352d5761352d6155af565b60200260200101519050600084838151811061354b5761354b6155af565b60209081029190910181015160008481526097835260408082206001600160a01b038c16835290935291909120549091508181101561359c5760405162461bcd60e51b8152600401610957906158a5565b60009283526097602090815260408085206001600160a01b038b16865290915290922091039055806135cd816155db565b915050613510565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051613626929190615972565b60405180910390a450505050565b6101915460ff161561367b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610957565b610191805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586134863390565b6000610b488383614153565b600054610100900460ff166136e45760405162461bcd60e51b815260040161095790615aa4565b61114e8161417d565b600054610100900460ff166137145760405162461bcd60e51b815260040161095790615aa4565b565b600054610100900460ff1661373d5760405162461bcd60e51b815260040161095790615aa4565b6137146141ad565b600054610100900460ff1661376c5760405162461bcd60e51b815260040161095790615aa4565b6137146141f2565b610f9682826132f2565b600082815260656020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6000610985825490565b6060816137f75750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613821578061380b816155db565b915061381a9050600a83615661565b91506137fb565b6000816001600160401b0381111561383b5761383b614983565b6040519080825280601f01601f191660200182016040528015613865576020820181803683370190505b5090505b84156138d05761387a600183615aef565b9150613887600a86615b06565b61389290603061576c565b60f81b8183815181106138a7576138a76155af565b60200101906001600160f81b031916908160001a9053506138c9600a86615661565b9450613869565b949350505050565b6001600160a01b0384166138fe5760405162461bcd60e51b8152600401610957906159a0565b3361390e81878761336d88613a39565b60008481526097602090815260408083206001600160a01b038a168452909152902054838110156139515760405162461bcd60e51b8152600401610957906159e5565b60008581526097602090815260408083206001600160a01b038b811685529252808320878503905590881682528120805486929061399090849061576c565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46139f0828888888888614089565b50505050505050565b60006001600160e01b03198216636cdb3d1360e11b1480613a2a57506001600160e01b031982166303a24d0760e21b145b80610985575061098582614226565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110613a7357613a736155af565b602090810291909101015292915050565b60005b8351811015613b91576000848281518110613aa457613aa46155af565b602002602001015190506000848381518110613ac257613ac26155af565b6020026020010151905060006001600160a01b0316876001600160a01b03161415613b225780613af289846108ef565b1015613afe6020612622565b90613b1c5760405162461bcd60e51b81526004016109579190614970565b50613b7e565b6001600160a01b03881615801590613b4257506001600160a01b03871615155b15613b7e5780613b5289846108ef565b1015613b5e6021612622565b90613b7c5760405162461bcd60e51b81526004016109579190614970565b505b505080613b8a906155db565b9050613a87565b50613ba086868686868661425b565b60005b83518110156139f0576000848281518110613bc057613bc06155af565b602002602001015190506000848381518110613bde57613bde6155af565b6020026020010151905060006001600160a01b0316886001600160a01b03161415613c1257613c0d87836142d2565b613c59565b6001600160a01b038716613c2b57613c0d88838361430e565b866001600160a01b0316886001600160a01b031614613c5957613c4e87836142d2565b613c5988838361430e565b505080613c65906155db565b9050613ba3565b6001600160a01b0384163b156120405760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190613cb09089908990889088908890600401615b1a565b602060405180830381600087803b158015613cca57600080fd5b505af1925050508015613cfa575060408051601f3d908101601f19168201909252613cf791810190615b78565b60015b613da757613d06615b95565b806308c379a01415613d405750613d1b615bb1565b80613d265750613d42565b8060405162461bcd60e51b81526004016109579190614970565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610957565b6001600160e01b0319811663bc197c8160e01b146139f05760405162461bcd60e51b815260040161095790615c3a565b60606000613de683600261562c565b613df190600261576c565b6001600160401b03811115613e0857613e08614983565b6040519080825280601f01601f191660200182016040528015613e32576020820181803683370190505b509050600360fc1b81600081518110613e4d57613e4d6155af565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613e7c57613e7c6155af565b60200101906001600160f81b031916908160001a9053506000613ea084600261562c565b613eab90600161576c565b90505b6001811115613f23576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110613edf57613edf6155af565b1a60f81b828281518110613ef557613ef56155af565b60200101906001600160f81b031916908160001a90535060049490941c93613f1c81615c82565b9050613eae565b508315610b485760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610957565b613f7c82826114f1565b610f965760008281526065602090815260408083206001600160a01b03851684529091529020805460ff19166001179055613fb43390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610b48836001600160a01b0384166143fa565b61401782826114f1565b15610f965760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610b48836001600160a01b038416614449565b6001600160a01b0384163b156120405760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906140cd9089908990889088908890600401615c99565b602060405180830381600087803b1580156140e757600080fd5b505af1925050508015614117575060408051601f3d908101601f1916820190925261411491810190615b78565b60015b61412357613d06615b95565b6001600160e01b0319811663f23a6e6160e01b146139f05760405162461bcd60e51b815260040161095790615c3a565b600082600001828154811061416a5761416a6155af565b9060005260206000200154905092915050565b600054610100900460ff166141a45760405162461bcd60e51b815260040161095790615aa4565b61114e8161453c565b600054610100900460ff166141d45760405162461bcd60e51b815260040161095790615aa4565b60408051602081019182905260009081905261114e9160fb9161470c565b600054610100900460ff166142195760405162461bcd60e51b815260040161095790615aa4565b610191805460ff19169055565b60006001600160e01b03198216637965db0b60e01b148061098557506301ffc9a760e01b6001600160e01b0319831614610985565b61426986868686868661454f565b6101915460ff16156120405760405162461bcd60e51b815260206004820152602c60248201527f455243313135355061757361626c653a20746f6b656e207472616e736665722060448201526b1dda1a5b19481c185d5cd95960a21b6064820152608401610957565b6142dc82826108ef565b610f96576001600160a01b039190911660009081526101f5602090815260408220805460018101825590835291200155565b8061431984846108ef565b1415610f1757600061432b848461465d565b6001600160a01b03851660009081526101f56020526040902080549192509061435690600190615aef565b81548110614366576143666155af565b90600052602060002001546101f56000866001600160a01b03166001600160a01b0316815260200190815260200160002082815481106143a8576143a86155af565b60009182526020808320909101929092556001600160a01b03861681526101f5909152604090208054806143de576143de615cde565b6001900381819060005260206000200160009055905550505050565b600081815260018301602052604081205461444157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610985565b506000610985565b6000818152600183016020526040812054801561453257600061446d600183615aef565b855490915060009061448190600190615aef565b90508181146144e65760008660000182815481106144a1576144a16155af565b90600052602060002001549050808760000184815481106144c4576144c46155af565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806144f7576144f7615cde565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610985565b6000915050610985565b8051610f9690609990602084019061470c565b6001600160a01b0385166145d75760005b83518110156145d55782818151811061457b5761457b6155af565b602002602001015161012d600086848151811061459a5761459a6155af565b6020026020010151815260200190815260200160002060008282546145bf919061576c565b909155506145ce9050816155db565b9050614560565b505b6001600160a01b0384166120405760005b83518110156139f057828181518110614603576146036155af565b602002602001015161012d6000868481518110614622576146226155af565b6020026020010151815260200190815260200160002060008282546146479190615aef565b909155506146569050816155db565b90506145e8565b6001600160a01b03821660009081526101f56020526040812054815b818310156146da576001600160a01b03851660009081526101f5602052604090208054859190859081106146af576146af6155af565b906000526020600020015414156146c857506109859050565b826146d2816155db565b935050614679565b806146e56022612622565b906147035760405162461bcd60e51b81526004016109579190614970565b50505092915050565b828054614718906154f7565b90600052602060002090601f01602090048101928261473a5760008555614780565b82601f1061475357805160ff1916838001178555614780565b82800160010185558215614780579182015b82811115614780578251825591602001919060010190614765565b5061478c92915061483e565b5090565b82805461479c906154f7565b90600052602060002090601f0160209004810192826147be5760008555614780565b82601f106147d75782800160ff19823516178555614780565b82800160010185558215614780579182015b828111156147805782358255916020019190600101906147e9565b82805482825590600052602060002090810192821561478057916020028201828111156147805782358255916020019190600101906147e9565b5b8082111561478c576000815560010161483f565b80356001600160a01b038116811461486a57600080fd5b919050565b6000806040838503121561488257600080fd5b61488b83614853565b946020939093013593505050565b6001600160e01b03198116811461114e57600080fd5b6000602082840312156148c157600080fd5b8135610b4881614899565b6000806000606084860312156148e157600080fd5b6148ea84614853565b95602085013595506040909401359392505050565b60006020828403121561491157600080fd5b5035919050565b60005b8381101561493357818101518382015260200161491b565b83811115611c545750506000910152565b6000815180845261495c816020860160208601614918565b601f01601f19169290920160200192915050565b602081526000610b486020830184614944565b634e487b7160e01b600052604160045260246000fd5b606081018181106001600160401b03821117156149b8576149b8614983565b60405250565b601f8201601f191681016001600160401b03811182821017156149e3576149e3614983565b6040525050565b60006001600160401b03821115614a0357614a03614983565b5060051b60200190565b600082601f830112614a1e57600080fd5b81356020614a2b826149ea565b604051614a3882826149be565b83815260059390931b8501820192828101915086841115614a5857600080fd5b8286015b84811015614a735780358352918301918301614a5c565b509695505050505050565b600082601f830112614a8f57600080fd5b81356001600160401b03811115614aa857614aa8614983565b604051614abf601f8301601f1916602001826149be565b818152846020838601011115614ad457600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f830112614b0257600080fd5b81356020614b0f826149ea565b604051614b1c82826149be565b83815260059390931b8501820192828101915086841115614b3c57600080fd5b8286015b84811015614a735780356001600160401b03811115614b5f5760008081fd5b614b6d8986838b0101614a7e565b845250918301918301614b40565b60008060008060008060c08789031215614b9457600080fd5b614b9d87614853565b955060208701356001600160401b0380821115614bb957600080fd5b614bc58a838b01614a0d565b96506040890135915080821115614bdb57600080fd5b614be78a838b01614a0d565b95506060890135915080821115614bfd57600080fd5b614c098a838b01614af1565b94506080890135915080821115614c1f57600080fd5b614c2b8a838b01614a7e565b935060a0890135915080821115614c4157600080fd5b50614c4e89828a01614a0d565b9150509295509295509295565b60008060408385031215614c6e57600080fd5b50508035926020909101359150565b600080600080600060a08688031215614c9557600080fd5b614c9e86614853565b9450614cac60208701614853565b935060408601356001600160401b0380821115614cc857600080fd5b614cd489838a01614a0d565b94506060880135915080821115614cea57600080fd5b614cf689838a01614a0d565b93506080880135915080821115614d0c57600080fd5b50614d1988828901614a7e565b9150509295509295909350565b60008060408385031215614d3957600080fd5b82359150610e5160208401614853565b60008060008060808587031215614d5f57600080fd5b614d6885614853565b93506020850135925060408501356001600160401b03811115614d8a57600080fd5b614d9687828801614a7e565b949793965093946060013593505050565b60008060408385031215614dba57600080fd5b82356001600160401b0380821115614dd157600080fd5b818501915085601f830112614de557600080fd5b81356020614df2826149ea565b604051614dff82826149be565b83815260059390931b8501820192828101915089841115614e1f57600080fd5b948201945b83861015614e4457614e3586614853565b82529482019490820190614e24565b96505086013592505080821115614e5a57600080fd5b50614e6785828601614a0d565b9150509250929050565b600081518084526020808501945080840160005b83811015614ea157815187529582019590820190600101614e85565b509495945050505050565b602081526000610b486020830184614e71565b600060208284031215614ed157600080fd5b81356001600160401b03811115614ee757600080fd5b6138d084828501614a7e565b600080600060608486031215614f0857600080fd5b614f1184614853565b925060208401356001600160401b0380821115614f2d57600080fd5b614f3987838801614a0d565b93506040860135915080821115614f4f57600080fd5b50614f5c86828701614a0d565b9150509250925092565b600060208284031215614f7857600080fd5b610b4882614853565b60008060408385031215614f9457600080fd5b8235915060208301356001600160401b03811115614fb157600080fd5b614e6785828601614a7e565b60008060408385031215614fd057600080fd5b614fd983614853565b915060208301358015158114614fee57600080fd5b809150509250929050565b60006101a0828403121561261c57600080fd5b6000806040838503121561501f57600080fd5b8235915060208301356001600160401b0381111561503c57600080fd5b614e6785828601614ff9565b60008060006060848603121561505d57600080fd5b8335925061506d60208501614853565b9150604084013590509250925092565b60008060006040848603121561509257600080fd5b8335925060208401356001600160401b03808211156150b057600080fd5b818601915086601f8301126150c457600080fd5b8135818111156150d357600080fd5b8760208260051b85010111156150e857600080fd5b6020830194508093505050509250925092565b600080600080600060a0868803121561511357600080fd5b85356001600160401b0381111561512957600080fd5b61513588828901614a7e565b9550506020860135935061514b60408701614853565b925061515960608701614853565b915061516760808701614853565b90509295509295909350565b60006020828403121561518557600080fd5b81356001600160401b0381111561519b57600080fd5b6138d084828501614ff9565b6000602082840312156151b957600080fd5b81358060030b8114610b4857600080fd5b600081518084526020808501945080840160005b83811015614ea157815180518852838101518489015260409081015190880152606090960195908201906001016151de565b60208152600082516101a080602085015261522f6101c0850183614944565b91506020850151601f198086850301604087015261524d8483614944565b9350604087015191508086850301606087015261526a8483614944565b935060608701519150808685030160808701526152878483614944565b935060808701519150808685030160a08701526152a48483614944565b935060a08701519150808685030160c08701526152c18483614e71565b935060c087015191506152df60e08701836001600160a01b03169052565b60e0870151610100878101919091528701516101208088019190915287015161014080880191909152870151610160808801919091528701516101808088019190915287015186850390910183870152905061533b83826151ca565b9695505050505050565b602080825282518282018190526000919060409081850190868401855b8281101561538757815180518552860151868501529284019290850190600101615362565b5091979650505050505050565b600080604083850312156153a757600080fd5b6153b083614853565b9150610e5160208401614853565b600080600080600060a086880312156153d657600080fd5b6153df86614853565b94506153ed60208701614853565b9350604086013592506060860135915060808601356001600160401b0381111561541657600080fd5b614d1988828901614a7e565b600080604080848603121561543657600080fd5b833592506020808501356001600160401b0381111561545457600080fd5b8501601f8101871361546557600080fd5b8035615470816149ea565b845161547c82826149be565b8281526060928302840185019285820192508a84111561549b57600080fd5b938501935b838510156154e65780858c0312156154b85760008081fd5b86516154c381614999565b8535815286860135878201528786013588820152835293840193918501916154a0565b508096505050505050509250929050565b600181811c9082168061550b57607f821691505b6020821081141561261c57634e487b7160e01b600052602260045260246000fd5b600080845461553a816154f7565b60018281168015615552576001811461556357615592565b60ff19841687528287019450615592565b8860005260208060002060005b858110156155895781548a820152908401908201615570565b50505082870194505b5050505083516155a6818360208801614918565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156155ef576155ef6155c5565b5060010190565b6001600160a01b038416815260606020820181905260009061561a90830185614e71565b828103604084015261533b8185614e71565b6000816000190483118215151615615646576156466155c5565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826156705761567061564b565b500490565b83815260606020820152600061568e6060830185614944565b9050826040830152949350505050565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60006020808352600084546156fb816154f7565b8084870152604060018084166000811461571c57600181146157305761575e565b60ff1985168984015260608901955061575e565b896000528660002060005b858110156157565781548b820186015290830190880161573b565b8a0184019650505b509398975050505050505050565b6000821982111561577f5761577f6155c5565b500190565b6000808335601e1984360301811261579b57600080fd5b8301803591506001600160401b038211156157b557600080fd5b6020019150368190038213156157ca57600080fd5b9250929050565b6000808335601e198436030181126157e857600080fd5b8301803591506001600160401b0382111561580257600080fd5b6020019150600581901b36038213156157ca57600080fd5b6000808335601e1984360301811261583157600080fd5b8301803591506001600160401b0382111561584b57600080fd5b60200191506060810236038213156157ca57600080fd5b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6040815260006159856040830185614e71565b82810360208401526159978185614e71565b95945050505050565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351615a67816017850160208801614918565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351615a98816028840160208801614918565b01602801949350505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082821015615b0157615b016155c5565b500390565b600082615b1557615b1561564b565b500690565b6001600160a01b0386811682528516602082015260a060408201819052600090615b4690830186614e71565b8281036060840152615b588186614e71565b90508281036080840152615b6c8185614944565b98975050505050505050565b600060208284031215615b8a57600080fd5b8151610b4881614899565b600060033d1115615bae5760046000803e5060005160e01c5b90565b600060443d1015615bbf5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715615bee57505050505090565b8285019150815181811115615c065750505050505090565b843d8701016020828501011115615c205750505050505090565b615c2f602082860101876149be565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b600081615c9157615c916155c5565b506000190190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090615cd390830184614944565b979650505050505050565b634e487b7160e01b600052603160045260246000fdfe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a11c2020b6b4f4e00c2410234e0c72636b4739cf7cda4d8e24ef6b881350e67049f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6339759585899103d2ace64958e37e18ccb0504652c81d4a1b8aa80fe2126ab95a2646970667358221220c2b91a892b95eca0e717eaca80b0862d92c22a8784778837471c034b6f6d4cb064736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103985760003560e01c806398bcede9116101e9578063d53913931161010f578063e63ab1e9116100ad578063f3ccd6981161007c578063f3ccd69814610893578063f3d5c2af146108b4578063f5298aca146108c7578063f8742254146108da57600080fd5b8063e63ab1e914610827578063e8a3d4851461083c578063e985e9c514610844578063f242432a1461088057600080fd5b8063ddb94643116100e9578063ddb946431461079d578063ded25153146107d4578063df6f5b20146107e7578063e4e97e3c1461080757600080fd5b8063d539139314610762578063d547741f14610777578063d9fb5bed1461078a57600080fd5b8063aa7c75c811610187578063bdc24b2011610156578063bdc24b2014610727578063c63adb2b14610732578063ca15c8731461073c578063d46f506c1461074f57600080fd5b8063aa7c75c8146106cd578063b83ef2d7146106e0578063ba9fa963146106f3578063bd85b0391461070657600080fd5b8063a217fddf116101c3578063a217fddf14610695578063a22cb4651461069d578063a6e4bafb146106b0578063a7d2b743146106c357600080fd5b806398bcede91461064d5780639afb97de146106585780639c7e5a8f1461066b57600080fd5b806340a58a32116102ce57806380f556051161026c5780638da5cb5b1161023b5780638da5cb5b146106005780639010d07c1461061457806391d1485414610627578063938e3d7b1461063a57600080fd5b806380f55605146105be5780638456cb59146105d25780638462151c146105da578063862440e2146105ed57600080fd5b806355f804b3116102a857806355f804b3146105845780635c975abb146105975780636b20c454146105a35780636c0360eb146105b657600080fd5b806340a58a32146104ff5780634e1273f4146105415780634f558e791461056157600080fd5b806327d6cc421161033b5780632f2ff15d116103155780632f2ff15d146104be57806336568abe146104d1578063389403d8146104e45780633f4ba83a146104f757600080fd5b806327d6cc42146104665780632a55205a146104795780632eb2c2d6146104ab57600080fd5b80630e89341c116103775780630e89341c146103fb57806311d15e7a1461041b5780631f72d83114610430578063248a9ca31461044357600080fd5b8062fdd58e1461039d57806301ffc9a7146103c357806305325160146103e6575b600080fd5b6103b06103ab36600461486f565b6108ef565b6040519081526020015b60405180910390f35b6103d66103d13660046148af565b61098b565b60405190151581526020016103ba565b6103f96103f43660046148cc565b6109b6565b005b61040e6104093660046148ff565b610a66565b6040516103ba9190614970565b6103b0600080516020615d1583398151915281565b6103f961043e3660046148ff565b610b4f565b6103b06104513660046148ff565b60009081526065602052604090206001015490565b6103f9610474366004614b7b565b610bef565b61048c610487366004614c5b565b610e18565b604080516001600160a01b0390931683526020830191909152016103ba565b6103f96104b9366004614c7d565b610e5a565b6103f96104cc366004614d26565b610ef1565b6103f96104df366004614d26565b610f1c565b6103f96104f2366004614d49565b610f9a565b6103f961112d565b61052961050d3660046148ff565b600090815261022a60205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016103ba565b61055461054f366004614da7565b611151565b6040516103ba9190614eac565b6103d661056f3660046148ff565b600090815261012d6020526040902054151590565b6103f9610592366004614ebf565b61127a565b6101915460ff166103d6565b6103f96105b1366004614ef3565b6112cf565b61040e611312565b61022b54610529906001600160a01b031681565b6103f96113a5565b6105546105e8366004614f66565b6113c6565b6103f96105fb366004614f81565b611433565b61023054610529906001600160a01b031681565b610529610622366004614c5b565b6114d9565b6103d6610635366004614d26565b6114f1565b6103f9610648366004614ebf565b61151c565b610228546103b09081565b6103d66106663660046148cc565b6115a3565b6105296106793660046148ff565b61022a602052600090815260409020546001600160a01b031681565b6103b0600081565b6103f96106ab366004614fbd565b611648565b6103d66106be36600461500c565b611653565b6103b06102615481565b6103f96106db366004615048565b611a87565b6103f96106ee36600461507d565b611c5a565b6103f96107013660046150fb565b611dbb565b6103b06107143660046148ff565b600090815261012d602052604090205490565b610262546103b09081565b6103b061022f5481565b6103b061074a3660046148ff565b612048565b6103d661075d366004614d26565b61205f565b6103b0600080516020615d3583398151915281565b6103f9610785366004614d26565b612199565b6103b0610798366004615173565b6121bf565b6103b06107ab36600461486f565b6001600160a01b0391909116600090815261026460209081526040808320938352929052205490565b61040e6107e23660046151a7565b612622565b6107fa6107f53660046148ff565b612633565b6040516103ba9190615210565b61081a610815366004614f66565b612ad7565b6040516103ba9190615345565b6103b0600080516020615cf583398151915281565b61040e612c1b565b6103d6610852366004615394565b6001600160a01b03918216600090815260986020908152604080832093909416825291909152205460ff1690565b6103f961088e3660046153be565b612c2b565b6103b06108a13660046148ff565b6000908152610265602052604090205490565b6103d66108c2366004615422565b612c70565b6103f96108d53660046148cc565b612d40565b6103b0600080516020615d5583398151915281565b60006001600160a01b0383166109605760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b5060008181526097602090815260408083206001600160a01b03861684529091529020545b92915050565b600061099682612d83565b8061098557506001600160e01b0319821663152a902d60e11b1492915050565b6109c16000336114f1565b806109e35750600082815261022a60205260409020546001600160a01b031633145b6109ed601f612622565b90610a0b5760405162461bcd60e51b81526004016109579190614970565b50610a17838383612da8565b604080516001600160a01b0385168152602081018490529081018290527fccbea4088a3b7ae9ca2d15fab9a9742a4075b4d7247768a1eecea917565aba009060600160405180910390a1505050565b600081815261022d6020526040812080546060929190610a85906154f7565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab1906154f7565b8015610afe5780601f10610ad357610100808354040283529160200191610afe565b820191906000526020600020905b815481529060010190602001808311610ae157829003601f168201915b505050505090506000815111610b235760405180602001604052806000815250610b48565b61022e81604051602001610b3892919061552c565b6040516020818303038152906040525b9392505050565b610b5a6000336114f1565b610b646000612622565b90610b825760405162461bcd60e51b81526004016109579190614970565b50612710811115610b936005612622565b90610bb15760405162461bcd60e51b81526004016109579190614970565b5061022f8190556040518181527f244ea8d7627f5a08f4299862bd5a45752842c183aee5b0fb0d1e4887bfa605b3906020015b60405180910390a150565b610c07600080516020615d35833981519152336114f1565b610c116001612622565b90610c2f5760405162461bcd60e51b81526004016109579190614970565b508451815114610c3f6039612622565b90610c5d5760405162461bcd60e51b81526004016109579190614970565b50610c6a86868685612ead565b825160005b81811015610d9d57848181518110610c8957610c896155af565b602002602001015161022d6000898481518110610ca857610ca86155af565b602002602001015181526020019081526020016000209080519060200190610cd192919061470c565b50610ce161022880546001019055565b828181518110610cf357610cf36155af565b60200260200101516102656000898481518110610d1257610d126155af565b60200260200101518152602001908152602001600020819055506102636000848381518110610d4357610d436155af565b60200260200101518152602001908152602001600020600501878281518110610d6e57610d6e6155af565b60209081029190910181015182546001810184556000938452919092200155610d96816155db565b9050610c6f565b50336001600160a01b03881614610dba57610dba87336001613008565b61022b54610dd49088906001600160a01b03166001613008565b7fe40aa106f1fdba1313cdeb0ea7585b400d2be7b73e4674bc47a82df1767a5219878787604051610e07939291906155f6565b60405180910390a150505050505050565b600082815261022a602052604081205461022f546001600160a01b03909116919061271090610e47908561562c565b610e519190615661565b90509250929050565b6001600160a01b038516331480610e765750610e768533610852565b610edd5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610957565b610eea85858585856130e9565b5050505050565b600082815260656020526040902060010154610f0d813361328e565b610f1783836132f2565b505050565b6001600160a01b0381163314610f8c5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610957565b610f968282613314565b5050565b610fb2600080516020615d35833981519152336114f1565b610fbc6001612622565b90610fda5760405162461bcd60e51b81526004016109579190614970565b506001610fe76034612622565b906110055760405162461bcd60e51b81526004016109579190614970565b5060006110126102285490565b905061102f85828660405180602001604052806000815250613336565b600081815261022d60209081526040909120845161104f9286019061470c565b50600081815261022a6020908152604080832080546001600160a01b0319166001600160a01b038a16908117909155610265835281842086905585845261026383528184206005018054600181018255908552929093209091018390555133907f6fdefa1cffd10a72dc6bcde65472c7a120fb3bfedf2ca686ca4a660a13788de6906110e090859088908a90615675565b60405180910390a3336001600160a01b038616146111045761110485336001613008565b61022b5461111e9086906001600160a01b03166001613008565b610eea61022880546001019055565b600080516020615cf5833981519152611146813361328e565b61114e61340e565b50565b606081518351146111b65760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610957565b600083516001600160401b038111156111d1576111d1614983565b6040519080825280602002602001820160405280156111fa578160200160208202803683370190505b50905060005b84518110156112725761124585828151811061121e5761121e6155af565b6020026020010151858381518110611238576112386155af565b60200260200101516108ef565b828281518110611257576112576155af565b602090810291909101015261126b816155db565b9050611200565b509392505050565b611292600080516020615d55833981519152336114f1565b61129c602f612622565b906112ba5760405162461bcd60e51b81526004016109579190614970565b508051610f969061022e90602084019061470c565b6001600160a01b0383163314806112eb57506112eb8333610852565b6113075760405162461bcd60e51b81526004016109579061569e565b610f178383836134a3565b606061022e8054611322906154f7565b80601f016020809104026020016040519081016040528092919081815260200182805461134e906154f7565b801561139b5780601f106113705761010080835404028352916020019161139b565b820191906000526020600020905b81548152906001019060200180831161137e57829003601f168201915b5050505050905090565b600080516020615cf58339815191526113be813361328e565b61114e613634565b6001600160a01b03811660009081526101f5602090815260409182902080548351818402810184019094528084526060939283018282801561142757602002820191906000526020600020905b815481526020019060010190808311611413575b50505050509050919050565b61144b600080516020615d55833981519152336114f1565b611455602f612622565b906114735760405162461bcd60e51b81526004016109579190614970565b50600082815261022d6020908152604090912082516114949284019061470c565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b6114c084610a66565b6040516114cd9190614970565b60405180910390a25050565b600082815260c960205260408120610b4890836136b1565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b611534600080516020615d55833981519152336114f1565b61153e602f612622565b9061155c5760405162461bcd60e51b81526004016109579190614970565b5080516115719061022c90602084019061470c565b507fa92622edb95b29422aac14da4f6e70d32d35451fbdf30b467c0ddf78d5c70e5761022c604051610be491906156e7565b61022b546000906001600160a01b031633146115bf6038612622565b906115dd5760405162461bcd60e51b81526004016109579190614970565b50600083815261026360205260408120600b01805484929061160090849061576c565b90915550506001600160a01b0384166000908152610264602090815260408083208684529091528120805484929061163990849061576c565b90915550600195945050505050565b610f96338383613008565b6000600080516020615d3583398151915261166e813361328e565b600161167a6034612622565b906116985760405162461bcd60e51b81526004016109579190614970565b50600084815261026360205260409020600601546001600160a01b031633146116c16035612622565b906116df5760405162461bcd60e51b81526004016109579190614970565b5060006116ec8480615784565b9050116116f96033612622565b906117175760405162461bcd60e51b81526004016109579190614970565b5060006117276020850185615784565b9050116117346033612622565b906117525760405162461bcd60e51b81526004016109579190614970565b5060006117626040850185615784565b90501161176f6033612622565b9061178d5760405162461bcd60e51b81526004016109579190614970565b50600061179d6060850185615784565b9050116117aa6033612622565b906117c85760405162461bcd60e51b81526004016109579190614970565b5060006117d86080850185615784565b9050116117e56033612622565b906118035760405162461bcd60e51b81526004016109579190614970565b50600061181360a08501856157d1565b9050116118206033612622565b9061183e5760405162461bcd60e51b81526004016109579190614970565b50600083610140013513806118595750826101400135600019145b6118636033612622565b906118815760405162461bcd60e51b81526004016109579190614970565b5061188c8380615784565b6000868152610263602052604090206118a6929091614790565b506118b46020840184615784565b6000868152610263602052604090206118d292600190910191614790565b506118e06040840184615784565b6000868152610263602052604090206118fe92600290910191614790565b5061190c6060840184615784565b60008681526102636020526040902061192a92600390910191614790565b506119386080840184615784565b60008681526102636020526040902061195692600490910191614790565b5061196460a08401846157d1565b60008681526102636020526040902061198292600590910191614804565b506000848152610263602052604081206101208501356009820155610140850135600a820155426008909101555b6119be61018085018561581a565b9050811015611a5157600085815261026360205260409020600c016119e761018086018661581a565b838181106119f7576119f76155af565b835460018101855560009485526020909420606090910292909201926003029091019050611a3c82828135815560208201356001820155604082013560028201555050565b50508080611a49906155db565b9150506119b0565b5060405184907f0c0a12217294d82ef047e3eaa23502d376a77d0df8d33543cd321e17668192f790600090a25060019392505050565b611a926000336114f1565b80611ab45750600083815261022a60205260409020546001600160a01b031633145b611abe601f612622565b90611adc5760405162461bcd60e51b81526004016109579190614970565b50600083815261022d602052604081208054611af7906154f7565b80601f0160208091040260200160405190810160405280929190818152602001828054611b23906154f7565b8015611b705780601f10611b4557610100808354040283529160200191611b70565b820191906000526020600020905b815481529060010190602001808311611b5357829003601f168201915b505050505090506000815111611b866008612622565b90611ba45760405162461bcd60e51b81526004016109579190614970565b50611bc083858460405180602001604052806000815250613336565b826001600160a01b0316336001600160a01b03167f6fdefa1cffd10a72dc6bcde65472c7a120fb3bfedf2ca686ca4a660a13788de6868486604051611c0793929190615675565b60405180910390a3336001600160a01b03841614611c2b57611c2b83336001613008565b61022b54611c459084906001600160a01b03166001613008565b611c5461022880546001019055565b50505050565b600080516020615d35833981519152611c73813361328e565b6001611c7f6034612622565b90611c9d5760405162461bcd60e51b81526004016109579190614970565b50600084815261026360205260409020600601546001600160a01b03163314611cc66035612622565b90611ce45760405162461bcd60e51b81526004016109579190614970565b50811515611cf26037612622565b90611d105760405162461bcd60e51b81526004016109579190614970565b50600084815261026360205260409020611d2e906005018484614804565b5060008481526102636020526040808220426008909101555185917f0c0a12217294d82ef047e3eaa23502d376a77d0df8d33543cd321e17668192f791a260005b82811015610eea57846102656000868685818110611d8f57611d8f6155af565b905060200201358152602001908152602001600020819055508080611db3906155db565b915050611d6f565b600054610100900460ff16611dd65760005460ff1615611dda565b303b155b611e3d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610957565b600054610100900460ff16158015611e5f576000805461ffff19166101011790555b6001600160a01b0384161515611e756026612622565b90611e935760405162461bcd60e51b81526004016109579190614970565b50611e9d866136bd565b611ea56136ed565b611ead6136ed565b611eb5613716565b611ebd6136ed565b611ec5613745565b611ecd6136ed565b8551611ee19061022c90602089019061470c565b50604080516020810191829052600090819052611f019161022e9161470c565b5061023080546001600160a01b038086166001600160a01b03199283161790925561022b805492871692909116919091179055611f3f600084613774565b611f4885610b4f565b611f60600080516020615d5583398151915284613774565b611f78600080516020615d5583398151915283613774565b611f90600080516020615d1583398151915284613774565b611fa8600080516020615d1583398151915283613774565b611fc0600080516020615d158339815191528061377e565b611fd8600080516020615d3583398151915284613774565b611ff0600080516020615d3583398151915283613774565b612016600080516020615d35833981519152600080516020615d1583398151915261377e565b61202e600080516020615cf583398151915284613774565b8015612040576000805461ff00191690555b505050505050565b600081815260c960205260408120610985906137c9565b6000600080516020615d3583398151915261207a813361328e565b60016120866034612622565b906120a45760405162461bcd60e51b81526004016109579190614970565b50600084815261026360205260409020600601546001600160a01b031633146120cd6035612622565b906120eb5760405162461bcd60e51b81526004016109579190614970565b506001600160a01b0383163314156121036010612622565b906121215760405162461bcd60e51b81526004016109579190614970565b50600084815261026360209081526040918290206006810180546001600160a01b0319166001600160a01b0388169081179091554260089092019190915591518681527f9a02c0776a798089d5d1632873810b35836961155d75791f4ef7b3779b1a4f17910160405180910390a25060019392505050565b6000828152606560205260409020600101546121b5813361328e565b610f178383613314565b6000600080516020615d358339815191526121da813361328e565b60006121e68480615784565b9050116121f36033612622565b906122115760405162461bcd60e51b81526004016109579190614970565b5060006122216020850185615784565b90501161222e6033612622565b9061224c5760405162461bcd60e51b81526004016109579190614970565b50600061225c6040850185615784565b9050116122696033612622565b906122875760405162461bcd60e51b81526004016109579190614970565b5060006122976060850185615784565b9050116122a46033612622565b906122c25760405162461bcd60e51b81526004016109579190614970565b5060006122d26080850185615784565b9050116122df6033612622565b906122fd5760405162461bcd60e51b81526004016109579190614970565b50600061231060e0850160c08601614f66565b6001600160a01b031614156123256004612622565b906123435760405162461bcd60e51b81526004016109579190614970565b506000836101200135138061235e5750826101200135600019145b6123686033612622565b906123865760405162461bcd60e51b81526004016109579190614970565b50600083610140013513806123a15750826101400135600019145b6123ab6033612622565b906123c95760405162461bcd60e51b81526004016109579190614970565b506102625491506123da8380615784565b6000848152610263602052604090206123f4929091614790565b506124026020840184615784565b60008481526102636020526040902061242092600190910191614790565b5061242e6040840184615784565b60008481526102636020526040902061244c92600290910191614790565b5061245a6060840184615784565b60008481526102636020526040902061247892600390910191614790565b506124866080840184615784565b6000848152610263602052604090206124a492600490910191614790565b506124b260a08401846157d1565b6000848152610263602052604090206124d092600590910191614804565b506124e160e0840160c08501614f66565b6000838152610263602052604081206006810180546001600160a01b0319166001600160a01b039490941693909317909255426007830155600882018190556101208501356009830155610140850135600a830155600b9091018190555b61254d61018085018561581a565b90508110156125e057600083815261026360205260409020600c0161257661018086018661581a565b83818110612586576125866155af565b8354600181018555600094855260209094206060909102929092019260030290910190506125cb82828135815560208201356001820155604082013560028201555050565b505080806125d8906155db565b91505061253f565b506125f061026280546001019055565b60405182907f5baee347cce9899b119eb4f42984958a6e25dc5b505f4f1ab8f3837120cf241f90600090a25b50919050565b60606109858263ffffffff166137d3565b6126a7604051806101a0016040528060608152602001606081526020016060815260200160608152602001606081526020016060815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001606081525090565b600082815261026360205260409081902081516101a081019092528054829082906126d1906154f7565b80601f01602080910402602001604051908101604052809291908181526020018280546126fd906154f7565b801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b50505050508152602001600182018054612763906154f7565b80601f016020809104026020016040519081016040528092919081815260200182805461278f906154f7565b80156127dc5780601f106127b1576101008083540402835291602001916127dc565b820191906000526020600020905b8154815290600101906020018083116127bf57829003601f168201915b505050505081526020016002820180546127f5906154f7565b80601f0160208091040260200160405190810160405280929190818152602001828054612821906154f7565b801561286e5780601f106128435761010080835404028352916020019161286e565b820191906000526020600020905b81548152906001019060200180831161285157829003601f168201915b50505050508152602001600382018054612887906154f7565b80601f01602080910402602001604051908101604052809291908181526020018280546128b3906154f7565b80156129005780601f106128d557610100808354040283529160200191612900565b820191906000526020600020905b8154815290600101906020018083116128e357829003601f168201915b50505050508152602001600482018054612919906154f7565b80601f0160208091040260200160405190810160405280929190818152602001828054612945906154f7565b80156129925780601f1061296757610100808354040283529160200191612992565b820191906000526020600020905b81548152906001019060200180831161297557829003601f168201915b50505050508152602001600582018054806020026020016040519081016040528092919081815260200182805480156129ea57602002820191906000526020600020905b8154815260200190600101908083116129d6575b505050505081526020016006820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201805480602002602001604051908101604052809291908181526020016000905b82821015612ac95783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190612a79565b505050915250909392505050565b60606000612ae4836113c6565b5111612af06023612622565b90612b0e5760405162461bcd60e51b81526004016109579190614970565b506000612b1a836113c6565b905060008082516001600160401b03811115612b3857612b38614983565b604051908082528060200260200182016040528015612b7d57816020015b6040805180820190915260008082526020820152815260200190600190039081612b565790505b50905060005b8351811015612c125760006040518060400160405280868481518110612bab57612bab6155af565b60200260200101518152602001612bce89888681518110611238576112386155af565b815250905080838581518110612be657612be66155af565b6020908102919091010152612bfc60018561576c565b9350508080612c0a906155db565b915050612b83565b50949350505050565b606061022c8054611322906154f7565b6001600160a01b038516331480612c475750612c478533610852565b612c635760405162461bcd60e51b81526004016109579061569e565b610eea85858585856138d8565b6000600080516020615d35833981519152612c8b813361328e565b6000835111612c9a6036612622565b90612cb85760405162461bcd60e51b81526004016109579190614970565b5060005b8351811015611a51576102636000868152602001908152602001600020600c01848281518110612cee57612cee6155af565b6020908102919091018101518254600181810185556000948552938390208251600390920201908155918101519282019290925560409091015160029091015580612d38816155db565b915050612cbc565b6001600160a01b038316331480612d5c5750612d5c8333610852565b612d785760405162461bcd60e51b81526004016109579061569e565b610f17838383612da8565b60006001600160e01b03198216635a05180f60e01b14806109855750610985826139f9565b6001600160a01b038316612dce5760405162461bcd60e51b815260040161095790615862565b33612dfd81856000612ddf87613a39565b612de887613a39565b60405180602001604052806000815250613a84565b60008381526097602090815260408083206001600160a01b038816845290915290205482811015612e405760405162461bcd60e51b8152600401610957906158a5565b60008481526097602090815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b6001600160a01b038416612ed35760405162461bcd60e51b8152600401610957906158e9565b8151835114612ef45760405162461bcd60e51b81526004016109579061592a565b33612f0481600087878787613a84565b60005b8451811015612fa057838181518110612f2257612f226155af565b602002602001015160976000878481518110612f4057612f406155af565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254612f88919061576c565b90915550819050612f98816155db565b915050612f07565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612ff1929190615972565b60405180910390a4610eea81600087878787613c6c565b816001600160a01b0316836001600160a01b0316141561307c5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610957565b6001600160a01b03838116600081815260986020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b815183511461310a5760405162461bcd60e51b81526004016109579061592a565b6001600160a01b0384166131305760405162461bcd60e51b8152600401610957906159a0565b3361313f818787878787613a84565b60005b845181101561322857600085828151811061315f5761315f6155af565b60200260200101519050600085838151811061317d5761317d6155af565b60209081029190910181015160008481526097835260408082206001600160a01b038e1683529093529190912054909150818110156131ce5760405162461bcd60e51b8152600401610957906159e5565b60008381526097602090815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061320d90849061576c565b9250508190555050505080613221906155db565b9050613142565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051613278929190615972565b60405180910390a4612040818787878787613c6c565b61329882826114f1565b610f96576132b0816001600160a01b03166014613dd7565b6132bb836020613dd7565b6040516020016132cc929190615a2f565b60408051601f198184030181529082905262461bcd60e51b825261095791600401614970565b6132fc8282613f72565b600082815260c960205260409020610f179082613ff8565b61331e828261400d565b600082815260c960205260409020610f179082614074565b6001600160a01b03841661335c5760405162461bcd60e51b8152600401610957906158e9565b3361337c8160008761336d88613a39565b61337688613a39565b87613a84565b60008481526097602090815260408083206001600160a01b0389168452909152812080548592906133ae90849061576c565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610eea81600087878787614089565b6101915460ff166134585760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610957565b610191805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0383166134c95760405162461bcd60e51b815260040161095790615862565b80518251146134ea5760405162461bcd60e51b81526004016109579061592a565b600033905061350d81856000868660405180602001604052806000815250613a84565b60005b83518110156135d557600084828151811061352d5761352d6155af565b60200260200101519050600084838151811061354b5761354b6155af565b60209081029190910181015160008481526097835260408082206001600160a01b038c16835290935291909120549091508181101561359c5760405162461bcd60e51b8152600401610957906158a5565b60009283526097602090815260408085206001600160a01b038b16865290915290922091039055806135cd816155db565b915050613510565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051613626929190615972565b60405180910390a450505050565b6101915460ff161561367b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610957565b610191805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586134863390565b6000610b488383614153565b600054610100900460ff166136e45760405162461bcd60e51b815260040161095790615aa4565b61114e8161417d565b600054610100900460ff166137145760405162461bcd60e51b815260040161095790615aa4565b565b600054610100900460ff1661373d5760405162461bcd60e51b815260040161095790615aa4565b6137146141ad565b600054610100900460ff1661376c5760405162461bcd60e51b815260040161095790615aa4565b6137146141f2565b610f9682826132f2565b600082815260656020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6000610985825490565b6060816137f75750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613821578061380b816155db565b915061381a9050600a83615661565b91506137fb565b6000816001600160401b0381111561383b5761383b614983565b6040519080825280601f01601f191660200182016040528015613865576020820181803683370190505b5090505b84156138d05761387a600183615aef565b9150613887600a86615b06565b61389290603061576c565b60f81b8183815181106138a7576138a76155af565b60200101906001600160f81b031916908160001a9053506138c9600a86615661565b9450613869565b949350505050565b6001600160a01b0384166138fe5760405162461bcd60e51b8152600401610957906159a0565b3361390e81878761336d88613a39565b60008481526097602090815260408083206001600160a01b038a168452909152902054838110156139515760405162461bcd60e51b8152600401610957906159e5565b60008581526097602090815260408083206001600160a01b038b811685529252808320878503905590881682528120805486929061399090849061576c565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46139f0828888888888614089565b50505050505050565b60006001600160e01b03198216636cdb3d1360e11b1480613a2a57506001600160e01b031982166303a24d0760e21b145b80610985575061098582614226565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110613a7357613a736155af565b602090810291909101015292915050565b60005b8351811015613b91576000848281518110613aa457613aa46155af565b602002602001015190506000848381518110613ac257613ac26155af565b6020026020010151905060006001600160a01b0316876001600160a01b03161415613b225780613af289846108ef565b1015613afe6020612622565b90613b1c5760405162461bcd60e51b81526004016109579190614970565b50613b7e565b6001600160a01b03881615801590613b4257506001600160a01b03871615155b15613b7e5780613b5289846108ef565b1015613b5e6021612622565b90613b7c5760405162461bcd60e51b81526004016109579190614970565b505b505080613b8a906155db565b9050613a87565b50613ba086868686868661425b565b60005b83518110156139f0576000848281518110613bc057613bc06155af565b602002602001015190506000848381518110613bde57613bde6155af565b6020026020010151905060006001600160a01b0316886001600160a01b03161415613c1257613c0d87836142d2565b613c59565b6001600160a01b038716613c2b57613c0d88838361430e565b866001600160a01b0316886001600160a01b031614613c5957613c4e87836142d2565b613c5988838361430e565b505080613c65906155db565b9050613ba3565b6001600160a01b0384163b156120405760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190613cb09089908990889088908890600401615b1a565b602060405180830381600087803b158015613cca57600080fd5b505af1925050508015613cfa575060408051601f3d908101601f19168201909252613cf791810190615b78565b60015b613da757613d06615b95565b806308c379a01415613d405750613d1b615bb1565b80613d265750613d42565b8060405162461bcd60e51b81526004016109579190614970565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610957565b6001600160e01b0319811663bc197c8160e01b146139f05760405162461bcd60e51b815260040161095790615c3a565b60606000613de683600261562c565b613df190600261576c565b6001600160401b03811115613e0857613e08614983565b6040519080825280601f01601f191660200182016040528015613e32576020820181803683370190505b509050600360fc1b81600081518110613e4d57613e4d6155af565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613e7c57613e7c6155af565b60200101906001600160f81b031916908160001a9053506000613ea084600261562c565b613eab90600161576c565b90505b6001811115613f23576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110613edf57613edf6155af565b1a60f81b828281518110613ef557613ef56155af565b60200101906001600160f81b031916908160001a90535060049490941c93613f1c81615c82565b9050613eae565b508315610b485760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610957565b613f7c82826114f1565b610f965760008281526065602090815260408083206001600160a01b03851684529091529020805460ff19166001179055613fb43390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610b48836001600160a01b0384166143fa565b61401782826114f1565b15610f965760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610b48836001600160a01b038416614449565b6001600160a01b0384163b156120405760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906140cd9089908990889088908890600401615c99565b602060405180830381600087803b1580156140e757600080fd5b505af1925050508015614117575060408051601f3d908101601f1916820190925261411491810190615b78565b60015b61412357613d06615b95565b6001600160e01b0319811663f23a6e6160e01b146139f05760405162461bcd60e51b815260040161095790615c3a565b600082600001828154811061416a5761416a6155af565b9060005260206000200154905092915050565b600054610100900460ff166141a45760405162461bcd60e51b815260040161095790615aa4565b61114e8161453c565b600054610100900460ff166141d45760405162461bcd60e51b815260040161095790615aa4565b60408051602081019182905260009081905261114e9160fb9161470c565b600054610100900460ff166142195760405162461bcd60e51b815260040161095790615aa4565b610191805460ff19169055565b60006001600160e01b03198216637965db0b60e01b148061098557506301ffc9a760e01b6001600160e01b0319831614610985565b61426986868686868661454f565b6101915460ff16156120405760405162461bcd60e51b815260206004820152602c60248201527f455243313135355061757361626c653a20746f6b656e207472616e736665722060448201526b1dda1a5b19481c185d5cd95960a21b6064820152608401610957565b6142dc82826108ef565b610f96576001600160a01b039190911660009081526101f5602090815260408220805460018101825590835291200155565b8061431984846108ef565b1415610f1757600061432b848461465d565b6001600160a01b03851660009081526101f56020526040902080549192509061435690600190615aef565b81548110614366576143666155af565b90600052602060002001546101f56000866001600160a01b03166001600160a01b0316815260200190815260200160002082815481106143a8576143a86155af565b60009182526020808320909101929092556001600160a01b03861681526101f5909152604090208054806143de576143de615cde565b6001900381819060005260206000200160009055905550505050565b600081815260018301602052604081205461444157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610985565b506000610985565b6000818152600183016020526040812054801561453257600061446d600183615aef565b855490915060009061448190600190615aef565b90508181146144e65760008660000182815481106144a1576144a16155af565b90600052602060002001549050808760000184815481106144c4576144c46155af565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806144f7576144f7615cde565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610985565b6000915050610985565b8051610f9690609990602084019061470c565b6001600160a01b0385166145d75760005b83518110156145d55782818151811061457b5761457b6155af565b602002602001015161012d600086848151811061459a5761459a6155af565b6020026020010151815260200190815260200160002060008282546145bf919061576c565b909155506145ce9050816155db565b9050614560565b505b6001600160a01b0384166120405760005b83518110156139f057828181518110614603576146036155af565b602002602001015161012d6000868481518110614622576146226155af565b6020026020010151815260200190815260200160002060008282546146479190615aef565b909155506146569050816155db565b90506145e8565b6001600160a01b03821660009081526101f56020526040812054815b818310156146da576001600160a01b03851660009081526101f5602052604090208054859190859081106146af576146af6155af565b906000526020600020015414156146c857506109859050565b826146d2816155db565b935050614679565b806146e56022612622565b906147035760405162461bcd60e51b81526004016109579190614970565b50505092915050565b828054614718906154f7565b90600052602060002090601f01602090048101928261473a5760008555614780565b82601f1061475357805160ff1916838001178555614780565b82800160010185558215614780579182015b82811115614780578251825591602001919060010190614765565b5061478c92915061483e565b5090565b82805461479c906154f7565b90600052602060002090601f0160209004810192826147be5760008555614780565b82601f106147d75782800160ff19823516178555614780565b82800160010185558215614780579182015b828111156147805782358255916020019190600101906147e9565b82805482825590600052602060002090810192821561478057916020028201828111156147805782358255916020019190600101906147e9565b5b8082111561478c576000815560010161483f565b80356001600160a01b038116811461486a57600080fd5b919050565b6000806040838503121561488257600080fd5b61488b83614853565b946020939093013593505050565b6001600160e01b03198116811461114e57600080fd5b6000602082840312156148c157600080fd5b8135610b4881614899565b6000806000606084860312156148e157600080fd5b6148ea84614853565b95602085013595506040909401359392505050565b60006020828403121561491157600080fd5b5035919050565b60005b8381101561493357818101518382015260200161491b565b83811115611c545750506000910152565b6000815180845261495c816020860160208601614918565b601f01601f19169290920160200192915050565b602081526000610b486020830184614944565b634e487b7160e01b600052604160045260246000fd5b606081018181106001600160401b03821117156149b8576149b8614983565b60405250565b601f8201601f191681016001600160401b03811182821017156149e3576149e3614983565b6040525050565b60006001600160401b03821115614a0357614a03614983565b5060051b60200190565b600082601f830112614a1e57600080fd5b81356020614a2b826149ea565b604051614a3882826149be565b83815260059390931b8501820192828101915086841115614a5857600080fd5b8286015b84811015614a735780358352918301918301614a5c565b509695505050505050565b600082601f830112614a8f57600080fd5b81356001600160401b03811115614aa857614aa8614983565b604051614abf601f8301601f1916602001826149be565b818152846020838601011115614ad457600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f830112614b0257600080fd5b81356020614b0f826149ea565b604051614b1c82826149be565b83815260059390931b8501820192828101915086841115614b3c57600080fd5b8286015b84811015614a735780356001600160401b03811115614b5f5760008081fd5b614b6d8986838b0101614a7e565b845250918301918301614b40565b60008060008060008060c08789031215614b9457600080fd5b614b9d87614853565b955060208701356001600160401b0380821115614bb957600080fd5b614bc58a838b01614a0d565b96506040890135915080821115614bdb57600080fd5b614be78a838b01614a0d565b95506060890135915080821115614bfd57600080fd5b614c098a838b01614af1565b94506080890135915080821115614c1f57600080fd5b614c2b8a838b01614a7e565b935060a0890135915080821115614c4157600080fd5b50614c4e89828a01614a0d565b9150509295509295509295565b60008060408385031215614c6e57600080fd5b50508035926020909101359150565b600080600080600060a08688031215614c9557600080fd5b614c9e86614853565b9450614cac60208701614853565b935060408601356001600160401b0380821115614cc857600080fd5b614cd489838a01614a0d565b94506060880135915080821115614cea57600080fd5b614cf689838a01614a0d565b93506080880135915080821115614d0c57600080fd5b50614d1988828901614a7e565b9150509295509295909350565b60008060408385031215614d3957600080fd5b82359150610e5160208401614853565b60008060008060808587031215614d5f57600080fd5b614d6885614853565b93506020850135925060408501356001600160401b03811115614d8a57600080fd5b614d9687828801614a7e565b949793965093946060013593505050565b60008060408385031215614dba57600080fd5b82356001600160401b0380821115614dd157600080fd5b818501915085601f830112614de557600080fd5b81356020614df2826149ea565b604051614dff82826149be565b83815260059390931b8501820192828101915089841115614e1f57600080fd5b948201945b83861015614e4457614e3586614853565b82529482019490820190614e24565b96505086013592505080821115614e5a57600080fd5b50614e6785828601614a0d565b9150509250929050565b600081518084526020808501945080840160005b83811015614ea157815187529582019590820190600101614e85565b509495945050505050565b602081526000610b486020830184614e71565b600060208284031215614ed157600080fd5b81356001600160401b03811115614ee757600080fd5b6138d084828501614a7e565b600080600060608486031215614f0857600080fd5b614f1184614853565b925060208401356001600160401b0380821115614f2d57600080fd5b614f3987838801614a0d565b93506040860135915080821115614f4f57600080fd5b50614f5c86828701614a0d565b9150509250925092565b600060208284031215614f7857600080fd5b610b4882614853565b60008060408385031215614f9457600080fd5b8235915060208301356001600160401b03811115614fb157600080fd5b614e6785828601614a7e565b60008060408385031215614fd057600080fd5b614fd983614853565b915060208301358015158114614fee57600080fd5b809150509250929050565b60006101a0828403121561261c57600080fd5b6000806040838503121561501f57600080fd5b8235915060208301356001600160401b0381111561503c57600080fd5b614e6785828601614ff9565b60008060006060848603121561505d57600080fd5b8335925061506d60208501614853565b9150604084013590509250925092565b60008060006040848603121561509257600080fd5b8335925060208401356001600160401b03808211156150b057600080fd5b818601915086601f8301126150c457600080fd5b8135818111156150d357600080fd5b8760208260051b85010111156150e857600080fd5b6020830194508093505050509250925092565b600080600080600060a0868803121561511357600080fd5b85356001600160401b0381111561512957600080fd5b61513588828901614a7e565b9550506020860135935061514b60408701614853565b925061515960608701614853565b915061516760808701614853565b90509295509295909350565b60006020828403121561518557600080fd5b81356001600160401b0381111561519b57600080fd5b6138d084828501614ff9565b6000602082840312156151b957600080fd5b81358060030b8114610b4857600080fd5b600081518084526020808501945080840160005b83811015614ea157815180518852838101518489015260409081015190880152606090960195908201906001016151de565b60208152600082516101a080602085015261522f6101c0850183614944565b91506020850151601f198086850301604087015261524d8483614944565b9350604087015191508086850301606087015261526a8483614944565b935060608701519150808685030160808701526152878483614944565b935060808701519150808685030160a08701526152a48483614944565b935060a08701519150808685030160c08701526152c18483614e71565b935060c087015191506152df60e08701836001600160a01b03169052565b60e0870151610100878101919091528701516101208088019190915287015161014080880191909152870151610160808801919091528701516101808088019190915287015186850390910183870152905061533b83826151ca565b9695505050505050565b602080825282518282018190526000919060409081850190868401855b8281101561538757815180518552860151868501529284019290850190600101615362565b5091979650505050505050565b600080604083850312156153a757600080fd5b6153b083614853565b9150610e5160208401614853565b600080600080600060a086880312156153d657600080fd5b6153df86614853565b94506153ed60208701614853565b9350604086013592506060860135915060808601356001600160401b0381111561541657600080fd5b614d1988828901614a7e565b600080604080848603121561543657600080fd5b833592506020808501356001600160401b0381111561545457600080fd5b8501601f8101871361546557600080fd5b8035615470816149ea565b845161547c82826149be565b8281526060928302840185019285820192508a84111561549b57600080fd5b938501935b838510156154e65780858c0312156154b85760008081fd5b86516154c381614999565b8535815286860135878201528786013588820152835293840193918501916154a0565b508096505050505050509250929050565b600181811c9082168061550b57607f821691505b6020821081141561261c57634e487b7160e01b600052602260045260246000fd5b600080845461553a816154f7565b60018281168015615552576001811461556357615592565b60ff19841687528287019450615592565b8860005260208060002060005b858110156155895781548a820152908401908201615570565b50505082870194505b5050505083516155a6818360208801614918565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156155ef576155ef6155c5565b5060010190565b6001600160a01b038416815260606020820181905260009061561a90830185614e71565b828103604084015261533b8185614e71565b6000816000190483118215151615615646576156466155c5565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826156705761567061564b565b500490565b83815260606020820152600061568e6060830185614944565b9050826040830152949350505050565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60006020808352600084546156fb816154f7565b8084870152604060018084166000811461571c57600181146157305761575e565b60ff1985168984015260608901955061575e565b896000528660002060005b858110156157565781548b820186015290830190880161573b565b8a0184019650505b509398975050505050505050565b6000821982111561577f5761577f6155c5565b500190565b6000808335601e1984360301811261579b57600080fd5b8301803591506001600160401b038211156157b557600080fd5b6020019150368190038213156157ca57600080fd5b9250929050565b6000808335601e198436030181126157e857600080fd5b8301803591506001600160401b0382111561580257600080fd5b6020019150600581901b36038213156157ca57600080fd5b6000808335601e1984360301811261583157600080fd5b8301803591506001600160401b0382111561584b57600080fd5b60200191506060810236038213156157ca57600080fd5b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6040815260006159856040830185614e71565b82810360208401526159978185614e71565b95945050505050565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351615a67816017850160208801614918565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351615a98816028840160208801614918565b01602801949350505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082821015615b0157615b016155c5565b500390565b600082615b1557615b1561564b565b500690565b6001600160a01b0386811682528516602082015260a060408201819052600090615b4690830186614e71565b8281036060840152615b588186614e71565b90508281036080840152615b6c8185614944565b98975050505050505050565b600060208284031215615b8a57600080fd5b8151610b4881614899565b600060033d1115615bae5760046000803e5060005160e01c5b90565b600060443d1015615bbf5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715615bee57505050505090565b8285019150815181811115615c065750505050505090565b843d8701016020828501011115615c205750505050505090565b615c2f602082860101876149be565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b600081615c9157615c916155c5565b506000190190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090615cd390830184614944565b979650505050505050565b634e487b7160e01b600052603160045260246000fdfe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a11c2020b6b4f4e00c2410234e0c72636b4739cf7cda4d8e24ef6b881350e67049f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6339759585899103d2ace64958e37e18ccb0504652c81d4a1b8aa80fe2126ab95a2646970667358221220c2b91a892b95eca0e717eaca80b0862d92c22a8784778837471c034b6f6d4cb064736f6c63430008090033
Deployed Bytecode Sourcemap
99305:24324:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25426:318;;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;25426:318:0;;;;;;;;115190:389;;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;115190:389:0;1019:187:1;121204:392:0;;;;;;:::i;:::-;;:::i;:::-;;119218:482;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;99988:74::-;;-1:-1:-1;;;;;;;;;;;99988:74:0;;112568:220;;;;;;:::i;:::-;;:::i;72696:181::-;;;;;;:::i;:::-;72815:7;72847:12;;;:6;:12;;;;;:22;;;;72696:181;117421:977;;;;;;:::i;:::-;;:::i;112865:298::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7781:32:1;;;7763:51;;7845:2;7830:18;;7823:34;;;;7736:18;112865:298:0;7589:274:1;27571:442:0;;;;;;:::i;:::-;;:::i;73139:188::-;;;;;;:::i;:::-;;:::i;74269:287::-;;;;;;:::i;:::-;;:::i;115642:805::-;;;;;;:::i;:::-;;:::i;121056:87::-;;;:::i;102084:116::-;;;;;;:::i;:::-;102150:7;102177:15;;;:10;:15;;;;;;-1:-1:-1;;;;;102177:15:0;;102084:116;;;;-1:-1:-1;;;;;9778:32:1;;;9760:51;;9748:2;9733:18;102084:116:0;9614:203:1;25910:561:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;56383:133::-;;;;;;:::i;:::-;56440:4;56261:16;;;:12;:16;;;;;;-1:-1:-1;;;56383:133:0;120266:152;;;;;;:::i;:::-;;:::i;60542:86::-;60613:7;;;;60542:86;;58534:353;;;;;;:::i;:::-;;:::i;120475:91::-;;;:::i;100332:21::-;;;;;-1:-1:-1;;;;;100332:21:0;;;120771:83;;;:::i;47569:154::-;;;;;;:::i;:::-;;:::i;118406:212::-;;;;;;:::i;:::-;;:::i;101032:20::-;;;;;-1:-1:-1;;;;;101032:20:0;;;91643:203;;;;;;:::i;:::-;;:::i;71493:197::-;;;;;;:::i;:::-;;:::i;119756:173::-;;;;;;:::i;:::-;;:::i;99714:50::-;;;;;;;106218:562;;;;;;:::i;:::-;;:::i;100238:45::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;100238:45:0;;;70497:49;;70542:4;70497:49;;26544:187;;;;;;:::i;:::-;;:::i;106788:2364::-;;;;;;:::i;:::-;;:::i;123153:41::-;;;;;;116518:686;;;;;;:::i;:::-;;:::i;105228:787::-;;;;;;:::i;:::-;;:::i;110956:1509::-;;;;;;:::i;:::-;;:::i;56172:113::-;;;;;;:::i;:::-;56234:7;56261:16;;;:12;:16;;;;;;;56172:113;123203:55;;;;;;;100923:25;;;;;;92020:192;;;;;;:::i;:::-;;:::i;109733:658::-;;;;;;:::i;:::-;;:::i;99773:62::-;;-1:-1:-1;;;;;;;;;;;99773:62:0;;73572:190;;;;;;:::i;:::-;;:::i;102797:2423::-;;;;;;:::i;:::-;;:::i;102389:224::-;;;;;;:::i;:::-;-1:-1:-1;;;;;102560:30:0;;;;102528:7;102560:30;;;:21;:30;;;;;;;;:45;;;;;;;;;102389:224;46606:132;;;;;;:::i;:::-;;:::i;102208:173::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;122244:684::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;99842:62::-;;-1:-1:-1;;;;;;;;;;;99842:62:0;;120004:99;;;:::i;26803:218::-;;;;;;:::i;:::-;-1:-1:-1;;;;;26976:27:0;;;26947:4;26976:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;26803:218;27093:401;;;;;;:::i;:::-;;:::i;102621:168::-;;;;;;:::i;:::-;102728:7;102760:21;;;:16;:21;;;;;;;102621:168;109218:507;;;;;;:::i;:::-;;:::i;58205:321::-;;;;;;:::i;:::-;;:::i;99911:70::-;;-1:-1:-1;;;;;;;;;;;99911:70:0;;25426:318;25557:7;-1:-1:-1;;;;;25604:21:0;;25582:114;;;;-1:-1:-1;;;25582:114:0;;23252:2:1;25582:114:0;;;23234:21:1;23291:2;23271:18;;;23264:30;23330:34;23310:18;;;23303:62;-1:-1:-1;;;23381:18:1;;;23374:41;23432:19;;25582:114:0;;;;;;;;;-1:-1:-1;25714:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;25714:22:0;;;;;;;;;;25426:318;;;;;:::o;115190:389::-;115435:4;115477:36;115501:11;115477:23;:36::i;:::-;:94;;;-1:-1:-1;;;;;;;115530:41:0;;-1:-1:-1;;;115530:41:0;115457:114;115190:389;-1:-1:-1;;115190:389:0:o;121204:392::-;121351:39;70542:4;121379:10;121351:7;:39::i;:::-;:88;;;-1:-1:-1;121411:14:0;;;;:10;:14;;;;;;-1:-1:-1;;;;;121411:14:0;121429:10;121411:28;121351:88;121454:39;44956:2;121454:10;:39::i;:::-;121329:175;;;;;-1:-1:-1;;;121329:175:0;;;;;;;;:::i;:::-;;121515:25;121521:7;121530:2;121534:5;121515;:25::i;:::-;121556:32;;;-1:-1:-1;;;;;23682:32:1;;23664:51;;23746:2;23731:18;;23724:34;;;23774:18;;;23767:34;;;121556:32:0;;23652:2:1;23637:18;121556:32:0;;;;;;;121204:392;;;:::o;119218:482::-;119412:22;119437:19;;;:10;:19;;;;;119412:44;;119381:13;;119412:22;119437:19;119412:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;119605:1;119586:8;119580:22;:26;:112;;;;;;;;;;;;;;;;;119650:8;119660;119633:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;119580:112;119560:132;119218:482;-1:-1:-1;;;119218:482:0:o;112568:220::-;110538:39;70542:4;110566:10;110538:7;:39::i;:::-;110592:22;43060:1;110592:10;:22::i;:::-;110516:109;;;;;-1:-1:-1;;;110516:109:0;;;;;;;;:::i;:::-;-1:-1:-1;100857:6:0::1;112648:22:::0;::::1;;112672:29;43308:1;112672:10;:29::i;:::-;112640:62;;;;;-1:-1:-1::0;;;112640:62:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;112713:10:0::1;:24:::0;;;112753:27:::1;::::0;597:25:1;;;112753:27:0::1;::::0;585:2:1;570:18;112753:27:0::1;;;;;;;;112568:220:::0;:::o;117421:977::-;110694:32;-1:-1:-1;;;;;;;;;;;110715:10:0;110694:7;:32::i;:::-;110728:23;43106:1;110728:10;:23::i;:::-;110686:66;;;;;-1:-1:-1;;;110686:66:0;;;;;;;;:::i;:::-;;117716:3:::1;:10;117692:13;:20;:34;117741:35;46595:2;117741:10;:35::i;:::-;117670:117;;;;;-1:-1:-1::0;;;117670:117:0::1;;;;;;;;:::i;:::-;;117798:34;117809:2;117813:3;117818:7;117827:4;117798:10;:34::i;:::-;117862:11:::0;;117843:16:::1;117884:337;117908:8;117904:1;:12;117884:337;;;117959:4;117964:1;117959:7;;;;;;;;:::i;:::-;;;;;;;117938:10;:18;117949:3;117953:1;117949:6;;;;;;;;:::i;:::-;;;;;;;117938:18;;;;;;;;;;;:28;;;;;;;;;;;;:::i;:::-;;117981:27;:15;94232:19:::0;;94250:1;94232:19;;;94143:127;117981:27:::1;118126:13;118140:1;118126:16;;;;;;;;:::i;:::-;;;;;;;118099;:24;118116:3;118120:1;118116:6;;;;;;;;:::i;:::-;;;;;;;118099:24;;;;;;;;;;;:43;;;;118157:12;:30;118170:13;118184:1;118170:16;;;;;;;;:::i;:::-;;;;;;;118157:30;;;;;;;;;;;:39;;118202:3;118206:1;118202:6;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;118157:52;;::::1;::::0;::::1;::::0;;-1:-1:-1;118157:52:0;;;;;;;::::1;::::0;117918:3:::1;::::0;::::1;:::i;:::-;;;117884:337;;;-1:-1:-1::0;118235:10:0::1;-1:-1:-1::0;;;;;118235:16:0;::::1;;118231:62;;118253:40;118272:2;118276:10;118288:4;118253:18;:40::i;:::-;118327:6;::::0;118304:36:::1;::::0;118323:2;;-1:-1:-1;;;;;118327:6:0::1;::::0;118304:18:::1;:36::i;:::-;118356:34;118373:2;118377:3;118382:7;118356:34;;;;;;;;:::i;:::-;;;;;;;;117659:739;117421:977:::0;;;;;;:::o;112865:298::-;113007:16;113075:19;;;:10;:19;;;;;;113134:10;;-1:-1:-1;;;;;113075:19:0;;;;113007:16;100857:6;;113122:22;;:9;:22;:::i;:::-;113121:34;;;;:::i;:::-;113105:50;;112865:298;;;;;:::o;27571:442::-;-1:-1:-1;;;;;27804:20:0;;20944:10;27804:20;;:60;;-1:-1:-1;27828:36:0;27845:4;20944:10;26803:218;:::i;27828:36::-;27782:160;;;;-1:-1:-1;;;27782:160:0;;26783:2:1;27782:160:0;;;26765:21:1;26822:2;26802:18;;;26795:30;26861:34;26841:18;;;26834:62;-1:-1:-1;;;26912:18:1;;;26905:48;26970:19;;27782:160:0;26581:414:1;27782:160:0;27953:52;27976:4;27982:2;27986:3;27991:7;28000:4;27953:22;:52::i;:::-;27571:442;;;;;:::o;73139:188::-;72815:7;72847:12;;;:6;:12;;;;;:22;;;70988:30;70999:4;20944:10;70988;:30::i;:::-;73294:25:::1;73305:4;73311:7;73294:10;:25::i;:::-;73139:188:::0;;;:::o;74269:287::-;-1:-1:-1;;;;;74411:23:0;;20944:10;74411:23;74389:120;;;;-1:-1:-1;;;74389:120:0;;27202:2:1;74389:120:0;;;27184:21:1;27241:2;27221:18;;;27214:30;27280:34;27260:18;;;27253:62;-1:-1:-1;;;27331:18:1;;;27324:45;27386:19;;74389:120:0;27000:411:1;74389:120:0;74522:26;74534:4;74540:7;74522:11;:26::i;:::-;74269:287;;:::o;115642:805::-;110694:32;-1:-1:-1;;;;;;;;;;;110715:10:0;110694:7;:32::i;:::-;110728:23;43106:1;110728:10;:23::i;:::-;110686:66;;;;;-1:-1:-1;;;110686:66:0;;;;;;;;:::i;:::-;-1:-1:-1;115829:18:0;115862:50:::1;46300:2;115862:10;:50::i;:::-;115807:116;;;;;-1:-1:-1::0;;;115807:116:0::1;;;;;;;;:::i;:::-;;115936:10;115949:25;:15;94113:14:::0;;94021:114;115949:25:::1;115936:38;;115985:26;115991:3;115996:2;116000:6;115985:26;;;;;;;;;;;::::0;:5:::1;:26::i;:::-;116022:14;::::0;;;:10:::1;:14;::::0;;;;;;;:21;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;116054:14:0::1;::::0;;;:10:::1;:14;::::0;;;;;;;:20;;-1:-1:-1;;;;;;116054:20:0::1;-1:-1:-1::0;;;;;116054:20:0;::::1;::::0;;::::1;::::0;;;116122:16:::1;:20:::0;;;;;:36;;;116169:27;;;:12:::1;:27:::0;;;;;:36:::1;;:45:::0;;-1:-1:-1;116169:45:0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;116232:46;116244:10:::1;::::0;116232:46:::1;::::0;::::1;::::0;116054:14;;116265:4;;116271:6;;116232:46:::1;:::i;:::-;;;;;;;;116293:10;-1:-1:-1::0;;;;;116293:17:0;::::1;;116289:64;;116312:41;116331:3;116336:10;116348:4;116312:18;:41::i;:::-;116388:6;::::0;116364:37:::1;::::0;116383:3;;-1:-1:-1;;;;;116388:6:0::1;::::0;116364:18:::1;:37::i;:::-;116412:27;:15;94232:19:::0;;94250:1;94232:19;;;94143:127;121056:87;-1:-1:-1;;;;;;;;;;;70988:30:0;99880:24;20944:10;70988;:30::i;:::-;121125:10:::1;:8;:10::i;:::-;121056:87:::0;:::o;25910:561::-;26066:16;26141:3;:10;26122:8;:15;:29;26100:120;;;;-1:-1:-1;;;26100:120:0;;27985:2:1;26100:120:0;;;27967:21:1;28024:2;28004:18;;;27997:30;28063:34;28043:18;;;28036:62;-1:-1:-1;;;28114:18:1;;;28107:39;28163:19;;26100:120:0;27783:405:1;26100:120:0;26233:30;26280:8;:15;-1:-1:-1;;;;;26266:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26266:30:0;;26233:63;;26314:9;26309:122;26333:8;:15;26329:1;:19;26309:122;;;26389:30;26399:8;26408:1;26399:11;;;;;;;;:::i;:::-;;;;;;;26412:3;26416:1;26412:6;;;;;;;;:::i;:::-;;;;;;;26389:9;:30::i;:::-;26370:13;26384:1;26370:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;26350:3;;;:::i;:::-;;;26309:122;;;-1:-1:-1;26450:13:0;25910:561;-1:-1:-1;;;25910:561:0:o;120266:152::-;110839:36;-1:-1:-1;;;;;;;;;;;110864:10:0;110839:7;:36::i;:::-;110890:27;45984:2;110890:10;:27::i;:::-;110817:111;;;;;-1:-1:-1;;;110817:111:0;;;;;;;;:::i;:::-;-1:-1:-1;120392:18:0;;::::1;::::0;:8:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;58534:353::-:0;-1:-1:-1;;;;;58699:23:0;;20944:10;58699:23;;:66;;-1:-1:-1;58726:39:0;58743:7;20944:10;26803:218;:::i;58726:39::-;58677:157;;;;-1:-1:-1;;;58677:157:0;;;;;;;:::i;:::-;58847:32;58858:7;58867:3;58872:6;58847:10;:32::i;120475:91::-;120517:13;120550:8;120543:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;120475:91;:::o;120771:83::-;-1:-1:-1;;;;;;;;;;;70988:30:0;99880:24;20944:10;70988;:30::i;:::-;120838:8:::1;:6;:8::i;47569:154::-:0;-1:-1:-1;;;;;47696:19:0;;;;;;:12;:19;;;;;;;;;47689:26;;;;;;;;;;;;;;;;;47655:16;;47689:26;;;47696:19;47689:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47569:154;;;:::o;118406:212::-;110839:36;-1:-1:-1;;;;;;;;;;;110864:10:0;110839:7;:36::i;:::-;110890:27;45984:2;110890:10;:27::i;:::-;110817:111;;;;;-1:-1:-1;;;110817:111:0;;;;;;;;:::i;:::-;-1:-1:-1;118538:19:0::1;::::0;;;:10:::1;:19;::::0;;;;;;;:30;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;118602:7;118584:26;118588:12;118592:7;118588:3;:12::i;:::-;118584:26;;;;;;:::i;:::-;;;;;;;;118406:212:::0;;:::o;91643:203::-;91778:7;91810:18;;;:12;:18;;;;;:28;;91832:5;91810:21;:28::i;71493:197::-;71624:4;71653:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;71653:29:0;;;;;;;;;;;;;;;71493:197::o;119756:173::-;110839:36;-1:-1:-1;;;;;;;;;;;110864:10:0;110839:7;:36::i;:::-;110890:27;45984:2;110890:10;:27::i;:::-;110817:111;;;;;-1:-1:-1;;;110817:111:0;;;;;;;;:::i;:::-;-1:-1:-1;119842:26:0;;::::1;::::0;:12:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;:::-;;119884:37;119908:12;119884:37;;;;;;:::i;106218:562::-:0;106433:6;;106380:4;;-1:-1:-1;;;;;106433:6:0;106419:10;:20;106454:49;46536:2;106454:10;:49::i;:::-;106397:117;;;;;-1:-1:-1;;;106397:117:0;;;;;;;;:::i;:::-;-1:-1:-1;106527:27:0;;;;:12;:27;;;;;:44;;:57;;106575:9;;106527:27;:57;;106575:9;;106527:57;:::i;:::-;;;;-1:-1:-1;;;;;;;106647:30:0;;;;;;:21;:30;;;;;;;;:45;;;;;;;;:58;;106696:9;;106647:30;:58;;106696:9;;106647:58;:::i;:::-;;;;-1:-1:-1;106768:4:0;;106218:562;-1:-1:-1;;;;;106218:562:0:o;26544:187::-;26671:52;20944:10;26704:8;26714;26671:18;:52::i;106788:2364::-;106927:4;-1:-1:-1;;;;;;;;;;;70988:30:0;99811:24;20944:10;70988;:30::i;:::-;106957:8;106967:50:::1;46300:2;106967:10;:50::i;:::-;106949:69;;;;;-1:-1:-1::0;;;106949:69:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;107065:17:0::1;::::0;;;:12:::1;:17;::::0;;;;:23:::1;;::::0;-1:-1:-1;;;;;107065:23:0::1;107051:10;:37;107103:25;46349:2;107103:10;:25::i;:::-;107029:110;;;;;-1:-1:-1::0;;;107029:110:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;107208:1:0::1;107180:17;:11:::0;;:17:::1;:::i;:::-;107174:31;;:35;107224:37;46226:2;107224:10;:37::i;:::-;107152:120;;;;;-1:-1:-1::0;;;107152:120:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;107345:1:0::1;107311:23;;::::0;::::1;:11:::0;:23:::1;:::i;:::-;107305:37;;:41;107361:37;46226:2;107361:10;:37::i;:::-;107283:126;;;;;-1:-1:-1::0;;;107283:126:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;107480:1:0::1;107448:21;;::::0;::::1;:11:::0;:21:::1;:::i;:::-;107442:35;;:39;107496:37;46226:2;107496:10;:37::i;:::-;107420:124;;;;;-1:-1:-1::0;;;107420:124:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;107613:1:0::1;107583:19;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;107577:33;;:37;107629;46226:2;107629:10;:37::i;:::-;107555:122;;;;;-1:-1:-1::0;;;107555:122:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;107746:1:0::1;107716:19;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;107710:33;;:37;107762;46226:2;107762:10;:37::i;:::-;107688:122;;;;;-1:-1:-1::0;;;107688:122:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;107873:1:0::1;107843:20;;::::0;::::1;:11:::0;:20:::1;:::i;:::-;:27;;:31;107889:37;46226:2;107889:10;:37::i;:::-;107821:116;;;;;-1:-1:-1::0;;;107821:116:0::1;;;;;;;;:::i;:::-;;108005:1;107970:11;:32;;;:36;:95;;;;108027:11;:32;;;-1:-1:-1::0;;108027:38:0::1;107970:95;108080:37;46226:2;108080:10;:37::i;:::-;107948:180;;;;;-1:-1:-1::0;;;107948:180:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;108321:17:0::1;:11:::0;;:17:::1;:::i;:::-;108295;::::0;;;:12:::1;:17;::::0;;;;:43:::1;::::0;:17;;:43:::1;:::i;:::-;-1:-1:-1::0;108381:23:0::1;;::::0;::::1;:11:::0;:23:::1;:::i;:::-;108349:17;::::0;;;:12:::1;:17;::::0;;;;:55:::1;::::0;:29:::1;::::0;;::::1;::::0;:55:::1;:::i;:::-;-1:-1:-1::0;108445:21:0::1;;::::0;::::1;:11:::0;:21:::1;:::i;:::-;108415:17;::::0;;;:12:::1;:17;::::0;;;;:51:::1;::::0;:27:::1;::::0;;::::1;::::0;:51:::1;:::i;:::-;-1:-1:-1::0;108505:19:0::1;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;108477:17;::::0;;;:12:::1;:17;::::0;;;;:47:::1;::::0;:25:::1;::::0;;::::1;::::0;:47:::1;:::i;:::-;-1:-1:-1::0;108563:19:0::1;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;108535:17;::::0;;;:12:::1;:17;::::0;;;;:47:::1;::::0;:25:::1;::::0;;::::1;::::0;:47:::1;:::i;:::-;-1:-1:-1::0;108622:20:0::1;;::::0;::::1;:11:::0;:20:::1;:::i;:::-;108593:17;::::0;;;:12:::1;:17;::::0;;;;:49:::1;::::0;:26:::1;::::0;;::::1;::::0;:49:::1;:::i;:::-;-1:-1:-1::0;108653:17:0::1;::::0;;;:12:::1;:17;::::0;;;;108691:29:::1;::::0;::::1;;108653:35;::::0;::::1;:67:::0;108772:46:::1;::::0;::::1;;108731:38;::::0;::::1;:87:::0;108859:15:::1;108829:27;::::0;;::::1;:45:::0;108887:194:::1;108911:27;;::::0;::::1;:11:::0;:27:::1;:::i;:::-;:34;;108907:1;:38;108887:194;;;108967:17;::::0;;;:12:::1;:17;::::0;;;;:33:::1;;109024:27;;::::0;::::1;:11:::0;:27:::1;:::i;:::-;109052:1;109024:30;;;;;;;:::i;:::-;108967:102:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;108967:102:0;;;::::1;::::0;;;109024:30:::1;::::0;;::::1;::::0;;;::::1;::::0;108967:102:::1;;::::0;;::::1;::::0;-1:-1:-1;108967:102:0::1;109024:30:::0;108967:102;31511:5:1;31498:19;31492:4;31485:33;31572:2;31565:5;31561:14;31548:28;31544:1;31538:4;31534:12;31527:50;31631:2;31624:5;31620:14;31607:28;31603:1;31597:4;31593:12;31586:50;;;31332:310;108967:102:0::1;;;108947:3;;;;;:::i;:::-;;;;108887:194;;;-1:-1:-1::0;109098:22:0::1;::::0;109116:3;;109098:22:::1;::::0;;;::::1;-1:-1:-1::0;109140:4:0::1;::::0;106788:2364;-1:-1:-1;;;106788:2364:0:o;116518:686::-;116656:39;70542:4;116684:10;116656:7;:39::i;:::-;:88;;;-1:-1:-1;116716:14:0;;;;:10;:14;;;;;;-1:-1:-1;;;;;116716:14:0;116734:10;116716:28;116656:88;116759:39;44956:2;116759:10;:39::i;:::-;116634:175;;;;;-1:-1:-1;;;116634:175:0;;;;;;;;:::i;:::-;-1:-1:-1;116820:22:0;116845:14;;;:10;:14;;;;;116820:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;116903:1;116884:8;116878:22;:26;116906:23;43468:1;116906:10;:23::i;:::-;116870:60;;;;;-1:-1:-1;;;116870:60:0;;;;;;;;:::i;:::-;;116941:26;116947:3;116952:2;116956:6;116941:26;;;;;;;;;;;;:5;:26::i;:::-;117007:3;-1:-1:-1;;;;;116983:50:0;116995:10;-1:-1:-1;;;;;116983:50:0;;117012:2;117016:8;117026:6;116983:50;;;;;;;;:::i;:::-;;;;;;;;117050:10;-1:-1:-1;;;;;117050:17:0;;;117046:64;;117069:41;117088:3;117093:10;117105:4;117069:18;:41::i;:::-;117145:6;;117121:37;;117140:3;;-1:-1:-1;;;;;117145:6:0;;117121:18;:37::i;:::-;117169:27;:15;94232:19;;94250:1;94232:19;;;94143:127;117169:27;116623:581;116518:686;;;:::o;105228:787::-;-1:-1:-1;;;;;;;;;;;70988:30:0;99811:24;20944:10;70988;:30::i;:::-;105401:18;105434:50:::1;46300:2;105434:10;:50::i;:::-;105379:116;;;;;-1:-1:-1::0;;;105379:116:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;105542:27:0::1;::::0;;;:12:::1;:27;::::0;;;;:33:::1;;::::0;-1:-1:-1;;;;;105542:33:0::1;105528:10;:47;105590:25;46349:2;105590:10;:25::i;:::-;105506:120;;;;;-1:-1:-1::0;;;105506:120:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;105645:20:0;;;105667:30:::1;46463:2;105667:10;:30::i;:::-;105637:61;;;;;-1:-1:-1::0;;;105637:61:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;105711:27:0::1;::::0;;;:12:::1;:27;::::0;;;;:48:::1;::::0;:36:::1;;105750:9:::0;;105711:48:::1;:::i;:::-;-1:-1:-1::0;105770:27:0::1;::::0;;;:12:::1;:27;::::0;;;;;105810:15:::1;105770:37;::::0;;::::1;:55:::0;105843:32;105783:13;;105843:32:::1;::::0;::::1;105893:9;105888:120;105908:20:::0;;::::1;105888:120;;;105983:13;105950:16;:30;105967:9;;105977:1;105967:12;;;;;;;:::i;:::-;;;;;;;105950:30;;;;;;;;;;;:46;;;;105930:3;;;;;:::i;:::-;;;;105888:120;;110956:1509:::0;19149:13;;;;;;;:48;;19185:12;;;;19184:13;19149:48;;;19975:4;10348:19;:23;19165:16;19127:144;;;;-1:-1:-1;;;19127:144:0;;31849:2:1;19127:144:0;;;31831:21:1;31888:2;31868:18;;;31861:30;31927:34;31907:18;;;31900:62;-1:-1:-1;;;31978:18:1;;;31971:44;32032:19;;19127:144:0;31647:410:1;19127:144:0;19284:19;19307:13;;;;;;19306:14;19331:101;;;;19366:13;:20;;-1:-1:-1;;19401:19:0;;;;;19331:101;-1:-1:-1;;;;;111177:21:0;::::1;::::0;::::1;111213:49;45418:2;111213:10;:49::i;:::-;111155:118;;;;;-1:-1:-1::0;;;111155:118:0::1;;;;;;;;:::i;:::-;;111286:20;111301:4;111286:14;:20::i;:::-;111317:22;:20;:22::i;:::-;111350:37;:35;:37::i;:::-;111398:26;:24;:26::i;:::-;111435:22;:20;:22::i;:::-;111468:24;:22;:24::i;:::-;111503;:22;:24::i;:::-;111570:19:::0;;::::1;::::0;:12:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;111634:13:0::1;::::0;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;111634:13:0;;;;::::1;::::0;:8:::1;::::0;:13:::1;:::i;:::-;-1:-1:-1::0;111705:5:0::1;:14:::0;;-1:-1:-1;;;;;111705:14:0;;::::1;-1:-1:-1::0;;;;;;111705:14:0;;::::1;;::::0;;;111767:6:::1;:16:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;111850:38:::1;111705:5;111713:6:::0;111850:10:::1;:38::i;:::-;111948:26;111962:11;111948:13;:26::i;:::-;112021:35;-1:-1:-1::0;;;;;;;;;;;112049:6:0::1;112021:10;:35::i;:::-;112067:40;-1:-1:-1::0;;;;;;;;;;;112095:11:0::1;112067:10;:40::i;:::-;112118:37;-1:-1:-1::0;;;;;;;;;;;112148:6:0::1;112118:10;:37::i;:::-;112166:42;-1:-1:-1::0;;;;;;;;;;;112196:11:0::1;112166:10;:42::i;:::-;112219:51;-1:-1:-1::0;;;;;;;;;;;100032:30:0;112219:13:::1;:51::i;:::-;112281:31;-1:-1:-1::0;;;;;;;;;;;112305:6:0::1;112281:10;:31::i;:::-;112323:36;-1:-1:-1::0;;;;;;;;;;;112347:11:0::1;112323:10;:36::i;:::-;112370:45;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;112370:13:0::1;:45::i;:::-;112426:31;-1:-1:-1::0;;;;;;;;;;;112450:6:0::1;112426:10;:31::i;:::-;19462:14:::0;19458:68;;;19509:5;19493:21;;-1:-1:-1;;19493:21:0;;;19458:68;18842:691;110956:1509;;;;;:::o;92020:192::-;92145:7;92177:18;;;:12;:18;;;;;:27;;:25;:27::i;109733:658::-;109866:4;-1:-1:-1;;;;;;;;;;;70988:30:0;99811:24;20944:10;70988;:30::i;:::-;109896:8;109906:50:::1;46300:2;109906:10;:50::i;:::-;109888:69;;;;;-1:-1:-1::0;;;109888:69:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;110004:17:0::1;::::0;;;:12:::1;:17;::::0;;;;:23:::1;;::::0;-1:-1:-1;;;;;110004:23:0::1;109990:10;:37;110042:25;46349:2;110042:10;:25::i;:::-;109968:110;;;;;-1:-1:-1::0;;;109968:110:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;110142:20:0;::::1;110152:10;110142:20;;110164:32;43951:2;110164:10;:32::i;:::-;110134:63;;;;;-1:-1:-1::0;;;110134:63:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;110210:17:0::1;::::0;;;:12:::1;:17;::::0;;;;;;;;:23:::1;::::0;::::1;:32:::0;;-1:-1:-1;;;;;;110210:32:0::1;-1:-1:-1::0;;;;;110210:32:0;::::1;::::0;;::::1;::::0;;;110283:15:::1;110253:27;::::0;;::::1;:45:::0;;;;110316:43;;597:25:1;;;110316:43:0::1;::::0;570:18:1;110316:43:0::1;;;;;;;-1:-1:-1::0;110379:4:0::1;::::0;109733:658;-1:-1:-1;;;109733:658:0:o;73572:190::-;72815:7;72847:12;;;:6;:12;;;;;:22;;;70988:30;70999:4;20944:10;70988;:30::i;:::-;73728:26:::1;73740:4;73746:7;73728:11;:26::i;102797:2423::-:0;102923:10;-1:-1:-1;;;;;;;;;;;70988:30:0;99811:24;20944:10;70988;:30::i;:::-;103007:1:::1;102979:17;:11:::0;;:17:::1;:::i;:::-;102973:31;;:35;103023:37;46226:2;103023:10;:37::i;:::-;102951:120;;;;;-1:-1:-1::0;;;102951:120:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;103144:1:0::1;103110:23;;::::0;::::1;:11:::0;:23:::1;:::i;:::-;103104:37;;:41;103160:37;46226:2;103160:10;:37::i;:::-;103082:126;;;;;-1:-1:-1::0;;;103082:126:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;103279:1:0::1;103247:21;;::::0;::::1;:11:::0;:21:::1;:::i;:::-;103241:35;;:39;103295:37;46226:2;103295:10;:37::i;:::-;103219:124;;;;;-1:-1:-1::0;;;103219:124:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;103412:1:0::1;103382:19;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;103376:33;;:37;103428;46226:2;103428:10;:37::i;:::-;103354:122;;;;;-1:-1:-1::0;;;103354:122:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;103545:1:0::1;103515:19;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;103509:33;;:37;103561;46226:2;103561:10;:37::i;:::-;103487:122;;;;;-1:-1:-1::0;;;103487:122:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;103723:1:0::1;103694:17;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;103694:31:0::1;;;103727:24;43256:1;103727:10;:24::i;:::-;103686:66;;;;;-1:-1:-1::0;;;103686:66:0::1;;;;;;;;:::i;:::-;;103817:1;103785:11;:29;;;:33;:89;;;;103839:11;:29;;;-1:-1:-1::0;;103839:35:0::1;103785:89;103889:37;46226:2;103889:10;:37::i;:::-;103763:174;;;;;-1:-1:-1::0;;;103763:174:0::1;;;;;;;;:::i;:::-;;104005:1;103970:11;:32;;;:36;:95;;;;104027:11;:32;;;-1:-1:-1::0;;104027:38:0::1;103970:95;104080:37;46226:2;104080:10;:37::i;:::-;103948:180;;;;;-1:-1:-1::0;;;103948:180:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;104146:20:0::1;94113:14:::0;104141:35;-1:-1:-1;104214:17:0::1;:11:::0;;:17:::1;:::i;:::-;104189:16;::::0;;;:12:::1;:16;::::0;;;;:42:::1;::::0;:16;;:42:::1;:::i;:::-;-1:-1:-1::0;104273:23:0::1;;::::0;::::1;:11:::0;:23:::1;:::i;:::-;104242:16;::::0;;;:12:::1;:16;::::0;;;;:54:::1;::::0;:28:::1;::::0;;::::1;::::0;:54:::1;:::i;:::-;-1:-1:-1::0;104336:21:0::1;;::::0;::::1;:11:::0;:21:::1;:::i;:::-;104307:16;::::0;;;:12:::1;:16;::::0;;;;:50:::1;::::0;:26:::1;::::0;;::::1;::::0;:50:::1;:::i;:::-;-1:-1:-1::0;104395:19:0::1;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;104368:16;::::0;;;:12:::1;:16;::::0;;;;:46:::1;::::0;:24:::1;::::0;;::::1;::::0;:46:::1;:::i;:::-;-1:-1:-1::0;104452:19:0::1;;::::0;::::1;:11:::0;:19:::1;:::i;:::-;104425:16;::::0;;;:12:::1;:16;::::0;;;;:46:::1;::::0;:24:::1;::::0;;::::1;::::0;:46:::1;:::i;:::-;-1:-1:-1::0;104510:20:0::1;;::::0;::::1;:11:::0;:20:::1;:::i;:::-;104482:16;::::0;;;:12:::1;:16;::::0;;;;:48:::1;::::0;:25:::1;::::0;;::::1;::::0;:48:::1;:::i;:::-;-1:-1:-1::0;104566:17:0::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;104541:16;::::0;;;:12:::1;:16;::::0;;;;:22:::1;::::0;::::1;:42:::0;;-1:-1:-1;;;;;;104541:42:0::1;-1:-1:-1::0;;;;;104541:42:0;;;::::1;::::0;;;::::1;::::0;;;104623:15:::1;104594:26;::::0;::::1;:44:::0;104649:26:::1;::::0;::::1;:30:::0;;;104727:29:::1;::::0;::::1;;104690:34;::::0;::::1;:66:::0;104807:46:::1;::::0;::::1;;104767:37;::::0;::::1;:86:::0;104864:33:::1;::::0;;::::1;:37:::0;;;104914:193:::1;104938:27;;::::0;::::1;:11:::0;:27:::1;:::i;:::-;:34;;104934:1;:38;104914:193;;;104994:16;::::0;;;:12:::1;:16;::::0;;;;:32:::1;;105050:27;;::::0;::::1;:11:::0;:27:::1;:::i;:::-;105078:1;105050:30;;;;;;;:::i;:::-;104994:101:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;104994:101:0;;;::::1;::::0;;;105050:30:::1;::::0;;::::1;::::0;;;::::1;::::0;104994:101:::1;;::::0;;::::1;::::0;-1:-1:-1;104994:101:0::1;105050:30:::0;104994:101;31511:5:1;31498:19;31492:4;31485:33;31572:2;31565:5;31561:14;31548:28;31544:1;31538:4;31534:12;31527:50;31631:2;31624:5;31620:14;31607:28;31603:1;31597:4;31593:12;31586:50;;;31332:310;104994:101:0::1;;;104974:3;;;;;:::i;:::-;;;;104914:193;;;;105119:32;:20;94232:19:::0;;94250:1;94232:19;;;94143:127;105119:32:::1;105169:21;::::0;105187:2;;105169:21:::1;::::0;;;::::1;71029:1;102797:2423:::0;;;;:::o;46606:132::-;46663:13;46696:34;46720:8;46696:34;;:16;:34::i;102208:173::-;102314:17;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102314:17:0;102356;;;;:12;:17;;;;;;;102349:24;;;;;;;;;;;;102356:17;;102349:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;102349:24:0;-1:-1:-1;;;;;102349:24:0;-1:-1:-1;;;;;102349:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;102349:24:0;;-1:-1:-1;102349:24:0;;102208:173;-1:-1:-1;;;102208:173:0:o;122244:684::-;122343:21;122421:1;122390:21;122404:6;122390:13;:21::i;:::-;:28;:32;122424:24;45231:2;122424:10;:24::i;:::-;122382:67;;;;;-1:-1:-1;;;122382:67:0;;;;;;;;:::i;:::-;;122460:20;122483:21;122497:6;122483:13;:21::i;:::-;122460:44;;122515:16;122546:34;122602:3;:10;-1:-1:-1;;;;;122583:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;122583:30:0;;;;;;;;;;;;;;;;122546:67;;122631:9;122626:265;122650:3;:10;122646:1;:14;122626:265;;;122682:25;122710:96;;;;;;;;122741:3;122745:1;122741:6;;;;;;;;:::i;:::-;;;;;;;122710:96;;;;122766:25;122776:6;122784:3;122788:1;122784:6;;;;;;;;:::i;122766:25::-;122710:96;;;122682:124;;122846:5;122821:12;122834:8;122821:22;;;;;;;;:::i;:::-;;;;;;;;;;:30;122866:13;122878:1;122866:13;;:::i;:::-;;;122667:224;122662:3;;;;;:::i;:::-;;;;122626:265;;;-1:-1:-1;122908:12:0;122244:684;-1:-1:-1;;;;122244:684:0:o;120004:99::-;120050:13;120083:12;120076:19;;;;;:::i;27093:401::-;-1:-1:-1;;;;;27301:20:0;;20944:10;27301:20;;:60;;-1:-1:-1;27325:36:0;27342:4;20944:10;26803:218;:::i;27325:36::-;27279:151;;;;-1:-1:-1;;;27279:151:0;;;;;;;:::i;:::-;27441:45;27459:4;27465:2;27469;27473:6;27481:4;27441:17;:45::i;109218:507::-;109373:4;-1:-1:-1;;;;;;;;;;;70988:30:0;99811:24;20944:10;70988;:30::i;:::-;109438:1:::1;109412:16;:23;:27;109454:36;46409:2;109454:10;:36::i;:::-;109390:111;;;;;-1:-1:-1::0;;;109390:111:0::1;;;;;;;;:::i;:::-;;109519:9;109514:140;109538:16;:23;109534:1;:27;109514:140;;;109583:12;:17;109596:3;109583:17;;;;;;;;;;;:33;;109622:16;109639:1;109622:19;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;109583:59;;::::1;::::0;;::::1;::::0;;-1:-1:-1;109583:59:0;;;;;;;;;::::1;::::0;;::::1;;::::0;;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;109563:3;::::1;::::0;::::1;:::i;:::-;;;;109514:140;;58205:321:::0;-1:-1:-1;;;;;58345:23:0;;20944:10;58345:23;;:66;;-1:-1:-1;58372:39:0;58389:7;20944:10;26803:218;:::i;58372:39::-;58323:157;;;;-1:-1:-1;;;58323:157:0;;;;;;;:::i;:::-;58493:25;58499:7;58508:2;58512:5;58493;:25::i;90730:314::-;90860:4;-1:-1:-1;;;;;;90902:81:0;;-1:-1:-1;;;90902:81:0;;:134;;;91000:36;91024:11;91000:23;:36::i;34562:737::-;-1:-1:-1;;;;;34689:18:0;;34681:66;;;;-1:-1:-1;;;34681:66:0;;;;;;;:::i;:::-;20944:10;34804:191;20944:10;34862:4;34760:16;34906:21;34924:2;34906:17;:21::i;:::-;34942:25;34960:6;34942:17;:25::i;:::-;34804:191;;;;;;;;;;;;:20;:191::i;:::-;35008:19;35030:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;35030:19:0;;;;;;;;;;35068:21;;;;35060:70;;;;-1:-1:-1;;;35060:70:0;;;;;;;:::i;:::-;35166:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;35166:19:0;;;;;;;;;;;;35188:20;;;35166:42;;35237:54;;33045:25:1;;;33086:18;;;33079:34;;;35166:19:0;;35237:54;;;;;;33018:18:1;35237:54:0;;;;;;;34670:629;;34562:737;;;:::o;33451:861::-;-1:-1:-1;;;;;33629:16:0;;33621:62;;;;-1:-1:-1;;;33621:62:0;;;;;;;:::i;:::-;33730:7;:14;33716:3;:10;:28;33694:118;;;;-1:-1:-1;;;33694:118:0;;;;;;;:::i;:::-;20944:10;33869:66;20944:10;33825:16;33912:2;33916:3;33921:7;33930:4;33869:20;:66::i;:::-;33953:9;33948:103;33972:3;:10;33968:1;:14;33948:103;;;34029:7;34037:1;34029:10;;;;;;;;:::i;:::-;;;;;;;34004:9;:17;34014:3;34018:1;34014:6;;;;;;;;:::i;:::-;;;;;;;34004:17;;;;;;;;;;;:21;34022:2;-1:-1:-1;;;;;34004:21:0;-1:-1:-1;;;;;34004:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;33984:3:0;;-1:-1:-1;33984:3:0;;;:::i;:::-;;;;33948:103;;;;34104:2;-1:-1:-1;;;;;34068:53:0;34100:1;-1:-1:-1;;;;;34068:53:0;34082:8;-1:-1:-1;;;;;34068:53:0;;34108:3;34113:7;34068:53;;;;;;;:::i;:::-;;;;;;;;34134:170;34184:8;34215:1;34232:2;34249:3;34267:7;34289:4;34134:35;:170::i;36621:331::-;36776:8;-1:-1:-1;;;;;36767:17:0;:5;-1:-1:-1;;;;;36767:17:0;;;36759:71;;;;-1:-1:-1;;;36759:71:0;;34607:2:1;36759:71:0;;;34589:21:1;34646:2;34626:18;;;34619:30;34685:34;34665:18;;;34658:62;-1:-1:-1;;;34736:18:1;;;34729:39;34785:19;;36759:71:0;34405:405:1;36759:71:0;-1:-1:-1;;;;;36841:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;36841:46:0;;;;;;;;;;36903:41;;1159::1;;;36903::0;;1132:18:1;36903:41:0;;;;;;;36621:331;;;:::o;29781:1249::-;30022:7;:14;30008:3;:10;:28;29986:118;;;;-1:-1:-1;;;29986:118:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30123:16:0;;30115:66;;;;-1:-1:-1;;;30115:66:0;;;;;;;:::i;:::-;20944:10;30238:60;20944:10;30269:4;30275:2;30279:3;30284:7;30293:4;30238:20;:60::i;:::-;30316:9;30311:470;30335:3;:10;30331:1;:14;30311:470;;;30367:10;30380:3;30384:1;30380:6;;;;;;;;:::i;:::-;;;;;;;30367:19;;30401:14;30418:7;30426:1;30418:10;;;;;;;;:::i;:::-;;;;;;;;;;;;30445:19;30467:13;;;:9;:13;;;;;;-1:-1:-1;;;;;30467:19:0;;;;;;;;;;;;30418:10;;-1:-1:-1;30527:21:0;;;;30501:125;;;;-1:-1:-1;;;30501:125:0;;;;;;;:::i;:::-;30670:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;30670:19:0;;;;;;;;;;30692:20;;;30670:42;;30742:17;;;;;;;:27;;30692:20;;30670:13;30742:27;;30692:20;;30742:27;:::i;:::-;;;;;;;;30352:429;;;30347:3;;;;:::i;:::-;;;30311:470;;;;30828:2;-1:-1:-1;;;;;30798:47:0;30822:4;-1:-1:-1;;;;;30798:47:0;30812:8;-1:-1:-1;;;;;30798:47:0;;30832:3;30837:7;30798:47;;;;;;;:::i;:::-;;;;;;;;30858:164;30908:8;30931:4;30950:2;30967:3;30985:7;31007:4;30858:35;:164::i;71980:527::-;72069:22;72077:4;72083:7;72069;:22::i;:::-;72064:436;;72257:52;72296:7;-1:-1:-1;;;;;72257:52:0;72306:2;72257:30;:52::i;:::-;72382:49;72421:4;72428:2;72382:30;:49::i;:::-;72162:292;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;72162:292:0;;;;;;;;;;-1:-1:-1;;;72108:380:0;;;;;;;:::i;92305:201::-;92425:31;92442:4;92448:7;92425:16;:31::i;:::-;92467:18;;;;:12;:18;;;;;:31;;92490:7;92467:22;:31::i;92600:206::-;92721:32;92739:4;92745:7;92721:17;:32::i;:::-;92764:18;;;;:12;:18;;;;;:34;;92790:7;92764:25;:34::i;32348:747::-;-1:-1:-1;;;;;32501:16:0;;32493:62;;;;-1:-1:-1;;;32493:62:0;;;;;;;:::i;:::-;20944:10;32612:191;20944:10;32568:16;32695:2;32712:21;32730:2;32712:17;:21::i;:::-;32748:25;32766:6;32748:17;:25::i;:::-;32788:4;32612:20;:191::i;:::-;32816:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;32816:17:0;;;;;;;;;:27;;32837:6;;32816:13;:27;;32837:6;;32816:27;:::i;:::-;;;;-1:-1:-1;;32859:52:0;;;33045:25:1;;;33101:2;33086:18;;33079:34;;;-1:-1:-1;;;;;32859:52:0;;;;32892:1;;32859:52;;;;;;33018:18:1;32859:52:0;;;;;;;32924:163;32969:8;33000:1;33017:2;33034;33051:6;33072:4;32924:30;:163::i;61601:120::-;60613:7;;;;61137:41;;;;-1:-1:-1;;;61137:41:0;;36625:2:1;61137:41:0;;;36607:21:1;36664:2;36644:18;;;36637:30;-1:-1:-1;;;36683:18:1;;;36676:50;36743:18;;61137:41:0;36423:344:1;61137:41:0;61660:7:::1;:15:::0;;-1:-1:-1;;61660:15:0::1;::::0;;61691:22:::1;20944:10:::0;61700:12:::1;61691:22;::::0;-1:-1:-1;;;;;9778:32:1;;;9760:51;;9748:2;9733:18;61691:22:0::1;;;;;;;61601:120::o:0;35502:977::-;-1:-1:-1;;;;;35654:18:0;;35646:66;;;;-1:-1:-1;;;35646:66:0;;;;;;;:::i;:::-;35759:7;:14;35745:3;:10;:28;35723:118;;;;-1:-1:-1;;;35723:118:0;;;;;;;:::i;:::-;35854:16;20944:10;35854:31;;35898:66;35919:8;35929:4;35943:1;35947:3;35952:7;35898:66;;;;;;;;;;;;:20;:66::i;:::-;35982:9;35977:422;36001:3;:10;35997:1;:14;35977:422;;;36033:10;36046:3;36050:1;36046:6;;;;;;;;:::i;:::-;;;;;;;36033:19;;36067:14;36084:7;36092:1;36084:10;;;;;;;;:::i;:::-;;;;;;;;;;;;36111:19;36133:13;;;:9;:13;;;;;;-1:-1:-1;;;;;36133:19:0;;;;;;;;;;;;36084:10;;-1:-1:-1;36193:21:0;;;;36167:119;;;;-1:-1:-1;;;36167:119:0;;;;;;;:::i;:::-;36330:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;36330:19:0;;;;;;;;;;36352:20;;36330:42;;36013:3;;;;:::i;:::-;;;;35977:422;;;;36454:1;-1:-1:-1;;;;;36416:55:0;36440:4;-1:-1:-1;;;;;36416:55:0;36430:8;-1:-1:-1;;;;;36416:55:0;;36458:3;36463:7;36416:55;;;;;;;:::i;:::-;;;;;;;;35635:844;35502:977;;;:::o;61342:118::-;60613:7;;;;60867:9;60859:38;;;;-1:-1:-1;;;60859:38:0;;36974:2:1;60859:38:0;;;36956:21:1;37013:2;36993:18;;;36986:30;-1:-1:-1;;;37032:18:1;;;37025:46;37088:18;;60859:38:0;36772:340:1;60859:38:0;61402:7:::1;:14:::0;;-1:-1:-1;;61402:14:0::1;61412:4;61402:14;::::0;;61432:20:::1;61439:12;20944:10:::0;;20864:98;86243:190;86344:7;86400:22;86404:3;86416:5;86400:3;:22::i;24021:119::-;19775:13;;;;;;;19767:69;;;;-1:-1:-1;;;19767:69:0;;;;;;;:::i;:::-;24102:30:::1;24127:4;24102:24;:30::i;70196:60::-:0;19775:13;;;;;;;19767:69;;;;-1:-1:-1;;;19767:69:0;;;;;;;:::i;:::-;70196:60::o;52866:117::-;19775:13;;;;;;;19767:69;;;;-1:-1:-1;;;19767:69:0;;;;;;;:::i;:::-;52939:36:::1;:34;:36::i;62683:106::-:0;19775:13;;;;;;;19767:69;;;;-1:-1:-1;;;19767:69:0;;;;;;;:::i;:::-;62754:27:::1;:25;:27::i;75215:112::-:0;75294:25;75305:4;75311:7;75294:10;:25::i;75459:251::-;75543:25;72847:12;;;:6;:12;;;;;;:22;;;;75600:34;;;;75650:52;;72847:22;;75600:34;;72847:22;;:12;;75650:52;;75543:25;75650:52;75532:178;75459:251;;:::o;85772:117::-;85835:7;85862:19;85870:3;81004:18;;80921:109;41056:723;41112:13;41333:10;41329:53;;-1:-1:-1;;41360:10:0;;;;;;;;;;;;-1:-1:-1;;;41360:10:0;;;;;41056:723::o;41329:53::-;41407:5;41392:12;41448:78;41455:9;;41448:78;;41481:8;;;;:::i;:::-;;-1:-1:-1;41504:10:0;;-1:-1:-1;41512:2:0;41504:10;;:::i;:::-;;;41448:78;;;41536:19;41568:6;-1:-1:-1;;;;;41558:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41558:17:0;;41536:39;;41586:154;41593:10;;41586:154;;41620:11;41630:1;41620:11;;:::i;:::-;;-1:-1:-1;41689:10:0;41697:2;41689:5;:10;:::i;:::-;41676:24;;:2;:24;:::i;:::-;41663:39;;41646:6;41653;41646:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;41646:56:0;;;;;;;;-1:-1:-1;41717:11:0;41726:2;41717:11;;:::i;:::-;;;41586:154;;;41764:6;41056:723;-1:-1:-1;;;;41056:723:0:o;28477:946::-;-1:-1:-1;;;;;28665:16:0;;28657:66;;;;-1:-1:-1;;;28657:66:0;;;;;;;:::i;:::-;20944:10;28780:185;20944:10;28838:4;28857:2;28874:21;28892:2;28874:17;:21::i;28780:185::-;28978:19;29000:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;29000:19:0;;;;;;;;;;29052:21;;;;29030:113;;;;-1:-1:-1;;;29030:113:0;;;;;;;:::i;:::-;29179:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;29179:19:0;;;;;;;;;;29201:20;;;29179:42;;29243:17;;;;;;;:27;;29201:20;;29179:13;29243:27;;29201:20;;29243:27;:::i;:::-;;;;-1:-1:-1;;29288:46:0;;;33045:25:1;;;33101:2;33086:18;;33079:34;;;-1:-1:-1;;;;;29288:46:0;;;;;;;;;;;;;;33018:18:1;29288:46:0;;;;;;;29347:68;29378:8;29388:4;29394:2;29398;29402:6;29410:4;29347:30;:68::i;:::-;28646:777;;28477:946;;;;;:::o;24355:404::-;24524:4;-1:-1:-1;;;;;;24566:52:0;;-1:-1:-1;;;24566:52:0;;:132;;-1:-1:-1;;;;;;;24635:63:0;;-1:-1:-1;;;24635:63:0;24566:132;:185;;;;24715:36;24739:11;24715:23;:36::i;40152:230::-;40304:16;;;40318:1;40304:16;;;;;;;;;40245;;40279:22;;40304:16;;;;;;;;;;;;-1:-1:-1;40304:16:0;40279:41;;40342:7;40331:5;40337:1;40331:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;40369:5;40152:230;-1:-1:-1;;40152:230:0:o;113257:1861::-;113657:9;113652:718;113676:3;:10;113672:1;:14;113652:718;;;113708:15;113726:3;113730:1;113726:6;;;;;;;;:::i;:::-;;;;;;;113708:24;;113747:14;113764:7;113772:1;113764:10;;;;;;;;:::i;:::-;;;;;;;113747:27;;113807:1;-1:-1:-1;;;;;113793:16:0;:2;-1:-1:-1;;;;;113793:16:0;;113789:570;;;113912:6;113884:24;113894:4;113900:7;113884:9;:24::i;:::-;:34;;113941:55;45035:2;113941:10;:55::i;:::-;113854:161;;;;;-1:-1:-1;;;113854:161:0;;;;;;;;:::i;:::-;;113789:570;;;-1:-1:-1;;;;;114041:18:0;;;;;;:38;;-1:-1:-1;;;;;;114063:16:0;;;;114041:38;114037:322;;;114186:6;114158:24;114168:4;114174:7;114158:9;:24::i;:::-;:34;;114215:109;45129:2;114215:10;:109::i;:::-;114128:215;;;;;-1:-1:-1;;;114128:215:0;;;;;;;;:::i;:::-;;114037:322;113693:677;;113688:3;;;;:::i;:::-;;;113652:718;;;;114420:66;114447:8;114457:4;114463:2;114467:3;114472:7;114481:4;114420:26;:66::i;:::-;114504:9;114499:612;114523:3;:10;114519:1;:14;114499:612;;;114555:15;114573:3;114577:1;114573:6;;;;;;;;:::i;:::-;;;;;;;114555:24;;114594:14;114611:7;114619:1;114611:10;;;;;;;;:::i;:::-;;;;;;;114594:27;;114656:1;-1:-1:-1;;;;;114640:18:0;:4;-1:-1:-1;;;;;114640:18:0;;114636:464;;;114703:40;114731:2;114735:7;114703:27;:40::i;:::-;114636:464;;;-1:-1:-1;;;;;114769:16:0;;114765:335;;114830:55;114863:4;114869:7;114878:6;114830:32;:55::i;114765:335::-;114919:2;-1:-1:-1;;;;;114911:10:0;:4;-1:-1:-1;;;;;114911:10:0;;114907:193;;114970:40;114998:2;115002:7;114970:27;:40::i;:::-;115029:55;115062:4;115068:7;115077:6;115029:32;:55::i;:::-;114540:571;;114535:3;;;;:::i;:::-;;;114499:612;;39126:1018;-1:-1:-1;;;;;39366:13:0;;10348:19;:23;39362:775;;39419:214;;-1:-1:-1;;;39419:214:0;;-1:-1:-1;;;;;39419:54:0;;;;;:214;;39496:8;;39527:4;;39554:3;;39580:7;;39610:4;;39419:214;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39419:214:0;;;;;;;;-1:-1:-1;;39419:214:0;;;;;;;;;;;;:::i;:::-;;;39398:728;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;39999:6;39992:14;;-1:-1:-1;;;39992:14:0;;;;;;;;:::i;39398:728::-;;;40048:62;;-1:-1:-1;;;40048:62:0;;39924:2:1;40048:62:0;;;39906:21:1;39963:2;39943:18;;;39936:30;40002:34;39982:18;;;39975:62;-1:-1:-1;;;40053:18:1;;;40046:50;40113:19;;40048:62:0;39722:416:1;39398:728:0;-1:-1:-1;;;;;;39718:92:0;;-1:-1:-1;;;39718:92:0;39692:231;;39853:50;;-1:-1:-1;;;39853:50:0;;;;;;;:::i;51761:483::-;51863:13;51894:19;51926:10;51930:6;51926:1;:10;:::i;:::-;:14;;51939:1;51926:14;:::i;:::-;-1:-1:-1;;;;;51916:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51916:25:0;;51894:47;;-1:-1:-1;;;51952:6:0;51959:1;51952:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;51952:15:0;;;;;;;;;-1:-1:-1;;;51978:6:0;51985:1;51978:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;51978:15:0;;;;;;;;-1:-1:-1;52009:9:0;52021:10;52025:6;52021:1;:10;:::i;:::-;:14;;52034:1;52021:14;:::i;:::-;52009:26;;52004:135;52041:1;52037;:5;52004:135;;;-1:-1:-1;;;52089:5:0;52097:3;52089:11;52076:25;;;;;;;:::i;:::-;;;;52064:6;52071:1;52064:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;52064:37:0;;;;;;;;-1:-1:-1;52126:1:0;52116:11;;;;;52044:3;;;:::i;:::-;;;52004:135;;;-1:-1:-1;52157:10:0;;52149:55;;;;-1:-1:-1;;;52149:55:0;;40895:2:1;52149:55:0;;;40877:21:1;;;40914:18;;;40907:30;40973:34;40953:18;;;40946:62;41025:18;;52149:55:0;40693:356:1;75839:238:0;75923:22;75931:4;75937:7;75923;:22::i;:::-;75918:152;;75962:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;75962:29:0;;;;;;;;;:36;;-1:-1:-1;;75962:36:0;75994:4;75962:36;;;76045:12;20944:10;;20864:98;76045:12;-1:-1:-1;;;;;76018:40:0;76036:7;-1:-1:-1;;;;;76018:40:0;76030:4;76018:40;;;;;;;;;;75839:238;;:::o;84869:175::-;84957:4;84986:50;84991:3;-1:-1:-1;;;;;85011:23:0;;84986:4;:50::i;76209:239::-;76293:22;76301:4;76307:7;76293;:22::i;:::-;76289:152;;;76364:5;76332:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;76332:29:0;;;;;;;;;;:37;;-1:-1:-1;;76332:37:0;;;76389:40;20944:10;;76332:12;;76389:40;;76364:5;76389:40;76209:239;;:::o;85220:181::-;85311:4;85340:53;85348:3;-1:-1:-1;;;;;85368:23:0;;85340:7;:53::i;38137:981::-;-1:-1:-1;;;;;38352:13:0;;10348:19;:23;38348:763;;38405:207;;-1:-1:-1;;;38405:207:0;;-1:-1:-1;;;;;38405:49:0;;;;;:207;;38477:8;;38508:4;;38535:2;;38560:6;;38589:4;;38405:207;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38405:207:0;;;;;;;;-1:-1:-1;;38405:207:0;;;;;;;;;;;;:::i;:::-;;;38384:716;;;;:::i;:::-;-1:-1:-1;;;;;;38697:87:0;;-1:-1:-1;;;38697:87:0;38671:226;;38827:50;;-1:-1:-1;;;38827:50:0;;;;;;;:::i;81384:152::-;81478:7;81510:3;:11;;81522:5;81510:18;;;;;;;;:::i;:::-;;;;;;;;;81503:25;;81384:152;;;;:::o;24148:135::-;19775:13;;;;;;;19767:69;;;;-1:-1:-1;;;19767:69:0;;;;;;;:::i;:::-;24262:13:::1;24270:4;24262:7;:13::i;52991:104::-:0;19775:13;;;;;;;19767:69;;;;-1:-1:-1;;;19767:69:0;;;;;;;:::i;:::-;53074:13:::1;::::0;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;53074:13:0;;;;::::1;::::0;:8:::1;::::0;:13:::1;:::i;60345:97::-:0;19775:13;;;;;;;19767:69;;;;-1:-1:-1;;;19767:69:0;;;;;;;:::i;:::-;60419:7:::1;:15:::0;;-1:-1:-1;;60419:15:0::1;::::0;;60345:97::o;71110:291::-;71240:4;-1:-1:-1;;;;;;71282:58:0;;-1:-1:-1;;;71282:58:0;;:111;;-1:-1:-1;;;;;;;;;;22594:51:0;;;71357:36;22435:218;63025:392;63264:66;63291:8;63301:4;63307:2;63311:3;63316:7;63325:4;63264:26;:66::i;:::-;60613:7;;;;63351:9;63343:66;;;;-1:-1:-1;;;63343:66:0;;41822:2:1;63343:66:0;;;41804:21:1;41861:2;41841:18;;;41834:30;41900:34;41880:18;;;41873:62;-1:-1:-1;;;41951:18:1;;;41944:42;42003:19;;63343:66:0;41620:408:1;48024:183:0;48114:22;48124:2;48128:7;48114:9;:22::i;:::-;48110:90;;-1:-1:-1;;;;;48158:16:0;;;;;;;;:12;:16;;;;;;;:30;;;;;;;;;;;;;;48024:183::o;48834:440::-;49009:6;48981:24;48991:4;48997:7;48981:9;:24::i;:::-;:34;48977:290;;;49032:19;49054:32;49072:4;49078:7;49054:17;:32::i;:::-;-1:-1:-1;;;;;49135:18:0;;;;;;:12;:18;;;;;49172:25;;49032:54;;-1:-1:-1;49135:18:0;49172:29;;49200:1;;49172:29;:::i;:::-;49135:81;;;;;;;;:::i;:::-;;;;;;;;;49101:12;:18;49114:4;-1:-1:-1;;;;;49101:18:0;-1:-1:-1;;;;;49101:18:0;;;;;;;;;;;;49120:11;49101:31;;;;;;;;:::i;:::-;;;;;;;;;;;;:115;;;;-1:-1:-1;;;;;49231:18:0;;;;:12;:18;;;;;;:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;49017:250;48834:440;;;:::o;78578:414::-;78641:4;80803:19;;;:12;;;:19;;;;;;78658:327;;-1:-1:-1;78701:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;78884:18;;78862:19;;;:12;;;:19;;;;;;:40;;;;78917:11;;78658:327;-1:-1:-1;78968:5:0;78961:12;;79168:1420;79234:4;79373:19;;;:12;;;:19;;;;;;79409:15;;79405:1176;;79784:21;79808:14;79821:1;79808:10;:14;:::i;:::-;79857:18;;79784:38;;-1:-1:-1;79837:17:0;;79857:22;;79878:1;;79857:22;:::i;:::-;79837:42;;79913:13;79900:9;:26;79896:405;;79947:17;79967:3;:11;;79979:9;79967:22;;;;;;;;:::i;:::-;;;;;;;;;79947:42;;80121:9;80092:3;:11;;80104:13;80092:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;80206:23;;;:12;;;:23;;;;;:36;;;79896:405;80382:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;80477:3;:12;;:19;80490:5;80477:19;;;;;;;;;;;80470:26;;;80520:4;80513:11;;;;;;;79405:1176;80564:5;80557:12;;;;;31874:88;31941:13;;;;:4;;:13;;;;;:::i;56591:655::-;-1:-1:-1;;;;;56913:18:0;;56909:160;;56953:9;56948:110;56972:3;:10;56968:1;:14;56948:110;;;57032:7;57040:1;57032:10;;;;;;;;:::i;:::-;;;;;;;57008:12;:20;57021:3;57025:1;57021:6;;;;;;;;:::i;:::-;;;;;;;57008:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;56984:3:0;;-1:-1:-1;56984:3:0;;:::i;:::-;;;56948:110;;;;56909:160;-1:-1:-1;;;;;57085:16:0;;57081:158;;57123:9;57118:110;57142:3;:10;57138:1;:14;57118:110;;;57202:7;57210:1;57202:10;;;;;;;;:::i;:::-;;;;;;;57178:12;:20;57191:3;57195:1;57191:6;;;;;;;;:::i;:::-;;;;;;;57178:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;57154:3:0;;-1:-1:-1;57154:3:0;;:::i;:::-;;;57118:110;;49282:470;-1:-1:-1;;;;;49442:19:0;;49394:13;49442:19;;;:12;:19;;;;;:26;49394:13;49500:188;49524:6;49516:5;:14;49500:188;;;-1:-1:-1;;;;;49560:19:0;;;;;;:12;:19;;;;;:26;;49590:7;;49560:19;49580:5;;49560:26;;;;;;:::i;:::-;;;;;;;;;:37;49556:121;;;-1:-1:-1;49649:12:0;;-1:-1:-1;49649:12:0;49556:121;49532:7;;;;:::i;:::-;;;;49500:188;;;49706:5;49713:30;45183:2;49713:10;:30::i;:::-;49698:46;;;;;-1:-1:-1;;;49698:46:0;;;;;;;;:::i;:::-;;49414:338;;49282:470;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:322::-;1288:6;1296;1304;1357:2;1345:9;1336:7;1332:23;1328:32;1325:52;;;1373:1;1370;1363:12;1325:52;1396:29;1415:9;1396:29;:::i;:::-;1386:39;1472:2;1457:18;;1444:32;;-1:-1:-1;1523:2:1;1508:18;;;1495:32;;1211:322;-1:-1:-1;;;1211:322:1:o;1538:180::-;1597:6;1650:2;1638:9;1629:7;1625:23;1621:32;1618:52;;;1666:1;1663;1656:12;1618:52;-1:-1:-1;1689:23:1;;1538:180;-1:-1:-1;1538:180:1:o;1723:258::-;1795:1;1805:113;1819:6;1816:1;1813:13;1805:113;;;1895:11;;;1889:18;1876:11;;;1869:39;1841:2;1834:10;1805:113;;;1936:6;1933:1;1930:13;1927:48;;;-1:-1:-1;;1971:1:1;1953:16;;1946:27;1723:258::o;1986:::-;2028:3;2066:5;2060:12;2093:6;2088:3;2081:19;2109:63;2165:6;2158:4;2153:3;2149:14;2142:4;2135:5;2131:16;2109:63;:::i;:::-;2226:2;2205:15;-1:-1:-1;;2201:29:1;2192:39;;;;2233:4;2188:50;;1986:258;-1:-1:-1;;1986:258:1:o;2249:220::-;2398:2;2387:9;2380:21;2361:4;2418:45;2459:2;2448:9;2444:18;2436:6;2418:45;:::i;2841:127::-;2902:10;2897:3;2893:20;2890:1;2883:31;2933:4;2930:1;2923:15;2957:4;2954:1;2947:15;2973:225;3059:4;3051:6;3047:17;3130:6;3118:10;3115:22;-1:-1:-1;;;;;3082:10:1;3079:34;3076:62;3073:88;;;3141:18;;:::i;:::-;3177:2;3170:22;-1:-1:-1;2973:225:1:o;3203:249::-;3313:2;3294:13;;-1:-1:-1;;3290:27:1;3278:40;;-1:-1:-1;;;;;3333:34:1;;3369:22;;;3330:62;3327:88;;;3395:18;;:::i;:::-;3431:2;3424:22;-1:-1:-1;;3203:249:1:o;3457:183::-;3517:4;-1:-1:-1;;;;;3542:6:1;3539:30;3536:56;;;3572:18;;:::i;:::-;-1:-1:-1;3617:1:1;3613:14;3629:4;3609:25;;3457:183::o;3645:724::-;3699:5;3752:3;3745:4;3737:6;3733:17;3729:27;3719:55;;3770:1;3767;3760:12;3719:55;3806:6;3793:20;3832:4;3855:43;3895:2;3855:43;:::i;:::-;3927:2;3921:9;3939:31;3967:2;3959:6;3939:31;:::i;:::-;4005:18;;;4097:1;4093:10;;;;4081:23;;4077:32;;;4039:15;;;;-1:-1:-1;4121:15:1;;;4118:35;;;4149:1;4146;4139:12;4118:35;4185:2;4177:6;4173:15;4197:142;4213:6;4208:3;4205:15;4197:142;;;4279:17;;4267:30;;4317:12;;;;4230;;4197:142;;;-1:-1:-1;4357:6:1;3645:724;-1:-1:-1;;;;;;3645:724:1:o;4374:556::-;4417:5;4470:3;4463:4;4455:6;4451:17;4447:27;4437:55;;4488:1;4485;4478:12;4437:55;4524:6;4511:20;-1:-1:-1;;;;;4546:2:1;4543:26;4540:52;;;4572:18;;:::i;:::-;4621:2;4615:9;4633:67;4688:2;4669:13;;-1:-1:-1;;4665:27:1;4694:4;4661:38;4615:9;4633:67;:::i;:::-;4724:2;4716:6;4709:18;4770:3;4763:4;4758:2;4750:6;4746:15;4742:26;4739:35;4736:55;;;4787:1;4784;4777:12;4736:55;4851:2;4844:4;4836:6;4832:17;4825:4;4817:6;4813:17;4800:54;4898:1;4874:15;;;4891:4;4870:26;4863:37;;;;4878:6;4374:556;-1:-1:-1;;;4374:556:1:o;4935:950::-;4988:5;5041:3;5034:4;5026:6;5022:17;5018:27;5008:55;;5059:1;5056;5049:12;5008:55;5095:6;5082:20;5121:4;5144:43;5184:2;5144:43;:::i;:::-;5216:2;5210:9;5228:31;5256:2;5248:6;5228:31;:::i;:::-;5294:18;;;5386:1;5382:10;;;;5370:23;;5366:32;;;5328:15;;;;-1:-1:-1;5410:15:1;;;5407:35;;;5438:1;5435;5428:12;5407:35;5474:2;5466:6;5462:15;5486:369;5502:6;5497:3;5494:15;5486:369;;;5588:3;5575:17;-1:-1:-1;;;;;5611:11:1;5608:35;5605:125;;;5684:1;5713:2;5709;5702:14;5605:125;5755:57;5808:3;5803:2;5789:11;5781:6;5777:24;5773:33;5755:57;:::i;:::-;5743:70;;-1:-1:-1;5833:12:1;;;;5519;;5486:369;;5890:1332;6113:6;6121;6129;6137;6145;6153;6206:3;6194:9;6185:7;6181:23;6177:33;6174:53;;;6223:1;6220;6213:12;6174:53;6246:29;6265:9;6246:29;:::i;:::-;6236:39;;6326:2;6315:9;6311:18;6298:32;-1:-1:-1;;;;;6390:2:1;6382:6;6379:14;6376:34;;;6406:1;6403;6396:12;6376:34;6429:61;6482:7;6473:6;6462:9;6458:22;6429:61;:::i;:::-;6419:71;;6543:2;6532:9;6528:18;6515:32;6499:48;;6572:2;6562:8;6559:16;6556:36;;;6588:1;6585;6578:12;6556:36;6611:63;6666:7;6655:8;6644:9;6640:24;6611:63;:::i;:::-;6601:73;;6727:2;6716:9;6712:18;6699:32;6683:48;;6756:2;6746:8;6743:16;6740:36;;;6772:1;6769;6762:12;6740:36;6795:62;6849:7;6838:8;6827:9;6823:24;6795:62;:::i;:::-;6785:72;;6910:3;6899:9;6895:19;6882:33;6866:49;;6940:2;6930:8;6927:16;6924:36;;;6956:1;6953;6946:12;6924:36;6979:52;7023:7;7012:8;7001:9;6997:24;6979:52;:::i;:::-;6969:62;;7084:3;7073:9;7069:19;7056:33;7040:49;;7114:2;7104:8;7101:16;7098:36;;;7130:1;7127;7120:12;7098:36;;7153:63;7208:7;7197:8;7186:9;7182:24;7153:63;:::i;:::-;7143:73;;;5890:1332;;;;;;;;:::o;7227:248::-;7295:6;7303;7356:2;7344:9;7335:7;7331:23;7327:32;7324:52;;;7372:1;7369;7362:12;7324:52;-1:-1:-1;;7395:23:1;;;7465:2;7450:18;;;7437:32;;-1:-1:-1;7227:248:1:o;7868:944::-;8022:6;8030;8038;8046;8054;8107:3;8095:9;8086:7;8082:23;8078:33;8075:53;;;8124:1;8121;8114:12;8075:53;8147:29;8166:9;8147:29;:::i;:::-;8137:39;;8195:38;8229:2;8218:9;8214:18;8195:38;:::i;:::-;8185:48;;8284:2;8273:9;8269:18;8256:32;-1:-1:-1;;;;;8348:2:1;8340:6;8337:14;8334:34;;;8364:1;8361;8354:12;8334:34;8387:61;8440:7;8431:6;8420:9;8416:22;8387:61;:::i;:::-;8377:71;;8501:2;8490:9;8486:18;8473:32;8457:48;;8530:2;8520:8;8517:16;8514:36;;;8546:1;8543;8536:12;8514:36;8569:63;8624:7;8613:8;8602:9;8598:24;8569:63;:::i;:::-;8559:73;;8685:3;8674:9;8670:19;8657:33;8641:49;;8715:2;8705:8;8702:16;8699:36;;;8731:1;8728;8721:12;8699:36;;8754:52;8798:7;8787:8;8776:9;8772:24;8754:52;:::i;:::-;8744:62;;;7868:944;;;;;;;;:::o;8817:254::-;8885:6;8893;8946:2;8934:9;8925:7;8921:23;8917:32;8914:52;;;8962:1;8959;8952:12;8914:52;8998:9;8985:23;8975:33;;9027:38;9061:2;9050:9;9046:18;9027:38;:::i;9076:533::-;9172:6;9180;9188;9196;9249:3;9237:9;9228:7;9224:23;9220:33;9217:53;;;9266:1;9263;9256:12;9217:53;9289:29;9308:9;9289:29;:::i;:::-;9279:39;;9365:2;9354:9;9350:18;9337:32;9327:42;;9420:2;9409:9;9405:18;9392:32;-1:-1:-1;;;;;9439:6:1;9436:30;9433:50;;;9479:1;9476;9469:12;9433:50;9502;9544:7;9535:6;9524:9;9520:22;9502:50;:::i;:::-;9076:533;;;;-1:-1:-1;9492:60:1;;9599:2;9584:18;9571:32;;-1:-1:-1;;;9076:533:1:o;9822:1208::-;9940:6;9948;10001:2;9989:9;9980:7;9976:23;9972:32;9969:52;;;10017:1;10014;10007:12;9969:52;10057:9;10044:23;-1:-1:-1;;;;;10127:2:1;10119:6;10116:14;10113:34;;;10143:1;10140;10133:12;10113:34;10181:6;10170:9;10166:22;10156:32;;10226:7;10219:4;10215:2;10211:13;10207:27;10197:55;;10248:1;10245;10238:12;10197:55;10284:2;10271:16;10306:4;10329:43;10369:2;10329:43;:::i;:::-;10401:2;10395:9;10413:31;10441:2;10433:6;10413:31;:::i;:::-;10479:18;;;10567:1;10563:10;;;;10555:19;;10551:28;;;10513:15;;;;-1:-1:-1;10591:19:1;;;10588:39;;;10623:1;10620;10613:12;10588:39;10647:11;;;;10667:148;10683:6;10678:3;10675:15;10667:148;;;10749:23;10768:3;10749:23;:::i;:::-;10737:36;;10700:12;;;;10793;;;;10667:148;;;10834:6;-1:-1:-1;;10878:18:1;;10865:32;;-1:-1:-1;;10909:16:1;;;10906:36;;;10938:1;10935;10928:12;10906:36;;10961:63;11016:7;11005:8;10994:9;10990:24;10961:63;:::i;:::-;10951:73;;;9822:1208;;;;;:::o;11035:435::-;11088:3;11126:5;11120:12;11153:6;11148:3;11141:19;11179:4;11208:2;11203:3;11199:12;11192:19;;11245:2;11238:5;11234:14;11266:1;11276:169;11290:6;11287:1;11284:13;11276:169;;;11351:13;;11339:26;;11385:12;;;;11420:15;;;;11312:1;11305:9;11276:169;;;-1:-1:-1;11461:3:1;;11035:435;-1:-1:-1;;;;;11035:435:1:o;11475:261::-;11654:2;11643:9;11636:21;11617:4;11674:56;11726:2;11715:9;11711:18;11703:6;11674:56;:::i;11741:322::-;11810:6;11863:2;11851:9;11842:7;11838:23;11834:32;11831:52;;;11879:1;11876;11869:12;11831:52;11919:9;11906:23;-1:-1:-1;;;;;11944:6:1;11941:30;11938:50;;;11984:1;11981;11974:12;11938:50;12007;12049:7;12040:6;12029:9;12025:22;12007:50;:::i;12068:669::-;12195:6;12203;12211;12264:2;12252:9;12243:7;12239:23;12235:32;12232:52;;;12280:1;12277;12270:12;12232:52;12303:29;12322:9;12303:29;:::i;:::-;12293:39;;12383:2;12372:9;12368:18;12355:32;-1:-1:-1;;;;;12447:2:1;12439:6;12436:14;12433:34;;;12463:1;12460;12453:12;12433:34;12486:61;12539:7;12530:6;12519:9;12515:22;12486:61;:::i;:::-;12476:71;;12600:2;12589:9;12585:18;12572:32;12556:48;;12629:2;12619:8;12616:16;12613:36;;;12645:1;12642;12635:12;12613:36;;12668:63;12723:7;12712:8;12701:9;12697:24;12668:63;:::i;:::-;12658:73;;;12068:669;;;;;:::o;12742:186::-;12801:6;12854:2;12842:9;12833:7;12829:23;12825:32;12822:52;;;12870:1;12867;12860:12;12822:52;12893:29;12912:9;12893:29;:::i;12933:390::-;13011:6;13019;13072:2;13060:9;13051:7;13047:23;13043:32;13040:52;;;13088:1;13085;13078:12;13040:52;13124:9;13111:23;13101:33;;13185:2;13174:9;13170:18;13157:32;-1:-1:-1;;;;;13204:6:1;13201:30;13198:50;;;13244:1;13241;13234:12;13198:50;13267;13309:7;13300:6;13289:9;13285:22;13267:50;:::i;13581:347::-;13646:6;13654;13707:2;13695:9;13686:7;13682:23;13678:32;13675:52;;;13723:1;13720;13713:12;13675:52;13746:29;13765:9;13746:29;:::i;:::-;13736:39;;13825:2;13814:9;13810:18;13797:32;13872:5;13865:13;13858:21;13851:5;13848:32;13838:60;;13894:1;13891;13884:12;13838:60;13917:5;13907:15;;;13581:347;;;;;:::o;13933:159::-;13996:5;14041:3;14032:6;14027:3;14023:16;14019:26;14016:46;;;14058:1;14055;14048:12;14097:430;14195:6;14203;14256:2;14244:9;14235:7;14231:23;14227:32;14224:52;;;14272:1;14269;14262:12;14224:52;14308:9;14295:23;14285:33;;14369:2;14358:9;14354:18;14341:32;-1:-1:-1;;;;;14388:6:1;14385:30;14382:50;;;14428:1;14425;14418:12;14382:50;14451:70;14513:7;14504:6;14493:9;14489:22;14451:70;:::i;14532:322::-;14609:6;14617;14625;14678:2;14666:9;14657:7;14653:23;14649:32;14646:52;;;14694:1;14691;14684:12;14646:52;14730:9;14717:23;14707:33;;14759:38;14793:2;14782:9;14778:18;14759:38;:::i;:::-;14749:48;;14844:2;14833:9;14829:18;14816:32;14806:42;;14532:322;;;;;:::o;14859:683::-;14954:6;14962;14970;15023:2;15011:9;15002:7;14998:23;14994:32;14991:52;;;15039:1;15036;15029:12;14991:52;15075:9;15062:23;15052:33;;15136:2;15125:9;15121:18;15108:32;-1:-1:-1;;;;;15200:2:1;15192:6;15189:14;15186:34;;;15216:1;15213;15206:12;15186:34;15254:6;15243:9;15239:22;15229:32;;15299:7;15292:4;15288:2;15284:13;15280:27;15270:55;;15321:1;15318;15311:12;15270:55;15361:2;15348:16;15387:2;15379:6;15376:14;15373:34;;;15403:1;15400;15393:12;15373:34;15456:7;15451:2;15441:6;15438:1;15434:14;15430:2;15426:23;15422:32;15419:45;15416:65;;;15477:1;15474;15467:12;15416:65;15508:2;15504;15500:11;15490:21;;15530:6;15520:16;;;;;14859:683;;;;;:::o;15547:614::-;15652:6;15660;15668;15676;15684;15737:3;15725:9;15716:7;15712:23;15708:33;15705:53;;;15754:1;15751;15744:12;15705:53;15794:9;15781:23;-1:-1:-1;;;;;15819:6:1;15816:30;15813:50;;;15859:1;15856;15849:12;15813:50;15882;15924:7;15915:6;15904:9;15900:22;15882:50;:::i;:::-;15872:60;;;15979:2;15968:9;15964:18;15951:32;15941:42;;16002:38;16036:2;16025:9;16021:18;16002:38;:::i;:::-;15992:48;;16059:38;16093:2;16082:9;16078:18;16059:38;:::i;:::-;16049:48;;16116:39;16150:3;16139:9;16135:19;16116:39;:::i;:::-;16106:49;;15547:614;;;;;;;;:::o;16425:362::-;16514:6;16567:2;16555:9;16546:7;16542:23;16538:32;16535:52;;;16583:1;16580;16573:12;16535:52;16623:9;16610:23;-1:-1:-1;;;;;16648:6:1;16645:30;16642:50;;;16688:1;16685;16678:12;16642:50;16711:70;16773:7;16764:6;16753:9;16749:22;16711:70;:::i;16792:273::-;16849:6;16902:2;16890:9;16881:7;16877:23;16873:32;16870:52;;;16918:1;16915;16908:12;16870:52;16957:9;16944:23;17010:5;17007:1;16996:20;16989:5;16986:31;16976:59;;17031:1;17028;17021:12;17070:617;17138:3;17176:5;17170:12;17203:6;17198:3;17191:19;17229:4;17258:2;17253:3;17249:12;17242:19;;17295:2;17288:5;17284:14;17316:1;17326:336;17340:6;17337:1;17334:13;17326:336;;;17399:13;;17437:9;;17425:22;;17487:11;;;17481:18;17467:12;;;17460:40;17523:4;17567:11;;;17561:18;17547:12;;;17540:40;17609:4;17600:14;;;;17637:15;;;;17362:1;17355:9;17326:336;;17692:2184;17877:2;17866:9;17859:21;17840:4;17915:6;17909:13;17941:6;17983:2;17978;17967:9;17963:18;17956:30;18009:52;18056:3;18045:9;18041:19;18027:12;18009:52;:::i;:::-;17995:66;;18110:2;18102:6;18098:15;18092:22;18137:2;18133:7;18204:2;18192:9;18184:6;18180:22;18176:31;18171:2;18160:9;18156:18;18149:59;18231:41;18265:6;18249:14;18231:41;:::i;:::-;18217:55;;18321:2;18313:6;18309:15;18303:22;18281:44;;18389:2;18377:9;18369:6;18365:22;18361:31;18356:2;18345:9;18341:18;18334:59;18416:41;18450:6;18434:14;18416:41;:::i;:::-;18402:55;;18506:2;18498:6;18494:15;18488:22;18466:44;;18575:2;18563:9;18555:6;18551:22;18547:31;18541:3;18530:9;18526:19;18519:60;18602:41;18636:6;18620:14;18602:41;:::i;:::-;18588:55;;18692:3;18684:6;18680:16;18674:23;18652:45;;18762:2;18750:9;18742:6;18738:22;18734:31;18728:3;18717:9;18713:19;18706:60;18789:41;18823:6;18807:14;18789:41;:::i;:::-;18775:55;;18879:3;18871:6;18867:16;18861:23;18839:45;;18949:2;18937:9;18929:6;18925:22;18921:31;18915:3;18904:9;18900:19;18893:60;18976:52;19021:6;19005:14;18976:52;:::i;:::-;18962:66;;19077:3;19069:6;19065:16;19059:23;19037:45;;19091:55;19141:3;19130:9;19126:19;19110:14;-1:-1:-1;;;;;7546:31:1;7534:44;;7480:104;19091:55;19183:3;19171:16;;19165:23;19207:3;19226:18;;;19219:30;;;;19274:15;;19268:22;19309:3;19328:18;;;19321:30;;;;19376:15;;19370:22;19411:3;19430:18;;;19423:30;;;;19478:15;;19472:22;19514:3;19533:19;;;19526:31;;;;19583:16;;19577:23;19620:3;19639:19;;;19632:32;;;;19701:16;;19695:23;19758:22;;;19754:31;;;19734:18;;;19727:59;19695:23;-1:-1:-1;19803:67:1;19762:6;19695:23;19803:67;:::i;:::-;19795:75;17692:2184;-1:-1:-1;;;;;;17692:2184:1:o;19881:798::-;20112:2;20164:21;;;20234:13;;20137:18;;;20256:22;;;20083:4;;20112:2;20297;;20315:18;;;;20356:15;;;20083:4;20399:254;20413:6;20410:1;20407:13;20399:254;;;20472:13;;20510:9;;20498:22;;20560:11;;20554:18;20540:12;;;20533:40;20593:12;;;;20628:15;;;;20435:1;20428:9;20399:254;;;-1:-1:-1;20670:3:1;;19881:798;-1:-1:-1;;;;;;;19881:798:1:o;20684:260::-;20752:6;20760;20813:2;20801:9;20792:7;20788:23;20784:32;20781:52;;;20829:1;20826;20819:12;20781:52;20852:29;20871:9;20852:29;:::i;:::-;20842:39;;20900:38;20934:2;20923:9;20919:18;20900:38;:::i;20949:607::-;21053:6;21061;21069;21077;21085;21138:3;21126:9;21117:7;21113:23;21109:33;21106:53;;;21155:1;21152;21145:12;21106:53;21178:29;21197:9;21178:29;:::i;:::-;21168:39;;21226:38;21260:2;21249:9;21245:18;21226:38;:::i;:::-;21216:48;;21311:2;21300:9;21296:18;21283:32;21273:42;;21362:2;21351:9;21347:18;21334:32;21324:42;;21417:3;21406:9;21402:19;21389:33;-1:-1:-1;;;;;21437:6:1;21434:30;21431:50;;;21477:1;21474;21467:12;21431:50;21500;21542:7;21533:6;21522:9;21518:22;21500:50;:::i;21561:1484::-;21687:6;21695;21726:2;21769;21757:9;21748:7;21744:23;21740:32;21737:52;;;21785:1;21782;21775:12;21737:52;21821:9;21808:23;21798:33;;21850:2;21903;21892:9;21888:18;21875:32;-1:-1:-1;;;;;21922:6:1;21919:30;21916:50;;;21962:1;21959;21952:12;21916:50;21985:22;;22038:4;22030:13;;22026:27;-1:-1:-1;22016:55:1;;22067:1;22064;22057:12;22016:55;22103:2;22090:16;22125:43;22165:2;22125:43;:::i;:::-;22197:2;22191:9;22209:31;22237:2;22229:6;22209:31;:::i;:::-;22275:18;;;22343:4;22382:11;;;22374:20;;22370:29;;;22309:15;;;;-1:-1:-1;22411:19:1;;;22408:39;;;22443:1;22440;22433:12;22408:39;22467:11;;;;22487:527;22503:6;22498:3;22495:15;22487:527;;;22583:2;22577:3;22568:7;22564:17;22560:26;22557:116;;;22627:1;22656:2;22652;22645:14;22557:116;22708:2;22702:9;22724:34;22749:8;22724:34;:::i;:::-;22788:17;;22771:35;;22858:12;;;22845:26;22826:17;;;22819:53;22924:12;;;22911:26;22892:17;;;22885:53;22951:21;;22520:12;;;;22992;;;;22487:527;;;22491:3;23033:6;23023:16;;;;;;;;21561:1484;;;;;:::o;23812:380::-;23891:1;23887:12;;;;23934;;;23955:61;;24009:4;24001:6;23997:17;23987:27;;23955:61;24062:2;24054:6;24051:14;24031:18;24028:38;24025:161;;;24108:10;24103:3;24099:20;24096:1;24089:31;24143:4;24140:1;24133:15;24171:4;24168:1;24161:15;24197:978;24373:3;24402:1;24435:6;24429:13;24465:36;24491:9;24465:36;:::i;:::-;24520:1;24537:18;;;24564:104;;;;24682:1;24677:356;;;;24530:503;;24564:104;-1:-1:-1;;24597:24:1;;24585:37;;24642:16;;;;-1:-1:-1;24564:104:1;;24677:356;24708:6;24705:1;24698:17;24738:4;24783:2;24780:1;24770:16;24808:1;24822:165;24836:6;24833:1;24830:13;24822:165;;;24914:14;;24901:11;;;24894:35;24957:16;;;;24851:10;;24822:165;;;24826:3;;;25016:6;25011:3;25007:16;25000:23;;24530:503;;;;;25064:6;25058:13;25080:55;25126:8;25121:3;25114:4;25106:6;25102:17;25080:55;:::i;:::-;25151:18;;24197:978;-1:-1:-1;;;;24197:978:1:o;25180:127::-;25241:10;25236:3;25232:20;25229:1;25222:31;25272:4;25269:1;25262:15;25296:4;25293:1;25286:15;25312:127;25373:10;25368:3;25364:20;25361:1;25354:31;25404:4;25401:1;25394:15;25428:4;25425:1;25418:15;25444:135;25483:3;-1:-1:-1;;25504:17:1;;25501:43;;;25524:18;;:::i;:::-;-1:-1:-1;25571:1:1;25560:13;;25444:135::o;25584:562::-;-1:-1:-1;;;;;25869:32:1;;25851:51;;25938:2;25933;25918:18;;25911:30;;;-1:-1:-1;;25964:56:1;;26001:18;;25993:6;25964:56;:::i;:::-;26068:9;26060:6;26056:22;26051:2;26040:9;26036:18;26029:50;26096:44;26133:6;26125;26096:44;:::i;26151:168::-;26191:7;26257:1;26253;26249:6;26245:14;26242:1;26239:21;26234:1;26227:9;26220:17;26216:45;26213:71;;;26264:18;;:::i;:::-;-1:-1:-1;26304:9:1;;26151:168::o;26324:127::-;26385:10;26380:3;26376:20;26373:1;26366:31;26416:4;26413:1;26406:15;26440:4;26437:1;26430:15;26456:120;26496:1;26522;26512:35;;26527:18;;:::i;:::-;-1:-1:-1;26561:9:1;;26456:120::o;27416:362::-;27621:6;27610:9;27603:25;27664:2;27659;27648:9;27644:18;27637:30;27584:4;27684:45;27725:2;27714:9;27710:18;27702:6;27684:45;:::i;:::-;27676:53;;27765:6;27760:2;27749:9;27745:18;27738:34;27416:362;;;;;;:::o;28193:405::-;28395:2;28377:21;;;28434:2;28414:18;;;28407:30;28473:34;28468:2;28453:18;;28446:62;-1:-1:-1;;;28539:2:1;28524:18;;28517:39;28588:3;28573:19;;28193:405::o;28603:926::-;28712:4;28741:2;28770;28759:9;28752:21;28793:1;28826:6;28820:13;28856:36;28882:9;28856:36;:::i;:::-;28928:6;28923:2;28912:9;28908:18;28901:34;28954:2;28975:1;29007:2;28996:9;28992:18;29024:1;29019:121;;;;29154:1;29149:354;;;;28985:518;;29019:121;-1:-1:-1;;29067:24:1;;29047:18;;;29040:52;29127:2;29112:18;;;-1:-1:-1;29019:121:1;;29149:354;29180:6;29177:1;29170:17;29228:2;29225:1;29215:16;29253:1;29267:180;29281:6;29278:1;29275:13;29267:180;;;29374:14;;29350:17;;;29346:26;;29339:50;29417:16;;;;29296:10;;29267:180;;;29471:17;;29467:26;;;-1:-1:-1;;28985:518:1;-1:-1:-1;29520:3:1;;28603:926;-1:-1:-1;;;;;;;;28603:926:1:o;29534:128::-;29574:3;29605:1;29601:6;29598:1;29595:13;29592:39;;;29611:18;;:::i;:::-;-1:-1:-1;29647:9:1;;29534:128::o;29667:522::-;29745:4;29751:6;29811:11;29798:25;29905:2;29901:7;29890:8;29874:14;29870:29;29866:43;29846:18;29842:68;29832:96;;29924:1;29921;29914:12;29832:96;29951:33;;30003:20;;;-1:-1:-1;;;;;;30035:30:1;;30032:50;;;30078:1;30075;30068:12;30032:50;30111:4;30099:17;;-1:-1:-1;30142:14:1;30138:27;;;30128:38;;30125:58;;;30179:1;30176;30169:12;30125:58;29667:522;;;;;:::o;30194:545::-;30287:4;30293:6;30353:11;30340:25;30447:2;30443:7;30432:8;30416:14;30412:29;30408:43;30388:18;30384:68;30374:96;;30466:1;30463;30456:12;30374:96;30493:33;;30545:20;;;-1:-1:-1;;;;;;30577:30:1;;30574:50;;;30620:1;30617;30610:12;30574:50;30653:4;30641:17;;-1:-1:-1;30704:1:1;30700:14;;;30684;30680:35;30670:46;;30667:66;;;30729:1;30726;30719:12;30744:583;30872:4;30878:6;30938:11;30925:25;31032:2;31028:7;31017:8;31001:14;30997:29;30993:43;30973:18;30969:68;30959:96;;31051:1;31048;31041:12;30959:96;31078:33;;31130:20;;;-1:-1:-1;;;;;;31162:30:1;;31159:50;;;31205:1;31202;31195:12;31159:50;31238:4;31226:17;;-1:-1:-1;31297:4:1;31285:17;;31269:14;31265:38;31255:49;;31252:69;;;31317:1;31314;31307:12;32062:399;32264:2;32246:21;;;32303:2;32283:18;;;32276:30;32342:34;32337:2;32322:18;;32315:62;-1:-1:-1;;;32408:2:1;32393:18;;32386:33;32451:3;32436:19;;32062:399::o;32466:400::-;32668:2;32650:21;;;32707:2;32687:18;;;32680:30;32746:34;32741:2;32726:18;;32719:62;-1:-1:-1;;;32812:2:1;32797:18;;32790:34;32856:3;32841:19;;32466:400::o;33124:397::-;33326:2;33308:21;;;33365:2;33345:18;;;33338:30;33404:34;33399:2;33384:18;;33377:62;-1:-1:-1;;;33470:2:1;33455:18;;33448:31;33511:3;33496:19;;33124:397::o;33526:404::-;33728:2;33710:21;;;33767:2;33747:18;;;33740:30;33806:34;33801:2;33786:18;;33779:62;-1:-1:-1;;;33872:2:1;33857:18;;33850:38;33920:3;33905:19;;33526:404::o;33935:465::-;34192:2;34181:9;34174:21;34155:4;34218:56;34270:2;34259:9;34255:18;34247:6;34218:56;:::i;:::-;34322:9;34314:6;34310:22;34305:2;34294:9;34290:18;34283:50;34350:44;34387:6;34379;34350:44;:::i;:::-;34342:52;33935:465;-1:-1:-1;;;;;33935:465:1:o;34815:401::-;35017:2;34999:21;;;35056:2;35036:18;;;35029:30;35095:34;35090:2;35075:18;;35068:62;-1:-1:-1;;;35161:2:1;35146:18;;35139:35;35206:3;35191:19;;34815:401::o;35221:406::-;35423:2;35405:21;;;35462:2;35442:18;;;35435:30;35501:34;35496:2;35481:18;;35474:62;-1:-1:-1;;;35567:2:1;35552:18;;35545:40;35617:3;35602:19;;35221:406::o;35632:786::-;36043:25;36038:3;36031:38;36013:3;36098:6;36092:13;36114:62;36169:6;36164:2;36159:3;36155:12;36148:4;36140:6;36136:17;36114:62;:::i;:::-;-1:-1:-1;;;36235:2:1;36195:16;;;36227:11;;;36220:40;36285:13;;36307:63;36285:13;36356:2;36348:11;;36341:4;36329:17;;36307:63;:::i;:::-;36390:17;36409:2;36386:26;;35632:786;-1:-1:-1;;;;35632:786:1:o;37117:407::-;37319:2;37301:21;;;37358:2;37338:18;;;37331:30;37397:34;37392:2;37377:18;;37370:62;-1:-1:-1;;;37463:2:1;37448:18;;37441:41;37514:3;37499:19;;37117:407::o;37529:125::-;37569:4;37597:1;37594;37591:8;37588:34;;;37602:18;;:::i;:::-;-1:-1:-1;37639:9:1;;37529:125::o;37659:112::-;37691:1;37717;37707:35;;37722:18;;:::i;:::-;-1:-1:-1;37756:9:1;;37659:112::o;37776:827::-;-1:-1:-1;;;;;38173:15:1;;;38155:34;;38225:15;;38220:2;38205:18;;38198:43;38135:3;38272:2;38257:18;;38250:31;;;38098:4;;38304:57;;38341:19;;38333:6;38304:57;:::i;:::-;38409:9;38401:6;38397:22;38392:2;38381:9;38377:18;38370:50;38443:44;38480:6;38472;38443:44;:::i;:::-;38429:58;;38536:9;38528:6;38524:22;38518:3;38507:9;38503:19;38496:51;38564:33;38590:6;38582;38564:33;:::i;:::-;38556:41;37776:827;-1:-1:-1;;;;;;;;37776:827:1:o;38608:249::-;38677:6;38730:2;38718:9;38709:7;38705:23;38701:32;38698:52;;;38746:1;38743;38736:12;38698:52;38778:9;38772:16;38797:30;38821:5;38797:30;:::i;38862:179::-;38897:3;38939:1;38921:16;38918:23;38915:120;;;38985:1;38982;38979;38964:23;-1:-1:-1;39022:1:1;39016:8;39011:3;39007:18;38915:120;38862:179;:::o;39046:671::-;39085:3;39127:4;39109:16;39106:26;39103:39;;;39046:671;:::o;39103:39::-;39169:2;39163:9;-1:-1:-1;;39234:16:1;39230:25;;39227:1;39163:9;39206:50;39285:4;39279:11;39309:16;-1:-1:-1;;;;;39415:2:1;39408:4;39400:6;39396:17;39393:25;39388:2;39380:6;39377:14;39374:45;39371:58;;;39422:5;;;;;39046:671;:::o;39371:58::-;39459:6;39453:4;39449:17;39438:28;;39495:3;39489:10;39522:2;39514:6;39511:14;39508:27;;;39528:5;;;;;;39046:671;:::o;39508:27::-;39612:2;39593:16;39587:4;39583:27;39579:36;39572:4;39563:6;39558:3;39554:16;39550:27;39547:69;39544:82;;;39619:5;;;;;;39046:671;:::o;39544:82::-;39635:57;39686:4;39677:6;39669;39665:19;39661:30;39655:4;39635:57;:::i;:::-;-1:-1:-1;39708:3:1;;39046:671;-1:-1:-1;;;;;39046:671:1:o;40143:404::-;40345:2;40327:21;;;40384:2;40364:18;;;40357:30;40423:34;40418:2;40403:18;;40396:62;-1:-1:-1;;;40489:2:1;40474:18;;40467:38;40537:3;40522:19;;40143:404::o;40552:136::-;40591:3;40619:5;40609:39;;40628:18;;:::i;:::-;-1:-1:-1;;;40664:18:1;;40552:136::o;41054:561::-;-1:-1:-1;;;;;41351:15:1;;;41333:34;;41403:15;;41398:2;41383:18;;41376:43;41450:2;41435:18;;41428:34;;;41493:2;41478:18;;41471:34;;;41313:3;41536;41521:19;;41514:32;;;41276:4;;41563:46;;41589:19;;41581:6;41563:46;:::i;:::-;41555:54;41054:561;-1:-1:-1;;;;;;;41054:561:1:o;42033:127::-;42094:10;42089:3;42085:20;42082:1;42075:31;42125:4;42122:1;42115:15;42149:4;42146:1;42139:15
Swarm Source
ipfs://c2b91a892b95eca0e717eaca80b0862d92c22a8784778837471c034b6f6d4cb0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.