More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 31,346 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint And Sell721 | 21800744 | 5 hrs ago | IN | 0 ETH | 0.00157766 | ||||
Mint And Sell721 | 21800741 | 5 hrs ago | IN | 0 ETH | 0.0024236 | ||||
Buy And Redeem | 21800056 | 7 hrs ago | IN | 0.07552237 ETH | 0.00063749 | ||||
Buy And Redeem | 21800028 | 7 hrs ago | IN | 0.07299151 ETH | 0.00065899 | ||||
Buy And Redeem | 21799548 | 9 hrs ago | IN | 0.08635992 ETH | 0.00094531 | ||||
Mint And Sell115... | 21798327 | 13 hrs ago | IN | 0 ETH | 0.00046821 | ||||
Buy And Redeem | 21797144 | 17 hrs ago | IN | 0.03413941 ETH | 0.00189201 | ||||
Buy And Redeem | 21796835 | 18 hrs ago | IN | 0.02147261 ETH | 0.00121022 | ||||
Buy And Redeem | 21796512 | 19 hrs ago | IN | 0.36348804 ETH | 0.00119803 | ||||
Buy And Redeem | 21795675 | 22 hrs ago | IN | 0.1329778 ETH | 0.00115011 | ||||
Buy And Redeem | 21795212 | 23 hrs ago | IN | 4.16857088 ETH | 0.00267533 | ||||
Buy And Redeem | 21794947 | 24 hrs ago | IN | 0.39455672 ETH | 0.00134342 | ||||
Buy And Redeem | 21794486 | 26 hrs ago | IN | 4.01032451 ETH | 0.00123387 | ||||
Mint And Sell721 | 21793845 | 28 hrs ago | IN | 0 ETH | 0.00050158 | ||||
Mint And Sell721 | 21793606 | 29 hrs ago | IN | 0 ETH | 0.00095277 | ||||
Mint And Sell721 | 21793449 | 29 hrs ago | IN | 0 ETH | 0.00065728 | ||||
Mint And Sell721 | 21793445 | 29 hrs ago | IN | 0 ETH | 0.00073626 | ||||
Mint And Sell721 | 21792925 | 31 hrs ago | IN | 0 ETH | 0.00070715 | ||||
Buy And Redeem | 21792533 | 32 hrs ago | IN | 0.13108961 ETH | 0.00176111 | ||||
Mint And Sell721 | 21791998 | 34 hrs ago | IN | 0 ETH | 0.00053087 | ||||
Buy And Redeem | 21791300 | 36 hrs ago | IN | 0.0078166 ETH | 0.0024647 | ||||
Buy And Redeem | 21791230 | 36 hrs ago | IN | 0.15210494 ETH | 0.00045765 | ||||
Mint And Sell721 | 21791081 | 37 hrs ago | IN | 0 ETH | 0.00683262 | ||||
Mint And Sell721 | 21791064 | 37 hrs ago | IN | 0 ETH | 0.01297452 | ||||
Mint And Sell721 | 21791053 | 37 hrs ago | IN | 0 ETH | 0.00924185 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
21800056 | 7 hrs ago | 0.00022588 ETH | ||||
21800056 | 7 hrs ago | 0.00022588 ETH | ||||
21800056 | 7 hrs ago | 0.07552237 ETH | ||||
21800028 | 7 hrs ago | 0.00021831 ETH | ||||
21800028 | 7 hrs ago | 0.00021831 ETH | ||||
21800028 | 7 hrs ago | 0.07299151 ETH | ||||
21799548 | 9 hrs ago | 0.0002583 ETH | ||||
21799548 | 9 hrs ago | 0.0002583 ETH | ||||
21799548 | 9 hrs ago | 0.08635992 ETH | ||||
21797144 | 17 hrs ago | 0.00010211 ETH | ||||
21797144 | 17 hrs ago | 0.00010211 ETH | ||||
21797144 | 17 hrs ago | 0.03413941 ETH | ||||
21796835 | 18 hrs ago | 0.00006422 ETH | ||||
21796835 | 18 hrs ago | 0.00006422 ETH | ||||
21796835 | 18 hrs ago | 0.02147261 ETH | ||||
21796512 | 19 hrs ago | 0.00000228 ETH | ||||
21796512 | 19 hrs ago | 0.00000228 ETH | ||||
21796512 | 19 hrs ago | 0.36348804 ETH | ||||
21795675 | 22 hrs ago | 0.00000942 ETH | ||||
21795675 | 22 hrs ago | 0.00000942 ETH | ||||
21795675 | 22 hrs ago | 0.1329778 ETH | ||||
21795212 | 23 hrs ago | 0.0124683 ETH | ||||
21795212 | 23 hrs ago | 0.0124683 ETH | ||||
21795212 | 23 hrs ago | 4.16857088 ETH | ||||
21794947 | 24 hrs ago | 0.00118012 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
NFTXMarketplaceZap
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-19 */ // Sources flattened with hardhat v2.8.2 https://hardhat.org // File contracts/solidity/interface/INFTXEligibility.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface INFTXEligibility { // Read functions. function name() external pure returns (string memory); function finalized() external view returns (bool); function targetAsset() external pure returns (address); function checkAllEligible(uint256[] calldata tokenIds) external view returns (bool); function checkEligible(uint256[] calldata tokenIds) external view returns (bool[] memory); function checkAllIneligible(uint256[] calldata tokenIds) external view returns (bool); function checkIsEligible(uint256 tokenId) external view returns (bool); // Write functions. function __NFTXEligibility_init_bytes(bytes calldata configData) external; function beforeMintHook(uint256[] calldata tokenIds) external; function afterMintHook(uint256[] calldata tokenIds) external; function beforeRedeemHook(uint256[] calldata tokenIds) external; function afterRedeemHook(uint256[] calldata tokenIds) external; } // File contracts/solidity/token/IERC20Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File contracts/solidity/proxy/IBeacon.sol pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeacon { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function childImplementation() external view returns (address); function upgradeChildTo(address newImplementation) external; } // File contracts/solidity/interface/INFTXVaultFactory.sol pragma solidity ^0.8.0; interface INFTXVaultFactory is IBeacon { // Read functions. function numVaults() external view returns (uint256); function zapContract() external view returns (address); function feeDistributor() external view returns (address); function eligibilityManager() external view returns (address); function vault(uint256 vaultId) external view returns (address); function allVaults() external view returns (address[] memory); function vaultsForAsset(address asset) external view returns (address[] memory); function isLocked(uint256 id) external view returns (bool); function excludedFromFees(address addr) external view returns (bool); function factoryMintFee() external view returns (uint64); function factoryRandomRedeemFee() external view returns (uint64); function factoryTargetRedeemFee() external view returns (uint64); function factoryRandomSwapFee() external view returns (uint64); function factoryTargetSwapFee() external view returns (uint64); function vaultFees(uint256 vaultId) external view returns (uint256, uint256, uint256, uint256, uint256); event NewFeeDistributor(address oldDistributor, address newDistributor); event NewZapContract(address oldZap, address newZap); event FeeExclusion(address feeExcluded, bool excluded); event NewEligibilityManager(address oldEligManager, address newEligManager); event NewVault(uint256 indexed vaultId, address vaultAddress, address assetAddress); event UpdateVaultFees(uint256 vaultId, uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee); event DisableVaultFees(uint256 vaultId); event UpdateFactoryFees(uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee); // Write functions. function __NFTXVaultFactory_init(address _vaultImpl, address _feeDistributor) external; function createVault( string calldata name, string calldata symbol, address _assetAddress, bool is1155, bool allowAllItems ) external returns (uint256); function setFeeDistributor(address _feeDistributor) external; function setEligibilityManager(address _eligibilityManager) external; function setZapContract(address _zapContract) external; function setFeeExclusion(address _excludedAddr, bool excluded) external; function setFactoryFees( uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee ) external; function setVaultFees( uint256 vaultId, uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee ) external; function disableVaultFees(uint256 vaultId) external; } // File contracts/solidity/interface/INFTXVault.sol pragma solidity ^0.8.0; interface INFTXVault is IERC20Upgradeable { function manager() external view returns (address); function assetAddress() external view returns (address); function vaultFactory() external view returns (INFTXVaultFactory); function eligibilityStorage() external view returns (INFTXEligibility); function is1155() external view returns (bool); function allowAllItems() external view returns (bool); function enableMint() external view returns (bool); function enableRandomRedeem() external view returns (bool); function enableTargetRedeem() external view returns (bool); function enableRandomSwap() external view returns (bool); function enableTargetSwap() external view returns (bool); function vaultId() external view returns (uint256); function nftIdAt(uint256 holdingsIndex) external view returns (uint256); function allHoldings() external view returns (uint256[] memory); function totalHoldings() external view returns (uint256); function mintFee() external view returns (uint256); function randomRedeemFee() external view returns (uint256); function targetRedeemFee() external view returns (uint256); function randomSwapFee() external view returns (uint256); function targetSwapFee() external view returns (uint256); function vaultFees() external view returns (uint256, uint256, uint256, uint256, uint256); event VaultInit( uint256 indexed vaultId, address assetAddress, bool is1155, bool allowAllItems ); event ManagerSet(address manager); event EligibilityDeployed(uint256 moduleIndex, address eligibilityAddr); // event CustomEligibilityDeployed(address eligibilityAddr); event EnableMintUpdated(bool enabled); event EnableRandomRedeemUpdated(bool enabled); event EnableTargetRedeemUpdated(bool enabled); event EnableRandomSwapUpdated(bool enabled); event EnableTargetSwapUpdated(bool enabled); event Minted(uint256[] nftIds, uint256[] amounts, address to); event Redeemed(uint256[] nftIds, uint256[] specificIds, address to); event Swapped( uint256[] nftIds, uint256[] amounts, uint256[] specificIds, uint256[] redeemedIds, address to ); function __NFTXVault_init( string calldata _name, string calldata _symbol, address _assetAddress, bool _is1155, bool _allowAllItems ) external; function finalizeVault() external; function setVaultMetadata( string memory name_, string memory symbol_ ) external; function setVaultFeatures( bool _enableMint, bool _enableRandomRedeem, bool _enableTargetRedeem, bool _enableRandomSwap, bool _enableTargetSwap ) external; function setFees( uint256 _mintFee, uint256 _randomRedeemFee, uint256 _targetRedeemFee, uint256 _randomSwapFee, uint256 _targetSwapFee ) external; function disableVaultFees() external; // This function allows for an easy setup of any eligibility module contract from the EligibilityManager. // It takes in ABI encoded parameters for the desired module. This is to make sure they can all follow // a similar interface. function deployEligibilityStorage( uint256 moduleIndex, bytes calldata initData ) external returns (address); // The manager has control over options like fees and features function setManager(address _manager) external; function mint( uint256[] calldata tokenIds, uint256[] calldata amounts /* ignored for ERC721 vaults */ ) external returns (uint256); function mintTo( uint256[] calldata tokenIds, uint256[] calldata amounts, /* ignored for ERC721 vaults */ address to ) external returns (uint256); function redeem(uint256 amount, uint256[] calldata specificIds) external returns (uint256[] calldata); function redeemTo( uint256 amount, uint256[] calldata specificIds, address to ) external returns (uint256[] calldata); function swap( uint256[] calldata tokenIds, uint256[] calldata amounts, /* ignored for ERC721 vaults */ uint256[] calldata specificIds ) external returns (uint256[] calldata); function swapTo( uint256[] calldata tokenIds, uint256[] calldata amounts, /* ignored for ERC721 vaults */ uint256[] calldata specificIds, address to ) external returns (uint256[] calldata); function allValidNFTs(uint256[] calldata tokenIds) external view returns (bool); } // File contracts/solidity/interface/INFTXFeeDistributor.sol pragma solidity ^0.8.0; interface INFTXFeeDistributor { struct FeeReceiver { uint256 allocPoint; address receiver; bool isContract; } function nftxVaultFactory() external returns (address); function lpStaking() external returns (address); function treasury() external returns (address); function defaultTreasuryAlloc() external returns (uint256); function defaultLPAlloc() external returns (uint256); function allocTotal(uint256 vaultId) external returns (uint256); function specificTreasuryAlloc(uint256 vaultId) external returns (uint256); // Write functions. function __FeeDistributor__init__(address _lpStaking, address _treasury) external; function rescueTokens(address token) external; function distribute(uint256 vaultId) external; function addReceiver(uint256 _vaultId, uint256 _allocPoint, address _receiver, bool _isContract) external; function initializeVaultReceivers(uint256 _vaultId) external; function changeMultipleReceiverAlloc( uint256[] memory _vaultIds, uint256[] memory _receiverIdxs, uint256[] memory allocPoints ) external; function changeMultipleReceiverAddress( uint256[] memory _vaultIds, uint256[] memory _receiverIdxs, address[] memory addresses, bool[] memory isContracts ) external; function changeReceiverAlloc(uint256 _vaultId, uint256 _idx, uint256 _allocPoint) external; function changeReceiverAddress(uint256 _vaultId, uint256 _idx, address _address, bool _isContract) external; function removeReceiver(uint256 _vaultId, uint256 _receiverIdx) external; // Configuration functions. function setTreasuryAddress(address _treasury) external; function setDefaultTreasuryAlloc(uint256 _allocPoint) external; function setSpecificTreasuryAlloc(uint256 _vaultId, uint256 _allocPoint) external; function setLPStakingAddress(address _lpStaking) external; function setNFTXVaultFactory(address _factory) external; function setDefaultLPAlloc(uint256 _allocPoint) external; } // File contracts/solidity/interface/INFTXLPStaking.sol pragma solidity ^0.8.0; interface INFTXLPStaking { function nftxVaultFactory() external view returns (address); function rewardDistTokenImpl() external view returns (address); function stakingTokenProvider() external view returns (address); function vaultToken(address _stakingToken) external view returns (address); function stakingToken(address _vaultToken) external view returns (address); function rewardDistributionToken(uint256 vaultId) external view returns (address); function newRewardDistributionToken(uint256 vaultId) external view returns (address); function oldRewardDistributionToken(uint256 vaultId) external view returns (address); function unusedRewardDistributionToken(uint256 vaultId) external view returns (address); function rewardDistributionTokenAddr(address stakedToken, address rewardToken) external view returns (address); // Write functions. function __NFTXLPStaking__init(address _stakingTokenProvider) external; function setNFTXVaultFactory(address newFactory) external; function setStakingTokenProvider(address newProvider) external; function addPoolForVault(uint256 vaultId) external; function updatePoolForVault(uint256 vaultId) external; function updatePoolForVaults(uint256[] calldata vaultId) external; function receiveRewards(uint256 vaultId, uint256 amount) external returns (bool); function deposit(uint256 vaultId, uint256 amount) external; function timelockDepositFor(uint256 vaultId, address account, uint256 amount, uint256 timelockLength) external; function exit(uint256 vaultId, uint256 amount) external; function rescue(uint256 vaultId) external; function withdraw(uint256 vaultId, uint256 amount) external; function claimRewards(uint256 vaultId) external; } // File contracts/solidity/interface/IUniswapV2Router01.sol pragma solidity ^0.8.0; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } // File contracts/solidity/interface/IERC165Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File contracts/solidity/token/IERC1155Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external; } // File contracts/solidity/token/IERC721ReceiverUpgradeable.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721ReceiverUpgradeable { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File contracts/solidity/token/ERC721HolderUpgradeable.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721HolderUpgradeable is IERC721ReceiverUpgradeable { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } } // File contracts/solidity/token/IERC1155ReceiverUpgradeable.sol pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155ReceiverUpgradeable is IERC165Upgradeable { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns(bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns(bytes4); } // File contracts/solidity/util/ERC165Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is IERC165Upgradeable { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } } // File contracts/solidity/token/ERC1155ReceiverUpgradeable.sol pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ abstract contract ERC1155ReceiverUpgradeable is ERC165Upgradeable, IERC1155ReceiverUpgradeable { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC1155ReceiverUpgradeable).interfaceId || super.supportsInterface(interfaceId); } } // File contracts/solidity/token/ERC1155HolderUpgradeable.sol pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ abstract contract ERC1155HolderUpgradeable is ERC1155ReceiverUpgradeable { function onERC1155Received(address, address, uint256, uint256, bytes memory) public virtual override returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public virtual override returns (bytes4) { return this.onERC1155BatchReceived.selector; } } // File contracts/solidity/util/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File contracts/solidity/util/SafeERC20Upgradeable.sol pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20Upgradeable { using Address for address; function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/solidity/NFTXMarketplaceZap.sol pragma solidity ^0.8.0; // Authors: @0xKiwi_. interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; function balanceOf(address to) external view returns (uint256); } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(msg.sender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == msg.sender, "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } contract NFTXMarketplaceZap is Ownable, ReentrancyGuard, ERC721HolderUpgradeable, ERC1155HolderUpgradeable { using SafeERC20Upgradeable for IERC20Upgradeable; IWETH public immutable WETH; INFTXLPStaking public immutable lpStaking; INFTXVaultFactory public immutable nftxFactory; IUniswapV2Router01 public immutable sushiRouter; uint256 constant BASE = 1e18; event Buy(uint256 count, uint256 ethSpent, address to); event Sell(uint256 count, uint256 ethReceived, address to); event Swap(uint256 count, uint256 ethSpent, address to); constructor(address _nftxFactory, address _sushiRouter) Ownable() ReentrancyGuard() { nftxFactory = INFTXVaultFactory(_nftxFactory); lpStaking = INFTXLPStaking(INFTXFeeDistributor(INFTXVaultFactory(_nftxFactory).feeDistributor()).lpStaking()); sushiRouter = IUniswapV2Router01(_sushiRouter); WETH = IWETH(IUniswapV2Router01(_sushiRouter).WETH()); IERC20Upgradeable(address(IUniswapV2Router01(_sushiRouter).WETH())).safeApprove(_sushiRouter, type(uint256).max); } function mintAndSell721( uint256 vaultId, uint256[] calldata ids, uint256 minEthOut, address[] calldata path, address to ) external nonReentrant { require(to != address(0) && to != address(this)); require(ids.length != 0); (address vault, uint256 vaultBalance) = _mint721(vaultId, ids); uint256[] memory amounts = _sellVaultTokenETH(vault, minEthOut, vaultBalance, path, to); emit Sell(ids.length, amounts[amounts.length-1], to); } function mintAndSell721WETH( uint256 vaultId, uint256[] calldata ids, uint256 minWethOut, address[] calldata path, address to ) external nonReentrant { require(to != address(0) && to != address(this)); require(ids.length != 0); (address vault, uint256 vaultBalance) = _mint721(vaultId, ids); uint256[] memory amounts = _sellVaultTokenWETH(vault, minWethOut, vaultBalance, path, to); emit Sell(ids.length, amounts[amounts.length-1], to); } function buyAndSwap721( uint256 vaultId, uint256[] calldata idsIn, uint256[] calldata specificIds, address[] calldata path, address to ) external payable nonReentrant { require(to != address(0) && to != address(this)); require(idsIn.length != 0); WETH.deposit{value: msg.value}(); INFTXVault vault = INFTXVault(nftxFactory.vault(vaultId)); uint256 redeemFees = (vault.targetSwapFee() * specificIds.length) + ( vault.randomSwapFee() * (idsIn.length - specificIds.length) ); uint256[] memory amounts = _buyVaultToken(redeemFees, msg.value, path); _swap721(vaultId, idsIn, specificIds, to); emit Swap(idsIn.length, amounts[0], to); // Return extras. uint256 remaining = WETH.balanceOf(address(this)); WETH.withdraw(remaining); (bool success, ) = payable(to).call{value: remaining}(""); require(success, "Address: unable to send value, recipient may have reverted"); } function buyAndSwap721WETH( uint256 vaultId, uint256[] calldata idsIn, uint256[] calldata specificIds, uint256 maxWethIn, address[] calldata path, address to ) external nonReentrant { require(to != address(0) && to != address(this)); require(idsIn.length != 0); IERC20Upgradeable(address(WETH)).safeTransferFrom(msg.sender, address(this), maxWethIn); INFTXVault vault = INFTXVault(nftxFactory.vault(vaultId)); uint256 redeemFees = (vault.targetSwapFee() * specificIds.length) + ( vault.randomSwapFee() * (idsIn.length - specificIds.length) ); uint256[] memory amounts = _buyVaultToken(redeemFees, maxWethIn, path); _swap721(vaultId, idsIn, specificIds, to); emit Swap(idsIn.length, amounts[0], to); // Return extras. uint256 remaining = WETH.balanceOf(address(this)); if (remaining != 0) { WETH.transfer(to, remaining); } } function buyAndSwap1155( uint256 vaultId, uint256[] calldata idsIn, uint256[] calldata amounts, uint256[] calldata specificIds, address[] calldata path, address to ) external payable nonReentrant { require(to != address(0) && to != address(this)); uint256 length = idsIn.length; require(length != 0); WETH.deposit{value: msg.value}(); uint256 count; for (uint256 i; i < length; ++i) { uint256 amount = amounts[i]; require(amount > 0, "Transferring < 1"); count += amount; } INFTXVault vault = INFTXVault(nftxFactory.vault(vaultId)); uint256 redeemFees = (vault.targetSwapFee() * specificIds.length) + ( vault.randomSwapFee() * (count - specificIds.length) ); uint256[] memory swapAmounts = _buyVaultToken(redeemFees, msg.value, path); _swap1155(vaultId, idsIn, amounts, specificIds, to); emit Swap(count, swapAmounts[0], to); // Return extras. uint256 remaining = WETH.balanceOf(address(this)); WETH.withdraw(remaining); (bool success, ) = payable(to).call{value: remaining}(""); require(success, "Address: unable to send value, recipient may have reverted"); } function buyAndSwap1155WETH( uint256 vaultId, uint256[] calldata idsIn, uint256[] calldata amounts, uint256[] calldata specificIds, uint256 maxWethIn, address[] calldata path, address to ) external payable nonReentrant { require(to != address(0) && to != address(this)); require(idsIn.length != 0); uint256 count; for (uint256 i = 0; i < idsIn.length; i++) { uint256 amount = amounts[i]; require(amount > 0, "Transferring < 1"); count += amount; } INFTXVault vault = INFTXVault(nftxFactory.vault(vaultId)); uint256 redeemFees = (vault.targetSwapFee() * specificIds.length) + ( vault.randomSwapFee() * (count - specificIds.length) ); IERC20Upgradeable(address(WETH)).safeTransferFrom(msg.sender, address(this), maxWethIn); uint256[] memory swapAmounts = _buyVaultToken(redeemFees, maxWethIn, path); _swap1155(vaultId, idsIn, amounts, specificIds, to); emit Swap(count, swapAmounts[0], to); // Return extras. uint256 remaining = WETH.balanceOf(address(this)); WETH.transfer(to, remaining); } function buyAndRedeem( uint256 vaultId, uint256 amount, uint256[] calldata specificIds, address[] calldata path, address to ) external payable nonReentrant { require(to != address(0) && to != address(this)); require(amount != 0); WETH.deposit{value: msg.value}(); (, uint256 randomRedeemFee, uint256 targetRedeemFee, ,) = nftxFactory.vaultFees(vaultId); uint256 totalFee = (targetRedeemFee * specificIds.length) + ( randomRedeemFee * (amount - specificIds.length) ); uint256[] memory amounts = _buyVaultToken((amount*BASE)+totalFee, msg.value, path); _redeem(vaultId, amount, specificIds, to); emit Buy(amount, amounts[0], to); uint256 remaining = WETH.balanceOf(address(this)); if (remaining != 0) { WETH.withdraw(remaining); (bool success, ) = payable(to).call{value: remaining}(""); require(success, "Address: unable to send value, recipient may have reverted"); } } function buyAndRedeemWETH( uint256 vaultId, uint256 amount, uint256[] calldata specificIds, uint256 maxWethIn, address[] calldata path, address to ) external nonReentrant { require(to != address(0) && to != address(this)); require(amount != 0); uint256 totalFee; { (, uint256 randomRedeemFee, uint256 targetRedeemFee, ,) = nftxFactory.vaultFees(vaultId); totalFee = (targetRedeemFee * specificIds.length) + ( randomRedeemFee * (amount - specificIds.length) ); } IERC20Upgradeable(address(WETH)).safeTransferFrom(msg.sender, address(this), maxWethIn); uint256[] memory amounts = _buyVaultToken((amount*BASE) + totalFee, maxWethIn, path); _redeem(vaultId, amount, specificIds, to); emit Buy(amount, amounts[0], to); uint256 remaining = WETH.balanceOf(address(this)); if (remaining != 0) { WETH.transfer(to, remaining); } } function mintAndSell1155( uint256 vaultId, uint256[] calldata ids, uint256[] calldata amounts, uint256 minWethOut, address[] calldata path, address to ) external nonReentrant { require(to != address(0) && to != address(this)); require(ids.length != 0); (address vault, uint256 vaultTokenBalance) = _mint1155(vaultId, ids, amounts); uint256[] memory uniAmounts = _sellVaultTokenETH(vault, minWethOut, vaultTokenBalance, path, to); uint256 count; uint256 length = ids.length; for (uint256 i; i < length; ++i) { count += amounts[i]; } emit Sell(count, uniAmounts[uniAmounts.length-1], to); } function mintAndSell1155WETH( uint256 vaultId, uint256[] calldata ids, uint256[] calldata amounts, uint256 minWethOut, address[] calldata path, address to ) external nonReentrant { require(to != address(0) && to != address(this)); require(ids.length != 0); (address vault, uint256 vaultTokenBalance) = _mint1155(vaultId, ids, amounts); _sellVaultTokenWETH(vault, minWethOut, vaultTokenBalance, path, to); uint256 count; uint256 length = ids.length; for (uint256 i; i < length; ++i) { count += amounts[i]; } emit Sell(count, amounts[amounts.length-1], to); } function _mint721( uint256 vaultId, uint256[] memory ids ) internal returns (address, uint256) { address vault = nftxFactory.vault(vaultId); // Transfer tokens to zap and mint to NFTX. address assetAddress = INFTXVault(vault).assetAddress(); uint256 length = ids.length; for (uint256 i; i < length; ++i) { transferFromERC721(assetAddress, ids[i], vault); approveERC721(assetAddress, vault, ids[i]); } uint256[] memory emptyIds; INFTXVault(vault).mint(ids, emptyIds); uint256 count = ids.length; uint256 balance = (count * BASE) - (count * INFTXVault(vault).mintFee()); return (vault, balance); } function _swap721( uint256 vaultId, uint256[] memory idsIn, uint256[] memory idsOut, address to ) internal returns (address) { address vault = nftxFactory.vault(vaultId); // Transfer tokens to zap and mint to NFTX. address assetAddress = INFTXVault(vault).assetAddress(); uint256 length = idsIn.length; for (uint256 i; i < length; ++i) { transferFromERC721(assetAddress, idsIn[i], vault); approveERC721(assetAddress, vault, idsIn[i]); } uint256[] memory emptyIds; INFTXVault(vault).swapTo(idsIn, emptyIds, idsOut, to); return (vault); } function _swap1155( uint256 vaultId, uint256[] memory idsIn, uint256[] memory amounts, uint256[] memory idsOut, address to ) internal returns (address) { address vault = nftxFactory.vault(vaultId); // Transfer tokens to zap and mint to NFTX. address assetAddress = INFTXVault(vault).assetAddress(); IERC1155Upgradeable(assetAddress).safeBatchTransferFrom(msg.sender, address(this), idsIn, amounts, ""); IERC1155Upgradeable(assetAddress).setApprovalForAll(vault, true); INFTXVault(vault).swapTo(idsIn, amounts, idsOut, to); return (vault); } function _redeem( uint256 vaultId, uint256 amount, uint256[] memory specificIds, address to ) internal { address vault = nftxFactory.vault(vaultId); INFTXVault(vault).redeemTo(amount, specificIds, to); } function _mint1155( uint256 vaultId, uint256[] memory ids, uint256[] memory amounts ) internal returns (address, uint256) { address vault = nftxFactory.vault(vaultId); require(vault != address(0), "NFTXZap: Vault does not exist"); // Transfer tokens to zap and mint to NFTX. address assetAddress = INFTXVault(vault).assetAddress(); IERC1155Upgradeable(assetAddress).safeBatchTransferFrom(msg.sender, address(this), ids, amounts, ""); IERC1155Upgradeable(assetAddress).setApprovalForAll(vault, true); uint256 count = INFTXVault(vault).mint(ids, amounts); uint256 balance = (count * BASE) - (INFTXVault(vault).mintFee()*count); return (vault, balance); } function _buyVaultToken( uint256 minTokenOut, uint256 maxWethIn, address[] calldata path ) internal returns (uint256[] memory) { uint256[] memory amounts = sushiRouter.swapTokensForExactTokens( minTokenOut, maxWethIn, path, address(this), block.timestamp ); return amounts; } function _sellVaultTokenWETH( address vault, uint256 minWethOut, uint256 maxTokenIn, address[] calldata path, address to ) internal returns (uint256[] memory) { IERC20Upgradeable(vault).safeApprove(address(sushiRouter), maxTokenIn); uint256[] memory amounts = sushiRouter.swapExactTokensForTokens( maxTokenIn, minWethOut, path, to, block.timestamp ); return amounts; } function _sellVaultTokenETH( address vault, uint256 minEthOut, uint256 maxTokenIn, address[] calldata path, address to ) internal returns (uint256[] memory) { IERC20Upgradeable(vault).safeApprove(address(sushiRouter), maxTokenIn); uint256[] memory amounts = sushiRouter.swapExactTokensForETH( maxTokenIn, minEthOut, path, to, block.timestamp ); return amounts; } function transferFromERC721(address assetAddr, uint256 tokenId, address to) internal virtual { address kitties = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d; address punks = 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB; bytes memory data; if (assetAddr == kitties) { // Cryptokitties. data = abi.encodeWithSignature("transferFrom(address,address,uint256)", msg.sender, to, tokenId); } else if (assetAddr == punks) { // CryptoPunks. // Fix here for frontrun attack. Added in v1.0.2. bytes memory punkIndexToAddress = abi.encodeWithSignature("punkIndexToAddress(uint256)", tokenId); (bool checkSuccess, bytes memory result) = address(assetAddr).staticcall(punkIndexToAddress); (address nftOwner) = abi.decode(result, (address)); require(checkSuccess && nftOwner == msg.sender, "Not the NFT owner"); data = abi.encodeWithSignature("buyPunk(uint256)", tokenId); } else { // Default. // We push to the vault to avoid an unneeded transfer. data = abi.encodeWithSignature("safeTransferFrom(address,address,uint256)", msg.sender, to, tokenId); } (bool success, bytes memory resultData) = address(assetAddr).call(data); require(success, string(resultData)); } function approveERC721(address assetAddr, address to, uint256 tokenId) internal virtual { address kitties = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d; address punks = 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB; bytes memory data; if (assetAddr == kitties) { // // Cryptokitties. // data = abi.encodeWithSignature("approve(address,uint256)", to, tokenId); // No longer needed to approve with pushing. return; } else if (assetAddr == punks) { // CryptoPunks. data = abi.encodeWithSignature("offerPunkForSaleToAddress(uint256,uint256,address)", tokenId, 0, to); } else { // No longer needed to approve with pushing. return; } (bool success, bytes memory resultData) = address(assetAddr).call(data); require(success, string(resultData)); } // calculates the CREATE2 address for a pair without making any external calls function pairFor(address tokenA, address tokenB) internal view returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = address(uint160(uint256(keccak256(abi.encodePacked( hex'ff', sushiRouter.factory(), keccak256(abi.encodePacked(token0, token1)), hex'e18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303' // init code hash ))))); } // returns sorted token addresses, used to handle return values from pairs sorted in this order function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) { require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES'); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS'); } function rescue(address token) external onlyOwner { if (token == address(0)) { (bool success, ) = payable(msg.sender).call{value: address(this).balance}(""); require(success, "Address: unable to send value, recipient may have reverted"); } else { IERC20Upgradeable(token).safeTransfer(msg.sender, IERC20Upgradeable(token).balanceOf(address(this))); } } receive() external payable { require(msg.sender == address(WETH), "Only WETH"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_nftxFactory","type":"address"},{"internalType":"address","name":"_sushiRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethSpent","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"Sell","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethSpent","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"buyAndRedeem","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"internalType":"uint256","name":"maxWethIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"buyAndRedeemWETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"idsIn","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"buyAndSwap1155","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"idsIn","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"internalType":"uint256","name":"maxWethIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"buyAndSwap1155WETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"idsIn","type":"uint256[]"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"buyAndSwap721","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"idsIn","type":"uint256[]"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"internalType":"uint256","name":"maxWethIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"buyAndSwap721WETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lpStaking","outputs":[{"internalType":"contract INFTXLPStaking","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"minWethOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"mintAndSell1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"minWethOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"mintAndSell1155WETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256","name":"minEthOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"mintAndSell721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256","name":"minWethOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"mintAndSell721WETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nftxFactory","outputs":[{"internalType":"contract INFTXVaultFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"rescue","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":"sushiRouter","outputs":[{"internalType":"contract IUniswapV2Router01","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101006040523480156200001257600080fd5b5060405162005b1d38038062005b1d8339810160408190526200003591620006f5565b62000040336200029e565b600180556001600160601b0319606083901b1660c05260408051630d43e8ad60e01b815290516001600160a01b03841691630d43e8ad916004808301926020929190829003018186803b1580156200009757600080fd5b505afa158015620000ac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d29190620006d8565b6001600160a01b0316639bf1401c6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200010d57600080fd5b505af115801562000122573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001489190620006d8565b6001600160601b0319606091821b811660a0529082901b1660e052604080516315ab88c960e31b815290516001600160a01b0383169163ad5c4648916004808301926020929190829003018186803b158015620001a457600080fd5b505afa158015620001b9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001df9190620006d8565b6001600160a01b03166080816001600160a01b031660601b815250506200029681600019836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200023d57600080fd5b505afa15801562000252573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002789190620006d8565b6001600160a01b0316620002ee60201b62002e89179092919060201c565b5050620007ed565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8015806200037c5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156200033f57600080fd5b505afa15801562000354573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037a91906200074e565b155b620003f45760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084015b60405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200044c9185916200045116565b505050565b6000620004ad826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200052f60201b6200301e179092919060201c565b8051909150156200044c5780806020019051810190620004ce91906200072c565b6200044c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620003eb565b60606200054084846000856200054a565b90505b9392505050565b606082471015620005ad5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401620003eb565b843b620005fd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620003eb565b600080866001600160a01b031685876040516200061b919062000767565b60006040518083038185875af1925050503d80600081146200065a576040519150601f19603f3d011682016040523d82523d6000602084013e6200065f565b606091505b509092509050620006728282866200067d565b979650505050505050565b606083156200068e57508162000543565b8251156200069f5782518084602001fd5b8160405162461bcd60e51b8152600401620003eb919062000785565b80516001600160a01b0381168114620006d357600080fd5b919050565b600060208284031215620006ea578081fd5b6200054382620006bb565b6000806040838503121562000708578081fd5b6200071383620006bb565b91506200072360208401620006bb565b90509250929050565b6000602082840312156200073e578081fd5b8151801515811462000543578182fd5b60006020828403121562000760578081fd5b5051919050565b600082516200077b818460208701620007ba565b9190910192915050565b6020815260008251806020840152620007a6816040850160208701620007ba565b601f01601f19169190910160400192915050565b60005b83811015620007d7578181015183820152602001620007bd565b83811115620007e7576000848401525b50505050565b60805160601c60a05160601c60c05160601c60e05160601c6151f5620009286000396000818161038b0152818161331b015281816133730152818161345801528181613b7f0152613bd701526000818161033f015281816108b701528181610dac015281816112b20152818161187e01528181611dda015281816123800152818161303e0152818161352f01528181613795015281816138e40152613c1d01526000610445015260008181610189015281816104b901528181610a5201528181610bd901528181610c8401528181610e8c01528181610fab0152818161105b015281816111790152818161159f0152818161163a015281816117f501528181611b2501528181611bc001528181611d990152818161209001528181612140015281816122d30152818161252801526125c801526151f56000f3fe6080604052600436106101795760003560e01c80637fc82484116100cb578063a02716171161007f578063bc197c8111610059578063bc197c81146104db578063f23a6e6114610520578063f2fde38b1461056557600080fd5b8063a027161714610467578063ab3a412114610487578063ad5c4648146104a757600080fd5b80638da5cb5b116100b05780638da5cb5b146103f5578063929bf3d3146104135780639bf1401c1461043357600080fd5b80637fc82484146103c2578063839006f2146103d557600080fd5b806357e836dc1161012d5780635ee50f88116101075780635ee50f881461032d5780636d13582c14610379578063715018a6146103ad57600080fd5b806357e836dc146102e757806358fbdd0a146102fa5780635d8117a61461030d57600080fd5b8063150b7a021161015e578063150b7a021461025757806342c4ccaa146102b45780634447d888146102c757600080fd5b806301ffc9a7146102025780630956642b1461023757600080fd5b366101fd57336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101fb5760405162461bcd60e51b815260206004820152600960248201527f4f6e6c792057455448000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b005b600080fd5b34801561020e57600080fd5b5061022261021d36600461495b565b610585565b60405190151581526020015b60405180910390f35b34801561024357600080fd5b506101fb610252366004614cca565b6105ee565b34801561026357600080fd5b5061029b6102723660046147d7565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040516001600160e01b0319909116815260200161022e565b6101fb6102c2366004614b27565b610762565b3480156102d357600080fd5b506101fb6102e2366004614dc1565b610d19565b6101fb6102f5366004614a4e565b6110ea565b6101fb61030836600461499b565b611767565b34801561031957600080fd5b506101fb610328366004614c0e565b611d00565b34801561033957600080fd5b506103617f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161022e565b34801561038557600080fd5b506103617f000000000000000000000000000000000000000000000000000000000000000081565b3480156103b957600080fd5b506101fb6121d0565b6101fb6103d0366004614d5e565b612245565b3480156103e157600080fd5b506101fb6103f03660046146f5565b612709565b34801561040157600080fd5b506000546001600160a01b0316610361565b34801561041f57600080fd5b506101fb61042e366004614cca565b6128d3565b34801561043f57600080fd5b506103617f000000000000000000000000000000000000000000000000000000000000000081565b34801561047357600080fd5b506101fb610482366004614c0e565b6129b3565b34801561049357600080fd5b506101fb6104a2366004614c0e565b612ba3565b3480156104b357600080fd5b506103617f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e757600080fd5b5061029b6104f636600461472d565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561052c57600080fd5b5061029b61053b366004614841565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b34801561057157600080fd5b506101fb6105803660046146f5565b612d9b565b60006001600160e01b031982167f4e2312e00000000000000000000000000000000000000000000000000000000014806105e857507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b600260015414156106415760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b0381161580159061066757506001600160a01b0381163014155b61067057600080fd5b8461067a57600080fd5b6000806106ba8989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061303792505050565b9150915060006106ce83888489898961330a565b90507f1cdb5ee3c47e1a706ac452b89698e5e3f2ff4f835ca72dde8936d0f4fcf37d818989905082600184516107049190615120565b8151811061072257634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0387169082015260600160405180910390a15050600180555050505050505050565b600260015414156107b55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b038116158015906107db57506001600160a01b0381163014155b6107e457600080fd5b886107ee57600080fd5b6000805b8a8110156108955760008a8a8381811061081c57634e487b7160e01b600052603260045260246000fd5b905060200201359050600081116108755760405162461bcd60e51b815260206004820152601060248201527f5472616e7366657272696e67203c20310000000000000000000000000000000060448201526064016101f2565b61087f81846150e9565b925050808061088d90615163565b9150506107f2565b506040516340d1b7db60e11b8152600481018d90526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906381a36fb69060240160206040518083038186803b1580156108f957600080fd5b505afa15801561090d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109319190614711565b9050600061093f8884615120565b826001600160a01b031663d53f62176040518163ffffffff1660e01b815260040160206040518083038186803b15801561097857600080fd5b505afa15801561098c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b09190614983565b6109ba9190615101565b89899050836001600160a01b03166335dca76c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109f757600080fd5b505afa158015610a0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2f9190614983565b610a399190615101565b610a4391906150e9565b9050610a7a6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308a613414565b6000610a8882898989613452565b9050610b4d8f8f8f80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508e8e80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508d8d808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c925061350c915050565b507f7af2bc3f8ec800c569b6555feaf16589d96a9d04a49d1645fd456d75fa0b372b8482600081518110610b9157634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0388169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015610c2357600080fd5b505afa158015610c37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5b9190614983565b60405163a9059cbb60e01b81526001600160a01b038881166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401602060405180830381600087803b158015610cca57600080fd5b505af1158015610cde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d02919061493b565b505060018055505050505050505050505050505050565b60026001541415610d6c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b03811615801590610d9257506001600160a01b0381163014155b610d9b57600080fd5b86610da557600080fd5b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663220613798c6040518263ffffffff1660e01b8152600401610df891815260200190565b60a06040518083038186803b158015610e1057600080fd5b505afa158015610e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e489190614e4d565b509194509250610e5c91508990508b615120565b610e669083615101565b610e708983615101565b610e7a91906150e9565b9250610eb49150506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333088613414565b6000610ede82610ecc670de0b6b3a76400008c615101565b610ed691906150e9565b878787613452565b9050610f208a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061377c915050565b7ff7735c8cb2a65788ca663fc8415b7c6a66cd6847d58346d8334e8d52a599d3df8982600081518110610f6357634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0386169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015610ff557600080fd5b505afa158015611009573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102d9190614983565b905080156110d95760405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b15801561109f57600080fd5b505af11580156110b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d7919061493b565b505b505060018055505050505050505050565b6002600154141561113d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b0381161580159061116357506001600160a01b0381163014155b61116c57600080fd5b878061117757600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156111d257600080fd5b505af11580156111e6573d6000803e3d6000fd5b50505050506000805b828110156112905760008a8a8381811061121957634e487b7160e01b600052603260045260246000fd5b905060200201359050600081116112725760405162461bcd60e51b815260206004820152601060248201527f5472616e7366657272696e67203c20310000000000000000000000000000000060448201526064016101f2565b61127c81846150e9565b9250508061128990615163565b90506111ef565b506040516340d1b7db60e11b8152600481018d90526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906381a36fb69060240160206040518083038186803b1580156112f457600080fd5b505afa158015611308573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132c9190614711565b9050600061133a8884615120565b826001600160a01b031663d53f62176040518163ffffffff1660e01b815260040160206040518083038186803b15801561137357600080fd5b505afa158015611387573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ab9190614983565b6113b59190615101565b89899050836001600160a01b03166335dca76c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113f257600080fd5b505afa158015611406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142a9190614983565b6114349190615101565b61143e91906150e9565b9050600061144e82348a8a613452565b90506115138f8f8f80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508e8e80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508d8d808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508d925061350c915050565b507f7af2bc3f8ec800c569b6555feaf16589d96a9d04a49d1645fd456d75fa0b372b848260008151811061155757634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0389169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b1580156115e957600080fd5b505afa1580156115fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116219190614983565b604051632e1a7d4d60e01b8152600481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561168657600080fd5b505af115801561169a573d6000803e3d6000fd5b505050506000876001600160a01b03168260405160006040518083038185875af1925050503d80600081146116eb576040519150601f19603f3d011682016040523d82523d6000602084013e6116f0565b606091505b5050905080610d025760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101f2565b600260015414156117ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b038116158015906117e057506001600160a01b0381163014155b6117e957600080fd5b856117f357600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561184e57600080fd5b505af1158015611862573d6000803e3d6000fd5b50506040516340d1b7db60e11b8152600481018c9052600093507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692506381a36fb6915060240160206040518083038186803b1580156118ca57600080fd5b505afa1580156118de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119029190614711565b905060006119108689615120565b826001600160a01b031663d53f62176040518163ffffffff1660e01b815260040160206040518083038186803b15801561194957600080fd5b505afa15801561195d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119819190614983565b61198b9190615101565b87879050836001600160a01b03166335dca76c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119c857600080fd5b505afa1580156119dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a009190614983565b611a0a9190615101565b611a1491906150e9565b90506000611a2482348888613452565b9050611a968b8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d9182918501908490808284376000920191909152508a92506138c1915050565b507f7af2bc3f8ec800c569b6555feaf16589d96a9d04a49d1645fd456d75fa0b372b8a8a905082600081518110611add57634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0387169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015611b6f57600080fd5b505afa158015611b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba79190614983565b604051632e1a7d4d60e01b8152600481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611c0c57600080fd5b505af1158015611c20573d6000803e3d6000fd5b505050506000856001600160a01b03168260405160006040518083038185875af1925050503d8060008114611c71576040519150601f19603f3d011682016040523d82523d6000602084013e611c76565b606091505b5050905080611ced5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101f2565b5050600180555050505050505050505050565b60026001541415611d535760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b03811615801590611d7957506001600160a01b0381163014155b611d8257600080fd5b86611d8c57600080fd5b611dc16001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333087613414565b6040516340d1b7db60e11b8152600481018a90526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906381a36fb69060240160206040518083038186803b158015611e2457600080fd5b505afa158015611e38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5c9190614711565b90506000611e6a878a615120565b826001600160a01b031663d53f62176040518163ffffffff1660e01b815260040160206040518083038186803b158015611ea357600080fd5b505afa158015611eb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611edb9190614983565b611ee59190615101565b88889050836001600160a01b03166335dca76c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f2257600080fd5b505afa158015611f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5a9190614983565b611f649190615101565b611f6e91906150e9565b90506000611f7e82888888613452565b90506120018c8c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a92506138c1915050565b507f7af2bc3f8ec800c569b6555feaf16589d96a9d04a49d1645fd456d75fa0b372b8b8b90508260008151811061204857634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0387169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b1580156120da57600080fd5b505afa1580156120ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121129190614983565b90508015611ced5760405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b15801561218457600080fd5b505af1158015612198573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121bc919061493b565b505050600180555050505050505050505050565b336121e36000546001600160a01b031690565b6001600160a01b0316146122395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f2565b6122436000613ad6565b565b600260015414156122985760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b038116158015906122be57506001600160a01b0381163014155b6122c757600080fd5b856122d157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561232c57600080fd5b505af1158015612340573d6000803e3d6000fd5b50506040517f22061379000000000000000000000000000000000000000000000000000000008152600481018b9052600093508392506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915063220613799060240160a06040518083038186803b1580156123c357600080fd5b505afa1580156123d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fb9190614e4d565b509194509250600091506124119050878a615120565b61241b9084615101565b6124258884615101565b61242f91906150e9565b9050600061245b82612449670de0b6b3a76400008d615101565b61245391906150e9565b348989613452565b905061249d8b8b8b8b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b925061377c915050565b7ff7735c8cb2a65788ca663fc8415b7c6a66cd6847d58346d8334e8d52a599d3df8a826000815181106124e057634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0388169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561257257600080fd5b505afa158015612586573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125aa9190614983565b905080156126f757604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561261457600080fd5b505af1158015612628573d6000803e3d6000fd5b505050506000866001600160a01b03168260405160006040518083038185875af1925050503d8060008114612679576040519150601f19603f3d011682016040523d82523d6000602084013e61267e565b606091505b50509050806126f55760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101f2565b505b50506001805550505050505050505050565b3361271c6000546001600160a01b031690565b6001600160a01b0316146127725760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f2565b6001600160a01b03811661284257604051600090339047908381818185875af1925050503d80600081146127c2576040519150601f19603f3d011682016040523d82523d6000602084013e6127c7565b606091505b505090508061283e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101f2565b5050565b6040516370a0823160e01b81523060048201526128d09033906001600160a01b038416906370a082319060240160206040518083038186803b15801561288757600080fd5b505afa15801561289b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128bf9190614983565b6001600160a01b0384169190613b3e565b50565b600260015414156129265760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b0381161580159061294c57506001600160a01b0381163014155b61295557600080fd5b8461295f57600080fd5b60008061299f8989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061303792505050565b9150915060006106ce838884898989613b6e565b60026001541415612a065760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b03811615801590612a2c57506001600160a01b0381163014155b612a3557600080fd5b86612a3f57600080fd5b600080612ab08b8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d918291850190849080828437600092019190915250613c1692505050565b91509150612ac2828783888888613b6e565b50600089815b81811015612b14578a8a82818110612af057634e487b7160e01b600052603260045260246000fd5b9050602002013583612b0291906150e9565b9250612b0d81615163565b9050612ac8565b507f1cdb5ee3c47e1a706ac452b89698e5e3f2ff4f835ca72dde8936d0f4fcf37d81828b8b612b44600182615120565b818110612b6157634e487b7160e01b600052603260045260246000fd5b604080519485526020918202939093013590840152506001600160a01b0388169082015260600160405180910390a15050600180555050505050505050505050565b60026001541415612bf65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b03811615801590612c1c57506001600160a01b0381163014155b612c2557600080fd5b86612c2f57600080fd5b600080612ca08b8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d918291850190849080828437600092019190915250613c1692505050565b915091506000612cb483888489898961330a565b905060008a815b81811015612d07578b8b82818110612ce357634e487b7160e01b600052603260045260246000fd5b9050602002013583612cf591906150e9565b9250612d0081615163565b9050612cbb565b507f1cdb5ee3c47e1a706ac452b89698e5e3f2ff4f835ca72dde8936d0f4fcf37d81828460018651612d399190615120565b81518110612d5757634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0389169082015260600160405180910390a1505060018055505050505050505050505050565b33612dae6000546001600160a01b031690565b6001600160a01b031614612e045760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f2565b6001600160a01b038116612e805760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016101f2565b6128d081613ad6565b801580612f2b57506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b158015612ef157600080fd5b505afa158015612f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f299190614983565b155b612f9d5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016101f2565b6040516001600160a01b0383166024820152604481018290526130199084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613f7c565b505050565b606061302d8484600085614061565b90505b9392505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166381a36fb6866040518263ffffffff1660e01b815260040161308a91815260200190565b60206040518083038186803b1580156130a257600080fd5b505afa1580156130b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130da9190614711565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561311757600080fd5b505afa15801561312b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314f9190614711565b855190915060005b818110156131d3576131918388838151811061318357634e487b7160e01b600052603260045260246000fd5b6020026020010151866141a0565b6131c383858984815181106131b657634e487b7160e01b600052603260045260246000fd5b60200260200101516144d0565b6131cc81615163565b9050613157565b50604051630f57464360e21b81526060906001600160a01b03851690633d5d190c90613205908a908590600401614f3a565b602060405180830381600087803b15801561321f57600080fd5b505af1158015613233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132579190614983565b506000875190506000856001600160a01b03166313966db56040518163ffffffff1660e01b815260040160206040518083038186803b15801561329957600080fd5b505afa1580156132ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d19190614983565b6132db9083615101565b6132ed670de0b6b3a764000084615101565b6132f79190615120565b95975094955050505050505b9250929050565b60606133406001600160a01b0388167f000000000000000000000000000000000000000000000000000000000000000087612e89565b6040517f18cbafe50000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906318cbafe5906133b29089908b908a908a908a904290600401615021565b600060405180830381600087803b1580156133cc57600080fd5b505af11580156133e0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261340891908101906148a8565b98975050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905261344c9085906323b872dd60e01b90608401612fe2565b50505050565b606060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638803dbee8787878730426040518763ffffffff1660e01b81526004016134ac96959493929190615021565b600060405180830381600087803b1580156134c657600080fd5b505af11580156134da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261350291908101906148a8565b9695505050505050565b6040516340d1b7db60e11b81526004810186905260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906381a36fb69060240160206040518083038186803b15801561357157600080fd5b505afa158015613585573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135a99190614711565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156135e657600080fd5b505afa1580156135fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061361e9190614711565b604051631759616b60e11b81529091506001600160a01b03821690632eb2c2d69061365390339030908c908c90600401614ee2565b600060405180830381600087803b15801561366d57600080fd5b505af1158015613681573d6000803e3d6000fd5b505060405163a22cb46560e01b81526001600160a01b038581166004830152600160248301528416925063a22cb4659150604401600060405180830381600087803b1580156136cf57600080fd5b505af11580156136e3573d6000803e3d6000fd5b5050604051632321420560e21b81526001600160a01b0385169250638c8508149150613719908a908a908a908a90600401614f68565b600060405180830381600087803b15801561373357600080fd5b505af1158015613747573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261376f91908101906148a8565b5090979650505050505050565b6040516340d1b7db60e11b8152600481018590526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906381a36fb69060240160206040518083038186803b1580156137df57600080fd5b505afa1580156137f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138179190614711565b6040517f9d54def60000000000000000000000000000000000000000000000000000000081529091506001600160a01b03821690639d54def69061386390879087908790600401614fef565b600060405180830381600087803b15801561387d57600080fd5b505af1158015613891573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526138b991908101906148a8565b505050505050565b6040516340d1b7db60e11b81526004810185905260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906381a36fb69060240160206040518083038186803b15801561392657600080fd5b505afa15801561393a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061395e9190614711565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561399b57600080fd5b505afa1580156139af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139d39190614711565b865190915060005b81811015613a3c57613a078389838151811061318357634e487b7160e01b600052603260045260246000fd5b613a2c83858a84815181106131b657634e487b7160e01b600052603260045260246000fd5b613a3581615163565b90506139db565b50604051632321420560e21b81526060906001600160a01b03851690638c85081490613a72908b9085908c908c90600401614f68565b600060405180830381600087803b158015613a8c57600080fd5b505af1158015613aa0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613ac891908101906148a8565b509298975050505050505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03831660248201526044810182905261301990849063a9059cbb60e01b90606401612fe2565b6060613ba46001600160a01b0388167f000000000000000000000000000000000000000000000000000000000000000087612e89565b6040517f38ed17390000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906338ed1739906133b29089908b908a908a908a904290600401615021565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166381a36fb6876040518263ffffffff1660e01b8152600401613c6991815260200190565b60206040518083038186803b158015613c8157600080fd5b505afa158015613c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cb99190614711565b90506001600160a01b038116613d115760405162461bcd60e51b815260206004820152601d60248201527f4e4654585a61703a205661756c7420646f6573206e6f7420657869737400000060448201526064016101f2565b6000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b158015613d4c57600080fd5b505afa158015613d60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d849190614711565b604051631759616b60e11b81529091506001600160a01b03821690632eb2c2d690613db990339030908b908b90600401614ee2565b600060405180830381600087803b158015613dd357600080fd5b505af1158015613de7573d6000803e3d6000fd5b505060405163a22cb46560e01b81526001600160a01b038581166004830152600160248301528416925063a22cb4659150604401600060405180830381600087803b158015613e3557600080fd5b505af1158015613e49573d6000803e3d6000fd5b5050604051630f57464360e21b8152600092506001600160a01b0385169150633d5d190c90613e7e908a908a90600401614f3a565b602060405180830381600087803b158015613e9857600080fd5b505af1158015613eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ed09190614983565b9050600081846001600160a01b03166313966db56040518163ffffffff1660e01b815260040160206040518083038186803b158015613f0e57600080fd5b505afa158015613f22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f469190614983565b613f509190615101565b613f62670de0b6b3a764000084615101565b613f6c9190615120565b9399939850929650505050505050565b6000613fd1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661301e9092919063ffffffff16565b8051909150156130195780806020019051810190613fef919061493b565b6130195760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016101f2565b6060824710156140d95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016101f2565b843b6141275760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101f2565b600080866001600160a01b031685876040516141439190614ec6565b60006040518083038185875af1925050503d8060008114614180576040519150601f19603f3d011682016040523d82523d6000602084013e614185565b606091505b509150915061419582828661459c565b979650505050505050565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038616831415614230576040513360248201526001600160a01b03851660448201526064810186905260840160408051601f198184030181529190526020810180516001600160e01b03166323b872dd60e01b1790529050614443565b816001600160a01b0316866001600160a01b031614156143db5760008560405160240161425f91815260200190565b60408051601f198184030181529181526020820180516001600160e01b03167f58178168000000000000000000000000000000000000000000000000000000001790525190915060009081906001600160a01b038a16906142c1908590614ec6565b600060405180830381855afa9150503d80600081146142fc576040519150601f19603f3d011682016040523d82523d6000602084013e614301565b606091505b509150915060008180602001905181019061431c9190614711565b905082801561433357506001600160a01b03811633145b61437f5760405162461bcd60e51b815260206004820152601160248201527f4e6f7420746865204e4654206f776e657200000000000000000000000000000060448201526064016101f2565b604051602481018a905260440160408051601f198184030181529190526020810180516001600160e01b03167f8264fe980000000000000000000000000000000000000000000000000000000017905294506144439350505050565b6040513360248201526001600160a01b03851660448201526064810186905260840160408051601f198184030181529190526020810180516001600160e01b03167f42842e0e0000000000000000000000000000000000000000000000000000000017905290505b600080876001600160a01b03168360405161445e9190614ec6565b6000604051808303816000865af19150503d806000811461449b576040519150601f19603f3d011682016040523d82523d6000602084013e6144a0565b606091505b50915091508181906144c55760405162461bcd60e51b81526004016101f29190614fbc565b505050505050505050565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b03861683141561451557505050505050565b816001600160a01b0316866001600160a01b031614156138b95760405160248101859052600060448201526001600160a01b038616606482015260840160408051601f198184030181529190526020810180516001600160e01b03167fbf31196f000000000000000000000000000000000000000000000000000000001790529050614443565b606083156145ab575081613030565b8251156145bb5782518084602001fd5b8160405162461bcd60e51b81526004016101f29190614fbc565b80356145e0816151aa565b919050565b60008083601f8401126145f6578182fd5b50813567ffffffffffffffff81111561460d578182fd5b6020830191508360208260051b850101111561330357600080fd5b600082601f830112614638578081fd5b8135602061464d614648836150c5565b615094565b80838252828201915082860187848660051b890101111561466c578586fd5b855b8581101561376f5781358452928401929084019060010161466e565b600082601f83011261469a578081fd5b813567ffffffffffffffff8111156146b4576146b4615194565b6146c7601f8201601f1916602001615094565b8181528460208386010111156146db578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215614706578081fd5b8135613030816151aa565b600060208284031215614722578081fd5b8151613030816151aa565b600080600080600060a08688031215614744578081fd5b853561474f816151aa565b9450602086013561475f816151aa565b9350604086013567ffffffffffffffff8082111561477b578283fd5b61478789838a01614628565b9450606088013591508082111561479c578283fd5b6147a889838a01614628565b935060808801359150808211156147bd578283fd5b506147ca8882890161468a565b9150509295509295909350565b600080600080608085870312156147ec578384fd5b84356147f7816151aa565b93506020850135614807816151aa565b925060408501359150606085013567ffffffffffffffff811115614829578182fd5b6148358782880161468a565b91505092959194509250565b600080600080600060a08688031215614858578081fd5b8535614863816151aa565b94506020860135614873816151aa565b93506040860135925060608601359150608086013567ffffffffffffffff81111561489c578182fd5b6147ca8882890161468a565b600060208083850312156148ba578182fd5b825167ffffffffffffffff8111156148d0578283fd5b8301601f810185136148e0578283fd5b80516148ee614648826150c5565b80828252848201915084840188868560051b870101111561490d578687fd5b8694505b8385101561492f578051835260019490940193918501918501614911565b50979650505050505050565b60006020828403121561494c578081fd5b81518015158114613030578182fd5b60006020828403121561496c578081fd5b81356001600160e01b031981168114613030578182fd5b600060208284031215614994578081fd5b5051919050565b60008060008060008060008060a0898b0312156149b6578586fd5b88359750602089013567ffffffffffffffff808211156149d4578788fd5b6149e08c838d016145e5565b909950975060408b01359150808211156149f8578485fd5b614a048c838d016145e5565b909750955060608b0135915080821115614a1c578485fd5b50614a298b828c016145e5565b9094509250506080890135614a3d816151aa565b809150509295985092959890939650565b60008060008060008060008060008060c08b8d031215614a6c578384fd5b8a35995060208b013567ffffffffffffffff80821115614a8a578586fd5b614a968e838f016145e5565b909b50995060408d0135915080821115614aae578586fd5b614aba8e838f016145e5565b909950975060608d0135915080821115614ad2578586fd5b614ade8e838f016145e5565b909750955060808d0135915080821115614af6578384fd5b50614b038d828e016145e5565b9094509250614b16905060a08c016145d5565b90509295989b9194979a5092959850565b600080600080600080600080600080600060e08c8e031215614b47578485fd5b8b359a5067ffffffffffffffff8060208e01351115614b64578586fd5b614b748e60208f01358f016145e5565b909b50995060408d0135811015614b89578586fd5b614b998e60408f01358f016145e5565b909950975060608d0135811015614bae578586fd5b614bbe8e60608f01358f016145e5565b909750955060808d0135945060a08d0135811015614bda578182fd5b50614beb8d60a08e01358e016145e5565b9093509150614bfc60c08d016145d5565b90509295989b509295989b9093969950565b600080600080600080600080600060c08a8c031215614c2b578283fd5b8935985060208a013567ffffffffffffffff80821115614c49578485fd5b614c558d838e016145e5565b909a50985060408c0135915080821115614c6d578485fd5b614c798d838e016145e5565b909850965060608c0135955060808c0135915080821115614c98578485fd5b50614ca58c828d016145e5565b90945092505060a08a0135614cb9816151aa565b809150509295985092959850929598565b600080600080600080600060a0888a031215614ce4578081fd5b87359650602088013567ffffffffffffffff80821115614d02578283fd5b614d0e8b838c016145e5565b909850965060408a0135955060608a0135915080821115614d2d578283fd5b50614d3a8a828b016145e5565b9094509250506080880135614d4e816151aa565b8091505092959891949750929550565b600080600080600080600060a0888a031215614d78578081fd5b8735965060208801359550604088013567ffffffffffffffff80821115614d9d578283fd5b614da98b838c016145e5565b909750955060608a0135915080821115614d2d578283fd5b60008060008060008060008060c0898b031215614ddc578182fd5b8835975060208901359650604089013567ffffffffffffffff80821115614e01578384fd5b614e0d8c838d016145e5565b909850965060608b0135955060808b0135915080821115614e2c578384fd5b50614e398b828c016145e5565b90945092505060a0890135614a3d816151aa565b600080600080600060a08688031215614e64578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6000815180845260208085019450808401835b83811015614ebb57815187529582019590820190600101614e9f565b509495945050505050565b60008251614ed8818460208701615137565b9190910192915050565b60006001600160a01b03808716835280861660208401525060a06040830152614f0e60a0830185614e8c565b8281036060840152614f208185614e8c565b838103608090940193909352508152602001949350505050565b604081526000614f4d6040830185614e8c565b8281036020840152614f5f8185614e8c565b95945050505050565b608081526000614f7b6080830187614e8c565b8281036020840152614f8d8187614e8c565b90508281036040840152614fa18186614e8c565b9150506001600160a01b038316606083015295945050505050565b6020815260008251806020840152614fdb816040850160208701615137565b601f01601f19169190910160400192915050565b8381526060602082015260006150086060830185614e8c565b90506001600160a01b0383166040830152949350505050565b868152602080820187905260a0604083018190528201859052600090869060c08401835b88811015615073578335615058816151aa565b6001600160a01b031682529282019290820190600101615045565b506001600160a01b0396909616606085015250505060800152949350505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156150bd576150bd615194565b604052919050565b600067ffffffffffffffff8211156150df576150df615194565b5060051b60200190565b600082198211156150fc576150fc61517e565b500190565b600081600019048311821515161561511b5761511b61517e565b500290565b6000828210156151325761513261517e565b500390565b60005b8381101561515257818101518382015260200161513a565b8381111561344c5750506000910152565b60006000198214156151775761517761517e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146128d057600080fdfea2646970667358221220c014f43baa5d7fbb85db9f4e5587bbb8c3d457a56e7a6c72b775dff3912ec9a764736f6c63430008040033000000000000000000000000be86f647b167567525ccaafcd6f881f1ee558216000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f
Deployed Bytecode
0x6080604052600436106101795760003560e01c80637fc82484116100cb578063a02716171161007f578063bc197c8111610059578063bc197c81146104db578063f23a6e6114610520578063f2fde38b1461056557600080fd5b8063a027161714610467578063ab3a412114610487578063ad5c4648146104a757600080fd5b80638da5cb5b116100b05780638da5cb5b146103f5578063929bf3d3146104135780639bf1401c1461043357600080fd5b80637fc82484146103c2578063839006f2146103d557600080fd5b806357e836dc1161012d5780635ee50f88116101075780635ee50f881461032d5780636d13582c14610379578063715018a6146103ad57600080fd5b806357e836dc146102e757806358fbdd0a146102fa5780635d8117a61461030d57600080fd5b8063150b7a021161015e578063150b7a021461025757806342c4ccaa146102b45780634447d888146102c757600080fd5b806301ffc9a7146102025780630956642b1461023757600080fd5b366101fd57336001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216146101fb5760405162461bcd60e51b815260206004820152600960248201527f4f6e6c792057455448000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b005b600080fd5b34801561020e57600080fd5b5061022261021d36600461495b565b610585565b60405190151581526020015b60405180910390f35b34801561024357600080fd5b506101fb610252366004614cca565b6105ee565b34801561026357600080fd5b5061029b6102723660046147d7565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040516001600160e01b0319909116815260200161022e565b6101fb6102c2366004614b27565b610762565b3480156102d357600080fd5b506101fb6102e2366004614dc1565b610d19565b6101fb6102f5366004614a4e565b6110ea565b6101fb61030836600461499b565b611767565b34801561031957600080fd5b506101fb610328366004614c0e565b611d00565b34801561033957600080fd5b506103617f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee55821681565b6040516001600160a01b03909116815260200161022e565b34801561038557600080fd5b506103617f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b3480156103b957600080fd5b506101fb6121d0565b6101fb6103d0366004614d5e565b612245565b3480156103e157600080fd5b506101fb6103f03660046146f5565b612709565b34801561040157600080fd5b506000546001600160a01b0316610361565b34801561041f57600080fd5b506101fb61042e366004614cca565b6128d3565b34801561043f57600080fd5b506103617f000000000000000000000000688c3e4658b5367da06fd629e41879beab538e3781565b34801561047357600080fd5b506101fb610482366004614c0e565b6129b3565b34801561049357600080fd5b506101fb6104a2366004614c0e565b612ba3565b3480156104b357600080fd5b506103617f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b3480156104e757600080fd5b5061029b6104f636600461472d565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561052c57600080fd5b5061029b61053b366004614841565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b34801561057157600080fd5b506101fb6105803660046146f5565b612d9b565b60006001600160e01b031982167f4e2312e00000000000000000000000000000000000000000000000000000000014806105e857507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b600260015414156106415760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b0381161580159061066757506001600160a01b0381163014155b61067057600080fd5b8461067a57600080fd5b6000806106ba8989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061303792505050565b9150915060006106ce83888489898961330a565b90507f1cdb5ee3c47e1a706ac452b89698e5e3f2ff4f835ca72dde8936d0f4fcf37d818989905082600184516107049190615120565b8151811061072257634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0387169082015260600160405180910390a15050600180555050505050505050565b600260015414156107b55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b038116158015906107db57506001600160a01b0381163014155b6107e457600080fd5b886107ee57600080fd5b6000805b8a8110156108955760008a8a8381811061081c57634e487b7160e01b600052603260045260246000fd5b905060200201359050600081116108755760405162461bcd60e51b815260206004820152601060248201527f5472616e7366657272696e67203c20310000000000000000000000000000000060448201526064016101f2565b61087f81846150e9565b925050808061088d90615163565b9150506107f2565b506040516340d1b7db60e11b8152600481018d90526000906001600160a01b037f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee55821616906381a36fb69060240160206040518083038186803b1580156108f957600080fd5b505afa15801561090d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109319190614711565b9050600061093f8884615120565b826001600160a01b031663d53f62176040518163ffffffff1660e01b815260040160206040518083038186803b15801561097857600080fd5b505afa15801561098c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b09190614983565b6109ba9190615101565b89899050836001600160a01b03166335dca76c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109f757600080fd5b505afa158015610a0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2f9190614983565b610a399190615101565b610a4391906150e9565b9050610a7a6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21633308a613414565b6000610a8882898989613452565b9050610b4d8f8f8f80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508e8e80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508d8d808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c925061350c915050565b507f7af2bc3f8ec800c569b6555feaf16589d96a9d04a49d1645fd456d75fa0b372b8482600081518110610b9157634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0388169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316906370a082319060240160206040518083038186803b158015610c2357600080fd5b505afa158015610c37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5b9190614983565b60405163a9059cbb60e01b81526001600160a01b038881166004830152602482018390529192507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29091169063a9059cbb90604401602060405180830381600087803b158015610cca57600080fd5b505af1158015610cde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d02919061493b565b505060018055505050505050505050505050505050565b60026001541415610d6c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b03811615801590610d9257506001600160a01b0381163014155b610d9b57600080fd5b86610da557600080fd5b60008060007f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b031663220613798c6040518263ffffffff1660e01b8152600401610df891815260200190565b60a06040518083038186803b158015610e1057600080fd5b505afa158015610e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e489190614e4d565b509194509250610e5c91508990508b615120565b610e669083615101565b610e708983615101565b610e7a91906150e9565b9250610eb49150506001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216333088613414565b6000610ede82610ecc670de0b6b3a76400008c615101565b610ed691906150e9565b878787613452565b9050610f208a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061377c915050565b7ff7735c8cb2a65788ca663fc8415b7c6a66cd6847d58346d8334e8d52a599d3df8982600081518110610f6357634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0386169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316906370a082319060240160206040518083038186803b158015610ff557600080fd5b505afa158015611009573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102d9190614983565b905080156110d95760405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2169063a9059cbb90604401602060405180830381600087803b15801561109f57600080fd5b505af11580156110b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d7919061493b565b505b505060018055505050505050505050565b6002600154141561113d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b0381161580159061116357506001600160a01b0381163014155b61116c57600080fd5b878061117757600080fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156111d257600080fd5b505af11580156111e6573d6000803e3d6000fd5b50505050506000805b828110156112905760008a8a8381811061121957634e487b7160e01b600052603260045260246000fd5b905060200201359050600081116112725760405162461bcd60e51b815260206004820152601060248201527f5472616e7366657272696e67203c20310000000000000000000000000000000060448201526064016101f2565b61127c81846150e9565b9250508061128990615163565b90506111ef565b506040516340d1b7db60e11b8152600481018d90526000906001600160a01b037f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee55821616906381a36fb69060240160206040518083038186803b1580156112f457600080fd5b505afa158015611308573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132c9190614711565b9050600061133a8884615120565b826001600160a01b031663d53f62176040518163ffffffff1660e01b815260040160206040518083038186803b15801561137357600080fd5b505afa158015611387573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ab9190614983565b6113b59190615101565b89899050836001600160a01b03166335dca76c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113f257600080fd5b505afa158015611406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142a9190614983565b6114349190615101565b61143e91906150e9565b9050600061144e82348a8a613452565b90506115138f8f8f80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508e8e80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508d8d808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508d925061350c915050565b507f7af2bc3f8ec800c569b6555feaf16589d96a9d04a49d1645fd456d75fa0b372b848260008151811061155757634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0389169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316906370a082319060240160206040518083038186803b1580156115e957600080fd5b505afa1580156115fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116219190614983565b604051632e1a7d4d60e01b8152600481018290529091507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561168657600080fd5b505af115801561169a573d6000803e3d6000fd5b505050506000876001600160a01b03168260405160006040518083038185875af1925050503d80600081146116eb576040519150601f19603f3d011682016040523d82523d6000602084013e6116f0565b606091505b5050905080610d025760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101f2565b600260015414156117ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b038116158015906117e057506001600160a01b0381163014155b6117e957600080fd5b856117f357600080fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561184e57600080fd5b505af1158015611862573d6000803e3d6000fd5b50506040516340d1b7db60e11b8152600481018c9052600093507f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b031692506381a36fb6915060240160206040518083038186803b1580156118ca57600080fd5b505afa1580156118de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119029190614711565b905060006119108689615120565b826001600160a01b031663d53f62176040518163ffffffff1660e01b815260040160206040518083038186803b15801561194957600080fd5b505afa15801561195d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119819190614983565b61198b9190615101565b87879050836001600160a01b03166335dca76c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119c857600080fd5b505afa1580156119dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a009190614983565b611a0a9190615101565b611a1491906150e9565b90506000611a2482348888613452565b9050611a968b8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d9182918501908490808284376000920191909152508a92506138c1915050565b507f7af2bc3f8ec800c569b6555feaf16589d96a9d04a49d1645fd456d75fa0b372b8a8a905082600081518110611add57634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0387169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316906370a082319060240160206040518083038186803b158015611b6f57600080fd5b505afa158015611b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba79190614983565b604051632e1a7d4d60e01b8152600481018290529091507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611c0c57600080fd5b505af1158015611c20573d6000803e3d6000fd5b505050506000856001600160a01b03168260405160006040518083038185875af1925050503d8060008114611c71576040519150601f19603f3d011682016040523d82523d6000602084013e611c76565b606091505b5050905080611ced5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101f2565b5050600180555050505050505050505050565b60026001541415611d535760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b03811615801590611d7957506001600160a01b0381163014155b611d8257600080fd5b86611d8c57600080fd5b611dc16001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216333087613414565b6040516340d1b7db60e11b8152600481018a90526000907f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b0316906381a36fb69060240160206040518083038186803b158015611e2457600080fd5b505afa158015611e38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5c9190614711565b90506000611e6a878a615120565b826001600160a01b031663d53f62176040518163ffffffff1660e01b815260040160206040518083038186803b158015611ea357600080fd5b505afa158015611eb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611edb9190614983565b611ee59190615101565b88889050836001600160a01b03166335dca76c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f2257600080fd5b505afa158015611f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5a9190614983565b611f649190615101565b611f6e91906150e9565b90506000611f7e82888888613452565b90506120018c8c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a92506138c1915050565b507f7af2bc3f8ec800c569b6555feaf16589d96a9d04a49d1645fd456d75fa0b372b8b8b90508260008151811061204857634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0387169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316906370a082319060240160206040518083038186803b1580156120da57600080fd5b505afa1580156120ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121129190614983565b90508015611ced5760405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2169063a9059cbb90604401602060405180830381600087803b15801561218457600080fd5b505af1158015612198573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121bc919061493b565b505050600180555050505050505050505050565b336121e36000546001600160a01b031690565b6001600160a01b0316146122395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f2565b6122436000613ad6565b565b600260015414156122985760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b038116158015906122be57506001600160a01b0381163014155b6122c757600080fd5b856122d157600080fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561232c57600080fd5b505af1158015612340573d6000803e3d6000fd5b50506040517f22061379000000000000000000000000000000000000000000000000000000008152600481018b9052600093508392506001600160a01b037f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee55821616915063220613799060240160a06040518083038186803b1580156123c357600080fd5b505afa1580156123d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fb9190614e4d565b509194509250600091506124119050878a615120565b61241b9084615101565b6124258884615101565b61242f91906150e9565b9050600061245b82612449670de0b6b3a76400008d615101565b61245391906150e9565b348989613452565b905061249d8b8b8b8b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b925061377c915050565b7ff7735c8cb2a65788ca663fc8415b7c6a66cd6847d58346d8334e8d52a599d3df8a826000815181106124e057634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0388169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316906370a082319060240160206040518083038186803b15801561257257600080fd5b505afa158015612586573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125aa9190614983565b905080156126f757604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561261457600080fd5b505af1158015612628573d6000803e3d6000fd5b505050506000866001600160a01b03168260405160006040518083038185875af1925050503d8060008114612679576040519150601f19603f3d011682016040523d82523d6000602084013e61267e565b606091505b50509050806126f55760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101f2565b505b50506001805550505050505050505050565b3361271c6000546001600160a01b031690565b6001600160a01b0316146127725760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f2565b6001600160a01b03811661284257604051600090339047908381818185875af1925050503d80600081146127c2576040519150601f19603f3d011682016040523d82523d6000602084013e6127c7565b606091505b505090508061283e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101f2565b5050565b6040516370a0823160e01b81523060048201526128d09033906001600160a01b038416906370a082319060240160206040518083038186803b15801561288757600080fd5b505afa15801561289b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128bf9190614983565b6001600160a01b0384169190613b3e565b50565b600260015414156129265760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b0381161580159061294c57506001600160a01b0381163014155b61295557600080fd5b8461295f57600080fd5b60008061299f8989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061303792505050565b9150915060006106ce838884898989613b6e565b60026001541415612a065760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b03811615801590612a2c57506001600160a01b0381163014155b612a3557600080fd5b86612a3f57600080fd5b600080612ab08b8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d918291850190849080828437600092019190915250613c1692505050565b91509150612ac2828783888888613b6e565b50600089815b81811015612b14578a8a82818110612af057634e487b7160e01b600052603260045260246000fd5b9050602002013583612b0291906150e9565b9250612b0d81615163565b9050612ac8565b507f1cdb5ee3c47e1a706ac452b89698e5e3f2ff4f835ca72dde8936d0f4fcf37d81828b8b612b44600182615120565b818110612b6157634e487b7160e01b600052603260045260246000fd5b604080519485526020918202939093013590840152506001600160a01b0388169082015260600160405180910390a15050600180555050505050505050505050565b60026001541415612bf65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b03811615801590612c1c57506001600160a01b0381163014155b612c2557600080fd5b86612c2f57600080fd5b600080612ca08b8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d918291850190849080828437600092019190915250613c1692505050565b915091506000612cb483888489898961330a565b905060008a815b81811015612d07578b8b82818110612ce357634e487b7160e01b600052603260045260246000fd5b9050602002013583612cf591906150e9565b9250612d0081615163565b9050612cbb565b507f1cdb5ee3c47e1a706ac452b89698e5e3f2ff4f835ca72dde8936d0f4fcf37d81828460018651612d399190615120565b81518110612d5757634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0389169082015260600160405180910390a1505060018055505050505050505050505050565b33612dae6000546001600160a01b031690565b6001600160a01b031614612e045760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f2565b6001600160a01b038116612e805760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016101f2565b6128d081613ad6565b801580612f2b57506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b158015612ef157600080fd5b505afa158015612f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f299190614983565b155b612f9d5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016101f2565b6040516001600160a01b0383166024820152604481018290526130199084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613f7c565b505050565b606061302d8484600085614061565b90505b9392505050565b60008060007f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b03166381a36fb6866040518263ffffffff1660e01b815260040161308a91815260200190565b60206040518083038186803b1580156130a257600080fd5b505afa1580156130b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130da9190614711565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561311757600080fd5b505afa15801561312b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314f9190614711565b855190915060005b818110156131d3576131918388838151811061318357634e487b7160e01b600052603260045260246000fd5b6020026020010151866141a0565b6131c383858984815181106131b657634e487b7160e01b600052603260045260246000fd5b60200260200101516144d0565b6131cc81615163565b9050613157565b50604051630f57464360e21b81526060906001600160a01b03851690633d5d190c90613205908a908590600401614f3a565b602060405180830381600087803b15801561321f57600080fd5b505af1158015613233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132579190614983565b506000875190506000856001600160a01b03166313966db56040518163ffffffff1660e01b815260040160206040518083038186803b15801561329957600080fd5b505afa1580156132ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d19190614983565b6132db9083615101565b6132ed670de0b6b3a764000084615101565b6132f79190615120565b95975094955050505050505b9250929050565b60606133406001600160a01b0388167f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f87612e89565b6040517f18cbafe50000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f16906318cbafe5906133b29089908b908a908a908a904290600401615021565b600060405180830381600087803b1580156133cc57600080fd5b505af11580156133e0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261340891908101906148a8565b98975050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905261344c9085906323b872dd60e01b90608401612fe2565b50505050565b606060007f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6001600160a01b0316638803dbee8787878730426040518763ffffffff1660e01b81526004016134ac96959493929190615021565b600060405180830381600087803b1580156134c657600080fd5b505af11580156134da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261350291908101906148a8565b9695505050505050565b6040516340d1b7db60e11b81526004810186905260009081906001600160a01b037f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee55821616906381a36fb69060240160206040518083038186803b15801561357157600080fd5b505afa158015613585573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135a99190614711565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156135e657600080fd5b505afa1580156135fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061361e9190614711565b604051631759616b60e11b81529091506001600160a01b03821690632eb2c2d69061365390339030908c908c90600401614ee2565b600060405180830381600087803b15801561366d57600080fd5b505af1158015613681573d6000803e3d6000fd5b505060405163a22cb46560e01b81526001600160a01b038581166004830152600160248301528416925063a22cb4659150604401600060405180830381600087803b1580156136cf57600080fd5b505af11580156136e3573d6000803e3d6000fd5b5050604051632321420560e21b81526001600160a01b0385169250638c8508149150613719908a908a908a908a90600401614f68565b600060405180830381600087803b15801561373357600080fd5b505af1158015613747573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261376f91908101906148a8565b5090979650505050505050565b6040516340d1b7db60e11b8152600481018590526000907f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b0316906381a36fb69060240160206040518083038186803b1580156137df57600080fd5b505afa1580156137f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138179190614711565b6040517f9d54def60000000000000000000000000000000000000000000000000000000081529091506001600160a01b03821690639d54def69061386390879087908790600401614fef565b600060405180830381600087803b15801561387d57600080fd5b505af1158015613891573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526138b991908101906148a8565b505050505050565b6040516340d1b7db60e11b81526004810185905260009081906001600160a01b037f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee55821616906381a36fb69060240160206040518083038186803b15801561392657600080fd5b505afa15801561393a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061395e9190614711565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561399b57600080fd5b505afa1580156139af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139d39190614711565b865190915060005b81811015613a3c57613a078389838151811061318357634e487b7160e01b600052603260045260246000fd5b613a2c83858a84815181106131b657634e487b7160e01b600052603260045260246000fd5b613a3581615163565b90506139db565b50604051632321420560e21b81526060906001600160a01b03851690638c85081490613a72908b9085908c908c90600401614f68565b600060405180830381600087803b158015613a8c57600080fd5b505af1158015613aa0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613ac891908101906148a8565b509298975050505050505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03831660248201526044810182905261301990849063a9059cbb60e01b90606401612fe2565b6060613ba46001600160a01b0388167f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f87612e89565b6040517f38ed17390000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f16906338ed1739906133b29089908b908a908a908a904290600401615021565b60008060007f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b03166381a36fb6876040518263ffffffff1660e01b8152600401613c6991815260200190565b60206040518083038186803b158015613c8157600080fd5b505afa158015613c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cb99190614711565b90506001600160a01b038116613d115760405162461bcd60e51b815260206004820152601d60248201527f4e4654585a61703a205661756c7420646f6573206e6f7420657869737400000060448201526064016101f2565b6000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b158015613d4c57600080fd5b505afa158015613d60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d849190614711565b604051631759616b60e11b81529091506001600160a01b03821690632eb2c2d690613db990339030908b908b90600401614ee2565b600060405180830381600087803b158015613dd357600080fd5b505af1158015613de7573d6000803e3d6000fd5b505060405163a22cb46560e01b81526001600160a01b038581166004830152600160248301528416925063a22cb4659150604401600060405180830381600087803b158015613e3557600080fd5b505af1158015613e49573d6000803e3d6000fd5b5050604051630f57464360e21b8152600092506001600160a01b0385169150633d5d190c90613e7e908a908a90600401614f3a565b602060405180830381600087803b158015613e9857600080fd5b505af1158015613eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ed09190614983565b9050600081846001600160a01b03166313966db56040518163ffffffff1660e01b815260040160206040518083038186803b158015613f0e57600080fd5b505afa158015613f22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f469190614983565b613f509190615101565b613f62670de0b6b3a764000084615101565b613f6c9190615120565b9399939850929650505050505050565b6000613fd1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661301e9092919063ffffffff16565b8051909150156130195780806020019051810190613fef919061493b565b6130195760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016101f2565b6060824710156140d95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016101f2565b843b6141275760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101f2565b600080866001600160a01b031685876040516141439190614ec6565b60006040518083038185875af1925050503d8060008114614180576040519150601f19603f3d011682016040523d82523d6000602084013e614185565b606091505b509150915061419582828661459c565b979650505050505050565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038616831415614230576040513360248201526001600160a01b03851660448201526064810186905260840160408051601f198184030181529190526020810180516001600160e01b03166323b872dd60e01b1790529050614443565b816001600160a01b0316866001600160a01b031614156143db5760008560405160240161425f91815260200190565b60408051601f198184030181529181526020820180516001600160e01b03167f58178168000000000000000000000000000000000000000000000000000000001790525190915060009081906001600160a01b038a16906142c1908590614ec6565b600060405180830381855afa9150503d80600081146142fc576040519150601f19603f3d011682016040523d82523d6000602084013e614301565b606091505b509150915060008180602001905181019061431c9190614711565b905082801561433357506001600160a01b03811633145b61437f5760405162461bcd60e51b815260206004820152601160248201527f4e6f7420746865204e4654206f776e657200000000000000000000000000000060448201526064016101f2565b604051602481018a905260440160408051601f198184030181529190526020810180516001600160e01b03167f8264fe980000000000000000000000000000000000000000000000000000000017905294506144439350505050565b6040513360248201526001600160a01b03851660448201526064810186905260840160408051601f198184030181529190526020810180516001600160e01b03167f42842e0e0000000000000000000000000000000000000000000000000000000017905290505b600080876001600160a01b03168360405161445e9190614ec6565b6000604051808303816000865af19150503d806000811461449b576040519150601f19603f3d011682016040523d82523d6000602084013e6144a0565b606091505b50915091508181906144c55760405162461bcd60e51b81526004016101f29190614fbc565b505050505050505050565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b03861683141561451557505050505050565b816001600160a01b0316866001600160a01b031614156138b95760405160248101859052600060448201526001600160a01b038616606482015260840160408051601f198184030181529190526020810180516001600160e01b03167fbf31196f000000000000000000000000000000000000000000000000000000001790529050614443565b606083156145ab575081613030565b8251156145bb5782518084602001fd5b8160405162461bcd60e51b81526004016101f29190614fbc565b80356145e0816151aa565b919050565b60008083601f8401126145f6578182fd5b50813567ffffffffffffffff81111561460d578182fd5b6020830191508360208260051b850101111561330357600080fd5b600082601f830112614638578081fd5b8135602061464d614648836150c5565b615094565b80838252828201915082860187848660051b890101111561466c578586fd5b855b8581101561376f5781358452928401929084019060010161466e565b600082601f83011261469a578081fd5b813567ffffffffffffffff8111156146b4576146b4615194565b6146c7601f8201601f1916602001615094565b8181528460208386010111156146db578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215614706578081fd5b8135613030816151aa565b600060208284031215614722578081fd5b8151613030816151aa565b600080600080600060a08688031215614744578081fd5b853561474f816151aa565b9450602086013561475f816151aa565b9350604086013567ffffffffffffffff8082111561477b578283fd5b61478789838a01614628565b9450606088013591508082111561479c578283fd5b6147a889838a01614628565b935060808801359150808211156147bd578283fd5b506147ca8882890161468a565b9150509295509295909350565b600080600080608085870312156147ec578384fd5b84356147f7816151aa565b93506020850135614807816151aa565b925060408501359150606085013567ffffffffffffffff811115614829578182fd5b6148358782880161468a565b91505092959194509250565b600080600080600060a08688031215614858578081fd5b8535614863816151aa565b94506020860135614873816151aa565b93506040860135925060608601359150608086013567ffffffffffffffff81111561489c578182fd5b6147ca8882890161468a565b600060208083850312156148ba578182fd5b825167ffffffffffffffff8111156148d0578283fd5b8301601f810185136148e0578283fd5b80516148ee614648826150c5565b80828252848201915084840188868560051b870101111561490d578687fd5b8694505b8385101561492f578051835260019490940193918501918501614911565b50979650505050505050565b60006020828403121561494c578081fd5b81518015158114613030578182fd5b60006020828403121561496c578081fd5b81356001600160e01b031981168114613030578182fd5b600060208284031215614994578081fd5b5051919050565b60008060008060008060008060a0898b0312156149b6578586fd5b88359750602089013567ffffffffffffffff808211156149d4578788fd5b6149e08c838d016145e5565b909950975060408b01359150808211156149f8578485fd5b614a048c838d016145e5565b909750955060608b0135915080821115614a1c578485fd5b50614a298b828c016145e5565b9094509250506080890135614a3d816151aa565b809150509295985092959890939650565b60008060008060008060008060008060c08b8d031215614a6c578384fd5b8a35995060208b013567ffffffffffffffff80821115614a8a578586fd5b614a968e838f016145e5565b909b50995060408d0135915080821115614aae578586fd5b614aba8e838f016145e5565b909950975060608d0135915080821115614ad2578586fd5b614ade8e838f016145e5565b909750955060808d0135915080821115614af6578384fd5b50614b038d828e016145e5565b9094509250614b16905060a08c016145d5565b90509295989b9194979a5092959850565b600080600080600080600080600080600060e08c8e031215614b47578485fd5b8b359a5067ffffffffffffffff8060208e01351115614b64578586fd5b614b748e60208f01358f016145e5565b909b50995060408d0135811015614b89578586fd5b614b998e60408f01358f016145e5565b909950975060608d0135811015614bae578586fd5b614bbe8e60608f01358f016145e5565b909750955060808d0135945060a08d0135811015614bda578182fd5b50614beb8d60a08e01358e016145e5565b9093509150614bfc60c08d016145d5565b90509295989b509295989b9093969950565b600080600080600080600080600060c08a8c031215614c2b578283fd5b8935985060208a013567ffffffffffffffff80821115614c49578485fd5b614c558d838e016145e5565b909a50985060408c0135915080821115614c6d578485fd5b614c798d838e016145e5565b909850965060608c0135955060808c0135915080821115614c98578485fd5b50614ca58c828d016145e5565b90945092505060a08a0135614cb9816151aa565b809150509295985092959850929598565b600080600080600080600060a0888a031215614ce4578081fd5b87359650602088013567ffffffffffffffff80821115614d02578283fd5b614d0e8b838c016145e5565b909850965060408a0135955060608a0135915080821115614d2d578283fd5b50614d3a8a828b016145e5565b9094509250506080880135614d4e816151aa565b8091505092959891949750929550565b600080600080600080600060a0888a031215614d78578081fd5b8735965060208801359550604088013567ffffffffffffffff80821115614d9d578283fd5b614da98b838c016145e5565b909750955060608a0135915080821115614d2d578283fd5b60008060008060008060008060c0898b031215614ddc578182fd5b8835975060208901359650604089013567ffffffffffffffff80821115614e01578384fd5b614e0d8c838d016145e5565b909850965060608b0135955060808b0135915080821115614e2c578384fd5b50614e398b828c016145e5565b90945092505060a0890135614a3d816151aa565b600080600080600060a08688031215614e64578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6000815180845260208085019450808401835b83811015614ebb57815187529582019590820190600101614e9f565b509495945050505050565b60008251614ed8818460208701615137565b9190910192915050565b60006001600160a01b03808716835280861660208401525060a06040830152614f0e60a0830185614e8c565b8281036060840152614f208185614e8c565b838103608090940193909352508152602001949350505050565b604081526000614f4d6040830185614e8c565b8281036020840152614f5f8185614e8c565b95945050505050565b608081526000614f7b6080830187614e8c565b8281036020840152614f8d8187614e8c565b90508281036040840152614fa18186614e8c565b9150506001600160a01b038316606083015295945050505050565b6020815260008251806020840152614fdb816040850160208701615137565b601f01601f19169190910160400192915050565b8381526060602082015260006150086060830185614e8c565b90506001600160a01b0383166040830152949350505050565b868152602080820187905260a0604083018190528201859052600090869060c08401835b88811015615073578335615058816151aa565b6001600160a01b031682529282019290820190600101615045565b506001600160a01b0396909616606085015250505060800152949350505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156150bd576150bd615194565b604052919050565b600067ffffffffffffffff8211156150df576150df615194565b5060051b60200190565b600082198211156150fc576150fc61517e565b500190565b600081600019048311821515161561511b5761511b61517e565b500290565b6000828210156151325761513261517e565b500390565b60005b8381101561515257818101518382015260200161513a565b8381111561344c5750506000910152565b60006000198214156151775761517761517e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146128d057600080fdfea2646970667358221220c014f43baa5d7fbb85db9f4e5587bbb8c3d457a56e7a6c72b775dff3912ec9a764736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000be86f647b167567525ccaafcd6f881f1ee558216000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f
-----Decoded View---------------
Arg [0] : _nftxFactory (address): 0xBE86f647b167567525cCAAfcd6f881F1Ee558216
Arg [1] : _sushiRouter (address): 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000be86f647b167567525ccaafcd6f881f1ee558216
Arg [1] : 000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f
Deployed Bytecode Sourcemap
48956:17544:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66450:10;-1:-1:-1;;;;;66472:4:0;66450:27;;66442:49;;;;-1:-1:-1;;;66442:49:0;;23877:2:1;66442:49:0;;;23859:21:1;23916:1;23896:18;;;23889:29;23954:11;23934:18;;;23927:39;23983:18;;66442:49:0;;;;;;;;;48956:17544;;;;;31008:269;;;;;;;;;;-1:-1:-1;31008:269:0;;;;;:::i;:::-;;:::i;:::-;;;21587:14:1;;21580:22;21562:41;;21550:2;21535:18;31008:269:0;;;;;;;;50024:490;;;;;;;;;;-1:-1:-1;50024:490:0;;;;;:::i;:::-;;:::i;27008:207::-;;;;;;;;;;-1:-1:-1;27008:207:0;;;;;:::i;:::-;27177:30;27008:207;;;;;;;;;;-1:-1:-1;;;;;;21776:79:1;;;21758:98;;21746:2;21731:18;27008:207:0;21713:149:1;54201:1150:0;;;;;;:::i;:::-;;:::i;56359:954::-;;;;;;;;;;-1:-1:-1;56359:954:0;;;;;:::i;:::-;;:::i;52964:1231::-;;;;;;:::i;:::-;;:::i;51023:981::-;;;;;;:::i;:::-;;:::i;52010:948::-;;;;;;;;;;-1:-1:-1;52010:948:0;;;;;:::i;:::-;;:::i;49204:46::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17820:55:1;;;17802:74;;17790:2;17775:18;49204:46:0;17757:125:1;49255:47:0;;;;;;;;;;;;;;;48327:94;;;;;;;;;;;;;:::i;55357:996::-;;;;;;:::i;:::-;;:::i;66011:391::-;;;;;;;;;;-1:-1:-1;66011:391:0;;;;;:::i;:::-;;:::i;47678:87::-;;;;;;;;;;-1:-1:-1;47724:7:0;47751:6;-1:-1:-1;;;;;47751:6:0;47678:87;;50520:497;;;;;;;;;;-1:-1:-1;50520:497:0;;;;;:::i;:::-;;:::i;49158:41::-;;;;;;;;;;;;;;;58008:652;;;;;;;;;;-1:-1:-1;58008:652:0;;;;;:::i;:::-;;:::i;57319:683::-;;;;;;;;;;-1:-1:-1;57319:683:0;;;;;:::i;:::-;;:::i;49125:27::-;;;;;;;;;;;;;;;31688:203;;;;;;;;;;-1:-1:-1;31688:203:0;;;;;:::i;:::-;31847:36;31688:203;;;;;;;;31505:175;;;;;;;;;;-1:-1:-1;31505:175:0;;;;;:::i;:::-;31641:31;31505:175;;;;;;;;48576:192;;;;;;;;;;-1:-1:-1;48576:192:0;;;;;:::i;:::-;;:::i;31008:269::-;31132:4;-1:-1:-1;;;;;;31156:60:0;;31171:45;31156:60;;:113;;-1:-1:-1;30646:36:0;-1:-1:-1;;;;;;30631:51:0;;;31233:36;31149:120;31008:269;-1:-1:-1;;31008:269:0:o;50024:490::-;45836:1;46432:7;;:19;;46424:63;;;;-1:-1:-1;;;46424:63:0;;26881:2:1;46424:63:0;;;26863:21:1;26920:2;26900:18;;;26893:30;26959:33;26939:18;;;26932:61;27010:18;;46424:63:0;26853:181:1;46424:63:0;45836:1;46565:7;:18;-1:-1:-1;;;;;50215:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;50235:19:0;::::1;50249:4;50235:19;;50215:39;50207:48;;;::::0;::::1;;50270:15:::0;50262:24:::1;;;::::0;::::1;;50294:13;50309:20:::0;50333:22:::1;50342:7;50351:3;;50333:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;50333:8:0::1;::::0;-1:-1:-1;;;50333:22:0:i:1;:::-;50293:62;;;;50362:24;50389:60;50408:5;50415:9;50426:12;50440:4;;50446:2;50389:18;:60::i;:::-;50362:87;;50461:47;50466:3;;:10;;50478:7;50501:1;50486:7;:14;:16;;;;:::i;:::-;50478:25;;;;;;-1:-1:-1::0;;;50478:25:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;50461:47:::1;::::0;;29039:25:1;;;29080:18;;;29073:34;-1:-1:-1;;;;;29143:55:1;;29123:18;;;29116:83;29027:2;29012:18;50461:47:0::1;;;;;;;-1:-1:-1::0;;45792:1:0;46744:22;;-1:-1:-1;;;;;;;;50024:490:0:o;54201:1150::-;45836:1;46432:7;;:19;;46424:63;;;;-1:-1:-1;;;46424:63:0;;26881:2:1;46424:63:0;;;26863:21:1;26920:2;26900:18;;;26893:30;26959:33;26939:18;;;26932:61;27010:18;;46424:63:0;26853:181:1;46424:63:0;45836:1;46565:7;:18;-1:-1:-1;;;;;54478:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;54498:19:0;::::1;54512:4;54498:19;;54478:39;54470:48;;;::::0;::::1;;54533:17:::0;54525:26:::1;;;::::0;::::1;;54558:13;::::0;54578:165:::1;54598:16:::0;;::::1;54578:165;;;54632:14;54649:7;;54657:1;54649:10;;;;;-1:-1:-1::0;;;54649:10:0::1;;;;;;;;;;;;;;;54632:27;;54687:1;54678:6;:10;54670:39;;;::::0;-1:-1:-1;;;54670:39:0;;26125:2:1;54670:39:0::1;::::0;::::1;26107:21:1::0;26164:2;26144:18;;;26137:30;26203:18;26183;;;26176:46;26239:18;;54670:39:0::1;26097:166:1::0;54670:39:0::1;54720:15;54729:6:::0;54720:15;::::1;:::i;:::-;;;54578:165;54616:3;;;;;:::i;:::-;;;;54578:165;;;-1:-1:-1::0;54779:26:0::1;::::0;-1:-1:-1;;;54779:26:0;;::::1;::::0;::::1;27954:25:1::0;;;54749:16:0::1;::::0;-1:-1:-1;;;;;54779:11:0::1;:17;::::0;::::1;::::0;27927:18:1;;54779:26:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54749:57:::0;-1:-1:-1;54813:18:0::1;54917:26;54925:11:::0;54917:5;:26:::1;:::i;:::-;54892:5;-1:-1:-1::0;;;;;54892:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;;:::i;:::-;54859:11;;:18;;54835:5;-1:-1:-1::0;;;;;54835:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;;:::i;:::-;54834:117;;;;:::i;:::-;54813:138:::0;-1:-1:-1;54958:87:0::1;-1:-1:-1::0;;;;;54984:4:0::1;54958:49;55008:10;55028:4;55035:9:::0;54958:49:::1;:87::i;:::-;55052:28;55083:43;55098:10;55110:9;55121:4;;55083:14;:43::i;:::-;55052:74;;55133:51;55143:7;55152:5;;55133:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55159:7;;55133:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55168:11;;55133:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;55181:2:0;;-1:-1:-1;55133:9:0::1;::::0;-1:-1:-1;;55133:51:0:i:1;:::-;;55198:31;55203:5;55210:11;55222:1;55210:14;;;;;;-1:-1:-1::0;;;55210:14:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;55198:31:::1;::::0;;29039:25:1;;;29080:18;;;29073:34;-1:-1:-1;;;;;29143:55:1;;29123:18;;;29116:83;29027:2;29012:18;55198:31:0::1;;;;;;;55281:29;::::0;-1:-1:-1;;;55281:29:0;;55304:4:::1;55281:29;::::0;::::1;17802:74:1::0;55261:17:0::1;::::0;55281:4:::1;-1:-1:-1::0;;;;;55281:14:0::1;::::0;::::1;::::0;17775:18:1;;55281:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55317:28;::::0;-1:-1:-1;;;55317:28:0;;-1:-1:-1;;;;;20046:55:1;;;55317:28:0::1;::::0;::::1;20028:74:1::0;20118:18;;;20111:34;;;55261:49:0;;-1:-1:-1;55317:4:0::1;:13:::0;;::::1;::::0;::::1;::::0;20001:18:1;;55317:28:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;45792:1:0;46744:22;;-1:-1:-1;;;;;;;;;;;;;;;54201:1150:0:o;56359:954::-;45836:1;46432:7;;:19;;46424:63;;;;-1:-1:-1;;;46424:63:0;;26881:2:1;46424:63:0;;;26863:21:1;26920:2;26900:18;;;26893:30;26959:33;26939:18;;;26932:61;27010:18;;46424:63:0;26853:181:1;46424:63:0;45836:1;46565:7;:18;-1:-1:-1;;;;;56581:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;56601:19:0;::::1;56615:4;56601:19;;56581:39;56573:48;;;::::0;::::1;;56636:11:::0;56628:20:::1;;;::::0;::::1;;56655:16;56688:23:::0;56713::::1;56743:11;-1:-1:-1::0;;;;;56743:21:0::1;;56765:7;56743:30;;;;;;;;;;;;;27954:25:1::0;;27942:2;27927:18;;27909:76;56743:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;56685:88:0;;-1:-1:-1;56685:88:0;-1:-1:-1;56864:27:0::1;::::0;-1:-1:-1;56873:11:0;;-1:-1:-1;56864:6:0;:27:::1;:::i;:::-;56845:47;::::0;:15;:47:::1;:::i;:::-;56794:36;56812:11:::0;56794:15;:36:::1;:::i;:::-;56793:106;;;;:::i;:::-;56782:117:::0;-1:-1:-1;56913:87:0::1;::::0;-1:-1:-1;;;;;;;56939:4:0::1;56913:49;56963:10;56983:4;56990:9:::0;56913:49:::1;:87::i;:::-;57007:24;57034:57;57065:8:::0;57050:11:::1;49333:4;57050:6:::0;:11:::1;:::i;:::-;57049:24;;;;:::i;:::-;57075:9;57086:4;;57034:14;:57::i;:::-;57007:84;;57098:41;57106:7;57115:6;57123:11;;57098:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;57136:2:0;;-1:-1:-1;57098:7:0::1;::::0;-1:-1:-1;;57098:41:0:i:1;:::-;57151:27;57155:6;57163:7;57171:1;57163:10;;;;;;-1:-1:-1::0;;;57163:10:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;57151:27:::1;::::0;;29039:25:1;;;29080:18;;;29073:34;-1:-1:-1;;;;;29143:55:1;;29123:18;;;29116:83;29027:2;29012:18;57151:27:0::1;;;;;;;57207:29;::::0;-1:-1:-1;;;57207:29:0;;57230:4:::1;57207:29;::::0;::::1;17802:74:1::0;57187:17:0::1;::::0;57207:4:::1;-1:-1:-1::0;;;;;57207:14:0::1;::::0;::::1;::::0;17775:18:1;;57207:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57187:49:::0;-1:-1:-1;57247:14:0;;57243:65:::1;;57272:28;::::0;-1:-1:-1;;;57272:28:0;;-1:-1:-1;;;;;20046:55:1;;;57272:28:0::1;::::0;::::1;20028:74:1::0;20118:18;;;20111:34;;;57272:4:0::1;:13;::::0;::::1;::::0;20001:18:1;;57272:28:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57243:65;-1:-1:-1::0;;45792:1:0;46744:22;;-1:-1:-1;;;;;;;;;56359:954:0:o;52964:1231::-;45836:1;46432:7;;:19;;46424:63;;;;-1:-1:-1;;;46424:63:0;;26881:2:1;46424:63:0;;;26863:21:1;26920:2;26900:18;;;26893:30;26959:33;26939:18;;;26932:61;27010:18;;46424:63:0;26853:181:1;46424:63:0;45836:1;46565:7;:18;-1:-1:-1;;;;;53212:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;53232:19:0;::::1;53246:4;53232:19;;53212:39;53204:48;;;::::0;::::1;;53276:5:::0;53303:11;53295:20:::1;;;::::0;::::1;;53322:4;-1:-1:-1::0;;;;;53322:12:0::1;;53342:9;53322:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;53361:13;53386:9:::0;53381:155:::1;53401:6;53397:1;:10;53381:155;;;53425:14;53442:7;;53450:1;53442:10;;;;;-1:-1:-1::0;;;53442:10:0::1;;;;;;;;;;;;;;;53425:27;;53480:1;53471:6;:10;53463:39;;;::::0;-1:-1:-1;;;53463:39:0;;26125:2:1;53463:39:0::1;::::0;::::1;26107:21:1::0;26164:2;26144:18;;;26137:30;26203:18;26183;;;26176:46;26239:18;;53463:39:0::1;26097:166:1::0;53463:39:0::1;53513:15;53522:6:::0;53513:15;::::1;:::i;:::-;;;53381:155;53409:3;;;;:::i;:::-;;;53381:155;;;-1:-1:-1::0;53572:26:0::1;::::0;-1:-1:-1;;;53572:26:0;;::::1;::::0;::::1;27954:25:1::0;;;53542:16:0::1;::::0;-1:-1:-1;;;;;53572:11:0::1;:17;::::0;::::1;::::0;27927:18:1;;53572:26:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53542:57:::0;-1:-1:-1;53606:18:0::1;53710:26;53718:11:::0;53710:5;:26:::1;:::i;:::-;53685:5;-1:-1:-1::0;;;;;53685:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;;:::i;:::-;53652:11;;:18;;53628:5;-1:-1:-1::0;;;;;53628:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;;:::i;:::-;53627:117;;;;:::i;:::-;53606:138;;53751:28;53782:43;53797:10;53809:9;53820:4;;53782:14;:43::i;:::-;53751:74;;53832:51;53842:7;53851:5;;53832:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53858:7;;53832:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53867:11;;53832:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;53880:2:0;;-1:-1:-1;53832:9:0::1;::::0;-1:-1:-1;;53832:51:0:i:1;:::-;;53897:31;53902:5;53909:11;53921:1;53909:14;;;;;;-1:-1:-1::0;;;53909:14:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;53897:31:::1;::::0;;29039:25:1;;;29080:18;;;29073:34;-1:-1:-1;;;;;29143:55:1;;29123:18;;;29116:83;29027:2;29012:18;53897:31:0::1;;;;;;;53980:29;::::0;-1:-1:-1;;;53980:29:0;;54003:4:::1;53980:29;::::0;::::1;17802:74:1::0;53960:17:0::1;::::0;53980:4:::1;-1:-1:-1::0;;;;;53980:14:0::1;::::0;::::1;::::0;17775:18:1;;53980:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54016:24;::::0;-1:-1:-1;;;54016:24:0;;::::1;::::0;::::1;27954:25:1::0;;;53960:49:0;;-1:-1:-1;54016:4:0::1;-1:-1:-1::0;;;;;54016:13:0::1;::::0;::::1;::::0;27927:18:1;;54016:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54048:12;54074:2;-1:-1:-1::0;;;;;54066:16:0::1;54090:9;54066:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54047:57;;;54119:7;54111:78;;;::::0;-1:-1:-1;;;54111:78:0;;24214:2:1;54111:78:0::1;::::0;::::1;24196:21:1::0;24253:2;24233:18;;;24226:30;24292:34;24272:18;;;24265:62;24363:28;24343:18;;;24336:56;24409:19;;54111:78:0::1;24186:248:1::0;51023:981:0;45836:1;46432:7;;:19;;46424:63;;;;-1:-1:-1;;;46424:63:0;;26881:2:1;46424:63:0;;;26863:21:1;26920:2;26900:18;;;26893:30;26959:33;26939:18;;;26932:61;27010:18;;46424:63:0;26853:181:1;46424:63:0;45836:1;46565:7;:18;-1:-1:-1;;;;;51236:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;51256:19:0;::::1;51270:4;51256:19;;51236:39;51228:48;;;::::0;::::1;;51291:17:::0;51283:26:::1;;;::::0;::::1;;51316:4;-1:-1:-1::0;;;;;51316:12:0::1;;51336:9;51316:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;51385:26:0::1;::::0;-1:-1:-1;;;51385:26:0;;::::1;::::0;::::1;27954:25:1::0;;;51355:16:0::1;::::0;-1:-1:-1;51385:11:0::1;-1:-1:-1::0;;;;;51385:17:0::1;::::0;-1:-1:-1;51385:17:0::1;::::0;-1:-1:-1;27927:18:1;;51385:26:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51355:57:::0;-1:-1:-1;51419:18:0::1;51523:33;51538:11:::0;51523:5;:33:::1;:::i;:::-;51498:5;-1:-1:-1::0;;;;;51498:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;;:::i;:::-;51465:11;;:18;;51441:5;-1:-1:-1::0;;;;;51441:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;;:::i;:::-;51440:124;;;;:::i;:::-;51419:145;;51571:24;51598:43;51613:10;51625:9;51636:4;;51598:14;:43::i;:::-;51571:70;;51648:41;51657:7;51666:5;;51648:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;51648:41:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;51673:11:0;;-1:-1:-1;51673:11:0;;;;51648:41;::::1;::::0;51673:11;;51648:41;51673:11;51648:41;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;51686:2:0;;-1:-1:-1;51648:8:0::1;::::0;-1:-1:-1;;51648:41:0:i:1;:::-;;51703:34;51708:5;;:12;;51722:7;51730:1;51722:10;;;;;;-1:-1:-1::0;;;51722:10:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;51703:34:::1;::::0;;29039:25:1;;;29080:18;;;29073:34;-1:-1:-1;;;;;29143:55:1;;29123:18;;;29116:83;29027:2;29012:18;51703:34:0::1;;;;;;;51789:29;::::0;-1:-1:-1;;;51789:29:0;;51812:4:::1;51789:29;::::0;::::1;17802:74:1::0;51769:17:0::1;::::0;51789:4:::1;-1:-1:-1::0;;;;;51789:14:0::1;::::0;::::1;::::0;17775:18:1;;51789:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51825:24;::::0;-1:-1:-1;;;51825:24:0;;::::1;::::0;::::1;27954:25:1::0;;;51769:49:0;;-1:-1:-1;51825:4:0::1;-1:-1:-1::0;;;;;51825:13:0::1;::::0;::::1;::::0;27927:18:1;;51825:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51857:12;51883:2;-1:-1:-1::0;;;;;51875:16:0::1;51899:9;51875:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51856:57;;;51928:7;51920:78;;;::::0;-1:-1:-1;;;51920:78:0;;24214:2:1;51920:78:0::1;::::0;::::1;24196:21:1::0;24253:2;24233:18;;;24226:30;24292:34;24272:18;;;24265:62;24363:28;24343:18;;;24336:56;24409:19;;51920:78:0::1;24186:248:1::0;51920:78:0::1;-1:-1:-1::0;;45792:1:0;46744:22;;-1:-1:-1;;;;;;;;;;;51023:981:0:o;52010:948::-;45836:1;46432:7;;:19;;46424:63;;;;-1:-1:-1;;;46424:63:0;;26881:2:1;46424:63:0;;;26863:21:1;26920:2;26900:18;;;26893:30;26959:33;26939:18;;;26932:61;27010:18;;46424:63:0;26853:181:1;46424:63:0;45836:1;46565:7;:18;-1:-1:-1;;;;;52244:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;52264:19:0;::::1;52278:4;52264:19;;52244:39;52236:48;;;::::0;::::1;;52299:17:::0;52291:26:::1;;;::::0;::::1;;52324:87;-1:-1:-1::0;;;;;52350:4:0::1;52324:49;52374:10;52394:4;52401:9:::0;52324:49:::1;:87::i;:::-;52448:26;::::0;-1:-1:-1;;;52448:26:0;;::::1;::::0;::::1;27954:25:1::0;;;52418:16:0::1;::::0;52448:11:::1;-1:-1:-1::0;;;;;52448:17:0::1;::::0;::::1;::::0;27927:18:1;;52448:26:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52418:57:::0;-1:-1:-1;52482:18:0::1;52586:33;52601:11:::0;52586:5;:33:::1;:::i;:::-;52561:5;-1:-1:-1::0;;;;;52561:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;;:::i;:::-;52528:11;;:18;;52504:5;-1:-1:-1::0;;;;;52504:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;;:::i;:::-;52503:124;;;;:::i;:::-;52482:145;;52634:24;52661:43;52676:10;52688:9;52699:4;;52661:14;:43::i;:::-;52634:70;;52711:41;52720:7;52729:5;;52711:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52736:11;;52711:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;52749:2:0;;-1:-1:-1;52711:8:0::1;::::0;-1:-1:-1;;52711:41:0:i:1;:::-;;52766:34;52771:5;;:12;;52785:7;52793:1;52785:10;;;;;;-1:-1:-1::0;;;52785:10:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;52766:34:::1;::::0;;29039:25:1;;;29080:18;;;29073:34;-1:-1:-1;;;;;29143:55:1;;29123:18;;;29116:83;29027:2;29012:18;52766:34:0::1;;;;;;;52852:29;::::0;-1:-1:-1;;;52852:29:0;;52875:4:::1;52852:29;::::0;::::1;17802:74:1::0;52832:17:0::1;::::0;52852:4:::1;-1:-1:-1::0;;;;;52852:14:0::1;::::0;::::1;::::0;17775:18:1;;52852:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52832:49:::0;-1:-1:-1;52892:14:0;;52888:65:::1;;52917:28;::::0;-1:-1:-1;;;52917:28:0;;-1:-1:-1;;;;;20046:55:1;;;52917:28:0::1;::::0;::::1;20028:74:1::0;20118:18;;;20111:34;;;52917:4:0::1;:13;::::0;::::1;::::0;20001:18:1;;52917:28:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;-1:-1:-1::0;;45792:1:0;46744:22;;-1:-1:-1;;;;;;;;;;;52010:948:0:o;48327:94::-;47909:10;47898:7;47724;47751:6;-1:-1:-1;;;;;47751:6:0;;47678:87;47898:7;-1:-1:-1;;;;;47898:21:0;;47890:66;;;;-1:-1:-1;;;47890:66:0;;25048:2:1;47890:66:0;;;25030:21:1;;;25067:18;;;25060:30;25126:34;25106:18;;;25099:62;25178:18;;47890:66:0;25020:182:1;47890:66:0;48392:21:::1;48410:1;48392:9;:21::i;:::-;48327:94::o:0;55357:996::-;45836:1;46432:7;;:19;;46424:63;;;;-1:-1:-1;;;46424:63:0;;26881:2:1;46424:63:0;;;26863:21:1;26920:2;26900:18;;;26893:30;26959:33;26939:18;;;26932:61;27010:18;;46424:63:0;26853:181:1;46424:63:0;45836:1;46565:7;:18;-1:-1:-1;;;;;55558:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;55578:19:0;::::1;55592:4;55578:19;;55558:39;55550:48;;;::::0;::::1;;55613:11:::0;55605:20:::1;;;::::0;::::1;;55632:4;-1:-1:-1::0;;;;;55632:12:0::1;;55652:9;55632:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;55729:30:0::1;::::0;;;;::::1;::::0;::::1;27954:25:1::0;;;55674:23:0::1;::::0;-1:-1:-1;55674:23:0;;-1:-1:-1;;;;;;55729:11:0::1;:21;::::0;-1:-1:-1;55729:21:0::1;::::0;27927:18:1;;55729:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;55671:88:0;;-1:-1:-1;55671:88:0;-1:-1:-1;55766:16:0::1;::::0;-1:-1:-1;55856:27:0::1;::::0;-1:-1:-1;55865:11:0;55856:6;:27:::1;:::i;:::-;55837:47;::::0;:15;:47:::1;:::i;:::-;55786:36;55804:11:::0;55786:15;:36:::1;:::i;:::-;55785:106;;;;:::i;:::-;55766:125:::0;-1:-1:-1;55898:24:0::1;55925:55;55766:125:::0;55941:11:::1;49333:4;55941:6:::0;:11:::1;:::i;:::-;55940:22;;;;:::i;:::-;55964:9;55975:4;;55925:14;:55::i;:::-;55898:82;;55987:41;55995:7;56004:6;56012:11;;55987:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;56025:2:0;;-1:-1:-1;55987:7:0::1;::::0;-1:-1:-1;;55987:41:0:i:1;:::-;56042:27;56046:6;56054:7;56062:1;56054:10;;;;;;-1:-1:-1::0;;;56054:10:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;56042:27:::1;::::0;;29039:25:1;;;29080:18;;;29073:34;-1:-1:-1;;;;;29143:55:1;;29123:18;;;29116:83;29027:2;29012:18;56042:27:0::1;;;;;;;56098:29;::::0;-1:-1:-1;;;56098:29:0;;56121:4:::1;56098:29;::::0;::::1;17802:74:1::0;56078:17:0::1;::::0;56098:4:::1;-1:-1:-1::0;;;;;56098:14:0::1;::::0;::::1;::::0;17775:18:1;;56098:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56078:49:::0;-1:-1:-1;56138:14:0;;56134:214:::1;;56163:24;::::0;-1:-1:-1;;;56163:24:0;;::::1;::::0;::::1;27954:25:1::0;;;56163:4:0::1;-1:-1:-1::0;;;;;56163:13:0::1;::::0;::::1;::::0;27927:18:1;;56163:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;56197:12;56223:2;-1:-1:-1::0;;;;;56215:16:0::1;56239:9;56215:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56196:57;;;56270:7;56262:78;;;::::0;-1:-1:-1;;;56262:78:0;;24214:2:1;56262:78:0::1;::::0;::::1;24196:21:1::0;24253:2;24233:18;;;24226:30;24292:34;24272:18;;;24265:62;24363:28;24343:18;;;24336:56;24409:19;;56262:78:0::1;24186:248:1::0;56262:78:0::1;56134:214;;-1:-1:-1::0;;45792:1:0;46744:22;;-1:-1:-1;;;;;;;;;;55357:996:0:o;66011:391::-;47909:10;47898:7;47724;47751:6;-1:-1:-1;;;;;47751:6:0;;47678:87;47898:7;-1:-1:-1;;;;;47898:21:0;;47890:66;;;;-1:-1:-1;;;47890:66:0;;25048:2:1;47890:66:0;;;25030:21:1;;;25067:18;;;25060:30;25126:34;25106:18;;;25099:62;25178:18;;47890:66:0;25020:182:1;47890:66:0;-1:-1:-1;;;;;66072:19:0;::::1;66068:329;;66121:58;::::0;66103:12:::1;::::0;66129:10:::1;::::0;66153:21:::1;::::0;66103:12;66121:58;66103:12;66121:58;66153:21;66129:10;66121:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66102:77;;;66196:7;66188:78;;;::::0;-1:-1:-1;;;66188:78:0;;24214:2:1;66188:78:0::1;::::0;::::1;24196:21:1::0;24253:2;24233:18;;;24226:30;24292:34;24272:18;;;24265:62;24363:28;24343:18;;;24336:56;24409:19;;66188:78:0::1;24186:248:1::0;66188:78:0::1;66068:329;66011:391:::0;:::o;66068:329::-:1;66339:49;::::0;-1:-1:-1;;;66339:49:0;;66382:4:::1;66339:49;::::0;::::1;17802:74:1::0;66289:100:0::1;::::0;66327:10:::1;::::0;-1:-1:-1;;;;;66339:34:0;::::1;::::0;::::1;::::0;17775:18:1;;66339:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;66289:37:0;::::1;::::0;:100;:37:::1;:100::i;:::-;66011:391:::0;:::o;50520:497::-;45836:1;46432:7;;:19;;46424:63;;;;-1:-1:-1;;;46424:63:0;;26881:2:1;46424:63:0;;;26863:21:1;26920:2;26900:18;;;26893:30;26959:33;26939:18;;;26932:61;27010:18;;46424:63:0;26853:181:1;46424:63:0;45836:1;46565:7;:18;-1:-1:-1;;;;;50716:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;50736:19:0;::::1;50750:4;50736:19;;50716:39;50708:48;;;::::0;::::1;;50771:15:::0;50763:24:::1;;;::::0;::::1;;50795:13;50810:20:::0;50834:22:::1;50843:7;50852:3;;50834:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;50834:8:0::1;::::0;-1:-1:-1;;;50834:22:0:i:1;:::-;50794:62;;;;50863:24;50890:62;50910:5;50917:10;50929:12;50943:4;;50949:2;50890:19;:62::i;58008:652::-:0;45836:1;46432:7;;:19;;46424:63;;;;-1:-1:-1;;;46424:63:0;;26881:2:1;46424:63:0;;;26863:21:1;26920:2;26900:18;;;26893:30;26959:33;26939:18;;;26932:61;27010:18;;46424:63:0;26853:181:1;46424:63:0;45836:1;46565:7;:18;-1:-1:-1;;;;;58238:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;58258:19:0;::::1;58272:4;58258:19;;58238:39;58230:48;;;::::0;::::1;;58293:15:::0;58285:24:::1;;;::::0;::::1;;58317:13;58332:25:::0;58361:32:::1;58371:7;58380:3;;58361:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;58361:32:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;58385:7:0;;-1:-1:-1;58385:7:0;;;;58361:32;::::1;::::0;58385:7;;58361:32;58385:7;58361:32;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;58361:9:0::1;::::0;-1:-1:-1;;;58361:32:0:i:1;:::-;58316:77;;;;58400:67;58420:5;58427:10;58439:17;58458:4;;58464:2;58400:19;:67::i;:::-;-1:-1:-1::0;58476:13:0::1;58513:3:::0;58476:13;58530:71:::1;58550:6;58546:1;:10;58530:71;;;58583:7;;58591:1;58583:10;;;;;-1:-1:-1::0;;;58583:10:0::1;;;;;;;;;;;;;;;58574:19;;;;;:::i;:::-;::::0;-1:-1:-1;58558:3:0::1;::::0;::::1;:::i;:::-;;;58530:71;;;-1:-1:-1::0;58612:42:0::1;58617:5:::0;58624:7;;58632:16:::1;58647:1;58624:7:::0;58632:16:::1;:::i;:::-;58624:25;;;;;-1:-1:-1::0;;;58624:25:0::1;;;;;;;;;58612:42;::::0;;29039:25:1;;;58624::0::1;::::0;;::::1;::::0;;;::::1;;29080:18:1::0;;;29073:34;-1:-1:-1;;;;;;29143:55:1;;29123:18;;;29116:83;29027:2;29012:18;58612:42:0::1;;;;;;;-1:-1:-1::0;;45792:1:0;46744:22;;-1:-1:-1;;;;;;;;;;;58008:652:0:o;57319:683::-;45836:1;46432:7;;:19;;46424:63;;;;-1:-1:-1;;;46424:63:0;;26881:2:1;46424:63:0;;;26863:21:1;26920:2;26900:18;;;26893:30;26959:33;26939:18;;;26932:61;27010:18;;46424:63:0;26853:181:1;46424:63:0;45836:1;46565:7;:18;-1:-1:-1;;;;;57545:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;57565:19:0;::::1;57579:4;57565:19;;57545:39;57537:48;;;::::0;::::1;;57600:15:::0;57592:24:::1;;;::::0;::::1;;57624:13;57639:25:::0;57668:32:::1;57678:7;57687:3;;57668:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;57668:32:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;57692:7:0;;-1:-1:-1;57692:7:0;;;;57668:32;::::1;::::0;57692:7;;57668:32;57692:7;57668:32;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;57668:9:0::1;::::0;-1:-1:-1;;;57668:32:0:i:1;:::-;57623:77;;;;57707:27;57737:66;57756:5;57763:10;57775:17;57794:4;;57800:2;57737:18;:66::i;:::-;57707:96:::0;-1:-1:-1;57812:13:0::1;57849:3:::0;57812:13;57866:71:::1;57886:6;57882:1;:10;57866:71;;;57919:7;;57927:1;57919:10;;;;;-1:-1:-1::0;;;57919:10:0::1;;;;;;;;;;;;;;;57910:19;;;;;:::i;:::-;::::0;-1:-1:-1;57894:3:0::1;::::0;::::1;:::i;:::-;;;57866:71;;;;57948:48;57953:5;57960:10;57989:1;57971:10;:17;:19;;;;:::i;:::-;57960:31;;;;;;-1:-1:-1::0;;;57960:31:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;57948:48:::1;::::0;;29039:25:1;;;29080:18;;;29073:34;-1:-1:-1;;;;;29143:55:1;;29123:18;;;29116:83;29027:2;29012:18;57948:48:0::1;;;;;;;-1:-1:-1::0;;45792:1:0;46744:22;;-1:-1:-1;;;;;;;;;;;;57319:683:0:o;48576:192::-;47909:10;47898:7;47724;47751:6;-1:-1:-1;;;;;47751:6:0;;47678:87;47898:7;-1:-1:-1;;;;;47898:21:0;;47890:66;;;;-1:-1:-1;;;47890:66:0;;25048:2:1;47890:66:0;;;25030:21:1;;;25067:18;;;25060:30;25126:34;25106:18;;;25099:62;25178:18;;47890:66:0;25020:182:1;47890:66:0;-1:-1:-1;;;;;48665:22:0;::::1;48657:73;;;::::0;-1:-1:-1;;;48657:73:0;;23470:2:1;48657:73:0::1;::::0;::::1;23452:21:1::0;23509:2;23489:18;;;23482:30;23548:34;23528:18;;;23521:62;23619:8;23599:18;;;23592:36;23645:19;;48657:73:0::1;23442:228:1::0;48657:73:0::1;48741:19;48751:8;48741:9;:19::i;41231:633::-:0;41612:10;;;41611:62;;-1:-1:-1;41628:39:0;;;;;41652:4;41628:39;;;18122:34:1;-1:-1:-1;;;;;18192:15:1;;;18172:18;;;18165:43;41628:15:0;;;;;18034:18:1;;41628:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;41611:62;41603:152;;;;-1:-1:-1;;;41603:152:0;;27241:2:1;41603:152:0;;;27223:21:1;27280:2;27260:18;;;27253:30;27319:34;27299:18;;;27292:62;27390:24;27370:18;;;27363:52;27432:19;;41603:152:0;27213:244:1;41603:152:0;41793:62;;-1:-1:-1;;;;;20046:55:1;;41793:62:0;;;20028:74:1;20118:18;;;20111:34;;;41766:90:0;;41786:5;;41816:22;;20001:18:1;;41793:62:0;;;;-1:-1:-1;;41793:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;41793:62:0;-1:-1:-1;;;;;;41793:62:0;;;;;;;;;;41766:19;:90::i;:::-;41231:633;;;:::o;35577:195::-;35680:12;35712:52;35734:6;35742:4;35748:1;35751:12;35712:21;:52::i;:::-;35705:59;;35577:195;;;;;;:::o;58666:690::-;58757:7;58766;58782:13;58798:11;-1:-1:-1;;;;;58798:17:0;;58816:7;58798:26;;;;;;;;;;;;;27954:25:1;;27942:2;27927:18;;27909:76;58798:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58782:42;;58882:20;58916:5;-1:-1:-1;;;;;58905:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58961:10;;58882:55;;-1:-1:-1;58944:14:0;58978:148;58998:6;58994:1;:10;58978:148;;;59020:47;59039:12;59053:3;59057:1;59053:6;;;;;;-1:-1:-1;;;59053:6:0;;;;;;;;;;;;;;;59061:5;59020:18;:47::i;:::-;59076:42;59090:12;59104:5;59111:3;59115:1;59111:6;;;;;;-1:-1:-1;;;59111:6:0;;;;;;;;;;;;;;;59076:13;:42::i;:::-;59006:3;;;:::i;:::-;;;58978:148;;;-1:-1:-1;59164:37:0;;-1:-1:-1;;;59164:37:0;;59132:25;;-1:-1:-1;;;;;59164:22:0;;;;;:37;;59187:3;;59132:25;;59164:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59208:13;59224:3;:10;59208:26;;59241:15;59296:5;-1:-1:-1;;;;;59285:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59277:35;;:5;:35;:::i;:::-;59260:12;49333:4;59260:5;:12;:::i;:::-;59259:54;;;;:::i;:::-;59335:5;;-1:-1:-1;59241:72:0;;-1:-1:-1;;;;;;58666:690:0;;;;;;:::o;62421:454::-;62591:16;62616:70;-1:-1:-1;;;;;62616:36:0;;62661:11;62675:10;62616:36;:70::i;:::-;62720:126;;;;;62693:24;;-1:-1:-1;;;;;62720:11:0;:33;;;;:126;;62762:10;;62781:9;;62799:4;;;;62813:2;;62824:15;;62720:126;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62720:126:0;;;;;;;;;;;;:::i;:::-;62693:153;62421:454;-1:-1:-1;;;;;;;;62421:454:0:o;40746:216::-;40885:68;;-1:-1:-1;;;;;19420:15:1;;;40885:68:0;;;19402:34:1;19472:15;;19452:18;;;19445:43;19504:18;;;19497:34;;;40858:96:0;;40878:5;;-1:-1:-1;;;40908:27:0;19314:18:1;;40885:68:0;19296:241:1;40858:96:0;40746:216;;;;:::o;61600:351::-;61729:16;61754:24;61781:11;-1:-1:-1;;;;;61781:36:0;;61826:11;61846:9;61864:4;;61886;61900:15;61781:141;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61781:141:0;;;;;;;;;;;;:::i;:::-;61754:168;61600:351;-1:-1:-1;;;;;;61600:351:0:o;59998:615::-;60202:26;;-1:-1:-1;;;60202:26:0;;;;;27954:25:1;;;60170:7:0;;;;-1:-1:-1;;;;;60202:11:0;:17;;;;27927:18:1;;60202:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60186:42;;60286:20;60320:5;-1:-1:-1;;;;;60309:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60348:102;;-1:-1:-1;;;60348:102:0;;60286:55;;-1:-1:-1;;;;;;60348:55:0;;;;;:102;;60404:10;;60424:4;;60431:5;;60438:7;;60348:102;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60457:64:0;;-1:-1:-1;;;60457:64:0;;-1:-1:-1;;;;;19728:55:1;;;60457:64:0;;;19710:74:1;60516:4:0;19800:18:1;;;19793:50;60457:51:0;;;-1:-1:-1;60457:51:0;;-1:-1:-1;19683:18:1;;60457:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60528:52:0;;-1:-1:-1;;;60528:52:0;;-1:-1:-1;;;;;60528:24:0;;;-1:-1:-1;60528:24:0;;-1:-1:-1;60528:52:0;;60553:5;;60560:7;;60569:6;;60577:2;;60528:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60528:52:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;60601:5:0;;59998:615;-1:-1:-1;;;;;;;59998:615:0:o;60619:240::-;60769:26;;-1:-1:-1;;;60769:26:0;;;;;27954:25:1;;;60753:13:0;;60769:11;-1:-1:-1;;;;;60769:17:0;;;;27927:18:1;;60769:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60802:51;;;;;60753:42;;-1:-1:-1;;;;;;60802:26:0;;;;;:51;;60829:6;;60837:11;;60850:2;;60802:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60802:51:0;;;;;;;;;;;;:::i;:::-;;60619:240;;;;;:::o;59362:630::-;59534:26;;-1:-1:-1;;;59534:26:0;;;;;27954:25:1;;;59502:7:0;;;;-1:-1:-1;;;;;59534:11:0;:17;;;;27927:18:1;;59534:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59518:42;;59618:20;59652:5;-1:-1:-1;;;;;59641:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59697:12;;59618:55;;-1:-1:-1;59680:14:0;59716:152;59736:6;59732:1;:10;59716:152;;;59758:49;59777:12;59791:5;59797:1;59791:8;;;;;;-1:-1:-1;;;59791:8:0;;;;;;;;59758:49;59816:44;59830:12;59844:5;59851;59857:1;59851:8;;;;;;-1:-1:-1;;;59851:8:0;;;;;;;;59816:44;59744:3;;;:::i;:::-;;;59716:152;;;-1:-1:-1;59906:53:0;;-1:-1:-1;;;59906:53:0;;59874:25;;-1:-1:-1;;;;;59906:24:0;;;;;:53;;59931:5;;59874:25;;59948:6;;59956:2;;59906:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59906:53:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;59980:5:0;;59362:630;-1:-1:-1;;;;;;;;59362:630:0:o;48776:173::-;48832:16;48851:6;;-1:-1:-1;;;;;48868:17:0;;;;;;;;;;48901:40;;48851:6;;;;;;;48901:40;;48832:16;48901:40;48776:173;;:::o;40550:188::-;40671:58;;-1:-1:-1;;;;;20046:55:1;;40671:58:0;;;20028:74:1;20118:18;;;20111:34;;;40644:86:0;;40664:5;;-1:-1:-1;;;40694:23:0;20001:18:1;;40671:58:0;19983:168:1;61955:460:0;62127:16;62152:70;-1:-1:-1;;;;;62152:36:0;;62197:11;62211:10;62152:36;:70::i;:::-;62256:130;;;;;62229:24;;-1:-1:-1;;;;;62256:11:0;:36;;;;:130;;62301:10;;62320;;62339:4;;;;62353:2;;62364:15;;62256:130;;;:::i;60865:729::-;60988:7;60997;61013:13;61029:11;-1:-1:-1;;;;;61029:17:0;;61047:7;61029:26;;;;;;;;;;;;;27954:25:1;;27942:2;27927:18;;27909:76;61029:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61013:42;-1:-1:-1;;;;;;61070:19:0;;61062:61;;;;-1:-1:-1;;;61062:61:0;;25409:2:1;61062:61:0;;;25391:21:1;25448:2;25428:18;;;25421:30;25487:31;25467:18;;;25460:59;25536:18;;61062:61:0;25381:179:1;61062:61:0;61181:20;61215:5;-1:-1:-1;;;;;61204:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61243:100;;-1:-1:-1;;;61243:100:0;;61181:55;;-1:-1:-1;;;;;;61243:55:0;;;;;:100;;61299:10;;61319:4;;61326:3;;61331:7;;61243:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61350:64:0;;-1:-1:-1;;;61350:64:0;;-1:-1:-1;;;;;19728:55:1;;;61350:64:0;;;19710:74:1;61409:4:0;19800:18:1;;;19793:50;61350:51:0;;;-1:-1:-1;61350:51:0;;-1:-1:-1;19683:18:1;;61350:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61439:36:0;;-1:-1:-1;;;61439:36:0;;61423:13;;-1:-1:-1;;;;;;61439:22:0;;;-1:-1:-1;61439:22:0;;:36;;61462:3;;61467:7;;61439:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61423:52;;61482:15;61546:5;61529;-1:-1:-1;;;;;61518:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;;;;:::i;:::-;61501:12;49333:4;61501:5;:12;:::i;:::-;61500:52;;;;:::i;:::-;61573:5;;;;-1:-1:-1;60865:729:0;;-1:-1:-1;;;;;;;60865:729:0:o;43039:772::-;43474:23;43500:69;43528:4;43500:69;;;;;;;;;;;;;;;;;43508:5;-1:-1:-1;;;;;43500:27:0;;;:69;;;;;:::i;:::-;43584:17;;43474:95;;-1:-1:-1;43584:21:0;43580:224;;43726:10;43715:30;;;;;;;;;;;;:::i;:::-;43707:85;;;;-1:-1:-1;;;43707:85:0;;26470:2:1;43707:85:0;;;26452:21:1;26509:2;26489:18;;;26482:30;26548:34;26528:18;;;26521:62;26619:12;26599:18;;;26592:40;26649:19;;43707:85:0;26442:232:1;36629:530:0;36756:12;36814:5;36789:21;:30;;36781:81;;;;-1:-1:-1;;;36781:81:0;;24641:2:1;36781:81:0;;;24623:21:1;24680:2;24660:18;;;24653:30;24719:34;24699:18;;;24692:62;24790:8;24770:18;;;24763:36;24816:19;;36781:81:0;24613:228:1;36781:81:0;33026:20;;36873:60;;;;-1:-1:-1;;;36873:60:0;;25767:2:1;36873:60:0;;;25749:21:1;25806:2;25786:18;;;25779:30;25845:31;25825:18;;;25818:59;25894:18;;36873:60:0;25739:179:1;36873:60:0;37007:12;37021:23;37048:6;-1:-1:-1;;;;;37048:11:0;37068:5;37076:4;37048:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37006:75;;;;37099:52;37117:7;37126:10;37138:12;37099:17;:52::i;:::-;37092:59;36629:530;-1:-1:-1;;;;;;;36629:530:0:o;62881:1303::-;62999:42;63064;63113:17;-1:-1:-1;;;;;63141:20:0;;;;63137:921;;;63208:89;;63273:10;63208:89;;;19402:34:1;-1:-1:-1;;;;;19472:15:1;;19452:18;;;19445:43;19504:18;;;19497:34;;;19314:18;;63208:89:0;;;-1:-1:-1;;63208:89:0;;;;;;;;;;;;;;-1:-1:-1;;;;;63208:89:0;-1:-1:-1;;;63208:89:0;;;;-1:-1:-1;63137:921:0;;;63328:5;-1:-1:-1;;;;;63315:18:0;:9;-1:-1:-1;;;;;63315:18:0;;63311:747;;;63430:31;63519:7;63464:63;;;;;;27954:25:1;;27942:2;27927:18;;27909:76;63464:63:0;;;;-1:-1:-1;;63464:63:0;;;;;;;;;;;;;;-1:-1:-1;;;;;63464:63:0;;;;;63581:49;63464:63;;-1:-1:-1;;;;;;;;;;63581:29:0;;;:49;;63464:63;;63581:49;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63538:92;;;;63642:16;63673:6;63662:29;;;;;;;;;;;;:::i;:::-;63641:50;;63710:12;:38;;;;-1:-1:-1;;;;;;63726:22:0;;63738:10;63726:22;63710:38;63702:68;;;;-1:-1:-1;;;63702:68:0;;27664:2:1;63702:68:0;;;27646:21:1;27703:2;27683:18;;;27676:30;27742:19;27722:18;;;27715:47;27779:18;;63702:68:0;27636:167:1;63702:68:0;63788:52;;;;;27954:25:1;;;27927:18;;63788:52:0;;;-1:-1:-1;;63788:52:0;;;;;;;;;;;;;;-1:-1:-1;;;;;63788:52:0;;;;;;-1:-1:-1;63311:747:0;;-1:-1:-1;;;;63311:747:0;;63957:93;;64026:10;63957:93;;;19402:34:1;-1:-1:-1;;;;;19472:15:1;;19452:18;;;19445:43;19504:18;;;19497:34;;;19314:18;;63957:93:0;;;-1:-1:-1;;63957:93:0;;;;;;;;;;;;;;-1:-1:-1;;;;;63957:93:0;;;;;;-1:-1:-1;63311:747:0;64065:12;64079:23;64114:9;-1:-1:-1;;;;;64106:23:0;64130:4;64106:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64064:71;;;;64150:7;64166:10;64142:36;;;;;-1:-1:-1;;;64142:36:0;;;;;;;;:::i;:::-;;62881:1303;;;;;;;;:::o;64190:852::-;64303:42;64368;64417:17;-1:-1:-1;;;;;64445:20:0;;;;64441:475;;;64647:7;;;64190:852;;;:::o;64441:475::-;64684:5;-1:-1:-1;;;;;64671:18:0;:9;-1:-1:-1;;;;;64671:18:0;;64667:249;;;64734:93;;;;;28655:25:1;;;64821:1:0;28696:18:1;;;28689:45;-1:-1:-1;;;;;28770:55:1;;28750:18;;;28743:83;28628:18;;64734:93:0;;;-1:-1:-1;;64734:93:0;;;;;;;;;;;;;;-1:-1:-1;;;;;64734:93:0;;;;;;-1:-1:-1;64667:249:0;;39169:742;39284:12;39313:7;39309:595;;;-1:-1:-1;39344:10:0;39337:17;;39309:595;39458:17;;:21;39454:439;;39721:10;39715:17;39782:15;39769:10;39765:2;39761:19;39754:44;39669:148;39864:12;39857:20;;-1:-1:-1;;;39857:20:0;;;;;;;;:::i;14:134:1:-;82:20;;111:31;82:20;111:31;:::i;:::-;63:85;;;:::o;153:395::-;216:8;226:6;280:3;273:4;265:6;261:17;257:27;247:2;;305:8;295;288:26;247:2;-1:-1:-1;335:20:1;;378:18;367:30;;364:2;;;417:8;407;400:26;364:2;461:4;453:6;449:17;437:29;;521:3;514:4;504:6;501:1;497:14;489:6;485:27;481:38;478:47;475:2;;;538:1;535;528:12;553:693;607:5;660:3;653:4;645:6;641:17;637:27;627:2;;682:5;675;668:20;627:2;722:6;709:20;748:4;772:60;788:43;828:2;788:43;:::i;:::-;772:60;:::i;:::-;854:3;878:2;873:3;866:15;906:2;901:3;897:12;890:19;;941:2;933:6;929:15;993:3;988:2;982;979:1;975:10;967:6;963:23;959:32;956:41;953:2;;;1014:5;1007;1000:20;953:2;1040:5;1054:163;1068:2;1065:1;1062:9;1054:163;;;1125:17;;1113:30;;1163:12;;;;1195;;;;1086:1;1079:9;1054:163;;1251:550;1293:5;1346:3;1339:4;1331:6;1327:17;1323:27;1313:2;;1368:5;1361;1354:20;1313:2;1408:6;1395:20;1434:18;1430:2;1427:26;1424:2;;;1456:18;;:::i;:::-;1500:55;1543:2;1524:13;;-1:-1:-1;;1520:27:1;1549:4;1516:38;1500:55;:::i;:::-;1580:2;1571:7;1564:19;1626:3;1619:4;1614:2;1606:6;1602:15;1598:26;1595:35;1592:2;;;1647:5;1640;1633:20;1592:2;1716;1709:4;1701:6;1697:17;1690:4;1681:7;1677:18;1664:55;1739:16;;;1757:4;1735:27;1728:42;;;;1743:7;1303:498;-1:-1:-1;;1303:498:1:o;1806:257::-;1865:6;1918:2;1906:9;1897:7;1893:23;1889:32;1886:2;;;1939:6;1931;1924:22;1886:2;1983:9;1970:23;2002:31;2027:5;2002:31;:::i;2068:261::-;2138:6;2191:2;2179:9;2170:7;2166:23;2162:32;2159:2;;;2212:6;2204;2197:22;2159:2;2249:9;2243:16;2268:31;2293:5;2268:31;:::i;2608:1111::-;2762:6;2770;2778;2786;2794;2847:3;2835:9;2826:7;2822:23;2818:33;2815:2;;;2869:6;2861;2854:22;2815:2;2913:9;2900:23;2932:31;2957:5;2932:31;:::i;:::-;2982:5;-1:-1:-1;3039:2:1;3024:18;;3011:32;3052:33;3011:32;3052:33;:::i;:::-;3104:7;-1:-1:-1;3162:2:1;3147:18;;3134:32;3185:18;3215:14;;;3212:2;;;3247:6;3239;3232:22;3212:2;3275:61;3328:7;3319:6;3308:9;3304:22;3275:61;:::i;:::-;3265:71;;3389:2;3378:9;3374:18;3361:32;3345:48;;3418:2;3408:8;3405:16;3402:2;;;3439:6;3431;3424:22;3402:2;3467:63;3522:7;3511:8;3500:9;3496:24;3467:63;:::i;:::-;3457:73;;3583:3;3572:9;3568:19;3555:33;3539:49;;3613:2;3603:8;3600:16;3597:2;;;3634:6;3626;3619:22;3597:2;;3662:51;3705:7;3694:8;3683:9;3679:24;3662:51;:::i;:::-;3652:61;;;2805:914;;;;;;;;:::o;3724:685::-;3819:6;3827;3835;3843;3896:3;3884:9;3875:7;3871:23;3867:33;3864:2;;;3918:6;3910;3903:22;3864:2;3962:9;3949:23;3981:31;4006:5;3981:31;:::i;:::-;4031:5;-1:-1:-1;4088:2:1;4073:18;;4060:32;4101:33;4060:32;4101:33;:::i;:::-;4153:7;-1:-1:-1;4207:2:1;4192:18;;4179:32;;-1:-1:-1;4262:2:1;4247:18;;4234:32;4289:18;4278:30;;4275:2;;;4326:6;4318;4311:22;4275:2;4354:49;4395:7;4386:6;4375:9;4371:22;4354:49;:::i;:::-;4344:59;;;3854:555;;;;;;;:::o;4414:754::-;4518:6;4526;4534;4542;4550;4603:3;4591:9;4582:7;4578:23;4574:33;4571:2;;;4625:6;4617;4610:22;4571:2;4669:9;4656:23;4688:31;4713:5;4688:31;:::i;:::-;4738:5;-1:-1:-1;4795:2:1;4780:18;;4767:32;4808:33;4767:32;4808:33;:::i;:::-;4860:7;-1:-1:-1;4914:2:1;4899:18;;4886:32;;-1:-1:-1;4965:2:1;4950:18;;4937:32;;-1:-1:-1;5020:3:1;5005:19;;4992:33;5048:18;5037:30;;5034:2;;;5085:6;5077;5070:22;5034:2;5113:49;5154:7;5145:6;5134:9;5130:22;5113:49;:::i;5173:937::-;5268:6;5299:2;5342;5330:9;5321:7;5317:23;5313:32;5310:2;;;5363:6;5355;5348:22;5310:2;5401:9;5395:16;5434:18;5426:6;5423:30;5420:2;;;5471:6;5463;5456:22;5420:2;5499:22;;5552:4;5544:13;;5540:27;-1:-1:-1;5530:2:1;;5586:6;5578;5571:22;5530:2;5620;5614:9;5643:60;5659:43;5699:2;5659:43;:::i;5643:60::-;5725:3;5749:2;5744:3;5737:15;5777:2;5772:3;5768:12;5761:19;;5808:2;5804;5800:11;5856:7;5851:2;5845;5842:1;5838:10;5834:2;5830:19;5826:28;5823:41;5820:2;;;5882:6;5874;5867:22;5820:2;5909:6;5900:15;;5924:156;5938:2;5935:1;5932:9;5924:156;;;5995:10;;5983:23;;5956:1;5949:9;;;;;6026:12;;;;6058;;5924:156;;;-1:-1:-1;6099:5:1;5279:831;-1:-1:-1;;;;;;;5279:831:1:o;6115:297::-;6182:6;6235:2;6223:9;6214:7;6210:23;6206:32;6203:2;;;6256:6;6248;6241:22;6203:2;6293:9;6287:16;6346:5;6339:13;6332:21;6325:5;6322:32;6312:2;;6373:6;6365;6358:22;6417:352;6475:6;6528:2;6516:9;6507:7;6503:23;6499:32;6496:2;;;6549:6;6541;6534:22;6496:2;6593:9;6580:23;-1:-1:-1;;;;;;6636:5:1;6632:78;6625:5;6622:89;6612:2;;6730:6;6722;6715:22;6774:194;6844:6;6897:2;6885:9;6876:7;6872:23;6868:32;6865:2;;;6918:6;6910;6903:22;6865:2;-1:-1:-1;6946:16:1;;6855:113;-1:-1:-1;6855:113:1:o;6973:1333::-;7149:6;7157;7165;7173;7181;7189;7197;7205;7258:3;7246:9;7237:7;7233:23;7229:33;7226:2;;;7280:6;7272;7265:22;7226:2;7321:9;7308:23;7298:33;;7382:2;7371:9;7367:18;7354:32;7405:18;7446:2;7438:6;7435:14;7432:2;;;7467:6;7459;7452:22;7432:2;7511:70;7573:7;7564:6;7553:9;7549:22;7511:70;:::i;:::-;7600:8;;-1:-1:-1;7485:96:1;-1:-1:-1;7688:2:1;7673:18;;7660:32;;-1:-1:-1;7704:16:1;;;7701:2;;;7738:6;7730;7723:22;7701:2;7782:72;7846:7;7835:8;7824:9;7820:24;7782:72;:::i;:::-;7873:8;;-1:-1:-1;7756:98:1;-1:-1:-1;7961:2:1;7946:18;;7933:32;;-1:-1:-1;7977:16:1;;;7974:2;;;8011:6;8003;7996:22;7974:2;;8055:72;8119:7;8108:8;8097:9;8093:24;8055:72;:::i;:::-;8146:8;;-1:-1:-1;8029:98:1;-1:-1:-1;;8231:3:1;8216:19;;8203:33;8245:31;8203:33;8245:31;:::i;:::-;8295:5;8285:15;;;7216:1090;;;;;;;;;;;:::o;8311:1598::-;8523:6;8531;8539;8547;8555;8563;8571;8579;8587;8595;8648:3;8636:9;8627:7;8623:23;8619:33;8616:2;;;8670:6;8662;8655:22;8616:2;8711:9;8698:23;8688:33;;8772:2;8761:9;8757:18;8744:32;8795:18;8836:2;8828:6;8825:14;8822:2;;;8857:6;8849;8842:22;8822:2;8901:70;8963:7;8954:6;8943:9;8939:22;8901:70;:::i;:::-;8990:8;;-1:-1:-1;8875:96:1;-1:-1:-1;9078:2:1;9063:18;;9050:32;;-1:-1:-1;9094:16:1;;;9091:2;;;9128:6;9120;9113:22;9091:2;9172:72;9236:7;9225:8;9214:9;9210:24;9172:72;:::i;:::-;9263:8;;-1:-1:-1;9146:98:1;-1:-1:-1;9351:2:1;9336:18;;9323:32;;-1:-1:-1;9367:16:1;;;9364:2;;;9401:6;9393;9386:22;9364:2;9445:72;9509:7;9498:8;9487:9;9483:24;9445:72;:::i;:::-;9536:8;;-1:-1:-1;9419:98:1;-1:-1:-1;9624:3:1;9609:19;;9596:33;;-1:-1:-1;9641:16:1;;;9638:2;;;9675:6;9667;9660:22;9638:2;;9719:72;9783:7;9772:8;9761:9;9757:24;9719:72;:::i;:::-;9810:8;;-1:-1:-1;9693:98:1;-1:-1:-1;9864:39:1;;-1:-1:-1;9898:3:1;9883:19;;9864:39;:::i;:::-;9854:49;;8606:1303;;;;;;;;;;;;;:::o;9914:1642::-;10135:6;10143;10151;10159;10167;10175;10183;10191;10199;10207;10215:7;10269:3;10257:9;10248:7;10244:23;10240:33;10237:2;;;10291:6;10283;10276:22;10237:2;10332:9;10319:23;10309:33;;10361:18;10428:2;10422;10411:9;10407:18;10394:32;10391:40;10388:2;;;10449:6;10441;10434:22;10388:2;10493:96;10581:7;10574:2;10563:9;10559:18;10546:32;10535:9;10531:48;10493:96;:::i;:::-;10608:8;;-1:-1:-1;10635:8:1;-1:-1:-1;10686:2:1;10671:18;;10658:32;10655:40;-1:-1:-1;10652:2:1;;;10713:6;10705;10698:22;10652:2;10757:96;10845:7;10838:2;10827:9;10823:18;10810:32;10799:9;10795:48;10757:96;:::i;:::-;10872:8;;-1:-1:-1;10899:8:1;-1:-1:-1;10950:2:1;10935:18;;10922:32;10919:40;-1:-1:-1;10916:2:1;;;10977:6;10969;10962:22;10916:2;11021:96;11109:7;11102:2;11091:9;11087:18;11074:32;11063:9;11059:48;11021:96;:::i;:::-;11136:8;;-1:-1:-1;11163:8:1;-1:-1:-1;11218:3:1;11203:19;;11190:33;;-1:-1:-1;11266:3:1;11251:19;;11238:33;11235:41;-1:-1:-1;11232:2:1;;;11295:7;11286;11279:24;11232:2;;11340:97;11429:7;11421:3;11410:9;11406:19;11393:33;11382:9;11378:49;11340:97;:::i;:::-;11456:8;;-1:-1:-1;11483:8:1;-1:-1:-1;11511:39:1;11545:3;11530:19;;11511:39;:::i;:::-;11500:50;;10227:1329;;;;;;;;;;;;;;:::o;11561:1402::-;11746:6;11754;11762;11770;11778;11786;11794;11802;11810;11863:3;11851:9;11842:7;11838:23;11834:33;11831:2;;;11885:6;11877;11870:22;11831:2;11926:9;11913:23;11903:33;;11987:2;11976:9;11972:18;11959:32;12010:18;12051:2;12043:6;12040:14;12037:2;;;12072:6;12064;12057:22;12037:2;12116:70;12178:7;12169:6;12158:9;12154:22;12116:70;:::i;:::-;12205:8;;-1:-1:-1;12090:96:1;-1:-1:-1;12293:2:1;12278:18;;12265:32;;-1:-1:-1;12309:16:1;;;12306:2;;;12343:6;12335;12328:22;12306:2;12387:72;12451:7;12440:8;12429:9;12425:24;12387:72;:::i;:::-;12478:8;;-1:-1:-1;12361:98:1;-1:-1:-1;12560:2:1;12545:18;;12532:32;;-1:-1:-1;12617:3:1;12602:19;;12589:33;;-1:-1:-1;12634:16:1;;;12631:2;;;12668:6;12660;12653:22;12631:2;;12712:72;12776:7;12765:8;12754:9;12750:24;12712:72;:::i;:::-;12803:8;;-1:-1:-1;12686:98:1;-1:-1:-1;;12888:3:1;12873:19;;12860:33;12902:31;12860:33;12902:31;:::i;:::-;12952:5;12942:15;;;11821:1142;;;;;;;;;;;:::o;12968:1076::-;13117:6;13125;13133;13141;13149;13157;13165;13218:3;13206:9;13197:7;13193:23;13189:33;13186:2;;;13240:6;13232;13225:22;13186:2;13281:9;13268:23;13258:33;;13342:2;13331:9;13327:18;13314:32;13365:18;13406:2;13398:6;13395:14;13392:2;;;13427:6;13419;13412:22;13392:2;13471:70;13533:7;13524:6;13513:9;13509:22;13471:70;:::i;:::-;13560:8;;-1:-1:-1;13445:96:1;-1:-1:-1;13642:2:1;13627:18;;13614:32;;-1:-1:-1;13699:2:1;13684:18;;13671:32;;-1:-1:-1;13715:16:1;;;13712:2;;;13749:6;13741;13734:22;13712:2;;13793:72;13857:7;13846:8;13835:9;13831:24;13793:72;:::i;:::-;13884:8;;-1:-1:-1;13767:98:1;-1:-1:-1;;13969:3:1;13954:19;;13941:33;13983:31;13941:33;13983:31;:::i;:::-;14033:5;14023:15;;;13176:868;;;;;;;;;;:::o;14049:1076::-;14198:6;14206;14214;14222;14230;14238;14246;14299:3;14287:9;14278:7;14274:23;14270:33;14267:2;;;14321:6;14313;14306:22;14267:2;14362:9;14349:23;14339:33;;14419:2;14408:9;14404:18;14391:32;14381:42;;14474:2;14463:9;14459:18;14446:32;14497:18;14538:2;14530:6;14527:14;14524:2;;;14559:6;14551;14544:22;14524:2;14603:70;14665:7;14656:6;14645:9;14641:22;14603:70;:::i;:::-;14692:8;;-1:-1:-1;14577:96:1;-1:-1:-1;14780:2:1;14765:18;;14752:32;;-1:-1:-1;14796:16:1;;;14793:2;;;14830:6;14822;14815:22;15130:1145;15288:6;15296;15304;15312;15320;15328;15336;15344;15397:3;15385:9;15376:7;15372:23;15368:33;15365:2;;;15419:6;15411;15404:22;15365:2;15460:9;15447:23;15437:33;;15517:2;15506:9;15502:18;15489:32;15479:42;;15572:2;15561:9;15557:18;15544:32;15595:18;15636:2;15628:6;15625:14;15622:2;;;15657:6;15649;15642:22;15622:2;15701:70;15763:7;15754:6;15743:9;15739:22;15701:70;:::i;:::-;15790:8;;-1:-1:-1;15675:96:1;-1:-1:-1;15872:2:1;15857:18;;15844:32;;-1:-1:-1;15929:3:1;15914:19;;15901:33;;-1:-1:-1;15946:16:1;;;15943:2;;;15980:6;15972;15965:22;15943:2;;16024:72;16088:7;16077:8;16066:9;16062:24;16024:72;:::i;:::-;16115:8;;-1:-1:-1;15998:98:1;-1:-1:-1;;16200:3:1;16185:19;;16172:33;16214:31;16172:33;16214:31;:::i;16280:440::-;16386:6;16394;16402;16410;16418;16471:3;16459:9;16450:7;16446:23;16442:33;16439:2;;;16493:6;16485;16478:22;16439:2;-1:-1:-1;;16521:16:1;;16577:2;16562:18;;16556:25;16621:2;16606:18;;16600:25;16665:2;16650:18;;16644:25;16709:3;16694:19;;;16688:26;16521:16;;16556:25;;-1:-1:-1;16600:25:1;16644;-1:-1:-1;16688:26:1;;-1:-1:-1;16429:291:1;-1:-1:-1;16429:291:1:o;16725:437::-;16778:3;16816:5;16810:12;16843:6;16838:3;16831:19;16869:4;16898:2;16893:3;16889:12;16882:19;;16935:2;16928:5;16924:14;16956:3;16968:169;16982:6;16979:1;16976:13;16968:169;;;17043:13;;17031:26;;17077:12;;;;17112:15;;;;17004:1;16997:9;16968:169;;;-1:-1:-1;17153:3:1;;16786:376;-1:-1:-1;;;;;16786:376:1:o;17167:274::-;17296:3;17334:6;17328:13;17350:53;17396:6;17391:3;17384:4;17376:6;17372:17;17350:53;:::i;:::-;17419:16;;;;;17304:137;-1:-1:-1;;17304:137:1:o;18219:915::-;18595:4;-1:-1:-1;;;;;18705:2:1;18697:6;18693:15;18682:9;18675:34;18757:2;18749:6;18745:15;18740:2;18729:9;18725:18;18718:43;;18797:3;18792:2;18781:9;18777:18;18770:31;18824:57;18876:3;18865:9;18861:19;18853:6;18824:57;:::i;:::-;18929:9;18921:6;18917:22;18912:2;18901:9;18897:18;18890:50;18963:44;19000:6;18992;18963:44;:::i;:::-;19044:22;;;19038:3;19023:19;;;19016:51;;;;-1:-1:-1;19076:20:1;;19125:2;19113:15;;18604:530;-1:-1:-1;;;;18604:530:1:o;20156:465::-;20413:2;20402:9;20395:21;20376:4;20439:56;20491:2;20480:9;20476:18;20468:6;20439:56;:::i;:::-;20543:9;20535:6;20531:22;20526:2;20515:9;20511:18;20504:50;20571:44;20608:6;20600;20571:44;:::i;:::-;20563:52;20385:236;-1:-1:-1;;;;;20385:236:1:o;20626:791::-;20989:3;20978:9;20971:22;20952:4;21016:57;21068:3;21057:9;21053:19;21045:6;21016:57;:::i;:::-;21121:9;21113:6;21109:22;21104:2;21093:9;21089:18;21082:50;21155:44;21192:6;21184;21155:44;:::i;:::-;21141:58;;21247:9;21239:6;21235:22;21230:2;21219:9;21215:18;21208:50;21275:44;21312:6;21304;21275:44;:::i;:::-;21267:52;;;-1:-1:-1;;;;;21359:6:1;21355:55;21350:2;21339:9;21335:18;21328:83;20961:456;;;;;;;:::o;22880:383::-;23029:2;23018:9;23011:21;22992:4;23061:6;23055:13;23104:6;23099:2;23088:9;23084:18;23077:34;23120:66;23179:6;23174:2;23163:9;23159:18;23154:2;23146:6;23142:15;23120:66;:::i;:::-;23247:2;23226:15;-1:-1:-1;;23222:29:1;23207:45;;;;23254:2;23203:54;;23001:262;-1:-1:-1;;23001:262:1:o;27990:452::-;28225:6;28214:9;28207:25;28268:2;28263;28252:9;28248:18;28241:30;28188:4;28288:56;28340:2;28329:9;28325:18;28317:6;28288:56;:::i;:::-;28280:64;;-1:-1:-1;;;;;28384:6:1;28380:55;28375:2;28364:9;28360:18;28353:83;28197:245;;;;;;:::o;29210:1068::-;29535:25;;;29579:2;29597:18;;;29590:34;;;29522:3;29655:2;29640:18;;29633:31;;;29507:19;;29699:22;;;29474:4;;29779:6;;29752:3;29737:19;;29474:4;29816:300;29830:6;29827:1;29824:13;29816:300;;;29905:6;29892:20;29925:31;29950:5;29925:31;:::i;:::-;-1:-1:-1;;;;;29981:54:1;29969:67;;30091:15;;;;30056:12;;;;29852:1;29845:9;29816:300;;;-1:-1:-1;;;;;;30172:55:1;;;;30167:2;30152:18;;30145:83;-1:-1:-1;;;30259:3:1;30244:19;30237:35;30133:3;29483:795;-1:-1:-1;;;;29483:795:1:o;30283:275::-;30354:2;30348:9;30419:2;30400:13;;-1:-1:-1;;30396:27:1;30384:40;;30454:18;30439:34;;30475:22;;;30436:62;30433:2;;;30501:18;;:::i;:::-;30537:2;30530:22;30328:230;;-1:-1:-1;30328:230:1:o;30563:183::-;30623:4;30656:18;30648:6;30645:30;30642:2;;;30678:18;;:::i;:::-;-1:-1:-1;30723:1:1;30719:14;30735:4;30715:25;;30632:114::o;30751:128::-;30791:3;30822:1;30818:6;30815:1;30812:13;30809:2;;;30828:18;;:::i;:::-;-1:-1:-1;30864:9:1;;30799:80::o;30884:168::-;30924:7;30990:1;30986;30982:6;30978:14;30975:1;30972:21;30967:1;30960:9;30953:17;30949:45;30946:2;;;30997:18;;:::i;:::-;-1:-1:-1;31037:9:1;;30936:116::o;31057:125::-;31097:4;31125:1;31122;31119:8;31116:2;;;31130:18;;:::i;:::-;-1:-1:-1;31167:9:1;;31106:76::o;31187:258::-;31259:1;31269:113;31283:6;31280:1;31277:13;31269:113;;;31359:11;;;31353:18;31340:11;;;31333:39;31305:2;31298:10;31269:113;;;31400:6;31397:1;31394:13;31391:2;;;-1:-1:-1;;31435:1:1;31417:16;;31410:27;31240:205::o;31450:135::-;31489:3;-1:-1:-1;;31510:17:1;;31507:2;;;31530:18;;:::i;:::-;-1:-1:-1;31577:1:1;31566:13;;31497:88::o;31590:184::-;-1:-1:-1;;;31639:1:1;31632:88;31739:4;31736:1;31729:15;31763:4;31760:1;31753:15;31779:184;-1:-1:-1;;;31828:1:1;31821:88;31928:4;31925:1;31918:15;31952:4;31949:1;31942:15;31968:154;-1:-1:-1;;;;;32047:5:1;32043:54;32036:5;32033:65;32023:2;;32112:1;32109;32102:12
Swarm Source
ipfs://c014f43baa5d7fbb85db9f4e5587bbb8c3d457a56e7a6c72b775dff3912ec9a7
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.