ERC-721
Overview
Max Total Supply
111 BODEGA
Holders
1
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
111 BODEGALoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Bodega
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-15 */ //SPDX-License-Identifier: MIT pragma solidity 0.8.14; interface IERC20 { function totalSupply() external view returns (uint256); function symbol() external view returns (string memory); function name() external view returns (string memory); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Returns the number of decimal places */ function decimals() external view returns (uint8); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: weiValue}( data ); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } abstract contract ReentrancyGuard { uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } modifier nonReentrant() { require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); _status = _ENTERED; _; _status = _NOT_ENTERED; } } library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } contract Ownable { address private owner; // event for EVM logging event OwnerSet(address indexed oldOwner, address indexed newOwner); // modifier to check if caller is owner modifier onlyOwner() { // If the first argument of 'require' evaluates to 'false', execution terminates and all // changes to the state and to Ether balances are reverted. // This used to consume all gas in old EVM versions, but not anymore. // It is often a good idea to use 'require' to check if functions are called correctly. // As a second argument, you can also provide an explanation about what went wrong. require(msg.sender == owner, "Caller is not owner"); _; } /** * @dev Set contract deployer as owner */ constructor() { owner = msg.sender; // 'msg.sender' is sender of current call, contract deployer for a constructor emit OwnerSet(address(0), owner); } /** * @dev Change owner * @param newOwner address of new owner */ function changeOwner(address newOwner) public onlyOwner { emit OwnerSet(owner, newOwner); owner = newOwner; } /** * @dev Return owner address * @return address of owner */ function getOwner() external view returns (address) { return owner; } } interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry constant operatorFilterRegistry = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(operatorFilterRegistry).code.length > 0) { if (subscribe) { operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { operatorFilterRegistry.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(operatorFilterRegistry).code.length > 0) { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from == msg.sender) { _; return; } if ( !( operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender) && operatorFilterRegistry.isOperatorAllowed(address(this), from) ) ) { revert OperatorNotAllowed(msg.sender); } } _; } } interface IClaimContract { function initRewards(uint256 tokenId) external; } contract Bodega is Context, ERC165, IERC721, IERC721Metadata, ReentrancyGuard, Ownable { using Address for address; using SafeMath for uint256; // Token name string private constant _name = "Bodega Blocks"; // Token symbol string private constant _symbol = "BODEGA"; // total number of NFTs Minted uint256 private _totalSupply; uint256 public currentSupplyIndex; // max supply cap uint256 public constant MAX_SUPPLY = 8_999; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // base URI string private baseURI = "temp_image"; string private ending = ".json"; // cost for minting NFT uint256 public costETH = 157 * 10**15; // total supply of each NFT uint256 public totalClass0; uint256 public totalClass1; uint256 public totalClass2; // constant break points uint256 public constant breakPoint0 = 111; uint256 public constant breakPoint1 = 1_222; // Enable Trading bool public tradingEnabled = false; bool public whitelistEnabled = true; // Whitelisted Users mapping(address => bool) public isWhitelisted; // Claim Contract address public claimContract; // Whether or not to check allowed operator bool public checkAllowedOperator = true; modifier canMint(uint256 numberOfMints) { require(tradingEnabled, "Trading Not Enabled"); if (whitelistEnabled) { require(isWhitelisted[msg.sender], "Sender Not Whitelisted"); } require(numberOfMints > 0, "Invalid Input"); _; } error OperatorNotAllowed(address operator); IOperatorFilterRegistry constant operatorFilterRegistry = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); modifier onlyAllowedOperator(address from) virtual { if (checkAllowedOperator == false) { _; return; } // Check registry code length to facilitate testing in environments without a deployed registry. if (address(operatorFilterRegistry).code.length > 0) { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from == msg.sender) { _; return; } if ( !( operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender) && operatorFilterRegistry.isOperatorAllowed(address(this), from) ) ) { revert OperatorNotAllowed(msg.sender); } } _; } constructor() { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(operatorFilterRegistry).code.length > 0) { operatorFilterRegistry.registerAndSubscribe(address(this), 0xFD7bfa171B5b81b79C245456E986db2f32fBFaDb); } } //////////////////////////////////////////////// /////////// OWNER FUNCTIONS /////////// //////////////////////////////////////////////// function setClaimContract(address newClaim) external onlyOwner { claimContract = newClaim; } function setCheckAllowedOperator(bool checkOperator) external onlyOwner { checkAllowedOperator = checkOperator; } function enableMinting() external onlyOwner { tradingEnabled = true; } function disableMinting() external onlyOwner { tradingEnabled = false; } function disableWhitelist() external onlyOwner { whitelistEnabled = false; } function enableWhitelist() external onlyOwner { whitelistEnabled = true; } function withdraw() external onlyOwner { (bool s, ) = payable(msg.sender).call{value: address(this).balance}(""); require(s); } function withdrawToken(address token_) external onlyOwner { require(token_ != address(0), "Zero Address"); IERC20(token_).transfer( msg.sender, IERC20(token_).balanceOf(address(this)) ); } function setCostETH(uint256 newCostETH) external onlyOwner { costETH = newCostETH; } function setBaseURI(string calldata newURI) external onlyOwner { baseURI = newURI; } function setURIExtention(string calldata newExtention) external onlyOwner { ending = newExtention; } function addWhitelist(address[] calldata users) external onlyOwner { uint256 length = users.length; for (uint256 i = 0; i < length; ) { isWhitelisted[users[i]] = true; unchecked { ++i; } } } function ownerMint(address[] calldata users, uint256[] calldata amounts) external onlyOwner { uint256 len = users.length; for (uint256 i = 0; i < len; ) { for (uint256 j = 0; j < amounts[i]; j++) { _safeMint(users[i], currentSupplyIndex); } unchecked { ++i; } } } //////////////////////////////////////////////// /////////// PUBLIC FUNCTIONS /////////// //////////////////////////////////////////////// /** * Mints `numberOfMints` NFTs To Caller */ function mintFinalPortion(uint256 numberOfMints) external payable canMint(numberOfMints) { require(currentSupplyIndex >= breakPoint1, "Mint Exceeds Breakpoint"); _mintETH(numberOfMints); } /** * Mints `numberOfMints` NFTs To Caller */ function mintFirstPortion(uint256 numberOfMints) external payable canMint(numberOfMints) { require( currentSupplyIndex + numberOfMints <= breakPoint1, "Mint Exceeds Breakpoint" ); _mintETH(numberOfMints); } function burn(uint256 tokenID) external { require( _isApprovedOrOwner(_msgSender(), tokenID), "caller not owner nor approved" ); _burn(tokenID); } receive() external payable {} /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address wpowner = ownerOf(tokenId); require(to != wpowner, "ERC721: approval to current owner"); require( _msgSender() == wpowner || isApprovedForAll(wpowner, _msgSender()), "ERC721: not approved or owner" ); _approve(to, tokenId); } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address _operator, bool approved) public override { _setApprovalForAll(_msgSender(), _operator, approved); } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override onlyAllowedOperator(from) { require( _isApprovedOrOwner(_msgSender(), tokenId), "caller not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override onlyAllowedOperator(from) { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override onlyAllowedOperator(from) { require( _isApprovedOrOwner(_msgSender(), tokenId), "caller not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } //////////////////////////////////////////////// /////////// INTERNAL FUNCTIONS /////////// //////////////////////////////////////////////// function _mintETH(uint256 numberOfMints) internal { require(costETH * numberOfMints <= msg.value, "Incorrect Value Sent"); for (uint256 i = 0; i < numberOfMints; ) { _safeMint(msg.sender, currentSupplyIndex); unchecked { ++i; } } } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId) internal { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, ""), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal { require(!_exists(tokenId), "ERC721: token already minted"); require(currentSupplyIndex < MAX_SUPPLY, "All NFTs Have Been Minted"); // set owner of tokenId _owners[tokenId] = to; // Increment necessary values for tracking, no need to check for overflow unchecked { _balances[to]++; _totalSupply++; currentSupplyIndex++; if (tokenId < breakPoint0) { totalClass0++; } else if (tokenId < breakPoint1) { totalClass1++; } else { totalClass2++; } } // Cancel trading if breakpoint is exceeded if (currentSupplyIndex == breakPoint1) { tradingEnabled = false; } // init rewards IClaimContract(claimContract).initRewards(tokenId); // Emit initial ID transfer emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal { require(_exists(tokenId), "Token Does Not Exist"); // owner of token address _owner = ownerOf(tokenId); // Clear approvals _approve(address(0), tokenId); // decrement balance _balances[_owner] -= 1; delete _owners[tokenId]; // decrement total supply _totalSupply -= 1; // decrement total class quantity if (tokenId < breakPoint0) { totalClass0--; } else if (tokenId < breakPoint1) { totalClass1--; } else { totalClass2--; } // emit transfer emit Transfer(_owner, address(0), tokenId); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: non ERC721Receiver implementer" ); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal nonReentrant { require(ownerOf(tokenId) == from, "Incorrect owner"); require(to != address(0), "zero address"); require(balanceOf(from) > 0, "Zero Balance"); // Clear approvals from the previous owner _approve(address(0), tokenId); // Allocate balances _balances[from] = _balances[from].sub(1); _balances[to] += 1; _owners[tokenId] = to; // emit transfer emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal { _tokenApprovals[tokenId] = to; emit Approval(ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address wpowner, address _operator, bool approved ) internal { require(wpowner != _operator, "ERC721: approve to caller"); _operatorApprovals[wpowner][_operator] = approved; emit ApprovalForAll(wpowner, _operator, approved); } //////////////////////////////////////////////// /////////// READ FUNCTIONS /////////// //////////////////////////////////////////////// function owner() external view returns (address) { return this.getOwner(); } function totalSupply() external view returns (uint256) { return _totalSupply; } function getIDsByOwner(address _owner) public view returns (uint256[] memory) { uint256[] memory ids = new uint256[](balanceOf(_owner)); if (balanceOf(_owner) == 0) return ids; uint256 count = 0; for (uint256 i = 0; i < currentSupplyIndex; i++) { if (_owners[i] == _owner) { ids[count] = i; count++; } } return ids; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address wpowner) public view override returns (uint256) { require(wpowner != address(0), "query for the zero address"); return _balances[wpowner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { address wpowner = _owners[tokenId]; require(wpowner != address(0), "query for nonexistent token"); return wpowner; } /** * @dev See {IERC721Metadata-name}. */ function name() public pure override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public pure override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "nonexistent token"); string memory idstr = uint2str(tokenId); string memory fHalf = string.concat(baseURI, idstr); return string.concat(fHalf, ending); } /** Converts A Uint Into a String */ function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint256 j = _i; uint256 len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint256 k = len; while (_i != 0) { k = k - 1; uint8 temp = (48 + uint8(_i - (_i / 10) * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721: query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address wpowner, address _operator) public view override returns (bool) { return _operatorApprovals[wpowner][_operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted */ function _exists(uint256 tokenId) internal view returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { require(_exists(tokenId), "ERC721: nonexistent token"); address wpowner = ownerOf(tokenId); return (spender == wpowner || getApproved(tokenId) == spender || isApprovedForAll(wpowner, spender)); } function onReceivedRetval() public pure returns (bytes4) { return IERC721Receiver.onERC721Received.selector; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wpowner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"breakPoint0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"breakPoint1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkAllowedOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSupplyIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getIDsByOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wpowner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"}],"name":"mintFinalPortion","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"}],"name":"mintFirstPortion","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"onReceivedRetval","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"checkOperator","type":"bool"}],"name":"setCheckAllowedOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newClaim","type":"address"}],"name":"setClaimContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCostETH","type":"uint256"}],"name":"setCostETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newExtention","type":"string"}],"name":"setURIExtention","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClass0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClass1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClass2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c0604052600a60808190526974656d705f696d61676560b01b60a09081526200002d916008919062000172565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200005c9160099162000172565b5067022dc6ab0dbc8000600a55600e805461ffff19166101001790556010805460ff60a01b1916600160a01b1790553480156200009857600080fd5b506001600081815581546001600160a01b031916339081179092556040517f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735908290a36daaeb6d7670e522a718067333cd4e3b156200016c57604051633e9f1edf60e11b815230600482015273fd7bfa171b5b81b79c245456e986db2f32fbfadb60248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe90604401600060405180830381600087803b1580156200015257600080fd5b505af115801562000167573d6000803e3d6000fd5b505050505b62000254565b828054620001809062000218565b90600052602060002090601f016020900481019282620001a45760008555620001ef565b82601f10620001bf57805160ff1916838001178555620001ef565b82800160010185558215620001ef579182015b82811115620001ef578251825591602001919060010190620001d2565b50620001fd92915062000201565b5090565b5b80821115620001fd576000815560010162000202565b600181811c908216806200022d57607f821691505b6020821081036200024e57634e487b7160e01b600052602260045260246000fd5b50919050565b612f4b80620002646000396000f3fe6080604052600436106102975760003560e01c806367a594f61161015a578063a22cb465116100c1578063c87b56dd1161007a578063c87b56dd146107ca578063cdfb2b4e146107ea578063d6b0f484146107ff578063e797ec1b14610814578063e985e9c514610829578063edac985b1461087257600080fd5b8063a22cb46514610712578063a6f9dae114610732578063a87b76d214610752578063ae9843d614610772578063b36444c814610794578063b88d4fde146107aa57600080fd5b8063893d20e811610113578063893d20e81461066757806389476069146106855780638ca5affd146106a55780638da5cb5b146106b857806391db3da5146106cd57806395d89b41146106e357600080fd5b806367a594f6146105d357806369f7d2f2146105e957806370a08231146106095780637e20d0c1146106295780637e5cd5c11461063c578063887c207a1461065157600080fd5b806342842e0e116101fe57806355f804b3116101b757806355f804b31461051b5780635bf244be1461053b5780635ece6aa1146105685780636352211e1461057d57806366345da41461059d57806367349ad8146105bd57600080fd5b806342842e0e1461046257806342966c68146104825780634408a046146104a25780634a30d3eb146104c25780634ada218b146104e257806351fb012d146104fc57600080fd5b80631e263990116102505780631e263990146103b157806323b872dd146103c75780632a1e5315146103e757806332cb6b0c146104075780633af32abf1461041d5780633ccfd60b1461044d57600080fd5b806301ffc9a7146102a357806306fdde03146102d8578063081812fc14610317578063095ea7b31461034f57806318160ddd146103715780631d2c9bde1461039057600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506102c36102be36600461273f565b610892565b60405190151581526020015b60405180910390f35b3480156102e457600080fd5b5060408051808201909152600d81526c426f6465676120426c6f636b7360981b60208201525b6040516102cf91906127b4565b34801561032357600080fd5b506103376103323660046127c7565b6108e4565b6040516001600160a01b0390911681526020016102cf565b34801561035b57600080fd5b5061036f61036a3660046127f5565b610975565b005b34801561037d57600080fd5b506002545b6040519081526020016102cf565b34801561039c57600080fd5b506010546102c390600160a01b900460ff1681565b3480156103bd57600080fd5b5061038260035481565b3480156103d357600080fd5b5061036f6103e2366004612821565b610a64565b3480156103f357600080fd5b5061036f6104023660046127c7565b610c2c565b34801561041357600080fd5b5061038261232781565b34801561042957600080fd5b506102c3610438366004612862565b600f6020526000908152604090205460ff1681565b34801561045957600080fd5b5061036f610c5b565b34801561046e57600080fd5b5061036f61047d366004612821565b610cdd565b34801561048e57600080fd5b5061036f61049d3660046127c7565b610e80565b3480156104ae57600080fd5b5061036f6104bd36600461287f565b610eaf565b3480156104ce57600080fd5b5061036f6104dd366004612862565b610ee5565b3480156104ee57600080fd5b50600e546102c39060ff1681565b34801561050857600080fd5b50600e546102c390610100900460ff1681565b34801561052757600080fd5b5061036f61053636600461287f565b610f31565b34801561054757600080fd5b5061055b610556366004612862565b610f67565b6040516102cf91906128f1565b34801561057457600080fd5b50610382606f81565b34801561058957600080fd5b506103376105983660046127c7565b611044565b3480156105a957600080fd5b50601054610337906001600160a01b031681565b3480156105c957600080fd5b50610382600d5481565b3480156105df57600080fd5b50610382600c5481565b3480156105f557600080fd5b5061036f610604366004612981565b6110a9565b34801561061557600080fd5b50610382610624366004612862565b611157565b61036f6106373660046127c7565b6111cb565b34801561064857600080fd5b5061036f611318565b34801561065d57600080fd5b506103826104c681565b34801561067357600080fd5b506001546001600160a01b0316610337565b34801561069157600080fd5b5061036f6106a0366004612862565b61134e565b61036f6106b33660046127c7565b61149e565b3480156106c457600080fd5b506103376115e9565b3480156106d957600080fd5b50610382600a5481565b3480156106ef57600080fd5b50604080518082019091526006815265424f4445474160d01b602082015261030a565b34801561071e57600080fd5b5061036f61072d3660046129fb565b611652565b34801561073e57600080fd5b5061036f61074d366004612862565b61165d565b34801561075e57600080fd5b5061036f61076d366004612a34565b6116e3565b34801561077e57600080fd5b50604051630a85bd0160e11b81526020016102cf565b3480156107a057600080fd5b50610382600b5481565b3480156107b657600080fd5b5061036f6107c5366004612a67565b61172b565b3480156107d657600080fd5b5061030a6107e53660046127c7565b6118f6565b3480156107f657600080fd5b5061036f6119b1565b34801561080b57600080fd5b5061036f6119ec565b34801561082057600080fd5b5061036f611a23565b34801561083557600080fd5b506102c3610844366004612b47565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561087e57600080fd5b5061036f61088d366004612b75565b611a5c565b60006001600160e01b031982166380ac58cd60e01b14806108c357506001600160e01b03198216635b5e139f60e01b145b806108de57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000818152600460205260408120546001600160a01b03166109595760405162461bcd60e51b815260206004820152602360248201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061098082611044565b9050806001600160a01b0316836001600160a01b0316036109ed5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610950565b336001600160a01b0382161480610a095750610a098133610844565b610a555760405162461bcd60e51b815260206004820152601d60248201527f4552433732313a206e6f7420617070726f766564206f72206f776e65720000006044820152606401610950565b610a5f8383611aef565b505050565b6010548390600160a01b900460ff161515600003610ab357610a87335b83611b5d565b610aa35760405162461bcd60e51b815260040161095090612bb7565b610aae848484611c3f565b610c26565b6daaeb6d7670e522a718067333cd4e3b15610bf657336001600160a01b03821603610ae157610a8733610a81565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b549190612bee565b8015610bd75750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610bb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd79190612bee565b610bf657604051633b79c77360e21b8152336004820152602401610950565b610bff33610a81565b610c1b5760405162461bcd60e51b815260040161095090612bb7565b610c26848484611c3f565b50505050565b6001546001600160a01b03163314610c565760405162461bcd60e51b815260040161095090612c0b565b600a55565b6001546001600160a01b03163314610c855760405162461bcd60e51b815260040161095090612c0b565b604051600090339047908381818185875af1925050503d8060008114610cc7576040519150601f19603f3d011682016040523d82523d6000602084013e610ccc565b606091505b5050905080610cda57600080fd5b50565b6010548390600160a01b900460ff161515600003610d1057610aae8484846040518060200160405280600081525061172b565b6daaeb6d7670e522a718067333cd4e3b15610e6557336001600160a01b03821603610d5057610aae8484846040518060200160405280600081525061172b565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc39190612bee565b8015610e465750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610e22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e469190612bee565b610e6557604051633b79c77360e21b8152336004820152602401610950565b610c268484846040518060200160405280600081525061172b565b610e8a3382611b5d565b610ea65760405162461bcd60e51b815260040161095090612bb7565b610cda81611e49565b6001546001600160a01b03163314610ed95760405162461bcd60e51b815260040161095090612c0b565b610a5f60098383612690565b6001546001600160a01b03163314610f0f5760405162461bcd60e51b815260040161095090612c0b565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314610f5b5760405162461bcd60e51b815260040161095090612c0b565b610a5f60088383612690565b60606000610f7483611157565b67ffffffffffffffff811115610f8c57610f8c612a51565b604051908082528060200260200182016040528015610fb5578160200160208202803683370190505b509050610fc183611157565b600003610fce5792915050565b6000805b60035481101561103b576000818152600460205260409020546001600160a01b03808716911603611029578083838151811061101057611010612c38565b60209081029190910101528161102581612c64565b9250505b8061103381612c64565b915050610fd2565b50909392505050565b6000818152600460205260408120546001600160a01b0316806108de5760405162461bcd60e51b815260206004820152601b60248201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610950565b6001546001600160a01b031633146110d35760405162461bcd60e51b815260040161095090612c0b565b8260005b8181101561114f5760005b8484838181106110f4576110f4612c38565b905060200201358110156111465761113487878481811061111757611117612c38565b905060200201602081019061112c9190612862565b600354611fad565b8061113e81612c64565b9150506110e2565b506001016110d7565b505050505050565b60006001600160a01b0382166111af5760405162461bcd60e51b815260206004820152601a60248201527f717565727920666f7220746865207a65726f20616464726573730000000000006044820152606401610950565b506001600160a01b031660009081526005602052604090205490565b600e54819060ff166112155760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c8139bdd08115b98589b1959606a1b6044820152606401610950565b600e54610100900460ff161561127d57336000908152600f602052604090205460ff1661127d5760405162461bcd60e51b815260206004820152601660248201527514d95b99195c88139bdd0815da1a5d195b1a5cdd195960521b6044820152606401610950565b600081116112bd5760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908125b9c1d5d609a1b6044820152606401610950565b6104c6600354101561130b5760405162461bcd60e51b8152602060048201526017602482015276135a5b9d08115e18d959591cc8109c99585adc1bda5b9d604a1b6044820152606401610950565b6113148261203a565b5050565b6001546001600160a01b031633146113425760405162461bcd60e51b815260040161095090612c0b565b600e805460ff19169055565b6001546001600160a01b031633146113785760405162461bcd60e51b815260040161095090612c0b565b6001600160a01b0381166113bd5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610950565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa15801561140b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142f9190612c7d565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561147a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113149190612bee565b600e54819060ff166114e85760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c8139bdd08115b98589b1959606a1b6044820152606401610950565b600e54610100900460ff161561155057336000908152600f602052604090205460ff166115505760405162461bcd60e51b815260206004820152601660248201527514d95b99195c88139bdd0815da1a5d195b1a5cdd195960521b6044820152606401610950565b600081116115905760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908125b9c1d5d609a1b6044820152606401610950565b6104c6826003546115a19190612c96565b111561130b5760405162461bcd60e51b8152602060048201526017602482015276135a5b9d08115e18d959591cc8109c99585adc1bda5b9d604a1b6044820152606401610950565b6000306001600160a01b031663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164d9190612cae565b905090565b6113143383836120ad565b6001546001600160a01b031633146116875760405162461bcd60e51b815260040161095090612c0b565b6001546040516001600160a01b038084169216907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73590600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316331461170d5760405162461bcd60e51b815260040161095090612c0b565b60108054911515600160a01b0260ff60a01b19909216919091179055565b6010548490600160a01b900460ff16151560000361177b5761174e335b84611b5d565b61176a5760405162461bcd60e51b815260040161095090612bb7565b6117768585858561217b565b6118ef565b6daaeb6d7670e522a718067333cd4e3b156118be57336001600160a01b038216036117a95761174e33611748565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156117f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181c9190612bee565b801561189f5750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561187b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189f9190612bee565b6118be57604051633b79c77360e21b8152336004820152602401610950565b6118c733611748565b6118e35760405162461bcd60e51b815260040161095090612bb7565b6118ef8585858561217b565b5050505050565b6000818152600460205260409020546060906001600160a01b03166119515760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610950565b600061195c836121ae565b90506000600882604051602001611974929190612d9e565b6040516020818303038152906040529050806009604051602001611999929190612dc3565b60405160208183030381529060405292505050919050565b6001546001600160a01b031633146119db5760405162461bcd60e51b815260040161095090612c0b565b600e805461ff001916610100179055565b6001546001600160a01b03163314611a165760405162461bcd60e51b815260040161095090612c0b565b600e805461ff0019169055565b6001546001600160a01b03163314611a4d5760405162461bcd60e51b815260040161095090612c0b565b600e805460ff19166001179055565b6001546001600160a01b03163314611a865760405162461bcd60e51b815260040161095090612c0b565b8060005b81811015610c26576001600f6000868685818110611aaa57611aaa612c38565b9050602002016020810190611abf9190612862565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101611a8a565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b2482611044565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600460205260408120546001600160a01b0316611bc15760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e000000000000006044820152606401610950565b6000611bcc83611044565b9050806001600160a01b0316846001600160a01b03161480611c075750836001600160a01b0316611bfc846108e4565b6001600160a01b0316145b80611c3757506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b600260005403611c915760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610950565b60026000556001600160a01b038316611ca982611044565b6001600160a01b031614611cf15760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba1037bbb732b960891b6044820152606401610950565b6001600160a01b038216611d365760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401610950565b6000611d4184611157565b11611d7d5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2042616c616e636560a01b6044820152606401610950565b611d88600082611aef565b6001600160a01b038316600090815260056020526040902054611dac9060016122da565b6001600160a01b03808516600090815260056020526040808220939093559084168152908120805460019290611de3908490612c96565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a45050600160005550565b6000818152600460205260409020546001600160a01b0316611ea45760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88111bd95cc8139bdd08115e1a5cdd60621b6044820152606401610950565b6000611eaf82611044565b9050611ebc600083611aef565b6001600160a01b0381166000908152600560205260408120805460019290611ee5908490612de1565b9091555050600082815260046020526040812080546001600160a01b03191690556002805460019290611f19908490612de1565b9091555050606f821015611f4157600b8054906000611f3783612df8565b9190505550611f71565b6104c6821015611f5b57600c8054906000611f3783612df8565b600d8054906000611f6b83612df8565b91905055505b60405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b611fb78282612323565b611fd36000838360405180602001604052806000815250612515565b6113145760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610950565b3481600a546120499190612e0f565b111561208e5760405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0815985b1d594814d95b9d60621b6044820152606401610950565b60005b81811015611314576120a533600354611fad565b600101612091565b816001600160a01b0316836001600160a01b03160361210e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610950565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612186848484611c3f565b61219284848484612515565b610c265760405162461bcd60e51b815260040161095090612e2e565b6060816000036121d55750506040805180820190915260018152600360fc1b602082015290565b8160005b81156121ff57806121e981612c64565b91506121f89050600a83612e74565b91506121d9565b60008167ffffffffffffffff81111561221a5761221a612a51565b6040519080825280601f01601f191660200182016040528015612244576020820181803683370190505b509050815b85156122d15761225a600182612de1565b90506000612269600a88612e74565b61227490600a612e0f565b61227e9088612de1565b612289906030612e96565b905060008160f81b9050808484815181106122a6576122a6612c38565b60200101906001600160f81b031916908160001a9053506122c8600a89612e74565b97505050612249565b50949350505050565b600061231c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061261d565b9392505050565b6000818152600460205260409020546001600160a01b0316156123885760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610950565b612327600354106123db5760405162461bcd60e51b815260206004820152601960248201527f416c6c204e4654732048617665204265656e204d696e746564000000000000006044820152606401610950565b600081815260046020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260059091529020805460019081019091556002805482019055600380549091019055606f81101561244357600b80546001019055612465565b6104c681101561245b57600c80546001019055612465565b600d805460010190555b6104c66003540361247b57600e805460ff191690555b601054604051636c65b9ad60e11b8152600481018390526001600160a01b039091169063d8cb735a90602401600060405180830381600087803b1580156124c157600080fd5b505af11580156124d5573d6000803e3d6000fd5b50506040518392506001600160a01b03851691506000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612529846001600160a01b0316612657565b1561261257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612560903390899088908890600401612ebb565b6020604051808303816000875af192505050801561259b575060408051601f3d908101601f1916820190925261259891810190612ef8565b60015b6125f8573d8080156125c9576040519150601f19603f3d011682016040523d82523d6000602084013e6125ce565b606091505b5080516000036125f05760405162461bcd60e51b815260040161095090612e2e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c37565b506001949350505050565b600081848411156126415760405162461bcd60e51b815260040161095091906127b4565b50600061264e8486612de1565b95945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611c37575050151592915050565b82805461269c90612ccb565b90600052602060002090601f0160209004810192826126be5760008555612704565b82601f106126d75782800160ff19823516178555612704565b82800160010185558215612704579182015b828111156127045782358255916020019190600101906126e9565b50612710929150612714565b5090565b5b808211156127105760008155600101612715565b6001600160e01b031981168114610cda57600080fd5b60006020828403121561275157600080fd5b813561231c81612729565b60005b8381101561277757818101518382015260200161275f565b83811115610c265750506000910152565b600081518084526127a081602086016020860161275c565b601f01601f19169290920160200192915050565b60208152600061231c6020830184612788565b6000602082840312156127d957600080fd5b5035919050565b6001600160a01b0381168114610cda57600080fd5b6000806040838503121561280857600080fd5b8235612813816127e0565b946020939093013593505050565b60008060006060848603121561283657600080fd5b8335612841816127e0565b92506020840135612851816127e0565b929592945050506040919091013590565b60006020828403121561287457600080fd5b813561231c816127e0565b6000806020838503121561289257600080fd5b823567ffffffffffffffff808211156128aa57600080fd5b818501915085601f8301126128be57600080fd5b8135818111156128cd57600080fd5b8660208285010111156128df57600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b818110156129295783518352928401929184019160010161290d565b50909695505050505050565b60008083601f84011261294757600080fd5b50813567ffffffffffffffff81111561295f57600080fd5b6020830191508360208260051b850101111561297a57600080fd5b9250929050565b6000806000806040858703121561299757600080fd5b843567ffffffffffffffff808211156129af57600080fd5b6129bb88838901612935565b909650945060208701359150808211156129d457600080fd5b506129e187828801612935565b95989497509550505050565b8015158114610cda57600080fd5b60008060408385031215612a0e57600080fd5b8235612a19816127e0565b91506020830135612a29816129ed565b809150509250929050565b600060208284031215612a4657600080fd5b813561231c816129ed565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612a7d57600080fd5b8435612a88816127e0565b93506020850135612a98816127e0565b925060408501359150606085013567ffffffffffffffff80821115612abc57600080fd5b818701915087601f830112612ad057600080fd5b813581811115612ae257612ae2612a51565b604051601f8201601f19908116603f01168101908382118183101715612b0a57612b0a612a51565b816040528281528a6020848701011115612b2357600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612b5a57600080fd5b8235612b65816127e0565b91506020830135612a29816127e0565b60008060208385031215612b8857600080fd5b823567ffffffffffffffff811115612b9f57600080fd5b612bab85828601612935565b90969095509350505050565b6020808252601d908201527f63616c6c6572206e6f74206f776e6572206e6f7220617070726f766564000000604082015260600190565b600060208284031215612c0057600080fd5b815161231c816129ed565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612c7657612c76612c4e565b5060010190565b600060208284031215612c8f57600080fd5b5051919050565b60008219821115612ca957612ca9612c4e565b500190565b600060208284031215612cc057600080fd5b815161231c816127e0565b600181811c90821680612cdf57607f821691505b602082108103612cff57634e487b7160e01b600052602260045260246000fd5b50919050565b8054600090600181811c9080831680612d1f57607f831692505b60208084108203612d4057634e487b7160e01b600052602260045260246000fd5b818015612d545760018114612d6557612d92565b60ff19861689528489019650612d92565b60008881526020902060005b86811015612d8a5781548b820152908501908301612d71565b505084890196505b50505050505092915050565b6000612daa8285612d05565b8351612dba81836020880161275c565b01949350505050565b60008351612dd581846020880161275c565b61264e81840185612d05565b600082821015612df357612df3612c4e565b500390565b600081612e0757612e07612c4e565b506000190190565b6000816000190483118215151615612e2957612e29612c4e565b500290565b60208082526026908201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560408201526536b2b73a32b960d11b606082015260800190565b600082612e9157634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff84168060ff03821115612eb357612eb3612c4e565b019392505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612eee90830184612788565b9695505050505050565b600060208284031215612f0a57600080fd5b815161231c8161272956fea2646970667358221220ce2ac26a1dad8e89d6f43aef6e1f2943b51d9f18ddc95f383ccca4bb0fc9af4964736f6c634300080e0033
Deployed Bytecode
0x6080604052600436106102975760003560e01c806367a594f61161015a578063a22cb465116100c1578063c87b56dd1161007a578063c87b56dd146107ca578063cdfb2b4e146107ea578063d6b0f484146107ff578063e797ec1b14610814578063e985e9c514610829578063edac985b1461087257600080fd5b8063a22cb46514610712578063a6f9dae114610732578063a87b76d214610752578063ae9843d614610772578063b36444c814610794578063b88d4fde146107aa57600080fd5b8063893d20e811610113578063893d20e81461066757806389476069146106855780638ca5affd146106a55780638da5cb5b146106b857806391db3da5146106cd57806395d89b41146106e357600080fd5b806367a594f6146105d357806369f7d2f2146105e957806370a08231146106095780637e20d0c1146106295780637e5cd5c11461063c578063887c207a1461065157600080fd5b806342842e0e116101fe57806355f804b3116101b757806355f804b31461051b5780635bf244be1461053b5780635ece6aa1146105685780636352211e1461057d57806366345da41461059d57806367349ad8146105bd57600080fd5b806342842e0e1461046257806342966c68146104825780634408a046146104a25780634a30d3eb146104c25780634ada218b146104e257806351fb012d146104fc57600080fd5b80631e263990116102505780631e263990146103b157806323b872dd146103c75780632a1e5315146103e757806332cb6b0c146104075780633af32abf1461041d5780633ccfd60b1461044d57600080fd5b806301ffc9a7146102a357806306fdde03146102d8578063081812fc14610317578063095ea7b31461034f57806318160ddd146103715780631d2c9bde1461039057600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506102c36102be36600461273f565b610892565b60405190151581526020015b60405180910390f35b3480156102e457600080fd5b5060408051808201909152600d81526c426f6465676120426c6f636b7360981b60208201525b6040516102cf91906127b4565b34801561032357600080fd5b506103376103323660046127c7565b6108e4565b6040516001600160a01b0390911681526020016102cf565b34801561035b57600080fd5b5061036f61036a3660046127f5565b610975565b005b34801561037d57600080fd5b506002545b6040519081526020016102cf565b34801561039c57600080fd5b506010546102c390600160a01b900460ff1681565b3480156103bd57600080fd5b5061038260035481565b3480156103d357600080fd5b5061036f6103e2366004612821565b610a64565b3480156103f357600080fd5b5061036f6104023660046127c7565b610c2c565b34801561041357600080fd5b5061038261232781565b34801561042957600080fd5b506102c3610438366004612862565b600f6020526000908152604090205460ff1681565b34801561045957600080fd5b5061036f610c5b565b34801561046e57600080fd5b5061036f61047d366004612821565b610cdd565b34801561048e57600080fd5b5061036f61049d3660046127c7565b610e80565b3480156104ae57600080fd5b5061036f6104bd36600461287f565b610eaf565b3480156104ce57600080fd5b5061036f6104dd366004612862565b610ee5565b3480156104ee57600080fd5b50600e546102c39060ff1681565b34801561050857600080fd5b50600e546102c390610100900460ff1681565b34801561052757600080fd5b5061036f61053636600461287f565b610f31565b34801561054757600080fd5b5061055b610556366004612862565b610f67565b6040516102cf91906128f1565b34801561057457600080fd5b50610382606f81565b34801561058957600080fd5b506103376105983660046127c7565b611044565b3480156105a957600080fd5b50601054610337906001600160a01b031681565b3480156105c957600080fd5b50610382600d5481565b3480156105df57600080fd5b50610382600c5481565b3480156105f557600080fd5b5061036f610604366004612981565b6110a9565b34801561061557600080fd5b50610382610624366004612862565b611157565b61036f6106373660046127c7565b6111cb565b34801561064857600080fd5b5061036f611318565b34801561065d57600080fd5b506103826104c681565b34801561067357600080fd5b506001546001600160a01b0316610337565b34801561069157600080fd5b5061036f6106a0366004612862565b61134e565b61036f6106b33660046127c7565b61149e565b3480156106c457600080fd5b506103376115e9565b3480156106d957600080fd5b50610382600a5481565b3480156106ef57600080fd5b50604080518082019091526006815265424f4445474160d01b602082015261030a565b34801561071e57600080fd5b5061036f61072d3660046129fb565b611652565b34801561073e57600080fd5b5061036f61074d366004612862565b61165d565b34801561075e57600080fd5b5061036f61076d366004612a34565b6116e3565b34801561077e57600080fd5b50604051630a85bd0160e11b81526020016102cf565b3480156107a057600080fd5b50610382600b5481565b3480156107b657600080fd5b5061036f6107c5366004612a67565b61172b565b3480156107d657600080fd5b5061030a6107e53660046127c7565b6118f6565b3480156107f657600080fd5b5061036f6119b1565b34801561080b57600080fd5b5061036f6119ec565b34801561082057600080fd5b5061036f611a23565b34801561083557600080fd5b506102c3610844366004612b47565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561087e57600080fd5b5061036f61088d366004612b75565b611a5c565b60006001600160e01b031982166380ac58cd60e01b14806108c357506001600160e01b03198216635b5e139f60e01b145b806108de57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000818152600460205260408120546001600160a01b03166109595760405162461bcd60e51b815260206004820152602360248201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061098082611044565b9050806001600160a01b0316836001600160a01b0316036109ed5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610950565b336001600160a01b0382161480610a095750610a098133610844565b610a555760405162461bcd60e51b815260206004820152601d60248201527f4552433732313a206e6f7420617070726f766564206f72206f776e65720000006044820152606401610950565b610a5f8383611aef565b505050565b6010548390600160a01b900460ff161515600003610ab357610a87335b83611b5d565b610aa35760405162461bcd60e51b815260040161095090612bb7565b610aae848484611c3f565b610c26565b6daaeb6d7670e522a718067333cd4e3b15610bf657336001600160a01b03821603610ae157610a8733610a81565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b549190612bee565b8015610bd75750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610bb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd79190612bee565b610bf657604051633b79c77360e21b8152336004820152602401610950565b610bff33610a81565b610c1b5760405162461bcd60e51b815260040161095090612bb7565b610c26848484611c3f565b50505050565b6001546001600160a01b03163314610c565760405162461bcd60e51b815260040161095090612c0b565b600a55565b6001546001600160a01b03163314610c855760405162461bcd60e51b815260040161095090612c0b565b604051600090339047908381818185875af1925050503d8060008114610cc7576040519150601f19603f3d011682016040523d82523d6000602084013e610ccc565b606091505b5050905080610cda57600080fd5b50565b6010548390600160a01b900460ff161515600003610d1057610aae8484846040518060200160405280600081525061172b565b6daaeb6d7670e522a718067333cd4e3b15610e6557336001600160a01b03821603610d5057610aae8484846040518060200160405280600081525061172b565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc39190612bee565b8015610e465750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610e22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e469190612bee565b610e6557604051633b79c77360e21b8152336004820152602401610950565b610c268484846040518060200160405280600081525061172b565b610e8a3382611b5d565b610ea65760405162461bcd60e51b815260040161095090612bb7565b610cda81611e49565b6001546001600160a01b03163314610ed95760405162461bcd60e51b815260040161095090612c0b565b610a5f60098383612690565b6001546001600160a01b03163314610f0f5760405162461bcd60e51b815260040161095090612c0b565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314610f5b5760405162461bcd60e51b815260040161095090612c0b565b610a5f60088383612690565b60606000610f7483611157565b67ffffffffffffffff811115610f8c57610f8c612a51565b604051908082528060200260200182016040528015610fb5578160200160208202803683370190505b509050610fc183611157565b600003610fce5792915050565b6000805b60035481101561103b576000818152600460205260409020546001600160a01b03808716911603611029578083838151811061101057611010612c38565b60209081029190910101528161102581612c64565b9250505b8061103381612c64565b915050610fd2565b50909392505050565b6000818152600460205260408120546001600160a01b0316806108de5760405162461bcd60e51b815260206004820152601b60248201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610950565b6001546001600160a01b031633146110d35760405162461bcd60e51b815260040161095090612c0b565b8260005b8181101561114f5760005b8484838181106110f4576110f4612c38565b905060200201358110156111465761113487878481811061111757611117612c38565b905060200201602081019061112c9190612862565b600354611fad565b8061113e81612c64565b9150506110e2565b506001016110d7565b505050505050565b60006001600160a01b0382166111af5760405162461bcd60e51b815260206004820152601a60248201527f717565727920666f7220746865207a65726f20616464726573730000000000006044820152606401610950565b506001600160a01b031660009081526005602052604090205490565b600e54819060ff166112155760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c8139bdd08115b98589b1959606a1b6044820152606401610950565b600e54610100900460ff161561127d57336000908152600f602052604090205460ff1661127d5760405162461bcd60e51b815260206004820152601660248201527514d95b99195c88139bdd0815da1a5d195b1a5cdd195960521b6044820152606401610950565b600081116112bd5760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908125b9c1d5d609a1b6044820152606401610950565b6104c6600354101561130b5760405162461bcd60e51b8152602060048201526017602482015276135a5b9d08115e18d959591cc8109c99585adc1bda5b9d604a1b6044820152606401610950565b6113148261203a565b5050565b6001546001600160a01b031633146113425760405162461bcd60e51b815260040161095090612c0b565b600e805460ff19169055565b6001546001600160a01b031633146113785760405162461bcd60e51b815260040161095090612c0b565b6001600160a01b0381166113bd5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610950565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa15801561140b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142f9190612c7d565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561147a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113149190612bee565b600e54819060ff166114e85760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c8139bdd08115b98589b1959606a1b6044820152606401610950565b600e54610100900460ff161561155057336000908152600f602052604090205460ff166115505760405162461bcd60e51b815260206004820152601660248201527514d95b99195c88139bdd0815da1a5d195b1a5cdd195960521b6044820152606401610950565b600081116115905760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908125b9c1d5d609a1b6044820152606401610950565b6104c6826003546115a19190612c96565b111561130b5760405162461bcd60e51b8152602060048201526017602482015276135a5b9d08115e18d959591cc8109c99585adc1bda5b9d604a1b6044820152606401610950565b6000306001600160a01b031663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164d9190612cae565b905090565b6113143383836120ad565b6001546001600160a01b031633146116875760405162461bcd60e51b815260040161095090612c0b565b6001546040516001600160a01b038084169216907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73590600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316331461170d5760405162461bcd60e51b815260040161095090612c0b565b60108054911515600160a01b0260ff60a01b19909216919091179055565b6010548490600160a01b900460ff16151560000361177b5761174e335b84611b5d565b61176a5760405162461bcd60e51b815260040161095090612bb7565b6117768585858561217b565b6118ef565b6daaeb6d7670e522a718067333cd4e3b156118be57336001600160a01b038216036117a95761174e33611748565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156117f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181c9190612bee565b801561189f5750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561187b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189f9190612bee565b6118be57604051633b79c77360e21b8152336004820152602401610950565b6118c733611748565b6118e35760405162461bcd60e51b815260040161095090612bb7565b6118ef8585858561217b565b5050505050565b6000818152600460205260409020546060906001600160a01b03166119515760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610950565b600061195c836121ae565b90506000600882604051602001611974929190612d9e565b6040516020818303038152906040529050806009604051602001611999929190612dc3565b60405160208183030381529060405292505050919050565b6001546001600160a01b031633146119db5760405162461bcd60e51b815260040161095090612c0b565b600e805461ff001916610100179055565b6001546001600160a01b03163314611a165760405162461bcd60e51b815260040161095090612c0b565b600e805461ff0019169055565b6001546001600160a01b03163314611a4d5760405162461bcd60e51b815260040161095090612c0b565b600e805460ff19166001179055565b6001546001600160a01b03163314611a865760405162461bcd60e51b815260040161095090612c0b565b8060005b81811015610c26576001600f6000868685818110611aaa57611aaa612c38565b9050602002016020810190611abf9190612862565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101611a8a565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b2482611044565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600460205260408120546001600160a01b0316611bc15760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e000000000000006044820152606401610950565b6000611bcc83611044565b9050806001600160a01b0316846001600160a01b03161480611c075750836001600160a01b0316611bfc846108e4565b6001600160a01b0316145b80611c3757506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b600260005403611c915760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610950565b60026000556001600160a01b038316611ca982611044565b6001600160a01b031614611cf15760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba1037bbb732b960891b6044820152606401610950565b6001600160a01b038216611d365760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401610950565b6000611d4184611157565b11611d7d5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2042616c616e636560a01b6044820152606401610950565b611d88600082611aef565b6001600160a01b038316600090815260056020526040902054611dac9060016122da565b6001600160a01b03808516600090815260056020526040808220939093559084168152908120805460019290611de3908490612c96565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a45050600160005550565b6000818152600460205260409020546001600160a01b0316611ea45760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88111bd95cc8139bdd08115e1a5cdd60621b6044820152606401610950565b6000611eaf82611044565b9050611ebc600083611aef565b6001600160a01b0381166000908152600560205260408120805460019290611ee5908490612de1565b9091555050600082815260046020526040812080546001600160a01b03191690556002805460019290611f19908490612de1565b9091555050606f821015611f4157600b8054906000611f3783612df8565b9190505550611f71565b6104c6821015611f5b57600c8054906000611f3783612df8565b600d8054906000611f6b83612df8565b91905055505b60405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b611fb78282612323565b611fd36000838360405180602001604052806000815250612515565b6113145760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610950565b3481600a546120499190612e0f565b111561208e5760405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0815985b1d594814d95b9d60621b6044820152606401610950565b60005b81811015611314576120a533600354611fad565b600101612091565b816001600160a01b0316836001600160a01b03160361210e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610950565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612186848484611c3f565b61219284848484612515565b610c265760405162461bcd60e51b815260040161095090612e2e565b6060816000036121d55750506040805180820190915260018152600360fc1b602082015290565b8160005b81156121ff57806121e981612c64565b91506121f89050600a83612e74565b91506121d9565b60008167ffffffffffffffff81111561221a5761221a612a51565b6040519080825280601f01601f191660200182016040528015612244576020820181803683370190505b509050815b85156122d15761225a600182612de1565b90506000612269600a88612e74565b61227490600a612e0f565b61227e9088612de1565b612289906030612e96565b905060008160f81b9050808484815181106122a6576122a6612c38565b60200101906001600160f81b031916908160001a9053506122c8600a89612e74565b97505050612249565b50949350505050565b600061231c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061261d565b9392505050565b6000818152600460205260409020546001600160a01b0316156123885760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610950565b612327600354106123db5760405162461bcd60e51b815260206004820152601960248201527f416c6c204e4654732048617665204265656e204d696e746564000000000000006044820152606401610950565b600081815260046020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260059091529020805460019081019091556002805482019055600380549091019055606f81101561244357600b80546001019055612465565b6104c681101561245b57600c80546001019055612465565b600d805460010190555b6104c66003540361247b57600e805460ff191690555b601054604051636c65b9ad60e11b8152600481018390526001600160a01b039091169063d8cb735a90602401600060405180830381600087803b1580156124c157600080fd5b505af11580156124d5573d6000803e3d6000fd5b50506040518392506001600160a01b03851691506000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612529846001600160a01b0316612657565b1561261257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612560903390899088908890600401612ebb565b6020604051808303816000875af192505050801561259b575060408051601f3d908101601f1916820190925261259891810190612ef8565b60015b6125f8573d8080156125c9576040519150601f19603f3d011682016040523d82523d6000602084013e6125ce565b606091505b5080516000036125f05760405162461bcd60e51b815260040161095090612e2e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c37565b506001949350505050565b600081848411156126415760405162461bcd60e51b815260040161095091906127b4565b50600061264e8486612de1565b95945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611c37575050151592915050565b82805461269c90612ccb565b90600052602060002090601f0160209004810192826126be5760008555612704565b82601f106126d75782800160ff19823516178555612704565b82800160010185558215612704579182015b828111156127045782358255916020019190600101906126e9565b50612710929150612714565b5090565b5b808211156127105760008155600101612715565b6001600160e01b031981168114610cda57600080fd5b60006020828403121561275157600080fd5b813561231c81612729565b60005b8381101561277757818101518382015260200161275f565b83811115610c265750506000910152565b600081518084526127a081602086016020860161275c565b601f01601f19169290920160200192915050565b60208152600061231c6020830184612788565b6000602082840312156127d957600080fd5b5035919050565b6001600160a01b0381168114610cda57600080fd5b6000806040838503121561280857600080fd5b8235612813816127e0565b946020939093013593505050565b60008060006060848603121561283657600080fd5b8335612841816127e0565b92506020840135612851816127e0565b929592945050506040919091013590565b60006020828403121561287457600080fd5b813561231c816127e0565b6000806020838503121561289257600080fd5b823567ffffffffffffffff808211156128aa57600080fd5b818501915085601f8301126128be57600080fd5b8135818111156128cd57600080fd5b8660208285010111156128df57600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b818110156129295783518352928401929184019160010161290d565b50909695505050505050565b60008083601f84011261294757600080fd5b50813567ffffffffffffffff81111561295f57600080fd5b6020830191508360208260051b850101111561297a57600080fd5b9250929050565b6000806000806040858703121561299757600080fd5b843567ffffffffffffffff808211156129af57600080fd5b6129bb88838901612935565b909650945060208701359150808211156129d457600080fd5b506129e187828801612935565b95989497509550505050565b8015158114610cda57600080fd5b60008060408385031215612a0e57600080fd5b8235612a19816127e0565b91506020830135612a29816129ed565b809150509250929050565b600060208284031215612a4657600080fd5b813561231c816129ed565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612a7d57600080fd5b8435612a88816127e0565b93506020850135612a98816127e0565b925060408501359150606085013567ffffffffffffffff80821115612abc57600080fd5b818701915087601f830112612ad057600080fd5b813581811115612ae257612ae2612a51565b604051601f8201601f19908116603f01168101908382118183101715612b0a57612b0a612a51565b816040528281528a6020848701011115612b2357600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612b5a57600080fd5b8235612b65816127e0565b91506020830135612a29816127e0565b60008060208385031215612b8857600080fd5b823567ffffffffffffffff811115612b9f57600080fd5b612bab85828601612935565b90969095509350505050565b6020808252601d908201527f63616c6c6572206e6f74206f776e6572206e6f7220617070726f766564000000604082015260600190565b600060208284031215612c0057600080fd5b815161231c816129ed565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612c7657612c76612c4e565b5060010190565b600060208284031215612c8f57600080fd5b5051919050565b60008219821115612ca957612ca9612c4e565b500190565b600060208284031215612cc057600080fd5b815161231c816127e0565b600181811c90821680612cdf57607f821691505b602082108103612cff57634e487b7160e01b600052602260045260246000fd5b50919050565b8054600090600181811c9080831680612d1f57607f831692505b60208084108203612d4057634e487b7160e01b600052602260045260246000fd5b818015612d545760018114612d6557612d92565b60ff19861689528489019650612d92565b60008881526020902060005b86811015612d8a5781548b820152908501908301612d71565b505084890196505b50505050505092915050565b6000612daa8285612d05565b8351612dba81836020880161275c565b01949350505050565b60008351612dd581846020880161275c565b61264e81840185612d05565b600082821015612df357612df3612c4e565b500390565b600081612e0757612e07612c4e565b506000190190565b6000816000190483118215151615612e2957612e29612c4e565b500290565b60208082526026908201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560408201526536b2b73a32b960d11b606082015260800190565b600082612e9157634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff84168060ff03821115612eb357612eb3612c4e565b019392505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612eee90830184612788565b9695505050505050565b600060208284031215612f0a57600080fd5b815161231c8161272956fea2646970667358221220ce2ac26a1dad8e89d6f43aef6e1f2943b51d9f18ddc95f383ccca4bb0fc9af4964736f6c634300080e0033
Deployed Bytecode Sourcemap
29102:21375:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45061:338;;;;;;;;;;-1:-1:-1;45061:338:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;45061:338:0;;;;;;;;46005:92;;;;;;;;;;-1:-1:-1;46084:5:0;;;;;;;;;;;;-1:-1:-1;;;46084:5:0;;;;46005:92;;;;;;;:::i;47430:245::-;;;;;;;;;;-1:-1:-1;47430:245:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;47430:245:0;1528:203:1;36223:377:0;;;;;;;;;;-1:-1:-1;36223:377:0;;;;;:::i;:::-;;:::i;:::-;;44420:93;;;;;;;;;;-1:-1:-1;44493:12:0;;44420:93;;;2338:25:1;;;2326:2;2311:18;44420:93:0;2192:177:1;30802:39:0;;;;;;;;;;-1:-1:-1;30802:39:0;;;;-1:-1:-1;;;30802:39:0;;;;;;29512:33;;;;;;;;;;;;;;;;36911:319;;;;;;;;;;-1:-1:-1;36911:319:0;;;;;:::i;:::-;;:::i;34043:98::-;;;;;;;;;;-1:-1:-1;34043:98:0;;;;;:::i;:::-;;:::i;29577:42::-;;;;;;;;;;;;29614:5;29577:42;;30639:45;;;;;;;;;;-1:-1:-1;30639:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33631:150;;;;;;;;;;;;;:::i;37301:203::-;;;;;;;;;;-1:-1:-1;37301:203:0;;;;;:::i;:::-;;:::i;35920:204::-;;;;;;;;;;-1:-1:-1;35920:204:0;;;;;:::i;:::-;;:::i;34255:114::-;;;;;;;;;;-1:-1:-1;34255:114:0;;;;;:::i;:::-;;:::i;33002:106::-;;;;;;;;;;-1:-1:-1;33002:106:0;;;;;:::i;:::-;;:::i;30528:34::-;;;;;;;;;;-1:-1:-1;30528:34:0;;;;;;;;30569:35;;;;;;;;;;-1:-1:-1;30569:35:0;;;;;;;;;;;34149:98;;;;;;;;;;-1:-1:-1;34149:98:0;;;;;:::i;:::-;;:::i;44521:468::-;;;;;;;;;;-1:-1:-1;44521:468:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30405:41::-;;;;;;;;;;;;30443:3;30405:41;;45715:223;;;;;;;;;;-1:-1:-1;45715:223:0;;;;;:::i;:::-;;:::i;30716:28::-;;;;;;;;;;-1:-1:-1;30716:28:0;;;;-1:-1:-1;;;;;30716:28:0;;;30340:26;;;;;;;;;;;;;;;;30307;;;;;;;;;;;;;;;;34663:404;;;;;;;;;;-1:-1:-1;34663:404:0;;;;;:::i;:::-;;:::i;45463:190::-;;;;;;;;;;-1:-1:-1;45463:190:0;;;;;:::i;:::-;;:::i;35302:243::-;;;;;;:::i;:::-;;:::i;33343:86::-;;;;;;;;;;;;;:::i;30453:43::-;;;;;;;;;;;;30491:5;30453:43;;24814:83;;;;;;;;;;-1:-1:-1;24884:5:0;;-1:-1:-1;;;;;24884:5:0;24814:83;;33789:246;;;;;;;;;;-1:-1:-1;33789:246:0;;;;;:::i;:::-;;:::i;35616:296::-;;;;;;:::i;:::-;;:::i;44322:90::-;;;;;;;;;;;;;:::i;30195:37::-;;;;;;;;;;;;;;;;46166:96;;;;;;;;;;-1:-1:-1;46247:7:0;;;;;;;;;;;;-1:-1:-1;;;46247:7:0;;;;46166:96;;36672:172;;;;;;;;;;-1:-1:-1;36672:172:0;;;;;:::i;:::-;;:::i;24589:132::-;;;;;;;;;;-1:-1:-1;24589:132:0;;;;;:::i;:::-;;:::i;33116:127::-;;;;;;;;;;-1:-1:-1;33116:127:0;;;;;:::i;:::-;;:::i;48865:124::-;;;;;;;;;;-1:-1:-1;48865:124:0;;-1:-1:-1;;;6371:52:1;;6359:2;6344:18;48865:124:0;6227:202:1;30274:26:0;;;;;;;;;;;;;;;;37575:363;;;;;;;;;;-1:-1:-1;37575:363:0;;;;;:::i;:::-;;:::i;46333:346::-;;;;;;;;;;-1:-1:-1;46333:346:0;;;;;:::i;:::-;;:::i;33535:88::-;;;;;;;;;;;;;:::i;33437:90::-;;;;;;;;;;;;;:::i;33251:84::-;;;;;;;;;;;;;:::i;47746:203::-;;;;;;;;;;-1:-1:-1;47746:203:0;;;;;:::i;:::-;-1:-1:-1;;;;;47903:27:0;;;47874:4;47903:27;;;:18;:27;;;;;;;;:38;;;;;;;;;;;;;;;47746:203;34377:278;;;;;;;;;;-1:-1:-1;34377:278:0;;;;;:::i;:::-;;:::i;45061:338::-;45191:4;-1:-1:-1;;;;;;45233:40:0;;-1:-1:-1;;;45233:40:0;;:105;;-1:-1:-1;;;;;;;45290:48:0;;-1:-1:-1;;;45290:48:0;45233:105;:158;;;-1:-1:-1;;;;;;;;;;4596:40:0;;;45355:36;45213:178;45061:338;-1:-1:-1;;45061:338:0:o;47430:245::-;47534:7;48274:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48274:16:0;47559:64;;;;-1:-1:-1;;;47559:64:0;;8874:2:1;47559:64:0;;;8856:21:1;8913:2;8893:18;;;8886:30;8952:34;8932:18;;;8925:62;-1:-1:-1;;;9003:18:1;;;8996:33;9046:19;;47559:64:0;;;;;;;;;-1:-1:-1;47643:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;47643:24:0;;47430:245::o;36223:377::-;36296:15;36314:16;36322:7;36314;:16::i;:::-;36296:34;;36355:7;-1:-1:-1;;;;;36349:13:0;:2;-1:-1:-1;;;;;36349:13:0;;36341:59;;;;-1:-1:-1;;;36341:59:0;;9278:2:1;36341:59:0;;;9260:21:1;9317:2;9297:18;;;9290:30;9356:34;9336:18;;;9329:62;-1:-1:-1;;;9407:18:1;;;9400:31;9448:19;;36341:59:0;9076:397:1;36341:59:0;18132:10;-1:-1:-1;;;;;36435:23:0;;;;:66;;-1:-1:-1;36462:39:0;36479:7;18132:10;47746:203;:::i;36462:39::-;36413:145;;;;-1:-1:-1;;;36413:145:0;;9680:2:1;36413:145:0;;;9662:21:1;9719:2;9699:18;;;9692:30;9758:31;9738:18;;;9731:59;9807:18;;36413:145:0;9478:353:1;36413:145:0;36571:21;36580:2;36584:7;36571:8;:21::i;:::-;36285:315;36223:377;;:::o;36911:319::-;31408:20;;37046:4;;-1:-1:-1;;;31408:20:0;;;;:29;;31432:5;31408:29;31404:84;;37085:41:::1;18132:10:::0;37104:12:::1;37118:7;37085:18;:41::i;:::-;37063:120;;;;-1:-1:-1::0;;;37063:120:0::1;;;;;;;:::i;:::-;37194:28;37204:4;37210:2;37214:7;37194:9;:28::i;:::-;31470:7:::0;;31404:84;31290:42;31608:43;:47;31604:699;;31895:10;-1:-1:-1;;;;;31887:18:0;;;31883:85;;37085:41:::1;18132:10:::0;37104:12:::1;18052:98:::0;31883:85;32028:67;;-1:-1:-1;;;32028:67:0;;32077:4;32028:67;;;10406:34:1;32084:10:0;10456:18:1;;;10449:43;31290:42:0;;32028:40;;10341:18:1;;32028:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;-1:-1:-1;32124:61:0;;-1:-1:-1;;;32124:61:0;;32173:4;32124:61;;;10406:34:1;-1:-1:-1;;;;;10476:15:1;;10456:18;;;10449:43;31290:42:0;;32124:40;;10341:18:1;;32124:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31982:310;;32246:30;;-1:-1:-1;;;32246:30:0;;32265:10;32246:30;;;1674:51:1;1647:18;;32246:30:0;1528:203:1;31982:310:0;37085:41:::1;18132:10:::0;37104:12:::1;18052:98:::0;37085:41:::1;37063:120;;;;-1:-1:-1::0;;;37063:120:0::1;;;;;;;:::i;:::-;37194:28;37204:4;37210:2;37214:7;37194:9;:28::i;:::-;36911:319:::0;;;;:::o;34043:98::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;34113:7:::1;:20:::0;34043:98::o;33631:150::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;33694:58:::1;::::0;33682:6:::1;::::0;33702:10:::1;::::0;33726:21:::1;::::0;33682:6;33694:58;33682:6;33694:58;33726:21;33702:10;33694:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33681:71;;;33771:1;33763:10;;;::::0;::::1;;33670:111;33631:150::o:0;37301:203::-;31408:20;;37440:4;;-1:-1:-1;;;31408:20:0;;;;:29;;31432:5;31408:29;31404:84;;37457:39:::1;37474:4;37480:2;37484:7;37457:39;;;;;;;;;;;::::0;:16:::1;:39::i;31404:84::-:0;31290:42;31608:43;:47;31604:699;;31895:10;-1:-1:-1;;;;;31887:18:0;;;31883:85;;37457:39:::1;37474:4;37480:2;37484:7;37457:39;;;;;;;;;;;::::0;:16:::1;:39::i;31883:85::-:0;32028:67;;-1:-1:-1;;;32028:67:0;;32077:4;32028:67;;;10406:34:1;32084:10:0;10456:18:1;;;10449:43;31290:42:0;;32028:40;;10341:18:1;;32028:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;-1:-1:-1;32124:61:0;;-1:-1:-1;;;32124:61:0;;32173:4;32124:61;;;10406:34:1;-1:-1:-1;;;;;10476:15:1;;10456:18;;;10449:43;31290:42:0;;32124:40;;10341:18:1;;32124:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31982:310;;32246:30;;-1:-1:-1;;;32246:30:0;;32265:10;32246:30;;;1674:51:1;1647:18;;32246:30:0;1528:203:1;31982:310:0;37457:39:::1;37474:4;37480:2;37484:7;37457:39;;;;;;;;;;;::::0;:16:::1;:39::i;35920:204::-:0;35993:41;18132:10;36026:7;35993:18;:41::i;:::-;35971:120;;;;-1:-1:-1;;;35971:120:0;;;;;;;:::i;:::-;36102:14;36108:7;36102:5;:14::i;34255:114::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;34340:21:::1;:6;34349:12:::0;;34340:21:::1;:::i;33002:106::-:0;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;33076:13:::1;:24:::0;;-1:-1:-1;;;;;;33076:24:0::1;-1:-1:-1::0;;;;;33076:24:0;;;::::1;::::0;;;::::1;::::0;;33002:106::o;34149:98::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;34223:16:::1;:7;34233:6:::0;;34223:16:::1;:::i;44521:468::-:0;44608:16;44642:20;44679:17;44689:6;44679:9;:17::i;:::-;44665:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44665:32:0;;44642:55;;44712:17;44722:6;44712:9;:17::i;:::-;44733:1;44712:22;44708:38;;44743:3;44521:468;-1:-1:-1;;44521:468:0:o;44708:38::-;44757:13;44790:9;44785:176;44809:18;;44805:1;:22;44785:176;;;44853:10;;;;:7;:10;;;;;;-1:-1:-1;;;;;44853:20:0;;;:10;;:20;44849:101;;44907:1;44894:3;44898:5;44894:10;;;;;;;;:::i;:::-;;;;;;;;;;:14;44927:7;;;;:::i;:::-;;;;44849:101;44829:3;;;;:::i;:::-;;;;44785:176;;;-1:-1:-1;44978:3:0;;44521:468;-1:-1:-1;;;44521:468:0:o;45715:223::-;45779:7;45817:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45817:16:0;;45844:61;;;;-1:-1:-1;;;45844:61:0;;11917:2:1;45844:61:0;;;11899:21:1;11956:2;11936:18;;;11929:30;11995:29;11975:18;;;11968:57;12042:18;;45844:61:0;11715:351:1;34663:404:0;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;34803:5;34789:11:::1;34826:234;34850:3;34846:1;:7;34826:234;;;34877:9;34872:115;34896:7;;34904:1;34896:10;;;;;;;:::i;:::-;;;;;;;34892:1;:14;34872:115;;;34932:39;34942:5;;34948:1;34942:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;34952:18;;34932:9;:39::i;:::-;34908:3:::0;::::1;::::0;::::1;:::i;:::-;;;;34872:115;;;-1:-1:-1::0;35030:3:0::1;;34826:234;;;;34778:289;34663:404:::0;;;;:::o;45463:190::-;45529:7;-1:-1:-1;;;;;45557:21:0;;45549:60;;;;-1:-1:-1;;;45549:60:0;;12273:2:1;45549:60:0;;;12255:21:1;12312:2;12292:18;;;12285:30;12351:28;12331:18;;;12324:56;12397:18;;45549:60:0;12071:350:1;45549:60:0;-1:-1:-1;;;;;;45627:18:0;;;;;:9;:18;;;;;;;45463:190::o;35302:243::-;30909:14;;35403:13;;30909:14;;30901:46;;;;-1:-1:-1;;;30901:46:0;;12628:2:1;30901:46:0;;;12610:21:1;12667:2;12647:18;;;12640:30;-1:-1:-1;;;12686:18:1;;;12679:49;12745:18;;30901:46:0;12426:343:1;30901:46:0;30962:16;;;;;;;30958:109;;;31017:10;31003:25;;;;:13;:25;;;;;;;;30995:60;;;;-1:-1:-1;;;30995:60:0;;12976:2:1;30995:60:0;;;12958:21:1;13015:2;12995:18;;;12988:30;-1:-1:-1;;;13034:18:1;;;13027:52;13096:18;;30995:60:0;12774:346:1;30995:60:0;31101:1;31085:13;:17;31077:43;;;;-1:-1:-1;;;31077:43:0;;13327:2:1;31077:43:0;;;13309:21:1;13366:2;13346:18;;;13339:30;-1:-1:-1;;;13385:18:1;;;13378:43;13438:18;;31077:43:0;13125:337:1;31077:43:0;30491:5:::1;35442:18;;:33;;35434:69;;;::::0;-1:-1:-1;;;35434:69:0;;13669:2:1;35434:69:0::1;::::0;::::1;13651:21:1::0;13708:2;13688:18;;;13681:30;-1:-1:-1;;;13727:18:1;;;13720:53;13790:18;;35434:69:0::1;13467:347:1::0;35434:69:0::1;35514:23;35523:13;35514:8;:23::i;:::-;35302:243:::0;;:::o;33343:86::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;33399:14:::1;:22:::0;;-1:-1:-1;;33399:22:0::1;::::0;;33343:86::o;33789:246::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33866:20:0;::::1;33858:45;;;::::0;-1:-1:-1;;;33858:45:0;;14021:2:1;33858:45:0::1;::::0;::::1;14003:21:1::0;14060:2;14040:18;;;14033:30;-1:-1:-1;;;14079:18:1;;;14072:42;14131:18;;33858:45:0::1;13819:336:1::0;33858:45:0::1;33977:39;::::0;-1:-1:-1;;;33977:39:0;;34010:4:::1;33977:39;::::0;::::1;1674:51:1::0;-1:-1:-1;;;;;33914:23:0;::::1;::::0;::::1;::::0;33952:10:::1;::::0;33914:23;;33977:24:::1;::::0;1647:18:1;;33977:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33914:113;::::0;-1:-1:-1;;;;;;33914:113:0::1;::::0;;;;;;-1:-1:-1;;;;;14541:32:1;;;33914:113:0::1;::::0;::::1;14523:51:1::0;14590:18;;;14583:34;14496:18;;33914:113:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35616:296::-:0;30909:14;;35717:13;;30909:14;;30901:46;;;;-1:-1:-1;;;30901:46:0;;12628:2:1;30901:46:0;;;12610:21:1;12667:2;12647:18;;;12640:30;-1:-1:-1;;;12686:18:1;;;12679:49;12745:18;;30901:46:0;12426:343:1;30901:46:0;30962:16;;;;;;;30958:109;;;31017:10;31003:25;;;;:13;:25;;;;;;;;30995:60;;;;-1:-1:-1;;;30995:60:0;;12976:2:1;30995:60:0;;;12958:21:1;13015:2;12995:18;;;12988:30;-1:-1:-1;;;13034:18:1;;;13027:52;13096:18;;30995:60:0;12774:346:1;30995:60:0;31101:1;31085:13;:17;31077:43;;;;-1:-1:-1;;;31077:43:0;;13327:2:1;31077:43:0;;;13309:21:1;13366:2;13346:18;;;13339:30;-1:-1:-1;;;13385:18:1;;;13378:43;13438:18;;31077:43:0;13125:337:1;31077:43:0;30491:5:::1;35791:13;35770:18;;:34;;;;:::i;:::-;:49;;35748:122;;;::::0;-1:-1:-1;;;35748:122:0;;13669:2:1;35748:122:0::1;::::0;::::1;13651:21:1::0;13708:2;13688:18;;;13681:30;-1:-1:-1;;;13727:18:1;;;13720:53;13790:18;;35748:122:0::1;13467:347:1::0;44322:90:0;44362:7;44389:4;-1:-1:-1;;;;;44389:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44382:22;;44322:90;:::o;36672:172::-;36783:53;18132:10;36816:9;36827:8;36783:18;:53::i;24589:132::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;24670:5:::1;::::0;24661:25:::1;::::0;-1:-1:-1;;;;;24661:25:0;;::::1;::::0;24670:5:::1;::::0;24661:25:::1;::::0;24670:5:::1;::::0;24661:25:::1;24697:5;:16:::0;;-1:-1:-1;;;;;;24697:16:0::1;-1:-1:-1::0;;;;;24697:16:0;;;::::1;::::0;;;::::1;::::0;;24589:132::o;33116:127::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;33199:20:::1;:36:::0;;;::::1;;-1:-1:-1::0;;;33199:36:0::1;-1:-1:-1::0;;;;33199:36:0;;::::1;::::0;;;::::1;::::0;;33116:127::o;37575:363::-;31408:20;;37743:4;;-1:-1:-1;;;31408:20:0;;;;:29;;31432:5;31408:29;31404:84;;37782:41:::1;18132:10:::0;37801:12:::1;37815:7;37782:18;:41::i;:::-;37760:120;;;;-1:-1:-1::0;;;37760:120:0::1;;;;;;;:::i;:::-;37891:39;37905:4;37911:2;37915:7;37924:5;37891:13;:39::i;:::-;31470:7:::0;;31404:84;31290:42;31608:43;:47;31604:699;;31895:10;-1:-1:-1;;;;;31887:18:0;;;31883:85;;37782:41:::1;18132:10:::0;37801:12:::1;18052:98:::0;31883:85;32028:67;;-1:-1:-1;;;32028:67:0;;32077:4;32028:67;;;10406:34:1;32084:10:0;10456:18:1;;;10449:43;31290:42:0;;32028:40;;10341:18:1;;32028:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;-1:-1:-1;32124:61:0;;-1:-1:-1;;;32124:61:0;;32173:4;32124:61;;;10406:34:1;-1:-1:-1;;;;;10476:15:1;;10456:18;;;10449:43;31290:42:0;;32124:40;;10341:18:1;;32124:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31982:310;;32246:30;;-1:-1:-1;;;32246:30:0;;32265:10;32246:30;;;1674:51:1;1647:18;;32246:30:0;1528:203:1;31982:310:0;37782:41:::1;18132:10:::0;37801:12:::1;18052:98:::0;37782:41:::1;37760:120;;;;-1:-1:-1::0;;;37760:120:0::1;;;;;;;:::i;:::-;37891:39;37905:4;37911:2;37915:7;37924:5;37891:13;:39::i;:::-;37575:363:::0;;;;;:::o;46333:346::-;48250:4;48274:16;;;:7;:16;;;;;;46434:13;;-1:-1:-1;;;;;48274:16:0;46465:46;;;;-1:-1:-1;;;46465:46:0;;15219:2:1;46465:46:0;;;15201:21:1;15258:2;15238:18;;;15231:30;-1:-1:-1;;;15277:18:1;;;15270:47;15334:18;;46465:46:0;15017:341:1;46465:46:0;46524:19;46546:17;46555:7;46546:8;:17::i;:::-;46524:39;;46574:19;46610:7;46619:5;46596:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46574:51;;46657:5;46664:6;46643:28;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46636:35;;;;46333:346;;;:::o;33535:88::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;33592:16:::1;:23:::0;;-1:-1:-1;;33592:23:0::1;;;::::0;;33535:88::o;33437:90::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;33495:16:::1;:24:::0;;-1:-1:-1;;33495:24:0::1;::::0;;33437:90::o;33251:84::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;33306:14:::1;:21:::0;;-1:-1:-1;;33306:21:0::1;33323:4;33306:21;::::0;;33251:84::o;34377:278::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;34472:5;34455:14:::1;34495:153;34519:6;34515:1;:10;34495:153;;;34570:4;34544:13;:23;34558:5;;34564:1;34558:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34544:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;34544:23:0;:30;;-1:-1:-1;;34544:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;34618:3:0::1;34495:153;;43530:159:::0;43597:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;43597:29:0;-1:-1:-1;;;;;43597:29:0;;;;;;;;:24;;43651:16;43597:24;43651:7;:16::i;:::-;-1:-1:-1;;;;;43642:39:0;;;;;;;;;;;43530:159;;:::o;48479:378::-;48591:4;48274:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48274:16:0;48613:54;;;;-1:-1:-1;;;48613:54:0;;17796:2:1;48613:54:0;;;17778:21:1;17835:2;17815:18;;;17808:30;17874:27;17854:18;;;17847:55;17919:18;;48613:54:0;17594:349:1;48613:54:0;48678:15;48696:16;48704:7;48696;:16::i;:::-;48678:34;;48742:7;-1:-1:-1;;;;;48731:18:0;:7;-1:-1:-1;;;;;48731:18:0;;:66;;;;48790:7;-1:-1:-1;;;;;48766:31:0;:20;48778:7;48766:11;:20::i;:::-;-1:-1:-1;;;;;48766:31:0;;48731:66;:117;;;-1:-1:-1;;;;;;47903:27:0;;;47874:4;47903:27;;;:18;:27;;;;;;;;:38;;;;;;;;;;;;48814:34;48723:126;48479:378;-1:-1:-1;;;;48479:378:0:o;42807:605::-;18391:1;18537:7;;:19;18529:63;;;;-1:-1:-1;;;18529:63:0;;18150:2:1;18529:63:0;;;18132:21:1;18189:2;18169:18;;;18162:30;18228:33;18208:18;;;18201:61;18279:18;;18529:63:0;17948:355:1;18529:63:0;18391:1;18603:7;:18;-1:-1:-1;;;;;42944:24:0;::::1;:16;42952:7:::0;42944::::1;:16::i;:::-;-1:-1:-1::0;;;;;42944:24:0::1;;42936:52;;;::::0;-1:-1:-1;;;42936:52:0;;18510:2:1;42936:52:0::1;::::0;::::1;18492:21:1::0;18549:2;18529:18;;;18522:30;-1:-1:-1;;;18568:18:1;;;18561:45;18623:18;;42936:52:0::1;18308:339:1::0;42936:52:0::1;-1:-1:-1::0;;;;;43007:16:0;::::1;42999:41;;;::::0;-1:-1:-1;;;42999:41:0;;18854:2:1;42999:41:0::1;::::0;::::1;18836:21:1::0;18893:2;18873:18;;;18866:30;-1:-1:-1;;;18912:18:1;;;18905:42;18964:18;;42999:41:0::1;18652:336:1::0;42999:41:0::1;43077:1;43059:15;43069:4;43059:9;:15::i;:::-;:19;43051:44;;;::::0;-1:-1:-1;;;43051:44:0;;19195:2:1;43051:44:0::1;::::0;::::1;19177:21:1::0;19234:2;19214:18;;;19207:30;-1:-1:-1;;;19253:18:1;;;19246:42;19305:18;;43051:44:0::1;18993:336:1::0;43051:44:0::1;43160:29;43177:1;43181:7;43160:8;:29::i;:::-;-1:-1:-1::0;;;;;43250:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:22:::1;::::0;43270:1:::1;43250:19;:22::i;:::-;-1:-1:-1::0;;;;;43232:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:40;;;;43283:13;;::::1;::::0;;;;;:18;;43300:1:::1;::::0;43232:15;43283:18:::1;::::0;43300:1;;43283:18:::1;:::i;:::-;::::0;;;-1:-1:-1;;43312:16:0::1;::::0;;;:7:::1;:16;::::0;;;;;:21;;-1:-1:-1;;;;;;43312:21:0::1;-1:-1:-1::0;;;;;43312:21:0;;::::1;::::0;;::::1;::::0;;;43377:27;;43312:16;;43377:27;;::::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;18347:1:0;18644:7;:22;-1:-1:-1;42807:605:0:o;40518:738::-;48250:4;48274:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48274:16:0;40570:49;;;;-1:-1:-1;;;40570:49:0;;19536:2:1;40570:49:0;;;19518:21:1;19575:2;19555:18;;;19548:30;-1:-1:-1;;;19594:18:1;;;19587:50;19654:18;;40570:49:0;19334:344:1;40570:49:0;40659:14;40676:16;40684:7;40676;:16::i;:::-;40659:33;;40733:29;40750:1;40754:7;40733:8;:29::i;:::-;-1:-1:-1;;;;;40805:17:0;;;;;;:9;:17;;;;;:22;;40826:1;;40805:17;:22;;40826:1;;40805:22;:::i;:::-;;;;-1:-1:-1;;40845:16:0;;;;:7;:16;;;;;40838:23;;-1:-1:-1;;;;;;40838:23:0;;;40909:12;:17;;40838:23;;40845:16;40909:17;;40838:23;;40909:17;:::i;:::-;;;;-1:-1:-1;;30443:3:0;40986:21;;40982:186;;;41024:11;:13;;;:11;:13;;;:::i;:::-;;;;;;40982:186;;;30491:5;41059:7;:21;41055:113;;;41097:11;:13;;;:11;:13;;;:::i;41055:113::-;41143:11;:13;;;:11;:13;;;:::i;:::-;;;;;;41055:113;41211:37;;41240:7;;41236:1;;-1:-1:-1;;;;;41211:37:0;;;;;41236:1;;41211:37;40559:697;40518:738;:::o;38656:256::-;38724:18;38730:2;38734:7;38724:5;:18::i;:::-;38775:51;38806:1;38810:2;38814:7;38775:51;;;;;;;;;;;;:22;:51::i;:::-;38753:151;;;;-1:-1:-1;;;38753:151:0;;20156:2:1;38753:151:0;;;20138:21:1;20195:2;20175:18;;;20168:30;20234:34;20214:18;;;20207:62;-1:-1:-1;;;20285:18:1;;;20278:48;20343:19;;38753:151:0;19954:414:1;38110:319:0;38206:9;38189:13;38179:7;;:23;;;;:::i;:::-;:36;;38171:69;;;;-1:-1:-1;;;38171:69:0;;20748:2:1;38171:69:0;;;20730:21:1;20787:2;20767:18;;;20760:30;-1:-1:-1;;;20806:18:1;;;20799:50;20866:18;;38171:69:0;20546:344:1;38171:69:0;38256:9;38251:171;38275:13;38271:1;:17;38251:171;;;38307:41;38317:10;38329:18;;38307:9;:41::i;:::-;38392:3;;38251:171;;43831:319;43983:9;-1:-1:-1;;;;;43972:20:0;:7;-1:-1:-1;;;;;43972:20:0;;43964:58;;;;-1:-1:-1;;;43964:58:0;;21097:2:1;43964:58:0;;;21079:21:1;21136:2;21116:18;;;21109:30;21175:27;21155:18;;;21148:55;21220:18;;43964:58:0;20895:349:1;43964:58:0;-1:-1:-1;;;;;44033:27:0;;;;;;;:18;:27;;;;;;;;:38;;;;;;;;;;;;;:49;;-1:-1:-1;;44033:49:0;;;;;;;;;;44098:44;;540:41:1;;;44098:44:0;;513:18:1;44098:44:0;;;;;;;43831:319;;;:::o;42138:332::-;42287:28;42297:4;42303:2;42307:7;42287:9;:28::i;:::-;42348:48;42371:4;42377:2;42381:7;42390:5;42348:22;:48::i;:::-;42326:136;;;;-1:-1:-1;;;42326:136:0;;;;;;;:::i;46743:621::-;46823:27;46872:2;46878:1;46872:7;46868:50;;-1:-1:-1;;46896:10:0;;;;;;;;;;;;-1:-1:-1;;;46896:10:0;;;;;46743:621::o;46868:50::-;46940:2;46928:9;46975:69;46982:6;;46975:69;;47005:5;;;;:::i;:::-;;-1:-1:-1;47025:7:0;;-1:-1:-1;47030:2:0;47025:7;;:::i;:::-;;;46975:69;;;47054:17;47084:3;47074:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47074:14:0;-1:-1:-1;47054:34:0;-1:-1:-1;47111:3:0;47125:202;47132:7;;47125:202;;47160:5;47164:1;47160;:5;:::i;:::-;47156:9;-1:-1:-1;47180:10:0;47211:7;47216:2;47211;:7;:::i;:::-;47210:14;;47222:2;47210:14;:::i;:::-;47205:19;;:2;:19;:::i;:::-;47194:31;;:2;:31;:::i;:::-;47180:46;;47241:9;47260:4;47253:12;;47241:24;;47290:2;47280:4;47285:1;47280:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;47280:12:0;;;;;;;;-1:-1:-1;47307:8:0;47313:2;47307:8;;:::i;:::-;;;47141:186;;47125:202;;;-1:-1:-1;47351:4:0;46743:621;-1:-1:-1;;;;46743:621:0:o;19408:136::-;19466:7;19493:43;19497:1;19500;19493:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;19486:50;19408:136;-1:-1:-1;;;19408:136:0:o;39248:1041::-;48250:4;48274:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48274:16:0;:30;39312:58;;;;-1:-1:-1;;;39312:58:0;;22289:2:1;39312:58:0;;;22271:21:1;22328:2;22308:18;;;22301:30;22367;22347:18;;;22340:58;22415:18;;39312:58:0;22087:352:1;39312:58:0;29614:5;39389:18;;:31;39381:69;;;;-1:-1:-1;;;39381:69:0;;22646:2:1;39381:69:0;;;22628:21:1;22685:2;22665:18;;;22658:30;22724:27;22704:18;;;22697:55;22769:18;;39381:69:0;22444:349:1;39381:69:0;39496:16;;;;:7;:16;;;;;;;;:21;;-1:-1:-1;;;;;;39496:21:0;-1:-1:-1;;;;;39496:21:0;;;;;;;;39638:13;;:9;:13;;;;;:15;;-1:-1:-1;39638:15:0;;;;;;39668:12;:14;;;;;;39697:18;:20;;;;;;;30443:3;39736:21;;39732:210;;;39778:11;:13;;;;;;39732:210;;;30491:5;39817:7;:21;39813:129;;;39859:11;:13;;;;;;39813:129;;;39913:11;:13;;;;;;39813:129;30491:5;40022:18;;:33;40018:88;;40072:14;:22;;-1:-1:-1;;40072:22:0;;;40018:88;40158:13;;40143:50;;-1:-1:-1;;;40143:50:0;;;;;2338:25:1;;;-1:-1:-1;;;;;40158:13:0;;;;40143:41;;2311:18:1;;40143:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40248:33:0;;40273:7;;-1:-1:-1;;;;;;40248:33:0;;;-1:-1:-1;40265:1:0;;40248:33;;40265:1;;40248:33;39248:1041;;:::o;49554:920::-;49709:4;49730:15;:2;-1:-1:-1;;;;;49730:13:0;;:15::i;:::-;49726:741;;;49783:175;;-1:-1:-1;;;49783:175:0;;-1:-1:-1;;;;;49783:36:0;;;;;:175;;18132:10;;49877:4;;49904:7;;49934:5;;49783:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49783:175:0;;;;;;;;-1:-1:-1;;49783:175:0;;;;;;;;;;;;:::i;:::-;;;49762:650;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50141:6;:13;50158:1;50141:18;50137:260;;50184:48;;-1:-1:-1;;;50184:48:0;;;;;;;:::i;50137:260::-;50347:6;50341:13;50332:6;50328:2;50324:15;50317:38;49762:650;-1:-1:-1;;;;;;50022:51:0;-1:-1:-1;;;50022:51:0;;-1:-1:-1;50015:58:0;;49726:741;-1:-1:-1;50451:4:0;49554:920;;;;;;:::o;19847:226::-;19967:7;20003:12;19995:6;;;;19987:29;;;;-1:-1:-1;;;19987:29:0;;;;;;;;:::i;:::-;-1:-1:-1;20027:9:0;20039:5;20043:1;20039;:5;:::i;:::-;20027:17;19847:226;-1:-1:-1;;;;;19847:226:0:o;11606:641::-;11666:4;12147:20;;11977:66;12196:23;;;;;;:42;;-1:-1:-1;;12223:15:0;;;12188:51;-1:-1:-1;;11606:641:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:131::-;-1:-1:-1;;;;;1811:31:1;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:1:o;2374:456::-;2451:6;2459;2467;2520:2;2508:9;2499:7;2495:23;2491:32;2488:52;;;2536:1;2533;2526:12;2488:52;2575:9;2562:23;2594:31;2619:5;2594:31;:::i;:::-;2644:5;-1:-1:-1;2701:2:1;2686:18;;2673:32;2714:33;2673:32;2714:33;:::i;:::-;2374:456;;2766:7;;-1:-1:-1;;;2820:2:1;2805:18;;;;2792:32;;2374:456::o;2835:247::-;2894:6;2947:2;2935:9;2926:7;2922:23;2918:32;2915:52;;;2963:1;2960;2953:12;2915:52;3002:9;2989:23;3021:31;3046:5;3021:31;:::i;3087:592::-;3158:6;3166;3219:2;3207:9;3198:7;3194:23;3190:32;3187:52;;;3235:1;3232;3225:12;3187:52;3275:9;3262:23;3304:18;3345:2;3337:6;3334:14;3331:34;;;3361:1;3358;3351:12;3331:34;3399:6;3388:9;3384:22;3374:32;;3444:7;3437:4;3433:2;3429:13;3425:27;3415:55;;3466:1;3463;3456:12;3415:55;3506:2;3493:16;3532:2;3524:6;3521:14;3518:34;;;3548:1;3545;3538:12;3518:34;3593:7;3588:2;3579:6;3575:2;3571:15;3567:24;3564:37;3561:57;;;3614:1;3611;3604:12;3561:57;3645:2;3637:11;;;;;3667:6;;-1:-1:-1;3087:592:1;;-1:-1:-1;;;;3087:592:1:o;3684:632::-;3855:2;3907:21;;;3977:13;;3880:18;;;3999:22;;;3826:4;;3855:2;4078:15;;;;4052:2;4037:18;;;3826:4;4121:169;4135:6;4132:1;4129:13;4121:169;;;4196:13;;4184:26;;4265:15;;;;4230:12;;;;4157:1;4150:9;4121:169;;;-1:-1:-1;4307:3:1;;3684:632;-1:-1:-1;;;;;;3684:632:1:o;4321:367::-;4384:8;4394:6;4448:3;4441:4;4433:6;4429:17;4425:27;4415:55;;4466:1;4463;4456:12;4415:55;-1:-1:-1;4489:20:1;;4532:18;4521:30;;4518:50;;;4564:1;4561;4554:12;4518:50;4601:4;4593:6;4589:17;4577:29;;4661:3;4654:4;4644:6;4641:1;4637:14;4629:6;4625:27;4621:38;4618:47;4615:67;;;4678:1;4675;4668:12;4615:67;4321:367;;;;;:::o;4693:773::-;4815:6;4823;4831;4839;4892:2;4880:9;4871:7;4867:23;4863:32;4860:52;;;4908:1;4905;4898:12;4860:52;4948:9;4935:23;4977:18;5018:2;5010:6;5007:14;5004:34;;;5034:1;5031;5024:12;5004:34;5073:70;5135:7;5126:6;5115:9;5111:22;5073:70;:::i;:::-;5162:8;;-1:-1:-1;5047:96:1;-1:-1:-1;5250:2:1;5235:18;;5222:32;;-1:-1:-1;5266:16:1;;;5263:36;;;5295:1;5292;5285:12;5263:36;;5334:72;5398:7;5387:8;5376:9;5372:24;5334:72;:::i;:::-;4693:773;;;;-1:-1:-1;5425:8:1;-1:-1:-1;;;;4693:773:1:o;5471:118::-;5557:5;5550:13;5543:21;5536:5;5533:32;5523:60;;5579:1;5576;5569:12;5594:382;5659:6;5667;5720:2;5708:9;5699:7;5695:23;5691:32;5688:52;;;5736:1;5733;5726:12;5688:52;5775:9;5762:23;5794:31;5819:5;5794:31;:::i;:::-;5844:5;-1:-1:-1;5901:2:1;5886:18;;5873:32;5914:30;5873:32;5914:30;:::i;:::-;5963:7;5953:17;;;5594:382;;;;;:::o;5981:241::-;6037:6;6090:2;6078:9;6069:7;6065:23;6061:32;6058:52;;;6106:1;6103;6096:12;6058:52;6145:9;6132:23;6164:28;6186:5;6164:28;:::i;6434:127::-;6495:10;6490:3;6486:20;6483:1;6476:31;6526:4;6523:1;6516:15;6550:4;6547:1;6540:15;6566:1266;6661:6;6669;6677;6685;6738:3;6726:9;6717:7;6713:23;6709:33;6706:53;;;6755:1;6752;6745:12;6706:53;6794:9;6781:23;6813:31;6838:5;6813:31;:::i;:::-;6863:5;-1:-1:-1;6920:2:1;6905:18;;6892:32;6933:33;6892:32;6933:33;:::i;:::-;6985:7;-1:-1:-1;7039:2:1;7024:18;;7011:32;;-1:-1:-1;7094:2:1;7079:18;;7066:32;7117:18;7147:14;;;7144:34;;;7174:1;7171;7164:12;7144:34;7212:6;7201:9;7197:22;7187:32;;7257:7;7250:4;7246:2;7242:13;7238:27;7228:55;;7279:1;7276;7269:12;7228:55;7315:2;7302:16;7337:2;7333;7330:10;7327:36;;;7343:18;;:::i;:::-;7418:2;7412:9;7386:2;7472:13;;-1:-1:-1;;7468:22:1;;;7492:2;7464:31;7460:40;7448:53;;;7516:18;;;7536:22;;;7513:46;7510:72;;;7562:18;;:::i;:::-;7602:10;7598:2;7591:22;7637:2;7629:6;7622:18;7677:7;7672:2;7667;7663;7659:11;7655:20;7652:33;7649:53;;;7698:1;7695;7688:12;7649:53;7754:2;7749;7745;7741:11;7736:2;7728:6;7724:15;7711:46;7799:1;7794:2;7789;7781:6;7777:15;7773:24;7766:35;7820:6;7810:16;;;;;;;6566:1266;;;;;;;:::o;7837:388::-;7905:6;7913;7966:2;7954:9;7945:7;7941:23;7937:32;7934:52;;;7982:1;7979;7972:12;7934:52;8021:9;8008:23;8040:31;8065:5;8040:31;:::i;:::-;8090:5;-1:-1:-1;8147:2:1;8132:18;;8119:32;8160:33;8119:32;8160:33;:::i;8230:437::-;8316:6;8324;8377:2;8365:9;8356:7;8352:23;8348:32;8345:52;;;8393:1;8390;8383:12;8345:52;8433:9;8420:23;8466:18;8458:6;8455:30;8452:50;;;8498:1;8495;8488:12;8452:50;8537:70;8599:7;8590:6;8579:9;8575:22;8537:70;:::i;:::-;8626:8;;8511:96;;-1:-1:-1;8230:437:1;-1:-1:-1;;;;8230:437:1:o;9836:353::-;10038:2;10020:21;;;10077:2;10057:18;;;10050:30;10116:31;10111:2;10096:18;;10089:59;10180:2;10165:18;;9836:353::o;10503:245::-;10570:6;10623:2;10611:9;10602:7;10598:23;10594:32;10591:52;;;10639:1;10636;10629:12;10591:52;10671:9;10665:16;10690:28;10712:5;10690:28;:::i;10753:343::-;10955:2;10937:21;;;10994:2;10974:18;;;10967:30;-1:-1:-1;;;11028:2:1;11013:18;;11006:49;11087:2;11072:18;;10753:343::o;11311:127::-;11372:10;11367:3;11363:20;11360:1;11353:31;11403:4;11400:1;11393:15;11427:4;11424:1;11417:15;11443:127;11504:10;11499:3;11495:20;11492:1;11485:31;11535:4;11532:1;11525:15;11559:4;11556:1;11549:15;11575:135;11614:3;11635:17;;;11632:43;;11655:18;;:::i;:::-;-1:-1:-1;11702:1:1;11691:13;;11575:135::o;14160:184::-;14230:6;14283:2;14271:9;14262:7;14258:23;14254:32;14251:52;;;14299:1;14296;14289:12;14251:52;-1:-1:-1;14322:16:1;;14160:184;-1:-1:-1;14160:184:1:o;14628:128::-;14668:3;14699:1;14695:6;14692:1;14689:13;14686:39;;;14705:18;;:::i;:::-;-1:-1:-1;14741:9:1;;14628:128::o;14761:251::-;14831:6;14884:2;14872:9;14863:7;14859:23;14855:32;14852:52;;;14900:1;14897;14890:12;14852:52;14932:9;14926:16;14951:31;14976:5;14951:31;:::i;15363:380::-;15442:1;15438:12;;;;15485;;;15506:61;;15560:4;15552:6;15548:17;15538:27;;15506:61;15613:2;15605:6;15602:14;15582:18;15579:38;15576:161;;15659:10;15654:3;15650:20;15647:1;15640:31;15694:4;15691:1;15684:15;15722:4;15719:1;15712:15;15576:161;;15363:380;;;:::o;15874:973::-;15959:12;;15924:3;;16014:1;16034:18;;;;16087;;;;16114:61;;16168:4;16160:6;16156:17;16146:27;;16114:61;16194:2;16242;16234:6;16231:14;16211:18;16208:38;16205:161;;16288:10;16283:3;16279:20;16276:1;16269:31;16323:4;16320:1;16313:15;16351:4;16348:1;16341:15;16205:161;16382:18;16409:104;;;;16527:1;16522:319;;;;16375:466;;16409:104;-1:-1:-1;;16442:24:1;;16430:37;;16487:16;;;;-1:-1:-1;16409:104:1;;16522:319;15821:1;15814:14;;;15858:4;15845:18;;16616:1;16630:165;16644:6;16641:1;16638:13;16630:165;;;16722:14;;16709:11;;;16702:35;16765:16;;;;16659:10;;16630:165;;;16634:3;;16824:6;16819:3;16815:16;16808:23;;16375:466;;;;;;;15874:973;;;;:::o;16852:376::-;17028:3;17056:38;17090:3;17082:6;17056:38;:::i;:::-;17123:6;17117:13;17139:52;17184:6;17180:2;17173:4;17165:6;17161:17;17139:52;:::i;:::-;17207:15;;16852:376;-1:-1:-1;;;;16852:376:1:o;17233:356::-;17409:3;17447:6;17441:13;17463:53;17509:6;17504:3;17497:4;17489:6;17485:17;17463:53;:::i;:::-;17532:51;17575:6;17570:3;17566:16;17558:6;17532:51;:::i;19683:125::-;19723:4;19751:1;19748;19745:8;19742:34;;;19756:18;;:::i;:::-;-1:-1:-1;19793:9:1;;19683:125::o;19813:136::-;19852:3;19880:5;19870:39;;19889:18;;:::i;:::-;-1:-1:-1;;;19925:18:1;;19813:136::o;20373:168::-;20413:7;20479:1;20475;20471:6;20467:14;20464:1;20461:21;20456:1;20449:9;20442:17;20438:45;20435:71;;;20486:18;;:::i;:::-;-1:-1:-1;20526:9:1;;20373:168::o;21249:402::-;21451:2;21433:21;;;21490:2;21470:18;;;21463:30;21529:34;21524:2;21509:18;;21502:62;-1:-1:-1;;;21595:2:1;21580:18;;21573:36;21641:3;21626:19;;21249:402::o;21656:217::-;21696:1;21722;21712:132;;21766:10;21761:3;21757:20;21754:1;21747:31;21801:4;21798:1;21791:15;21829:4;21826:1;21819:15;21712:132;-1:-1:-1;21858:9:1;;21656:217::o;21878:204::-;21916:3;21952:4;21949:1;21945:12;21984:4;21981:1;21977:12;22019:3;22013:4;22009:14;22004:3;22001:23;21998:49;;;22027:18;;:::i;:::-;22063:13;;21878:204;-1:-1:-1;;;21878:204:1:o;22798:489::-;-1:-1:-1;;;;;23067:15:1;;;23049:34;;23119:15;;23114:2;23099:18;;23092:43;23166:2;23151:18;;23144:34;;;23214:3;23209:2;23194:18;;23187:31;;;22992:4;;23235:46;;23261:19;;23253:6;23235:46;:::i;:::-;23227:54;22798:489;-1:-1:-1;;;;;;22798:489:1:o;23292:249::-;23361:6;23414:2;23402:9;23393:7;23389:23;23385:32;23382:52;;;23430:1;23427;23420:12;23382:52;23462:9;23456:16;23481:30;23505:5;23481:30;:::i
Swarm Source
ipfs://ce2ac26a1dad8e89d6f43aef6e1f2943b51d9f18ddc95f383ccca4bb0fc9af49
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.