Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
NFTXVaultUpgradeable
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-14 */ /** *Submitted for verification at Etherscan.io on 2022-06-08 */ // 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/INFTXEligibilityManager.sol pragma solidity ^0.8.0; interface INFTXEligibilityManager { function nftxVaultFactory() external returns (address); function eligibilityImpl() external returns (address); function deployEligibility(uint256 vaultId, bytes calldata initData) external returns (address); } // 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/IERC3156Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC3156 FlashBorrower, as defined in * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156]. */ interface IERC3156FlashBorrowerUpgradeable { /** * @dev Receive a flash loan. * @param initiator The initiator of the loan. * @param token The loan currency. * @param amount The amount of tokens lent. * @param fee The additional amount of tokens to repay. * @param data Arbitrary data structure, intended to contain user-defined parameters. * @return The keccak256 hash of "ERC3156FlashBorrower.onFlashLoan" */ function onFlashLoan( address initiator, address token, uint256 amount, uint256 fee, bytes calldata data ) external returns (bytes32); } /** * @dev Interface of the ERC3156 FlashLender, as defined in * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156]. */ interface IERC3156FlashLenderUpgradeable { /** * @dev The amount of currency available to be lended. * @param token The loan currency. * @return The amount of `token` that can be borrowed. */ function maxFlashLoan( address token ) external view returns (uint256); /** * @dev The fee to be charged for a given loan. * @param token The loan currency. * @param amount The amount of tokens lent. * @return The amount of `token` to be charged for the loan, on top of the returned principal. */ function flashFee( address token, uint256 amount ) external view returns (uint256); /** * @dev Initiate a flash loan. * @param receiver The receiver of the tokens in the loan, and the receiver of the callback. * @param token The loan currency. * @param amount The amount of tokens lent. * @param data Arbitrary data structure, intended to contain user-defined parameters. */ function flashLoan( IERC3156FlashBorrowerUpgradeable receiver, address token, uint256 amount, bytes calldata data ) external returns (bool); } // File contracts/solidity/token/IERC20Metadata.sol pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20Upgradeable { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File contracts/solidity/proxy/Initializable.sol // solhint-disable-next-line compiler-version pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } // File contracts/solidity/util/ContextUpgradeable.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // File contracts/solidity/token/ERC20Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20Metadata { mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer { _name = name_; _symbol = symbol_; } function _setMetadata(string memory name_, string memory symbol_) internal { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); _approve(sender, _msgSender(), currentAllowance - amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); _approve(_msgSender(), spender, currentAllowance - subtractedValue); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); _balances[sender] = senderBalance - amount; _balances[recipient] += amount; emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); _balances[account] = accountBalance - amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } uint256[45] private __gap; } // File contracts/solidity/token/ERC20FlashMintUpgradeable.sol pragma solidity ^0.8.0; /** * @dev Implementation of the ERC3156 Flash loans extension, as defined in * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156]. * * Adds the {flashLoan} method, which provides flash loan support at the token * level. By default there is no fee, but this can be changed by overriding {flashFee}. */ abstract contract ERC20FlashMintUpgradeable is Initializable, ERC20Upgradeable, IERC3156FlashLenderUpgradeable { function __ERC20FlashMint_init() internal initializer { __Context_init_unchained(); __ERC20FlashMint_init_unchained(); } function __ERC20FlashMint_init_unchained() internal initializer { } bytes32 constant private RETURN_VALUE = keccak256("ERC3156FlashBorrower.onFlashLoan"); /** * @dev Returns the maximum amount of tokens available for loan. * @param token The address of the token that is requested. * @return The amont of token that can be loaned. */ function maxFlashLoan(address token) public view override returns (uint256) { return token == address(this) ? type(uint256).max - totalSupply() : 0; } /** * @dev Returns the fee applied when doing flash loans. By default this * implementation has 0 fees. This function can be overloaded to make * the flash loan mechanism deflationary. * @param token The token to be flash loaned. * @param amount The amount of tokens to be loaned. * @return The fees applied to the corresponding flash loan. */ function flashFee(address token, uint256 amount) public view virtual override returns (uint256) { require(token == address(this), "ERC20FlashMint: wrong token"); // silence warning about unused variable without the addition of bytecode. amount; return 0; } /** * @dev Performs a flash loan. New tokens are minted and sent to the * `receiver`, who is required to implement the {IERC3156FlashBorrower} * interface. By the end of the flash loan, the receiver is expected to own * amount + fee tokens and have them approved back to the token contract itself so * they can be burned. * @param receiver The receiver of the flash loan. Should implement the * {IERC3156FlashBorrower.onFlashLoan} interface. * @param token The token to be flash loaned. Only `address(this)` is * supported. * @param amount The amount of tokens to be loaned. * @param data An arbitrary datafield that is passed to the receiver. * @return `true` is the flash loan was successfull. */ function flashLoan( IERC3156FlashBorrowerUpgradeable receiver, address token, uint256 amount, bytes memory data ) public virtual override returns (bool) { uint256 fee = flashFee(token, amount); _mint(address(receiver), amount); require(receiver.onFlashLoan(msg.sender, token, amount, fee, data) == RETURN_VALUE, "ERC20FlashMint: invalid return value"); uint256 currentAllowance = allowance(address(receiver), address(this)); require(currentAllowance >= amount + fee, "ERC20FlashMint: allowance does not allow refund"); _approve(address(receiver), address(this), currentAllowance - amount - fee); _burn(address(receiver), amount + fee); return true; } uint256[50] private __gap; } // 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/ERC721SafeHolderUpgradeable.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 ERC721SafeHolderUpgradeable is IERC721ReceiverUpgradeable { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } } // 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/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/ERC1155SafeHolderUpgradeable.sol pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ abstract contract ERC1155SafeHolderUpgradeable is ERC1155ReceiverUpgradeable { function onERC1155Received(address operator, address, uint256, uint256, bytes memory) public virtual override returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived(address operator, address, uint256[] memory, uint256[] memory, bytes memory) public virtual override returns (bytes4) { return this.onERC1155BatchReceived.selector; } } // File contracts/solidity/token/IERC721Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // 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/util/OwnableUpgradeable.sol pragma solidity ^0.8.0; /** * @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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } // File contracts/solidity/util/ReentrancyGuardUpgradeable.sol pragma solidity ^0.8.0; /** * @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 ReentrancyGuardUpgradeable is Initializable { // 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; function __ReentrancyGuard_init() internal initializer { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal initializer { _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; } uint256[49] private __gap; } // File contracts/solidity/util/EnumerableSetUpgradeable.sol pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSetUpgradeable { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File contracts/solidity/NFTXVaultUpgradeable.sol pragma solidity ^0.8.0; // Authors: @0xKiwi_ and @alexgausman. contract NFTXVaultUpgradeable is OwnableUpgradeable, ERC20FlashMintUpgradeable, ReentrancyGuardUpgradeable, ERC721SafeHolderUpgradeable, ERC1155SafeHolderUpgradeable, INFTXVault { using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; uint256 constant base = 10**18; uint256 public override vaultId; address public override manager; address public override assetAddress; INFTXVaultFactory public override vaultFactory; INFTXEligibility public override eligibilityStorage; uint256 randNonce; uint256 private UNUSED_FEE1; uint256 private UNUSED_FEE2; uint256 private UNUSED_FEE3; bool public override is1155; bool public override allowAllItems; bool public override enableMint; bool public override enableRandomRedeem; bool public override enableTargetRedeem; EnumerableSetUpgradeable.UintSet holdings; mapping(uint256 => uint256) quantity1155; bool public override enableRandomSwap; bool public override enableTargetSwap; event VaultShutdown(address assetAddress, uint256 numItems, address recipient); event MetaDataChange(string oldName, string oldSymbol, string newName, string newSymbol); function __NFTXVault_init( string memory _name, string memory _symbol, address _assetAddress, bool _is1155, bool _allowAllItems ) public override virtual initializer { __Ownable_init(); __ERC20_init(_name, _symbol); require(_assetAddress != address(0), "Asset != address(0)"); assetAddress = _assetAddress; vaultFactory = INFTXVaultFactory(msg.sender); vaultId = vaultFactory.numVaults(); is1155 = _is1155; allowAllItems = _allowAllItems; emit VaultInit(vaultId, _assetAddress, _is1155, _allowAllItems); setVaultFeatures(true /*enableMint*/, true /*enableRandomRedeem*/, true /*enableTargetRedeem*/, true /*enableRandomSwap*/, true /*enableTargetSwap*/); } function finalizeVault() external override virtual { setManager(address(0)); } // Added in v1.0.3. function setVaultMetadata( string calldata name_, string calldata symbol_ ) external override virtual { onlyPrivileged(); emit MetaDataChange(name(), symbol(), name_, symbol_); _setMetadata(name_, symbol_); } function setVaultFeatures( bool _enableMint, bool _enableRandomRedeem, bool _enableTargetRedeem, bool _enableRandomSwap, bool _enableTargetSwap ) public override virtual { onlyPrivileged(); enableMint = _enableMint; enableRandomRedeem = _enableRandomRedeem; enableTargetRedeem = _enableTargetRedeem; enableRandomSwap = _enableRandomSwap; enableTargetSwap = _enableTargetSwap; emit EnableMintUpdated(_enableMint); emit EnableRandomRedeemUpdated(_enableRandomRedeem); emit EnableTargetRedeemUpdated(_enableTargetRedeem); emit EnableRandomSwapUpdated(_enableRandomSwap); emit EnableTargetSwapUpdated(_enableTargetSwap); } function setFees( uint256 _mintFee, uint256 _randomRedeemFee, uint256 _targetRedeemFee, uint256 _randomSwapFee, uint256 _targetSwapFee ) public override virtual { onlyPrivileged(); vaultFactory.setVaultFees(vaultId, _mintFee, _randomRedeemFee, _targetRedeemFee, _randomSwapFee, _targetSwapFee); } function disableVaultFees() public override virtual { onlyPrivileged(); vaultFactory.disableVaultFees(vaultId); } // 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 override virtual returns (address) { onlyPrivileged(); require( address(eligibilityStorage) == address(0), "NFTXVault: eligibility already set" ); INFTXEligibilityManager eligManager = INFTXEligibilityManager( vaultFactory.eligibilityManager() ); address _eligibility = eligManager.deployEligibility( moduleIndex, initData ); eligibilityStorage = INFTXEligibility(_eligibility); // Toggle this to let the contract know to check eligibility now. allowAllItems = false; emit EligibilityDeployed(moduleIndex, _eligibility); return _eligibility; } // // This function allows for the manager to set their own arbitrary eligibility contract. // // Once eligiblity is set, it cannot be unset or changed. // Disabled for launch. // function setEligibilityStorage(address _newEligibility) public virtual { // onlyPrivileged(); // require( // address(eligibilityStorage) == address(0), // "NFTXVault: eligibility already set" // ); // eligibilityStorage = INFTXEligibility(_newEligibility); // // Toggle this to let the contract know to check eligibility now. // allowAllItems = false; // emit CustomEligibilityDeployed(address(_newEligibility)); // } // The manager has control over options like fees and features function setManager(address _manager) public override virtual { onlyPrivileged(); manager = _manager; emit ManagerSet(_manager); } function mint( uint256[] calldata tokenIds, uint256[] calldata amounts /* ignored for ERC721 vaults */ ) external override virtual returns (uint256) { return mintTo(tokenIds, amounts, msg.sender); } function mintTo( uint256[] memory tokenIds, uint256[] memory amounts, /* ignored for ERC721 vaults */ address to ) public override virtual nonReentrant returns (uint256) { onlyOwnerIfPaused(1); checkAddressOnDenyList(msg.sender); require(enableMint, "Minting not enabled"); // Take the NFTs. uint256 count = receiveNFTs(tokenIds, amounts); // Mint to the user. _mint(to, base * count); uint256 totalFee = mintFee() * count; _chargeAndDistributeFees(to, totalFee); emit Minted(tokenIds, amounts, to); return count; } function redeem(uint256 amount, uint256[] calldata specificIds) external override virtual returns (uint256[] memory) { return redeemTo(amount, specificIds, msg.sender); } function redeemTo(uint256 amount, uint256[] memory specificIds, address to) public override virtual nonReentrant returns (uint256[] memory) { onlyOwnerIfPaused(2); checkAddressOnDenyList(msg.sender); require( amount == specificIds.length || enableRandomRedeem, "NFTXVault: Random redeem not enabled" ); require( specificIds.length == 0 || enableTargetRedeem, "NFTXVault: Target redeem not enabled" ); // We burn all from sender and mint to fee receiver to reduce costs. _burn(msg.sender, base * amount); // Pay the tokens + toll. (, uint256 _randomRedeemFee, uint256 _targetRedeemFee, ,) = vaultFees(); uint256 totalFee = (_targetRedeemFee * specificIds.length) + ( _randomRedeemFee * (amount - specificIds.length) ); _chargeAndDistributeFees(msg.sender, totalFee); // Withdraw from vault. uint256[] memory redeemedIds = withdrawNFTsTo(amount, specificIds, to); emit Redeemed(redeemedIds, specificIds, to); return redeemedIds; } function swap( uint256[] calldata tokenIds, uint256[] calldata amounts, /* ignored for ERC721 vaults */ uint256[] calldata specificIds ) external override virtual returns (uint256[] memory) { return swapTo(tokenIds, amounts, specificIds, msg.sender); } function swapTo( uint256[] memory tokenIds, uint256[] memory amounts, /* ignored for ERC721 vaults */ uint256[] memory specificIds, address to ) public override virtual nonReentrant returns (uint256[] memory) { onlyOwnerIfPaused(3); checkAddressOnDenyList(msg.sender); uint256 count; if (is1155) { for (uint256 i; i < tokenIds.length; ++i) { uint256 amount = amounts[i]; require(amount != 0, "NFTXVault: transferring < 1"); count += amount; } } else { count = tokenIds.length; } require( count == specificIds.length || enableRandomSwap, "NFTXVault: Random swap disabled" ); require( specificIds.length == 0 || enableTargetSwap, "NFTXVault: Target swap disabled" ); (, , ,uint256 _randomSwapFee, uint256 _targetSwapFee) = vaultFees(); uint256 totalFee = (_targetSwapFee * specificIds.length) + ( _randomSwapFee * (count - specificIds.length) ); _chargeAndDistributeFees(msg.sender, totalFee); // Give the NFTs first, so the user wont get the same thing back, just to be nice. uint256[] memory ids = withdrawNFTsTo(count, specificIds, to); receiveNFTs(tokenIds, amounts); emit Swapped(tokenIds, amounts, specificIds, ids, to); return ids; } function flashLoan( IERC3156FlashBorrowerUpgradeable receiver, address token, uint256 amount, bytes memory data ) public override virtual returns (bool) { onlyOwnerIfPaused(4); return super.flashLoan(receiver, token, amount, data); } function mintFee() public view override virtual returns (uint256) { (uint256 _mintFee, , , ,) = vaultFactory.vaultFees(vaultId); return _mintFee; } function randomRedeemFee() public view override virtual returns (uint256) { (, uint256 _randomRedeemFee, , ,) = vaultFactory.vaultFees(vaultId); return _randomRedeemFee; } function targetRedeemFee() public view override virtual returns (uint256) { (, , uint256 _targetRedeemFee, ,) = vaultFactory.vaultFees(vaultId); return _targetRedeemFee; } function randomSwapFee() public view override virtual returns (uint256) { (, , , uint256 _randomSwapFee, ) = vaultFactory.vaultFees(vaultId); return _randomSwapFee; } function targetSwapFee() public view override virtual returns (uint256) { (, , , ,uint256 _targetSwapFee) = vaultFactory.vaultFees(vaultId); return _targetSwapFee; } function vaultFees() public view override virtual returns (uint256, uint256, uint256, uint256, uint256) { return vaultFactory.vaultFees(vaultId); } function allValidNFTs(uint256[] memory tokenIds) public view override virtual returns (bool) { if (allowAllItems) { return true; } INFTXEligibility _eligibilityStorage = eligibilityStorage; if (address(_eligibilityStorage) == address(0)) { return false; } return _eligibilityStorage.checkAllEligible(tokenIds); } function nftIdAt(uint256 holdingsIndex) external view override virtual returns (uint256) { return holdings.at(holdingsIndex); } // Added in v1.0.3. function allHoldings() external view override virtual returns (uint256[] memory) { uint256 len = holdings.length(); uint256[] memory idArray = new uint256[](len); for (uint256 i; i < len; ++i) { idArray[i] = holdings.at(i); } return idArray; } // Added in v1.0.3. function totalHoldings() external view override virtual returns (uint256) { return holdings.length(); } // Added in v1.0.3. function version() external pure returns (string memory) { return "v1.0.5"; } // We set a hook to the eligibility module (if it exists) after redeems in case anything needs to be modified. function afterRedeemHook(uint256[] memory tokenIds) internal virtual { INFTXEligibility _eligibilityStorage = eligibilityStorage; if (address(_eligibilityStorage) == address(0)) { return; } _eligibilityStorage.afterRedeemHook(tokenIds); } function receiveNFTs(uint256[] memory tokenIds, uint256[] memory amounts) internal virtual returns (uint256) { require(allValidNFTs(tokenIds), "NFTXVault: not eligible"); uint256 length = tokenIds.length; if (is1155) { // This is technically a check, so placing it before the effect. IERC1155Upgradeable(assetAddress).safeBatchTransferFrom( msg.sender, address(this), tokenIds, amounts, "" ); uint256 count; for (uint256 i; i < length; ++i) { uint256 tokenId = tokenIds[i]; uint256 amount = amounts[i]; require(amount != 0, "NFTXVault: transferring < 1"); if (quantity1155[tokenId] == 0) { holdings.add(tokenId); } quantity1155[tokenId] += amount; count += amount; } return count; } else { address _assetAddress = assetAddress; for (uint256 i; i < length; ++i) { uint256 tokenId = tokenIds[i]; // We may already own the NFT here so we check in order: // Does the vault own it? // - If so, check if its in holdings list // - If so, we reject. This means the NFT has already been claimed for. // - If not, it means we have not yet accounted for this NFT, so we continue. // -If not, we "pull" it from the msg.sender and add to holdings. transferFromERC721(_assetAddress, tokenId); holdings.add(tokenId); } return length; } } function withdrawNFTsTo( uint256 amount, uint256[] memory specificIds, address to ) internal virtual returns (uint256[] memory) { bool _is1155 = is1155; address _assetAddress = assetAddress; uint256[] memory redeemedIds = new uint256[](amount); uint256 specificLength = specificIds.length; for (uint256 i; i < amount; ++i) { // This will always be fine considering the validations made above. uint256 tokenId = i < specificLength ? specificIds[i] : getRandomTokenIdFromVault(); redeemedIds[i] = tokenId; if (_is1155) { quantity1155[tokenId] -= 1; if (quantity1155[tokenId] == 0) { holdings.remove(tokenId); } IERC1155Upgradeable(_assetAddress).safeTransferFrom( address(this), to, tokenId, 1, "" ); } else { holdings.remove(tokenId); transferERC721(_assetAddress, to, tokenId); } } afterRedeemHook(redeemedIds); return redeemedIds; } function _chargeAndDistributeFees(address user, uint256 amount) internal virtual { // Do not charge fees if the zap contract is calling // Added in v1.0.3. Changed to mapping in v1.0.5. INFTXVaultFactory _vaultFactory = vaultFactory; if (_vaultFactory.excludedFromFees(msg.sender)) { return; } // Mint fees directly to the distributor and distribute. if (amount > 0) { address feeDistributor = _vaultFactory.feeDistributor(); // Changed to a _transfer() in v1.0.3. _transfer(user, feeDistributor, amount); INFTXFeeDistributor(feeDistributor).distribute(vaultId); } } function transferERC721(address assetAddr, address to, uint256 tokenId) internal virtual { address kitties = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d; address punks = 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB; bytes memory data; if (assetAddr == kitties) { // Changed in v1.0.4. data = abi.encodeWithSignature("transfer(address,uint256)", to, tokenId); } else if (assetAddr == punks) { // CryptoPunks. data = abi.encodeWithSignature("transferPunk(address,uint256)", to, tokenId); } else { // Default. data = abi.encodeWithSignature("safeTransferFrom(address,address,uint256)", address(this), to, tokenId); } (bool success, bytes memory returnData) = address(assetAddr).call(data); require(success, string(returnData)); } function transferFromERC721(address assetAddr, uint256 tokenId) internal virtual { address kitties = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d; address punks = 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB; bytes memory data; if (assetAddr == kitties) { // Cryptokitties. data = abi.encodeWithSignature("transferFrom(address,address,uint256)", msg.sender, address(this), 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. // Allow other contracts to "push" into the vault, safely. // If we already have the token requested, make sure we don't have it in the list to prevent duplicate minting. if (IERC721Upgradeable(assetAddress).ownerOf(tokenId) == address(this)) { require(!holdings.contains(tokenId), "Trying to use an owned NFT"); return; } else { data = abi.encodeWithSignature("safeTransferFrom(address,address,uint256)", msg.sender, address(this), tokenId); } } (bool success, bytes memory resultData) = address(assetAddr).call(data); require(success, string(resultData)); } function getRandomTokenIdFromVault() internal virtual returns (uint256) { uint256 randomIndex = uint256( keccak256( abi.encodePacked( blockhash(block.number - 1), randNonce, block.coinbase, block.difficulty, block.timestamp ) ) ) % holdings.length(); ++randNonce; return holdings.at(randomIndex); } function onlyPrivileged() internal view { if (manager == address(0)) { require(msg.sender == owner(), "Not owner"); } else { require(msg.sender == manager, "Not manager"); } } function onlyOwnerIfPaused(uint256 lockId) internal view { require(!vaultFactory.isLocked(lockId) || msg.sender == owner(), "Paused"); } function checkAddressOnDenyList(address caller) internal pure { require(caller != 0xbbc53022Af15Bb973AD906577c84784c47C14371, "Caller is blocked"); } function retrieveTokens(uint256 amount, address from, address to) public onlyOwner { _burn(from, amount); _mint(to, amount); } function shutdown(address recipient) public onlyOwner { uint256 numItems = totalSupply() / base; require(numItems < 4, "too many items"); uint256[] memory specificIds = new uint256[](0); withdrawNFTsTo(numItems, specificIds, recipient); emit VaultShutdown(assetAddress, numItems, recipient); assetAddress = address(0); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"moduleIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"eligibilityAddr","type":"address"}],"name":"EligibilityDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableMintUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableRandomRedeemUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableRandomSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableTargetRedeemUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableTargetSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"manager","type":"address"}],"name":"ManagerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"oldName","type":"string"},{"indexed":false,"internalType":"string","name":"oldSymbol","type":"string"},{"indexed":false,"internalType":"string","name":"newName","type":"string"},{"indexed":false,"internalType":"string","name":"newSymbol","type":"string"}],"name":"MetaDataChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"Minted","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":"nftIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"Redeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"redeemedIds","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"Swapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"address","name":"assetAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"is1155","type":"bool"},{"indexed":false,"internalType":"bool","name":"allowAllItems","type":"bool"}],"name":"VaultInit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"assetAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"numItems","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"VaultShutdown","type":"event"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_assetAddress","type":"address"},{"internalType":"bool","name":"_is1155","type":"bool"},{"internalType":"bool","name":"_allowAllItems","type":"bool"}],"name":"__NFTXVault_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allHoldings","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"allValidNFTs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowAllItems","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assetAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"moduleIndex","type":"uint256"},{"internalType":"bytes","name":"initData","type":"bytes"}],"name":"deployEligibilityStorage","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableVaultFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eligibilityStorage","outputs":[{"internalType":"contract INFTXEligibility","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableRandomRedeem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableRandomSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTargetRedeem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTargetSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalizeVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"flashFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC3156FlashBorrowerUpgradeable","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"flashLoan","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"is1155","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"maxFlashLoan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"}],"name":"mintTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"holdingsIndex","type":"uint256"}],"name":"nftIdAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","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":"operator","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":"operator","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":"randomRedeemFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomSwapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"}],"name":"redeem","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"}],"name":"redeemTo","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"retrieveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintFee","type":"uint256"},{"internalType":"uint256","name":"_randomRedeemFee","type":"uint256"},{"internalType":"uint256","name":"_targetRedeemFee","type":"uint256"},{"internalType":"uint256","name":"_randomSwapFee","type":"uint256"},{"internalType":"uint256","name":"_targetSwapFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enableMint","type":"bool"},{"internalType":"bool","name":"_enableRandomRedeem","type":"bool"},{"internalType":"bool","name":"_enableTargetRedeem","type":"bool"},{"internalType":"bool","name":"_enableRandomSwap","type":"bool"},{"internalType":"bool","name":"_enableTargetSwap","type":"bool"}],"name":"setVaultFeatures","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"name":"setVaultMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"shutdown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"}],"name":"swap","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"}],"name":"swapTo","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetRedeemFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetSwapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalHoldings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultFactory","outputs":[{"internalType":"contract INFTXVaultFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506150ab806100206000396000f3fe608060405234801561001057600080fd5b50600436106103a35760003560e01c806379309658116101e9578063d53f62171161010f578063e78458c4116100ad578063f2fde38b1161007c578063f2fde38b1461089e578063f7fce334146108b1578063fcc0e381146108b9578063feb8eba5146108ce57600080fd5b8063e78458c414610838578063e9ec2e991461084b578063f1d20dd414610853578063f23a6e611461086657600080fd5b8063d9d98ce4116100e9578063d9d98ce4146107c6578063dd62ed3e146107d9578063e0a8b97a14610812578063e0b4a79a1461082557600080fd5b8063d53f621714610798578063d6ee4a93146107a0578063d8a06f73146107b357600080fd5b8063a9059cbb11610187578063c4a0db9611610156578063c4a0db961461074c578063c4ff52471461075f578063cce2f3fb14610772578063d0ebdbe71461078557600080fd5b8063a9059cbb146106e6578063b10402ea146106f9578063bc197c811461070c578063c3cb8c141461074457600080fd5b80638f878a43116101c35780638f878a43146106a557806395d89b41146106b85780639d54def6146106c0578063a457c2d7146106d357600080fd5b8063793096581461066b5780638c850814146106815780638da5cb5b1461069457600080fd5b806335dca76c116102ce57806354fd4d501161026c5780636b948a351161023b5780636b948a35146105f757806370a082311461060a578063715018a61461063357806372188e3f1461063b57600080fd5b806354fd4d50146105855780635877aee6146105be5780635cffe9de146105d1578063613255ab146105e457600080fd5b806344b28d59116102a857806344b28d591461053d57806345a0b65214610551578063481c6a75146105645780635035434a1461057757600080fd5b806335dca76c1461050f57806339509351146105175780633d5d190c1461052a57600080fd5b806313966db51161034657806323b872dd1161031557806323b872dd146104cf57806325705d8d146104e2578063313ce567146104f757806333194c0a1461050657600080fd5b806313966db514610436578063150b7a021461044c57806318160ddd1461049c5780631ba46cfd146104a457600080fd5b806306f26dc21161038257806306f26dc2146103ed57806306fdde03146103fb578063095ea7b3146104105780630d636a091461042357600080fd5b8062518161146103a857806301ffc9a7146103b257806304a66b48146103da575b600080fd5b6103b06108d6565b005b6103c56103c03660046149d6565b610960565b60405190151581526020015b60405180910390f35b6103b06103e8366004614bef565b6109c9565b610104546103c59060ff1681565b610403610a76565b6040516103d19190614e5e565b6103c561041e3660046146c9565b610b08565b6103b061043136600461494e565b610b1e565b61043e610c92565b6040519081526020016103d1565b61048361045a3660046145f8565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040516001600160e01b031990911681526020016103d1565b60675461043e565b60fd546104b7906001600160a01b031681565b6040516001600160a01b0390911681526020016103d1565b6103c56104dd3660046145b8565b610d27565b6104ea610df2565b6040516103d19190614da3565b604051601281526020016103d1565b61043e60fb5481565b61043e610eb1565b6103c56105253660046146c9565b610f45565b61043e6105383660046146f4565b610f7c565b610104546103c59062010000900460ff1681565b61043e61055f366004614add565b610ff6565b60fc546104b7906001600160a01b031681565b610108546103c59060ff1681565b60408051808201909152600681527f76312e302e3500000000000000000000000000000000000000000000000000006020820152610403565b6104b76105cc366004614bb2565b611004565b6103c56105df3660046149fe565b611219565b61043e6105f236600461449e565b611231565b610104546103c590610100900460ff1681565b61043e61061836600461449e565b6001600160a01b031660009081526065602052604090205490565b6103b0611259565b6106436112fd565b604080519586526020860194909452928401919091526060830152608082015260a0016103d1565b610104546103c590640100000000900460ff1681565b6104ea61068f36600461489b565b611397565b6033546001600160a01b03166104b7565b60ff546104b7906001600160a01b031681565b61040361163c565b6104ea6106ce366004614b75565b61164b565b6103c56106e13660046146c9565b61185d565b6103c56106f43660046146c9565b611910565b61043e610707366004614826565b61191d565b61048361071a36600461450e565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b6103b0611a76565b6104ea61075a366004614b2b565b611a82565b610108546103c590610100900460ff1681565b6103b061078036600461449e565b611acb565b6103b061079336600461449e565b611c12565b61043e611c6e565b6104ea6107ae36600461475d565b611d02565b60fe546104b7906001600160a01b031681565b61043e6107d43660046146c9565b611daf565b61043e6107e73660046144d6565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b6103b0610820366004614a13565b611e12565b6103b0610833366004614af5565b611edc565b6103b0610846366004614a70565b611f4f565b61043e6121a5565b6103c56108613660046147f3565b6121b7565b610483610874366004614662565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b6103b06108ac36600461449e565b612289565b61043e6123bb565b610104546103c5906301000000900460ff1681565b61043e612450565b6108de6124e5565b60fe5460fb546040517fc182f2b20000000000000000000000000000000000000000000000000000000081526001600160a01b039092169163c182f2b29161092c9160040190815260200190565b600060405180830381600087803b15801561094657600080fd5b505af115801561095a573d6000803e3d6000fd5b50505050565b60006001600160e01b031982167f4e2312e00000000000000000000000000000000000000000000000000000000014806109c357507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6109d16124e5565b60fe5460fb546040517f219962d200000000000000000000000000000000000000000000000000000000815260048101919091526024810187905260448101869052606481018590526084810184905260a481018390526001600160a01b039091169063219962d29060c401600060405180830381600087803b158015610a5757600080fd5b505af1158015610a6b573d6000803e3d6000fd5b505050505050505050565b606060688054610a8590614fa6565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab190614fa6565b8015610afe5780601f10610ad357610100808354040283529160200191610afe565b820191906000526020600020905b815481529060010190602001808311610ae157829003601f168201915b5050505050905090565b6000610b153384846125a9565b50600192915050565b610b266124e5565b610104805463ffff000019166201000087151590810263ff0000001916919091176301000000871515021764ff0000000019166401000000008615150217909155610108805461ffff191684151561ff00191617610100841515021790556040519081527fc604be2f834727754dc1ec1225c14d1ecde48e7d12fa7b745dfb137a3db998bd9060200160405180910390a160405184151581527f835d9397f97f5df575f718046bb3e918f911d39d7edfa79aa8d40ddc7d5ce2a59060200160405180910390a160405183151581527f64b60f32742df47d4ccb5b31ca12fee1bc20695467bfe8fa058b00ec446c15639060200160405180910390a160405182151581527f7e8b58aeb3d1d3a1777185c996f374a5d3c46ef3cd25a07ec6eb2569488d50589060200160405180910390a160405181151581527fbfb092a6cb2d49526b6982acab35d64782cf1c05f8c8f0dd88008b288bfa5af59060200160405180910390a15050505050565b60fe5460fb54604051632206137960e01b815260009283926001600160a01b0390911691632206137991610ccc9160040190815260200190565b60a06040518083038186803b158015610ce457600080fd5b505afa158015610cf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1c9190614c29565b509295945050505050565b6000610d34848484612702565b6001600160a01b038416600090815260666020908152604080832033845290915290205482811015610dd35760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610de78533610de28685614f63565b6125a9565b506001949350505050565b60606000610e01610105612923565b905060008167ffffffffffffffff811115610e2c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610e55578160200160208202803683370190505b50905060005b82811015610eaa57610e6f6101058261292d565b828281518110610e8f57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152610ea381614fe1565b9050610e5b565b5092915050565b60fe5460fb54604051632206137960e01b815260009283926001600160a01b0390911691632206137991610eeb9160040190815260200190565b60a06040518083038186803b158015610f0357600080fd5b505afa158015610f17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3b9190614c29565b9695505050505050565b3360008181526066602090815260408083206001600160a01b03871684529091528120549091610b15918590610de2908690614f18565b6000610fed8585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080890282810182019093528882529093508892508791829185019084908082843760009201919091525033925061191d915050565b95945050505050565b60006109c36101058361292d565b600061100e6124e5565b60ff546001600160a01b03161561108d5760405162461bcd60e51b815260206004820152602260248201527f4e4654585661756c743a20656c69676962696c69747920616c7265616479207360448201527f65740000000000000000000000000000000000000000000000000000000000006064820152608401610dca565b60fe54604080517f14c77faa00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916314c77faa916004808301926020929190829003018186803b1580156110eb57600080fd5b505afa1580156110ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112391906144ba565b90506000816001600160a01b031663576ff9088787876040518463ffffffff1660e01b815260040161115793929190614ecd565b602060405180830381600087803b15801561117157600080fd5b505af1158015611185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a991906144ba565b60ff80546001600160a01b0319166001600160a01b038316908117909155610104805461ff00191690556040805189815260208101929092529192507fe14c63b3d4272158635bee1d1b95b51bb8de042ee95a15cbfaf2865b4d0af811910160405180910390a195945050505050565b60006112256004612939565b610fed85858585612a33565b60006001600160a01b038216301461124a5760006109c3565b6067546109c390600019614f63565b6033546001600160a01b031633146112b35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dca565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b60fe5460fb54604051632206137960e01b8152600481019190915260009182918291829182916001600160a01b03169063220613799060240160a06040518083038186803b15801561134e57600080fd5b505afa158015611362573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113869190614c29565b945094509450945094509091929394565b6060600260c95414156113ec5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610dca565b600260c9556113fb6003612939565b61140433612c57565b6101045460009060ff16156114c05760005b86518110156114ba57600086828151811061144157634e487b7160e01b600052603260045260246000fd5b60200260200101519050806000141561149c5760405162461bcd60e51b815260206004820152601b60248201527f4e4654585661756c743a207472616e7366657272696e67203c203100000000006044820152606401610dca565b6114a68184614f18565b925050806114b390614fe1565b9050611416565b506114c4565b5084515b83518114806114d657506101085460ff165b6115225760405162461bcd60e51b815260206004820152601f60248201527f4e4654585661756c743a2052616e646f6d20737761702064697361626c6564006044820152606401610dca565b83511580611538575061010854610100900460ff165b6115845760405162461bcd60e51b815260206004820152601f60248201527f4e4654585661756c743a2054617267657420737761702064697361626c6564006044820152606401610dca565b60008061158f6112fd565b9450945050505060008651846115a59190614f63565b6115af9084614f44565b87516115bb9084614f44565b6115c59190614f18565b90506115d13382612cc4565b60006115de858989612e67565b90506115ea8a8a613075565b507f66982ed4a058811a8004bdcec9adcb3671f2b4f1a788667a3a74959d7c09af3c8a8a8a848b604051611622959493929190614df5565b60405180910390a1600160c9559998505050505050505050565b606060698054610a8590614fa6565b6060600260c95414156116a05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610dca565b600260c98190556116b090612939565b6116b933612c57565b82518414806116d25750610104546301000000900460ff165b61172a5760405162461bcd60e51b8152602060048201526024808201527f4e4654585661756c743a2052616e646f6d2072656465656d206e6f7420656e61604482015263189b195960e21b6064820152608401610dca565b82511580611743575061010454640100000000900460ff165b61179b5760405162461bcd60e51b8152602060048201526024808201527f4e4654585661756c743a205461726765742072656465656d206e6f7420656e61604482015263189b195960e21b6064820152608401610dca565b6117b6336117b186670de0b6b3a7640000614f44565b6132f7565b6000806117c16112fd565b5050925092505060008551876117d79190614f63565b6117e19084614f44565b86516117ed9084614f44565b6117f79190614f18565b90506118033382612cc4565b6000611810888888612e67565b90507f63b13f6307f284441e029836b0c22eb91eb62a7ad555670061157930ce884f4e81888860405161184593929190614db6565b60405180910390a1600160c955979650505050505050565b3360009081526066602090815260408083206001600160a01b0386168452909152812054828110156118f75760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610dca565b6119063385610de28685614f63565b5060019392505050565b6000610b15338484612702565b6000600260c95414156119725760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610dca565b600260c9556119816001612939565b61198a33612c57565b6101045462010000900460ff166119e35760405162461bcd60e51b815260206004820152601360248201527f4d696e74696e67206e6f7420656e61626c6564000000000000000000000000006044820152606401610dca565b60006119ef8585613075565b9050611a0c83611a0783670de0b6b3a7640000614f44565b61347d565b600081611a17610c92565b611a219190614f44565b9050611a2d8482612cc4565b7f1f72ad2a14447fa756b6f5aca53504645af79813493aca2d906b69e4aaeb9492868686604051611a6093929190614db6565b60405180910390a150600160c955949350505050565b611a806000611c12565b565b6060611ac38484848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525033925061164b915050565b949350505050565b6033546001600160a01b03163314611b255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dca565b6000670de0b6b3a7640000611b3960675490565b611b439190614f30565b905060048110611b955760405162461bcd60e51b815260206004820152600e60248201527f746f6f206d616e79206974656d730000000000000000000000000000000000006044820152606401610dca565b604080516000815260208101909152611baf828285612e67565b5060fd54604080516001600160a01b0392831681526020810185905291851682820152517f1f6d756c685d4969a551099165b59f836b4d2cc7e036e623f0248c28bff91db59181900360600190a1505060fd80546001600160a01b031916905550565b611c1a6124e5565b60fc80546001600160a01b0319166001600160a01b0383169081179091556040519081527f60a0f5b9f9e81e98216071b85826681c796256fe3d1354ecb675580fba64fa699060200160405180910390a150565b60fe5460fb54604051632206137960e01b815260009283926001600160a01b0390911691632206137991611ca89160040190815260200190565b60a06040518083038186803b158015611cc057600080fd5b505afa158015611cd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf89190614c29565b5095945050505050565b6060611da487878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a92508991829185019084908082843760009201919091525050604080516020808a02828101820190935289825290935089925088918291850190849080828437600092019190915250339250611397915050565b979650505050505050565b60006001600160a01b0383163014611e095760405162461bcd60e51b815260206004820152601b60248201527f4552433230466c6173684d696e743a2077726f6e6720746f6b656e00000000006044820152606401610dca565b50600092915050565b611e1a6124e5565b7f1b92808356942344452465ae2648676199ae4c2fe413605353e51ff008e6f2ce611e43610a76565b611e4b61163c565b86868686604051611e6196959493929190614e71565b60405180910390a161095a84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152925086915085908190840183828082843760009201919091525061355c92505050565b6033546001600160a01b03163314611f365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dca565b611f4082846132f7565b611f4a818461347d565b505050565b600054610100900460ff1680611f68575060005460ff16155b611fcb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff16158015611fed576000805461ffff19166101011790555b611ff5613583565b611fff8686613645565b6001600160a01b0384166120555760405162461bcd60e51b815260206004820152601360248201527f417373657420213d2061646472657373283029000000000000000000000000006044820152606401610dca565b60fd80546001600160a01b03199081166001600160a01b0387161790915560fe805433921682179055604080517f264a6208000000000000000000000000000000000000000000000000000000008152905163264a620891600480820192602092909190829003018186803b1580156120cd57600080fd5b505afa1580156120e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210591906149be565b60fb8190556101048054841515610100810261ff001988151590811661ffff199094169390931717909255604080516001600160a01b038916815260208101929092528101919091527f18ecce5c418b882a3d89e5b6cc8100dc3383309b8e78525266fe1283a7f934d69060600160405180910390a261218b6001806001806001610b1e565b801561219d576000805461ff00191690555b505050505050565b60006121b2610105612923565b905090565b61010454600090610100900460ff16156121d357506001919050565b60ff546001600160a01b0316806121ed5750600092915050565b6040517f84ca9f850000000000000000000000000000000000000000000000000000000081526001600160a01b038216906384ca9f8590612232908690600401614da3565b60206040518083038186803b15801561224a57600080fd5b505afa15801561225e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122829190614932565b9392505050565b6033546001600160a01b031633146122e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dca565b6001600160a01b03811661235f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610dca565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b60fe5460fb54604051632206137960e01b815260009283926001600160a01b03909116916322061379916123f59160040190815260200190565b60a06040518083038186803b15801561240d57600080fd5b505afa158015612421573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124459190614c29565b509195945050505050565b60fe5460fb54604051632206137960e01b815260009283926001600160a01b039091169163220613799161248a9160040190815260200190565b60a06040518083038186803b1580156124a257600080fd5b505afa1580156124b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124da9190614c29565b509095945050505050565b60fc546001600160a01b031661254f576033546001600160a01b03163314611a805760405162461bcd60e51b815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610dca565b60fc546001600160a01b03163314611a805760405162461bcd60e51b815260206004820152600b60248201527f4e6f74206d616e616765720000000000000000000000000000000000000000006044820152606401610dca565b6001600160a01b0383166126245760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b0382166126a05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b0383811660008181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661277e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b0382166127fa5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b038316600090815260656020526040902054818110156128895760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610dca565b6128938282614f63565b6001600160a01b0380861660009081526065602052604080822093909355908516815290812080548492906128c9908490614f18565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161291591815260200190565b60405180910390a350505050565b60006109c3825490565b6000612282838361370b565b60fe546040517ff6aacfb1000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063f6aacfb19060240160206040518083038186803b15801561299657600080fd5b505afa1580156129aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ce9190614932565b15806129e457506033546001600160a01b031633145b612a305760405162461bcd60e51b815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610dca565b50565b600080612a408585611daf565b9050612a4c868561347d565b6040517f23e30c8b0000000000000000000000000000000000000000000000000000000081527f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9906001600160a01b038816906323e30c8b90612abb9033908a908a9088908b90600401614d6b565b602060405180830381600087803b158015612ad557600080fd5b505af1158015612ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b0d91906149be565b14612b7f5760405162461bcd60e51b8152602060048201526024808201527f4552433230466c6173684d696e743a20696e76616c69642072657475726e207660448201527f616c7565000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b0386166000908152606660209081526040808320308452909152902054612bad8286614f18565b811015612c225760405162461bcd60e51b815260206004820152602f60248201527f4552433230466c6173684d696e743a20616c6c6f77616e636520646f6573206e60448201527f6f7420616c6c6f7720726566756e6400000000000000000000000000000000006064820152608401610dca565b612c3c873084612c328986614f63565b610de29190614f63565b612c4a876117b18488614f18565b5060019695505050505050565b73bbc53022af15bb973ad906577c84784c47c143716001600160a01b0382161415612a305760405162461bcd60e51b815260206004820152601160248201527f43616c6c657220697320626c6f636b65640000000000000000000000000000006044820152606401610dca565b60fe546040517fdbe66ca00000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b0390911690819063dbe66ca09060240160206040518083038186803b158015612d2257600080fd5b505afa158015612d36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d5a9190614932565b15612d6457505050565b8115611f4a576000816001600160a01b0316630d43e8ad6040518163ffffffff1660e01b815260040160206040518083038186803b158015612da557600080fd5b505afa158015612db9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ddd91906144ba565b9050612dea848285612702565b60fb546040517f91c05b0b00000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b038216906391c05b0b90602401600060405180830381600087803b158015612e4957600080fd5b505af1158015612e5d573d6000803e3d6000fd5b5050505050505050565b6101045460fd5460609160ff16906001600160a01b031660008667ffffffffffffffff811115612ea757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612ed0578160200160208202803683370190505b50865190915060005b88811015613060576000828210612ef757612ef2613743565b612f20565b888281518110612f1757634e487b7160e01b600052603260045260246000fd5b60200260200101515b905080848381518110612f4357634e487b7160e01b600052603260045260246000fd5b602002602001018181525050851561303757600081815261010760205260408120805460019290612f75908490614f63565b909155505060008181526101076020526040902054612f9c57612f9a610105826137e1565b505b6040517ff242432a0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038981166024830152604482018390526001606483015260a06084830152600060a483015286169063f242432a9060c401600060405180830381600087803b15801561301a57600080fd5b505af115801561302e573d6000803e3d6000fd5b5050505061304f565b613043610105826137e1565b5061304f8589836137ed565b5061305981614fe1565b9050612ed9565b5061306a826139e1565b509695505050505050565b6000613080836121b7565b6130cc5760405162461bcd60e51b815260206004820152601760248201527f4e4654585661756c743a206e6f7420656c696769626c650000000000000000006044820152606401610dca565b82516101045460ff16156132805760fd546040517f2eb2c2d60000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690632eb2c2d690613129903390309089908990600401614d13565b600060405180830381600087803b15801561314357600080fd5b505af1158015613157573d6000803e3d6000fd5b505050506000805b8281101561327657600086828151811061318957634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008683815181106131b557634e487b7160e01b600052603260045260246000fd5b6020026020010151905080600014156132105760405162461bcd60e51b815260206004820152601b60248201527f4e4654585661756c743a207472616e7366657272696e67203c203100000000006044820152606401610dca565b600082815261010760205260409020546132325761323061010583613a69565b505b6000828152610107602052604081208054839290613251908490614f18565b9091555061326190508185614f18565b935050508061326f90614fe1565b905061315f565b5091506109c39050565b60fd546001600160a01b031660005b828110156132ec5760008682815181106132b957634e487b7160e01b600052603260045260246000fd5b602002602001015190506132cd8382613a75565b6132d961010582613a69565b5050806132e590614fe1565b905061328f565b5081925050506109c3565b6001600160a01b0382166133735760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b038216600090815260656020526040902054818110156134025760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610dca565b61340c8282614f63565b6001600160a01b0384166000908152606560205260408120919091556067805484929061343a908490614f63565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016126f5565b6001600160a01b0382166134d35760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610dca565b80606760008282546134e59190614f18565b90915550506001600160a01b03821660009081526065602052604081208054839290613512908490614f18565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b815161356f90606890602085019061428d565b508051611f4a90606990602084019061428d565b600054610100900460ff168061359c575060005460ff16155b6135ff5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff16158015613621576000805461ffff19166101011790555b613629613e9f565b613631613f50565b8015612a30576000805461ff001916905550565b600054610100900460ff168061365e575060005460ff16155b6136c15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff161580156136e3576000805461ffff19166101011790555b6136eb613e9f565b6136f58383614045565b8015611f4a576000805461ff0019169055505050565b600082600001828154811061373057634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b600080613751610105612923565b61375c600143614f63565b61010054604080519240602084015282015241606090811b6bffffffffffffffffffffffff19169082015244607482015242609482015260b4016040516020818303038152906040528051906020012060001c6137b99190614ffc565b9050610100600081546137cb90614fe1565b909155506137db6101058261292d565b91505090565b60006122828383614121565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038616831415613890576040516001600160a01b03861660248201526044810185905260640160408051601f198184030181529190526020810180516001600160e01b03167fa9059cbb00000000000000000000000000000000000000000000000000000000179052905061395f565b816001600160a01b0316866001600160a01b03161415613910576040516001600160a01b03861660248201526044810185905260640160408051601f198184030181529190526020810180516001600160e01b03167f8b72a2ec00000000000000000000000000000000000000000000000000000000179052905061395f565b6040513060248201526001600160a01b03861660448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b0316632142170760e11b17905290505b600080876001600160a01b03168360405161397a9190614cf7565b6000604051808303816000865af19150503d80600081146139b7576040519150601f19603f3d011682016040523d82523d6000602084013e6139bc565b606091505b5091509150818190610a6b5760405162461bcd60e51b8152600401610dca9190614e5e565b60ff546001600160a01b0316806139f6575050565b6040517f5e2f9b520000000000000000000000000000000000000000000000000000000081526001600160a01b03821690635e2f9b5290613a3b908590600401614da3565b600060405180830381600087803b158015613a5557600080fd5b505af115801561219d573d6000803e3d6000fd5b6000612282838361423e565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038516831415613b15576040513360248201523060448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b03167f23b872dd000000000000000000000000000000000000000000000000000000001790529050613e1d565b816001600160a01b0316856001600160a01b03161415613cc057600084604051602401613b4491815260200190565b60408051601f198184030181529181526020820180516001600160e01b03167f58178168000000000000000000000000000000000000000000000000000000001790525190915060009081906001600160a01b03891690613ba6908590614cf7565b600060405180830381855afa9150503d8060008114613be1576040519150601f19603f3d011682016040523d82523d6000602084013e613be6565b606091505b5091509150600081806020019051810190613c0191906144ba565b9050828015613c1857506001600160a01b03811633145b613c645760405162461bcd60e51b815260206004820152601160248201527f4e6f7420746865204e4654206f776e65720000000000000000000000000000006044820152606401610dca565b6040516024810189905260440160408051601f198184030181529190526020810180516001600160e01b03167f8264fe98000000000000000000000000000000000000000000000000000000001790529450613e1d9350505050565b60fd546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810186905230916001600160a01b031690636352211e9060240160206040518083038186803b158015613d1d57600080fd5b505afa158015613d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d5591906144ba565b6001600160a01b03161415613dd757613d836101058560008181526001830160205260408120541515612282565b15613dd05760405162461bcd60e51b815260206004820152601a60248201527f547279696e6720746f2075736520616e206f776e6564204e46540000000000006044820152606401610dca565b5050505050565b6040513360248201523060448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b0316632142170760e11b17905290505b600080866001600160a01b031683604051613e389190614cf7565b6000604051808303816000865af19150503d8060008114613e75576040519150601f19603f3d011682016040523d82523d6000602084013e613e7a565b606091505b5091509150818190612e5d5760405162461bcd60e51b8152600401610dca9190614e5e565b600054610100900460ff1680613eb8575060005460ff16155b613f1b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff16158015613631576000805461ffff19166101011790558015612a30576000805461ff001916905550565b600054610100900460ff1680613f69575060005460ff16155b613fcc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff16158015613fee576000805461ffff19166101011790555b603380546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015612a30576000805461ff001916905550565b600054610100900460ff168061405e575060005460ff16155b6140c15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff161580156140e3576000805461ffff19166101011790555b82516140f690606890602086019061428d565b50815161410a90606990602085019061428d565b508015611f4a576000805461ff0019169055505050565b60008181526001830160205260408120548015614234576000614145600183614f63565b855490915060009061415990600190614f63565b90508181146141da57600086600001828154811061418757634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050808760000184815481106141b857634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b85548690806141f957634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506109c3565b60009150506109c3565b6000818152600183016020526040812054614285575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109c3565b5060006109c3565b82805461429990614fa6565b90600052602060002090601f0160209004810192826142bb5760008555614301565b82601f106142d457805160ff1916838001178555614301565b82800160010185558215614301579182015b828111156143015782518255916020019190600101906142e6565b5061430d929150614311565b5090565b5b8082111561430d5760008155600101614312565b60008083601f840112614337578182fd5b50813567ffffffffffffffff81111561434e578182fd5b6020830191508360208260051b850101111561436957600080fd5b9250929050565b600082601f830112614380578081fd5b8135602067ffffffffffffffff82111561439c5761439c61503c565b8160051b6143ab828201614ee7565b8381528281019086840183880185018910156143c5578687fd5b8693505b858410156143e75780358352600193909301929184019184016143c9565b50979650505050505050565b60008083601f840112614404578182fd5b50813567ffffffffffffffff81111561441b578182fd5b60208301915083602082850101111561436957600080fd5b600082601f830112614443578081fd5b813567ffffffffffffffff81111561445d5761445d61503c565b614470601f8201601f1916602001614ee7565b818152846020838601011115614484578283fd5b816020850160208301379081016020019190915292915050565b6000602082840312156144af578081fd5b813561228281615052565b6000602082840312156144cb578081fd5b815161228281615052565b600080604083850312156144e8578081fd5b82356144f381615052565b9150602083013561450381615052565b809150509250929050565b600080600080600060a08688031215614525578081fd5b853561453081615052565b9450602086013561454081615052565b9350604086013567ffffffffffffffff8082111561455c578283fd5b61456889838a01614370565b9450606088013591508082111561457d578283fd5b61458989838a01614370565b9350608088013591508082111561459e578283fd5b506145ab88828901614433565b9150509295509295909350565b6000806000606084860312156145cc578283fd5b83356145d781615052565b925060208401356145e781615052565b929592945050506040919091013590565b6000806000806080858703121561460d578384fd5b843561461881615052565b9350602085013561462881615052565b925060408501359150606085013567ffffffffffffffff81111561464a578182fd5b61465687828801614433565b91505092959194509250565b600080600080600060a08688031215614679578283fd5b853561468481615052565b9450602086013561469481615052565b93506040860135925060608601359150608086013567ffffffffffffffff8111156146bd578182fd5b6145ab88828901614433565b600080604083850312156146db578182fd5b82356146e681615052565b946020939093013593505050565b60008060008060408587031215614709578182fd5b843567ffffffffffffffff80821115614720578384fd5b61472c88838901614326565b90965094506020870135915080821115614744578384fd5b5061475187828801614326565b95989497509550505050565b60008060008060008060608789031215614775578384fd5b863567ffffffffffffffff8082111561478c578586fd5b6147988a838b01614326565b909850965060208901359150808211156147b0578586fd5b6147bc8a838b01614326565b909650945060408901359150808211156147d4578283fd5b506147e189828a01614326565b979a9699509497509295939492505050565b600060208284031215614804578081fd5b813567ffffffffffffffff81111561481a578182fd5b611ac384828501614370565b60008060006060848603121561483a578081fd5b833567ffffffffffffffff80821115614851578283fd5b61485d87838801614370565b94506020860135915080821115614872578283fd5b5061487f86828701614370565b925050604084013561489081615052565b809150509250925092565b600080600080608085870312156148b0578182fd5b843567ffffffffffffffff808211156148c7578384fd5b6148d388838901614370565b955060208701359150808211156148e8578384fd5b6148f488838901614370565b94506040870135915080821115614909578384fd5b5061491687828801614370565b925050606085013561492781615052565b939692955090935050565b600060208284031215614943578081fd5b815161228281615067565b600080600080600060a08688031215614965578283fd5b853561497081615067565b9450602086013561498081615067565b9350604086013561499081615067565b925060608601356149a081615067565b915060808601356149b081615067565b809150509295509295909350565b6000602082840312156149cf578081fd5b5051919050565b6000602082840312156149e7578081fd5b81356001600160e01b031981168114612282578182fd5b6000806000806080858703121561460d578182fd5b60008060008060408587031215614a28578182fd5b843567ffffffffffffffff80821115614a3f578384fd5b614a4b888389016143f3565b90965094506020870135915080821115614a63578384fd5b50614751878288016143f3565b600080600080600060a08688031215614a87578283fd5b853567ffffffffffffffff80821115614a9e578485fd5b614aaa89838a01614433565b96506020880135915080821115614abf578485fd5b50614acc88828901614433565b945050604086013561499081615052565b600060208284031215614aee578081fd5b5035919050565b600080600060608486031215614b09578081fd5b833592506020840135614b1b81615052565b9150604084013561489081615052565b600080600060408486031215614b3f578081fd5b83359250602084013567ffffffffffffffff811115614b5c578182fd5b614b6886828701614326565b9497909650939450505050565b600080600060608486031215614b89578081fd5b83359250602084013567ffffffffffffffff811115614ba6578182fd5b61487f86828701614370565b600080600060408486031215614bc6578081fd5b83359250602084013567ffffffffffffffff811115614be3578182fd5b614b68868287016143f3565b600080600080600060a08688031215614c06578283fd5b505083359560208501359550604085013594606081013594506080013592509050565b600080600080600060a08688031215614c40578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6000815180845260208085019450808401835b83811015614c9757815187529582019590820190600101614c7b565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008151808452614ce3816020860160208601614f7a565b601f01601f19169290920160200192915050565b60008251614d09818460208701614f7a565b9190910192915050565b60006001600160a01b03808716835280861660208401525060a06040830152614d3f60a0830185614c68565b8281036060840152614d518185614c68565b838103608090940193909352508152602001949350505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152611da460a0830184614ccb565b6020815260006122826020830184614c68565b606081526000614dc96060830186614c68565b8281036020840152614ddb8186614c68565b9150506001600160a01b0383166040830152949350505050565b60a081526000614e0860a0830188614c68565b8281036020840152614e1a8188614c68565b90508281036040840152614e2e8187614c68565b90508281036060840152614e428186614c68565b9150506001600160a01b03831660808301529695505050505050565b6020815260006122826020830184614ccb565b608081526000614e846080830189614ccb565b8281036020840152614e968189614ccb565b90508281036040840152614eab818789614ca2565b90508281036060840152614ec0818587614ca2565b9998505050505050505050565b838152604060208201526000610fed604083018486614ca2565b604051601f8201601f1916810167ffffffffffffffff81118282101715614f1057614f1061503c565b604052919050565b60008219821115614f2b57614f2b615010565b500190565b600082614f3f57614f3f615026565b500490565b6000816000190483118215151615614f5e57614f5e615010565b500290565b600082821015614f7557614f75615010565b500390565b60005b83811015614f95578181015183820152602001614f7d565b8381111561095a5750506000910152565b600181811c90821680614fba57607f821691505b60208210811415614fdb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614ff557614ff5615010565b5060010190565b60008261500b5761500b615026565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612a3057600080fd5b8015158114612a3057600080fdfea2646970667358221220822092582e88bb76ba54ceb4953ed87c984ff6175d5a6a89fde0fee445b8d40a64736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103a35760003560e01c806379309658116101e9578063d53f62171161010f578063e78458c4116100ad578063f2fde38b1161007c578063f2fde38b1461089e578063f7fce334146108b1578063fcc0e381146108b9578063feb8eba5146108ce57600080fd5b8063e78458c414610838578063e9ec2e991461084b578063f1d20dd414610853578063f23a6e611461086657600080fd5b8063d9d98ce4116100e9578063d9d98ce4146107c6578063dd62ed3e146107d9578063e0a8b97a14610812578063e0b4a79a1461082557600080fd5b8063d53f621714610798578063d6ee4a93146107a0578063d8a06f73146107b357600080fd5b8063a9059cbb11610187578063c4a0db9611610156578063c4a0db961461074c578063c4ff52471461075f578063cce2f3fb14610772578063d0ebdbe71461078557600080fd5b8063a9059cbb146106e6578063b10402ea146106f9578063bc197c811461070c578063c3cb8c141461074457600080fd5b80638f878a43116101c35780638f878a43146106a557806395d89b41146106b85780639d54def6146106c0578063a457c2d7146106d357600080fd5b8063793096581461066b5780638c850814146106815780638da5cb5b1461069457600080fd5b806335dca76c116102ce57806354fd4d501161026c5780636b948a351161023b5780636b948a35146105f757806370a082311461060a578063715018a61461063357806372188e3f1461063b57600080fd5b806354fd4d50146105855780635877aee6146105be5780635cffe9de146105d1578063613255ab146105e457600080fd5b806344b28d59116102a857806344b28d591461053d57806345a0b65214610551578063481c6a75146105645780635035434a1461057757600080fd5b806335dca76c1461050f57806339509351146105175780633d5d190c1461052a57600080fd5b806313966db51161034657806323b872dd1161031557806323b872dd146104cf57806325705d8d146104e2578063313ce567146104f757806333194c0a1461050657600080fd5b806313966db514610436578063150b7a021461044c57806318160ddd1461049c5780631ba46cfd146104a457600080fd5b806306f26dc21161038257806306f26dc2146103ed57806306fdde03146103fb578063095ea7b3146104105780630d636a091461042357600080fd5b8062518161146103a857806301ffc9a7146103b257806304a66b48146103da575b600080fd5b6103b06108d6565b005b6103c56103c03660046149d6565b610960565b60405190151581526020015b60405180910390f35b6103b06103e8366004614bef565b6109c9565b610104546103c59060ff1681565b610403610a76565b6040516103d19190614e5e565b6103c561041e3660046146c9565b610b08565b6103b061043136600461494e565b610b1e565b61043e610c92565b6040519081526020016103d1565b61048361045a3660046145f8565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040516001600160e01b031990911681526020016103d1565b60675461043e565b60fd546104b7906001600160a01b031681565b6040516001600160a01b0390911681526020016103d1565b6103c56104dd3660046145b8565b610d27565b6104ea610df2565b6040516103d19190614da3565b604051601281526020016103d1565b61043e60fb5481565b61043e610eb1565b6103c56105253660046146c9565b610f45565b61043e6105383660046146f4565b610f7c565b610104546103c59062010000900460ff1681565b61043e61055f366004614add565b610ff6565b60fc546104b7906001600160a01b031681565b610108546103c59060ff1681565b60408051808201909152600681527f76312e302e3500000000000000000000000000000000000000000000000000006020820152610403565b6104b76105cc366004614bb2565b611004565b6103c56105df3660046149fe565b611219565b61043e6105f236600461449e565b611231565b610104546103c590610100900460ff1681565b61043e61061836600461449e565b6001600160a01b031660009081526065602052604090205490565b6103b0611259565b6106436112fd565b604080519586526020860194909452928401919091526060830152608082015260a0016103d1565b610104546103c590640100000000900460ff1681565b6104ea61068f36600461489b565b611397565b6033546001600160a01b03166104b7565b60ff546104b7906001600160a01b031681565b61040361163c565b6104ea6106ce366004614b75565b61164b565b6103c56106e13660046146c9565b61185d565b6103c56106f43660046146c9565b611910565b61043e610707366004614826565b61191d565b61048361071a36600461450e565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b6103b0611a76565b6104ea61075a366004614b2b565b611a82565b610108546103c590610100900460ff1681565b6103b061078036600461449e565b611acb565b6103b061079336600461449e565b611c12565b61043e611c6e565b6104ea6107ae36600461475d565b611d02565b60fe546104b7906001600160a01b031681565b61043e6107d43660046146c9565b611daf565b61043e6107e73660046144d6565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b6103b0610820366004614a13565b611e12565b6103b0610833366004614af5565b611edc565b6103b0610846366004614a70565b611f4f565b61043e6121a5565b6103c56108613660046147f3565b6121b7565b610483610874366004614662565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b6103b06108ac36600461449e565b612289565b61043e6123bb565b610104546103c5906301000000900460ff1681565b61043e612450565b6108de6124e5565b60fe5460fb546040517fc182f2b20000000000000000000000000000000000000000000000000000000081526001600160a01b039092169163c182f2b29161092c9160040190815260200190565b600060405180830381600087803b15801561094657600080fd5b505af115801561095a573d6000803e3d6000fd5b50505050565b60006001600160e01b031982167f4e2312e00000000000000000000000000000000000000000000000000000000014806109c357507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6109d16124e5565b60fe5460fb546040517f219962d200000000000000000000000000000000000000000000000000000000815260048101919091526024810187905260448101869052606481018590526084810184905260a481018390526001600160a01b039091169063219962d29060c401600060405180830381600087803b158015610a5757600080fd5b505af1158015610a6b573d6000803e3d6000fd5b505050505050505050565b606060688054610a8590614fa6565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab190614fa6565b8015610afe5780601f10610ad357610100808354040283529160200191610afe565b820191906000526020600020905b815481529060010190602001808311610ae157829003601f168201915b5050505050905090565b6000610b153384846125a9565b50600192915050565b610b266124e5565b610104805463ffff000019166201000087151590810263ff0000001916919091176301000000871515021764ff0000000019166401000000008615150217909155610108805461ffff191684151561ff00191617610100841515021790556040519081527fc604be2f834727754dc1ec1225c14d1ecde48e7d12fa7b745dfb137a3db998bd9060200160405180910390a160405184151581527f835d9397f97f5df575f718046bb3e918f911d39d7edfa79aa8d40ddc7d5ce2a59060200160405180910390a160405183151581527f64b60f32742df47d4ccb5b31ca12fee1bc20695467bfe8fa058b00ec446c15639060200160405180910390a160405182151581527f7e8b58aeb3d1d3a1777185c996f374a5d3c46ef3cd25a07ec6eb2569488d50589060200160405180910390a160405181151581527fbfb092a6cb2d49526b6982acab35d64782cf1c05f8c8f0dd88008b288bfa5af59060200160405180910390a15050505050565b60fe5460fb54604051632206137960e01b815260009283926001600160a01b0390911691632206137991610ccc9160040190815260200190565b60a06040518083038186803b158015610ce457600080fd5b505afa158015610cf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1c9190614c29565b509295945050505050565b6000610d34848484612702565b6001600160a01b038416600090815260666020908152604080832033845290915290205482811015610dd35760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610de78533610de28685614f63565b6125a9565b506001949350505050565b60606000610e01610105612923565b905060008167ffffffffffffffff811115610e2c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610e55578160200160208202803683370190505b50905060005b82811015610eaa57610e6f6101058261292d565b828281518110610e8f57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152610ea381614fe1565b9050610e5b565b5092915050565b60fe5460fb54604051632206137960e01b815260009283926001600160a01b0390911691632206137991610eeb9160040190815260200190565b60a06040518083038186803b158015610f0357600080fd5b505afa158015610f17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3b9190614c29565b9695505050505050565b3360008181526066602090815260408083206001600160a01b03871684529091528120549091610b15918590610de2908690614f18565b6000610fed8585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080890282810182019093528882529093508892508791829185019084908082843760009201919091525033925061191d915050565b95945050505050565b60006109c36101058361292d565b600061100e6124e5565b60ff546001600160a01b03161561108d5760405162461bcd60e51b815260206004820152602260248201527f4e4654585661756c743a20656c69676962696c69747920616c7265616479207360448201527f65740000000000000000000000000000000000000000000000000000000000006064820152608401610dca565b60fe54604080517f14c77faa00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916314c77faa916004808301926020929190829003018186803b1580156110eb57600080fd5b505afa1580156110ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112391906144ba565b90506000816001600160a01b031663576ff9088787876040518463ffffffff1660e01b815260040161115793929190614ecd565b602060405180830381600087803b15801561117157600080fd5b505af1158015611185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a991906144ba565b60ff80546001600160a01b0319166001600160a01b038316908117909155610104805461ff00191690556040805189815260208101929092529192507fe14c63b3d4272158635bee1d1b95b51bb8de042ee95a15cbfaf2865b4d0af811910160405180910390a195945050505050565b60006112256004612939565b610fed85858585612a33565b60006001600160a01b038216301461124a5760006109c3565b6067546109c390600019614f63565b6033546001600160a01b031633146112b35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dca565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b60fe5460fb54604051632206137960e01b8152600481019190915260009182918291829182916001600160a01b03169063220613799060240160a06040518083038186803b15801561134e57600080fd5b505afa158015611362573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113869190614c29565b945094509450945094509091929394565b6060600260c95414156113ec5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610dca565b600260c9556113fb6003612939565b61140433612c57565b6101045460009060ff16156114c05760005b86518110156114ba57600086828151811061144157634e487b7160e01b600052603260045260246000fd5b60200260200101519050806000141561149c5760405162461bcd60e51b815260206004820152601b60248201527f4e4654585661756c743a207472616e7366657272696e67203c203100000000006044820152606401610dca565b6114a68184614f18565b925050806114b390614fe1565b9050611416565b506114c4565b5084515b83518114806114d657506101085460ff165b6115225760405162461bcd60e51b815260206004820152601f60248201527f4e4654585661756c743a2052616e646f6d20737761702064697361626c6564006044820152606401610dca565b83511580611538575061010854610100900460ff165b6115845760405162461bcd60e51b815260206004820152601f60248201527f4e4654585661756c743a2054617267657420737761702064697361626c6564006044820152606401610dca565b60008061158f6112fd565b9450945050505060008651846115a59190614f63565b6115af9084614f44565b87516115bb9084614f44565b6115c59190614f18565b90506115d13382612cc4565b60006115de858989612e67565b90506115ea8a8a613075565b507f66982ed4a058811a8004bdcec9adcb3671f2b4f1a788667a3a74959d7c09af3c8a8a8a848b604051611622959493929190614df5565b60405180910390a1600160c9559998505050505050505050565b606060698054610a8590614fa6565b6060600260c95414156116a05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610dca565b600260c98190556116b090612939565b6116b933612c57565b82518414806116d25750610104546301000000900460ff165b61172a5760405162461bcd60e51b8152602060048201526024808201527f4e4654585661756c743a2052616e646f6d2072656465656d206e6f7420656e61604482015263189b195960e21b6064820152608401610dca565b82511580611743575061010454640100000000900460ff165b61179b5760405162461bcd60e51b8152602060048201526024808201527f4e4654585661756c743a205461726765742072656465656d206e6f7420656e61604482015263189b195960e21b6064820152608401610dca565b6117b6336117b186670de0b6b3a7640000614f44565b6132f7565b6000806117c16112fd565b5050925092505060008551876117d79190614f63565b6117e19084614f44565b86516117ed9084614f44565b6117f79190614f18565b90506118033382612cc4565b6000611810888888612e67565b90507f63b13f6307f284441e029836b0c22eb91eb62a7ad555670061157930ce884f4e81888860405161184593929190614db6565b60405180910390a1600160c955979650505050505050565b3360009081526066602090815260408083206001600160a01b0386168452909152812054828110156118f75760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610dca565b6119063385610de28685614f63565b5060019392505050565b6000610b15338484612702565b6000600260c95414156119725760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610dca565b600260c9556119816001612939565b61198a33612c57565b6101045462010000900460ff166119e35760405162461bcd60e51b815260206004820152601360248201527f4d696e74696e67206e6f7420656e61626c6564000000000000000000000000006044820152606401610dca565b60006119ef8585613075565b9050611a0c83611a0783670de0b6b3a7640000614f44565b61347d565b600081611a17610c92565b611a219190614f44565b9050611a2d8482612cc4565b7f1f72ad2a14447fa756b6f5aca53504645af79813493aca2d906b69e4aaeb9492868686604051611a6093929190614db6565b60405180910390a150600160c955949350505050565b611a806000611c12565b565b6060611ac38484848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525033925061164b915050565b949350505050565b6033546001600160a01b03163314611b255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dca565b6000670de0b6b3a7640000611b3960675490565b611b439190614f30565b905060048110611b955760405162461bcd60e51b815260206004820152600e60248201527f746f6f206d616e79206974656d730000000000000000000000000000000000006044820152606401610dca565b604080516000815260208101909152611baf828285612e67565b5060fd54604080516001600160a01b0392831681526020810185905291851682820152517f1f6d756c685d4969a551099165b59f836b4d2cc7e036e623f0248c28bff91db59181900360600190a1505060fd80546001600160a01b031916905550565b611c1a6124e5565b60fc80546001600160a01b0319166001600160a01b0383169081179091556040519081527f60a0f5b9f9e81e98216071b85826681c796256fe3d1354ecb675580fba64fa699060200160405180910390a150565b60fe5460fb54604051632206137960e01b815260009283926001600160a01b0390911691632206137991611ca89160040190815260200190565b60a06040518083038186803b158015611cc057600080fd5b505afa158015611cd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf89190614c29565b5095945050505050565b6060611da487878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a92508991829185019084908082843760009201919091525050604080516020808a02828101820190935289825290935089925088918291850190849080828437600092019190915250339250611397915050565b979650505050505050565b60006001600160a01b0383163014611e095760405162461bcd60e51b815260206004820152601b60248201527f4552433230466c6173684d696e743a2077726f6e6720746f6b656e00000000006044820152606401610dca565b50600092915050565b611e1a6124e5565b7f1b92808356942344452465ae2648676199ae4c2fe413605353e51ff008e6f2ce611e43610a76565b611e4b61163c565b86868686604051611e6196959493929190614e71565b60405180910390a161095a84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152925086915085908190840183828082843760009201919091525061355c92505050565b6033546001600160a01b03163314611f365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dca565b611f4082846132f7565b611f4a818461347d565b505050565b600054610100900460ff1680611f68575060005460ff16155b611fcb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff16158015611fed576000805461ffff19166101011790555b611ff5613583565b611fff8686613645565b6001600160a01b0384166120555760405162461bcd60e51b815260206004820152601360248201527f417373657420213d2061646472657373283029000000000000000000000000006044820152606401610dca565b60fd80546001600160a01b03199081166001600160a01b0387161790915560fe805433921682179055604080517f264a6208000000000000000000000000000000000000000000000000000000008152905163264a620891600480820192602092909190829003018186803b1580156120cd57600080fd5b505afa1580156120e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210591906149be565b60fb8190556101048054841515610100810261ff001988151590811661ffff199094169390931717909255604080516001600160a01b038916815260208101929092528101919091527f18ecce5c418b882a3d89e5b6cc8100dc3383309b8e78525266fe1283a7f934d69060600160405180910390a261218b6001806001806001610b1e565b801561219d576000805461ff00191690555b505050505050565b60006121b2610105612923565b905090565b61010454600090610100900460ff16156121d357506001919050565b60ff546001600160a01b0316806121ed5750600092915050565b6040517f84ca9f850000000000000000000000000000000000000000000000000000000081526001600160a01b038216906384ca9f8590612232908690600401614da3565b60206040518083038186803b15801561224a57600080fd5b505afa15801561225e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122829190614932565b9392505050565b6033546001600160a01b031633146122e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dca565b6001600160a01b03811661235f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610dca565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b60fe5460fb54604051632206137960e01b815260009283926001600160a01b03909116916322061379916123f59160040190815260200190565b60a06040518083038186803b15801561240d57600080fd5b505afa158015612421573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124459190614c29565b509195945050505050565b60fe5460fb54604051632206137960e01b815260009283926001600160a01b039091169163220613799161248a9160040190815260200190565b60a06040518083038186803b1580156124a257600080fd5b505afa1580156124b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124da9190614c29565b509095945050505050565b60fc546001600160a01b031661254f576033546001600160a01b03163314611a805760405162461bcd60e51b815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610dca565b60fc546001600160a01b03163314611a805760405162461bcd60e51b815260206004820152600b60248201527f4e6f74206d616e616765720000000000000000000000000000000000000000006044820152606401610dca565b6001600160a01b0383166126245760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b0382166126a05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b0383811660008181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661277e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b0382166127fa5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b038316600090815260656020526040902054818110156128895760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610dca565b6128938282614f63565b6001600160a01b0380861660009081526065602052604080822093909355908516815290812080548492906128c9908490614f18565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161291591815260200190565b60405180910390a350505050565b60006109c3825490565b6000612282838361370b565b60fe546040517ff6aacfb1000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063f6aacfb19060240160206040518083038186803b15801561299657600080fd5b505afa1580156129aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ce9190614932565b15806129e457506033546001600160a01b031633145b612a305760405162461bcd60e51b815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610dca565b50565b600080612a408585611daf565b9050612a4c868561347d565b6040517f23e30c8b0000000000000000000000000000000000000000000000000000000081527f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9906001600160a01b038816906323e30c8b90612abb9033908a908a9088908b90600401614d6b565b602060405180830381600087803b158015612ad557600080fd5b505af1158015612ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b0d91906149be565b14612b7f5760405162461bcd60e51b8152602060048201526024808201527f4552433230466c6173684d696e743a20696e76616c69642072657475726e207660448201527f616c7565000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b0386166000908152606660209081526040808320308452909152902054612bad8286614f18565b811015612c225760405162461bcd60e51b815260206004820152602f60248201527f4552433230466c6173684d696e743a20616c6c6f77616e636520646f6573206e60448201527f6f7420616c6c6f7720726566756e6400000000000000000000000000000000006064820152608401610dca565b612c3c873084612c328986614f63565b610de29190614f63565b612c4a876117b18488614f18565b5060019695505050505050565b73bbc53022af15bb973ad906577c84784c47c143716001600160a01b0382161415612a305760405162461bcd60e51b815260206004820152601160248201527f43616c6c657220697320626c6f636b65640000000000000000000000000000006044820152606401610dca565b60fe546040517fdbe66ca00000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b0390911690819063dbe66ca09060240160206040518083038186803b158015612d2257600080fd5b505afa158015612d36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d5a9190614932565b15612d6457505050565b8115611f4a576000816001600160a01b0316630d43e8ad6040518163ffffffff1660e01b815260040160206040518083038186803b158015612da557600080fd5b505afa158015612db9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ddd91906144ba565b9050612dea848285612702565b60fb546040517f91c05b0b00000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b038216906391c05b0b90602401600060405180830381600087803b158015612e4957600080fd5b505af1158015612e5d573d6000803e3d6000fd5b5050505050505050565b6101045460fd5460609160ff16906001600160a01b031660008667ffffffffffffffff811115612ea757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612ed0578160200160208202803683370190505b50865190915060005b88811015613060576000828210612ef757612ef2613743565b612f20565b888281518110612f1757634e487b7160e01b600052603260045260246000fd5b60200260200101515b905080848381518110612f4357634e487b7160e01b600052603260045260246000fd5b602002602001018181525050851561303757600081815261010760205260408120805460019290612f75908490614f63565b909155505060008181526101076020526040902054612f9c57612f9a610105826137e1565b505b6040517ff242432a0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038981166024830152604482018390526001606483015260a06084830152600060a483015286169063f242432a9060c401600060405180830381600087803b15801561301a57600080fd5b505af115801561302e573d6000803e3d6000fd5b5050505061304f565b613043610105826137e1565b5061304f8589836137ed565b5061305981614fe1565b9050612ed9565b5061306a826139e1565b509695505050505050565b6000613080836121b7565b6130cc5760405162461bcd60e51b815260206004820152601760248201527f4e4654585661756c743a206e6f7420656c696769626c650000000000000000006044820152606401610dca565b82516101045460ff16156132805760fd546040517f2eb2c2d60000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690632eb2c2d690613129903390309089908990600401614d13565b600060405180830381600087803b15801561314357600080fd5b505af1158015613157573d6000803e3d6000fd5b505050506000805b8281101561327657600086828151811061318957634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008683815181106131b557634e487b7160e01b600052603260045260246000fd5b6020026020010151905080600014156132105760405162461bcd60e51b815260206004820152601b60248201527f4e4654585661756c743a207472616e7366657272696e67203c203100000000006044820152606401610dca565b600082815261010760205260409020546132325761323061010583613a69565b505b6000828152610107602052604081208054839290613251908490614f18565b9091555061326190508185614f18565b935050508061326f90614fe1565b905061315f565b5091506109c39050565b60fd546001600160a01b031660005b828110156132ec5760008682815181106132b957634e487b7160e01b600052603260045260246000fd5b602002602001015190506132cd8382613a75565b6132d961010582613a69565b5050806132e590614fe1565b905061328f565b5081925050506109c3565b6001600160a01b0382166133735760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610dca565b6001600160a01b038216600090815260656020526040902054818110156134025760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610dca565b61340c8282614f63565b6001600160a01b0384166000908152606560205260408120919091556067805484929061343a908490614f63565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016126f5565b6001600160a01b0382166134d35760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610dca565b80606760008282546134e59190614f18565b90915550506001600160a01b03821660009081526065602052604081208054839290613512908490614f18565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b815161356f90606890602085019061428d565b508051611f4a90606990602084019061428d565b600054610100900460ff168061359c575060005460ff16155b6135ff5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff16158015613621576000805461ffff19166101011790555b613629613e9f565b613631613f50565b8015612a30576000805461ff001916905550565b600054610100900460ff168061365e575060005460ff16155b6136c15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff161580156136e3576000805461ffff19166101011790555b6136eb613e9f565b6136f58383614045565b8015611f4a576000805461ff0019169055505050565b600082600001828154811061373057634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b600080613751610105612923565b61375c600143614f63565b61010054604080519240602084015282015241606090811b6bffffffffffffffffffffffff19169082015244607482015242609482015260b4016040516020818303038152906040528051906020012060001c6137b99190614ffc565b9050610100600081546137cb90614fe1565b909155506137db6101058261292d565b91505090565b60006122828383614121565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038616831415613890576040516001600160a01b03861660248201526044810185905260640160408051601f198184030181529190526020810180516001600160e01b03167fa9059cbb00000000000000000000000000000000000000000000000000000000179052905061395f565b816001600160a01b0316866001600160a01b03161415613910576040516001600160a01b03861660248201526044810185905260640160408051601f198184030181529190526020810180516001600160e01b03167f8b72a2ec00000000000000000000000000000000000000000000000000000000179052905061395f565b6040513060248201526001600160a01b03861660448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b0316632142170760e11b17905290505b600080876001600160a01b03168360405161397a9190614cf7565b6000604051808303816000865af19150503d80600081146139b7576040519150601f19603f3d011682016040523d82523d6000602084013e6139bc565b606091505b5091509150818190610a6b5760405162461bcd60e51b8152600401610dca9190614e5e565b60ff546001600160a01b0316806139f6575050565b6040517f5e2f9b520000000000000000000000000000000000000000000000000000000081526001600160a01b03821690635e2f9b5290613a3b908590600401614da3565b600060405180830381600087803b158015613a5557600080fd5b505af115801561219d573d6000803e3d6000fd5b6000612282838361423e565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038516831415613b15576040513360248201523060448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b03167f23b872dd000000000000000000000000000000000000000000000000000000001790529050613e1d565b816001600160a01b0316856001600160a01b03161415613cc057600084604051602401613b4491815260200190565b60408051601f198184030181529181526020820180516001600160e01b03167f58178168000000000000000000000000000000000000000000000000000000001790525190915060009081906001600160a01b03891690613ba6908590614cf7565b600060405180830381855afa9150503d8060008114613be1576040519150601f19603f3d011682016040523d82523d6000602084013e613be6565b606091505b5091509150600081806020019051810190613c0191906144ba565b9050828015613c1857506001600160a01b03811633145b613c645760405162461bcd60e51b815260206004820152601160248201527f4e6f7420746865204e4654206f776e65720000000000000000000000000000006044820152606401610dca565b6040516024810189905260440160408051601f198184030181529190526020810180516001600160e01b03167f8264fe98000000000000000000000000000000000000000000000000000000001790529450613e1d9350505050565b60fd546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810186905230916001600160a01b031690636352211e9060240160206040518083038186803b158015613d1d57600080fd5b505afa158015613d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d5591906144ba565b6001600160a01b03161415613dd757613d836101058560008181526001830160205260408120541515612282565b15613dd05760405162461bcd60e51b815260206004820152601a60248201527f547279696e6720746f2075736520616e206f776e6564204e46540000000000006044820152606401610dca565b5050505050565b6040513360248201523060448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b0316632142170760e11b17905290505b600080866001600160a01b031683604051613e389190614cf7565b6000604051808303816000865af19150503d8060008114613e75576040519150601f19603f3d011682016040523d82523d6000602084013e613e7a565b606091505b5091509150818190612e5d5760405162461bcd60e51b8152600401610dca9190614e5e565b600054610100900460ff1680613eb8575060005460ff16155b613f1b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff16158015613631576000805461ffff19166101011790558015612a30576000805461ff001916905550565b600054610100900460ff1680613f69575060005460ff16155b613fcc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff16158015613fee576000805461ffff19166101011790555b603380546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015612a30576000805461ff001916905550565b600054610100900460ff168061405e575060005460ff16155b6140c15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610dca565b600054610100900460ff161580156140e3576000805461ffff19166101011790555b82516140f690606890602086019061428d565b50815161410a90606990602085019061428d565b508015611f4a576000805461ff0019169055505050565b60008181526001830160205260408120548015614234576000614145600183614f63565b855490915060009061415990600190614f63565b90508181146141da57600086600001828154811061418757634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050808760000184815481106141b857634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b85548690806141f957634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506109c3565b60009150506109c3565b6000818152600183016020526040812054614285575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109c3565b5060006109c3565b82805461429990614fa6565b90600052602060002090601f0160209004810192826142bb5760008555614301565b82601f106142d457805160ff1916838001178555614301565b82800160010185558215614301579182015b828111156143015782518255916020019190600101906142e6565b5061430d929150614311565b5090565b5b8082111561430d5760008155600101614312565b60008083601f840112614337578182fd5b50813567ffffffffffffffff81111561434e578182fd5b6020830191508360208260051b850101111561436957600080fd5b9250929050565b600082601f830112614380578081fd5b8135602067ffffffffffffffff82111561439c5761439c61503c565b8160051b6143ab828201614ee7565b8381528281019086840183880185018910156143c5578687fd5b8693505b858410156143e75780358352600193909301929184019184016143c9565b50979650505050505050565b60008083601f840112614404578182fd5b50813567ffffffffffffffff81111561441b578182fd5b60208301915083602082850101111561436957600080fd5b600082601f830112614443578081fd5b813567ffffffffffffffff81111561445d5761445d61503c565b614470601f8201601f1916602001614ee7565b818152846020838601011115614484578283fd5b816020850160208301379081016020019190915292915050565b6000602082840312156144af578081fd5b813561228281615052565b6000602082840312156144cb578081fd5b815161228281615052565b600080604083850312156144e8578081fd5b82356144f381615052565b9150602083013561450381615052565b809150509250929050565b600080600080600060a08688031215614525578081fd5b853561453081615052565b9450602086013561454081615052565b9350604086013567ffffffffffffffff8082111561455c578283fd5b61456889838a01614370565b9450606088013591508082111561457d578283fd5b61458989838a01614370565b9350608088013591508082111561459e578283fd5b506145ab88828901614433565b9150509295509295909350565b6000806000606084860312156145cc578283fd5b83356145d781615052565b925060208401356145e781615052565b929592945050506040919091013590565b6000806000806080858703121561460d578384fd5b843561461881615052565b9350602085013561462881615052565b925060408501359150606085013567ffffffffffffffff81111561464a578182fd5b61465687828801614433565b91505092959194509250565b600080600080600060a08688031215614679578283fd5b853561468481615052565b9450602086013561469481615052565b93506040860135925060608601359150608086013567ffffffffffffffff8111156146bd578182fd5b6145ab88828901614433565b600080604083850312156146db578182fd5b82356146e681615052565b946020939093013593505050565b60008060008060408587031215614709578182fd5b843567ffffffffffffffff80821115614720578384fd5b61472c88838901614326565b90965094506020870135915080821115614744578384fd5b5061475187828801614326565b95989497509550505050565b60008060008060008060608789031215614775578384fd5b863567ffffffffffffffff8082111561478c578586fd5b6147988a838b01614326565b909850965060208901359150808211156147b0578586fd5b6147bc8a838b01614326565b909650945060408901359150808211156147d4578283fd5b506147e189828a01614326565b979a9699509497509295939492505050565b600060208284031215614804578081fd5b813567ffffffffffffffff81111561481a578182fd5b611ac384828501614370565b60008060006060848603121561483a578081fd5b833567ffffffffffffffff80821115614851578283fd5b61485d87838801614370565b94506020860135915080821115614872578283fd5b5061487f86828701614370565b925050604084013561489081615052565b809150509250925092565b600080600080608085870312156148b0578182fd5b843567ffffffffffffffff808211156148c7578384fd5b6148d388838901614370565b955060208701359150808211156148e8578384fd5b6148f488838901614370565b94506040870135915080821115614909578384fd5b5061491687828801614370565b925050606085013561492781615052565b939692955090935050565b600060208284031215614943578081fd5b815161228281615067565b600080600080600060a08688031215614965578283fd5b853561497081615067565b9450602086013561498081615067565b9350604086013561499081615067565b925060608601356149a081615067565b915060808601356149b081615067565b809150509295509295909350565b6000602082840312156149cf578081fd5b5051919050565b6000602082840312156149e7578081fd5b81356001600160e01b031981168114612282578182fd5b6000806000806080858703121561460d578182fd5b60008060008060408587031215614a28578182fd5b843567ffffffffffffffff80821115614a3f578384fd5b614a4b888389016143f3565b90965094506020870135915080821115614a63578384fd5b50614751878288016143f3565b600080600080600060a08688031215614a87578283fd5b853567ffffffffffffffff80821115614a9e578485fd5b614aaa89838a01614433565b96506020880135915080821115614abf578485fd5b50614acc88828901614433565b945050604086013561499081615052565b600060208284031215614aee578081fd5b5035919050565b600080600060608486031215614b09578081fd5b833592506020840135614b1b81615052565b9150604084013561489081615052565b600080600060408486031215614b3f578081fd5b83359250602084013567ffffffffffffffff811115614b5c578182fd5b614b6886828701614326565b9497909650939450505050565b600080600060608486031215614b89578081fd5b83359250602084013567ffffffffffffffff811115614ba6578182fd5b61487f86828701614370565b600080600060408486031215614bc6578081fd5b83359250602084013567ffffffffffffffff811115614be3578182fd5b614b68868287016143f3565b600080600080600060a08688031215614c06578283fd5b505083359560208501359550604085013594606081013594506080013592509050565b600080600080600060a08688031215614c40578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6000815180845260208085019450808401835b83811015614c9757815187529582019590820190600101614c7b565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008151808452614ce3816020860160208601614f7a565b601f01601f19169290920160200192915050565b60008251614d09818460208701614f7a565b9190910192915050565b60006001600160a01b03808716835280861660208401525060a06040830152614d3f60a0830185614c68565b8281036060840152614d518185614c68565b838103608090940193909352508152602001949350505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152611da460a0830184614ccb565b6020815260006122826020830184614c68565b606081526000614dc96060830186614c68565b8281036020840152614ddb8186614c68565b9150506001600160a01b0383166040830152949350505050565b60a081526000614e0860a0830188614c68565b8281036020840152614e1a8188614c68565b90508281036040840152614e2e8187614c68565b90508281036060840152614e428186614c68565b9150506001600160a01b03831660808301529695505050505050565b6020815260006122826020830184614ccb565b608081526000614e846080830189614ccb565b8281036020840152614e968189614ccb565b90508281036040840152614eab818789614ca2565b90508281036060840152614ec0818587614ca2565b9998505050505050505050565b838152604060208201526000610fed604083018486614ca2565b604051601f8201601f1916810167ffffffffffffffff81118282101715614f1057614f1061503c565b604052919050565b60008219821115614f2b57614f2b615010565b500190565b600082614f3f57614f3f615026565b500490565b6000816000190483118215151615614f5e57614f5e615010565b500290565b600082821015614f7557614f75615010565b500390565b60005b83811015614f95578181015183820152602001614f7d565b8381111561095a5750506000910152565b600181811c90821680614fba57607f821691505b60208210811415614fdb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614ff557614ff5615010565b5060010190565b60008261500b5761500b615026565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612a3057600080fd5b8015158114612a3057600080fdfea2646970667358221220822092582e88bb76ba54ceb4953ed87c984ff6175d5a6a89fde0fee445b8d40a64736f6c63430008040033
Deployed Bytecode Sourcemap
66875:21288:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70507:136;;;:::i;:::-;;42158:269;;;;;;:::i;:::-;;:::i;:::-;;;25913:14:1;;25906:22;25888:41;;25876:2;25861:18;42158:269:0;;;;;;;;70130:369;;;;;;:::i;:::-;;:::i;67566:27::-;;;;;;;;;23453:100;;;:::i;:::-;;;;;;;:::i;25620:169::-;;;;;;:::i;:::-;;:::i;69348:774::-;;;;;;:::i;:::-;;:::i;77209:170::-;;;:::i;:::-;;;40302:25:1;;;40290:2;40275:18;77209:170:0;40257:76:1;37292:216:0;;;;;;:::i;:::-;37470:30;37292:216;;;;;;;;;;-1:-1:-1;;;;;;26102:79:1;;;26084:98;;26072:2;26057:18;37292:216:0;26039:149:1;24573:108:0;24661:12;;24573:108;;67282:36;;;;;-1:-1:-1;;;;;67282:36:0;;;;;;-1:-1:-1;;;;;20149:55:1;;;20131:74;;20119:2;20104:18;67282:36:0;20086:125:1;26271:422:0;;;;;;:::i;:::-;;:::i;78984:306::-;;;:::i;:::-;;;;;;;:::i;24415:93::-;;;24498:2;42110:36:1;;42098:2;42083:18;24415:93:0;42065:87:1;67206:31:0;;;;;;77988:188;;;:::i;27102:215::-;;;;;;:::i;:::-;;:::i;72695:235::-;;;;;;:::i;:::-;;:::i;67641:31::-;;;;;;;;;;;;78810:141;;;;;;:::i;:::-;;:::i;67244:31::-;;;;;-1:-1:-1;;;;;67244:31:0;;;67870:37;;;;;;;;;79473:91;79541:15;;;;;;;;;;;;;;;;;79473:91;;70900:835;;;;;;:::i;:::-;;:::i;76904:297::-;;;;;;:::i;:::-;;:::i;33327:164::-;;;;;;:::i;:::-;;:::i;67600:34::-;;;;;;;;;;;;24744:127;;;;;;:::i;:::-;-1:-1:-1;;;;;24845:18:0;24818:7;24845:18;;;:9;:18;;;;;;;24744:127;53709:148;;;:::i;78184:161::-;;;:::i;:::-;;;;41219:25:1;;;41275:2;41260:18;;41253:34;;;;41303:18;;;41296:34;;;;41361:2;41346:18;;41339:34;41404:3;41389:19;;41382:35;41206:3;41191:19;78184:161:0;41173:250:1;67725:39:0;;;;;;;;;;;;75367:1529;;;;;;:::i;:::-;;:::i;53058:87::-;53131:6;;-1:-1:-1;;;;;53131:6:0;53058:87;;67378:51;;;;;-1:-1:-1;;;;;67378:51:0;;;23672:104;;;:::i;73834:1215::-;;;;;;:::i;:::-;;:::i;27820:377::-;;;;;;:::i;:::-;;:::i;25084:175::-;;;;;;:::i;:::-;;:::i;72938:655::-;;;;;;:::i;:::-;;:::i;42855:212::-;;;;;;:::i;:::-;43023:36;42855:212;;;;;;;;68951:92;;;:::i;73601:225::-;;;;;;:::i;:::-;;:::i;67914:37::-;;;;;;;;;;;;87781:379;;;;;;:::i;:::-;;:::i;72525:162::-;;;;;;:::i;:::-;;:::i;77791:189::-;;;:::i;75061:298::-;;;;;;:::i;:::-;;:::i;67325:46::-;;;;;-1:-1:-1;;;;;67325:46:0;;;33890:297;;;;;;:::i;:::-;;:::i;25322:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;25438:18:0;;;25411:7;25438:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;25322:151;69076:264;;;;;;:::i;:::-;;:::i;87624:149::-;;;;;;:::i;:::-;;:::i;68142:801::-;;;;;;:::i;:::-;;:::i;79323:117::-;;;:::i;78353:449::-;;;;;;:::i;:::-;;:::i;42663:184::-;;;;;;:::i;:::-;42808:31;42663:184;;;;;;;;54012:244;;;;;;:::i;:::-;;:::i;77387:194::-;;;:::i;67679:39::-;;;;;;;;;;;;77589:194;;;:::i;70507:136::-;70570:16;:14;:16::i;:::-;70597:12;;70627:7;;70597:38;;;;;-1:-1:-1;;;;;70597:12:0;;;;:29;;:38;;;;40302:25:1;;;40290:2;40275:18;;40257:76;70597:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70507:136::o;42158:269::-;42282:4;-1:-1:-1;;;;;;42306:60:0;;42321:45;42306:60;;:113;;-1:-1:-1;41796:36:0;-1:-1:-1;;;;;;41781:51:0;;;42383:36;42299:120;42158:269;-1:-1:-1;;42158:269:0:o;70130:369::-;70352:16;:14;:16::i;:::-;70379:12;;70405:7;;70379:112;;;;;;;;41715:25:1;;;;41756:18;;;41749:34;;;41799:18;;;41792:34;;;41842:18;;;41835:34;;;41885:19;;;41878:35;;;41929:19;;;41922:35;;;-1:-1:-1;;;;;70379:12:0;;;;:25;;41687:19:1;;70379:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70130:369;;;;;:::o;23453:100::-;23507:13;23540:5;23533:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23453:100;:::o;25620:169::-;25703:4;25720:39;20666:10;25743:7;25752:6;25720:8;:39::i;:::-;-1:-1:-1;25777:4:0;25620:169;;;;:::o;69348:774::-;69579:16;:14;:16::i;:::-;69606:10;:24;;-1:-1:-1;;69641:40:0;69606:24;;;;;;;-1:-1:-1;;69641:40:0;;;;;;;;;;;-1:-1:-1;;69692:40:0;;;;;;;;;;69743:16;:36;;-1:-1:-1;;69790:36:0;69743;;;-1:-1:-1;;69790:36:0;;69606:24;69790:36;;;;;;;69844:30;;25888:41:1;;;69844:30:0;;25876:2:1;25861:18;69844:30:0;;;;;;;69890:46;;25913:14:1;;25906:22;25888:41;;69890:46:0;;25876:2:1;25861:18;69890:46:0;;;;;;;69952;;25913:14:1;;25906:22;25888:41;;69952:46:0;;25876:2:1;25861:18;69952:46:0;;;;;;;70014:42;;25913:14:1;;25906:22;25888:41;;70014:42:0;;25876:2:1;25861:18;70014:42:0;;;;;;;70072;;25913:14:1;;25906:22;25888:41;;70072:42:0;;25876:2:1;25861:18;70072:42:0;;;;;;;69348:774;;;;;:::o;77209:170::-;77314:12;;77337:7;;77314:31;;-1:-1:-1;;;77314:31:0;;77266:7;;;;-1:-1:-1;;;;;77314:12:0;;;;:22;;:31;;;;40302:25:1;;;40290:2;40275:18;;40257:76;77314:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77286:59:0;;77209:170;-1:-1:-1;;;;;77209:170:0:o;26271:422::-;26377:4;26394:36;26404:6;26412:9;26423:6;26394:9;:36::i;:::-;-1:-1:-1;;;;;26470:19:0;;26443:24;26470:19;;;:11;:19;;;;;;;;20666:10;26470:33;;;;;;;;26522:26;;;;26514:79;;;;-1:-1:-1;;;26514:79:0;;34303:2:1;26514:79:0;;;34285:21:1;34342:2;34322:18;;;34315:30;34381:34;34361:18;;;34354:62;34452:10;34432:18;;;34425:38;34480:19;;26514:79:0;;;;;;;;;26604:57;26613:6;20666:10;26635:25;26654:6;26635:16;:25;:::i;:::-;26604:8;:57::i;:::-;-1:-1:-1;26681:4:0;;26271:422;-1:-1:-1;;;;26271:422:0:o;78984:306::-;79047:16;79076:11;79090:17;:8;:15;:17::i;:::-;79076:31;;79118:24;79159:3;79145:18;;;;;;-1:-1:-1;;;79145:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;79145:18:0;;79118:45;;79179:9;79174:84;79194:3;79190:1;:7;79174:84;;;79232:14;:8;79244:1;79232:11;:14::i;:::-;79219:7;79227:1;79219:10;;;;;;-1:-1:-1;;;79219:10:0;;;;;;;;;;;;;;;;;;:27;79199:3;;;:::i;:::-;;;79174:84;;;-1:-1:-1;79275:7:0;78984:306;-1:-1:-1;;78984:306:0:o;77988:188::-;78105:12;;78128:7;;78105:31;;-1:-1:-1;;;78105:31:0;;78051:7;;;;-1:-1:-1;;;;;78105:12:0;;;;:22;;:31;;;;40302:25:1;;;40290:2;40275:18;;40257:76;78105:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78071:65;77988:188;-1:-1:-1;;;;;;77988:188:0:o;27102:215::-;20666:10;27190:4;27239:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;27239:34:0;;;;;;;;;;27190:4;;27207:80;;27230:7;;27239:47;;27276:10;;27239:47;:::i;72695:235::-;72858:7;72885:37;72892:8;;72885:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;72885:37:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72902:7:0;;-1:-1:-1;72902:7:0;;;;72885:37;;;72902:7;;72885:37;72902:7;72885:37;;;;;;;;;-1:-1:-1;72911:10:0;;-1:-1:-1;72885:6:0;;-1:-1:-1;;72885:37:0:i;:::-;72878:44;72695:235;-1:-1:-1;;;;;72695:235:0:o;78810:141::-;78890:7;78917:26;:8;78929:13;78917:11;:26::i;70900:835::-;71040:7;71060:16;:14;:16::i;:::-;71117:18;;-1:-1:-1;;;;;71117:18:0;71109:41;71087:125;;;;-1:-1:-1;;;71087:125:0;;33129:2:1;71087:125:0;;;33111:21:1;33168:2;33148:18;;;33141:30;33207:34;33187:18;;;33180:62;33278:4;33258:18;;;33251:32;33300:19;;71087:125:0;33101:224:1;71087:125:0;71299:12;;:33;;;;;;;;71223:35;;-1:-1:-1;;;;;71299:12:0;;:31;;:33;;;;;;;;;;;;;;:12;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71223:120;;71354:20;71377:11;-1:-1:-1;;;;;71377:29:0;;71421:11;71447:8;;71377:89;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71477:18;:51;;-1:-1:-1;;;;;;71477:51:0;-1:-1:-1;;;;;71477:51:0;;;;;;;;71614:13;:21;;-1:-1:-1;;71614:21:0;;;71651:46;;;40512:25:1;;;40568:2;40553:18;;40546:83;;;;71477:51:0;;-1:-1:-1;71651:46:0;;40485:18:1;71651:46:0;;;;;;;71715:12;70900:835;-1:-1:-1;;;;;70900:835:0:o;76904:297::-;77092:4;77109:20;77127:1;77109:17;:20::i;:::-;77147:46;77163:8;77173:5;77180:6;77188:4;77147:15;:46::i;33327:164::-;33394:7;-1:-1:-1;;;;;33421:22:0;;33438:4;33421:22;:62;;33482:1;33421:62;;;24661:12;;33446:33;;-1:-1:-1;;33446:33:0;:::i;53709:148::-;53131:6;;-1:-1:-1;;;;;53131:6:0;20666:10;53278:23;53270:68;;;;-1:-1:-1;;;53270:68:0;;34712:2:1;53270:68:0;;;34694:21:1;;;34731:18;;;34724:30;34790:34;34770:18;;;34763:62;34842:18;;53270:68:0;34684:182:1;53270:68:0;53800:6:::1;::::0;53779:40:::1;::::0;53816:1:::1;::::0;-1:-1:-1;;;;;53800:6:0::1;::::0;53779:40:::1;::::0;53816:1;;53779:40:::1;53830:6;:19:::0;;-1:-1:-1;;;;;;53830:19:0::1;::::0;;53709:148::o;78184:161::-;78306:12;;78329:7;;78306:31;;-1:-1:-1;;;78306:31:0;;;;;40302:25:1;;;;78243:7:0;;;;;;;;;;-1:-1:-1;;;;;78306:12:0;;:22;;40275:18:1;;78306:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78299:38;;;;;;;;;;78184:161;;;;;:::o;75367:1529::-;75599:16;56073:1;56836:7;;:19;;56828:63;;;;-1:-1:-1;;;56828:63:0;;38065:2:1;56828:63:0;;;38047:21:1;38104:2;38084:18;;;38077:30;38143:33;38123:18;;;38116:61;38194:18;;56828:63:0;38037:181:1;56828:63:0;56073:1;56969:7;:18;75628:20:::1;75646:1;75628:17;:20::i;:::-;75659:34;75682:10;75659:22;:34::i;:::-;75732:6;::::0;75704:13:::1;::::0;75732:6:::1;;75728:302;;;75760:9;75755:208;75775:8;:15;75771:1;:19;75755:208;;;75816:14;75833:7;75841:1;75833:10;;;;;;-1:-1:-1::0;;;75833:10:0::1;;;;;;;;;;;;;;;75816:27;;75870:6;75880:1;75870:11;;75862:51;;;::::0;-1:-1:-1;;;75862:51:0;;32008:2:1;75862:51:0::1;::::0;::::1;31990:21:1::0;32047:2;32027:18;;;32020:30;32086:29;32066:18;;;32059:57;32133:18;;75862:51:0::1;31980:177:1::0;75862:51:0::1;75932:15;75941:6:::0;75932:15;::::1;:::i;:::-;;;75755:208;75792:3;;;;:::i;:::-;;;75755:208;;;;75728:302;;;-1:-1:-1::0;76003:15:0;;75728:302:::1;76073:11;:18;76064:5;:27;:47;;;-1:-1:-1::0;76095:16:0::1;::::0;::::1;;76064:47;76042:128;;;::::0;-1:-1:-1;;;76042:128:0;;32769:2:1;76042:128:0::1;::::0;::::1;32751:21:1::0;32808:2;32788:18;;;32781:30;32847:33;32827:18;;;32820:61;32898:18;;76042:128:0::1;32741:181:1::0;76042:128:0::1;76203:18:::0;;:23;;:43:::1;;-1:-1:-1::0;76230:16:0::1;::::0;::::1;::::0;::::1;;;76203:43;76181:124;;;::::0;-1:-1:-1;;;76181:124:0;;30948:2:1;76181:124:0::1;::::0;::::1;30930:21:1::0;30987:2;30967:18;;;30960:30;31026:33;31006:18;;;30999:61;31077:18;;76181:124:0::1;30920:181:1::0;76181:124:0::1;76324:22;76348::::0;76374:11:::1;:9;:11::i;:::-;76318:67;;;;;;;76396:16;76496:11;:18;76488:5;:26;;;;:::i;:::-;76470:45;::::0;:14;:45:::1;:::i;:::-;76433:18:::0;;76416:35:::1;::::0;:14;:35:::1;:::i;:::-;76415:111;;;;:::i;:::-;76396:130;;76537:46;76562:10;76574:8;76537:24;:46::i;:::-;76697:20;76720:38;76735:5;76742:11;76755:2;76720:14;:38::i;:::-;76697:61;;76771:30;76783:8;76793:7;76771:11;:30::i;:::-;;76819:48;76827:8;76837:7;76846:11;76859:3;76864:2;76819:48;;;;;;;;;;:::i;:::-;;;;;;;;56029:1:::0;57148:7;:22;76885:3;75367:1529;-1:-1:-1;;;;;;;;;75367:1529:0:o;23672:104::-;23728:13;23761:7;23754:14;;;;;:::i;73834:1215::-;74001:16;56073:1;56836:7;;:19;;56828:63;;;;-1:-1:-1;;;56828:63:0;;38065:2:1;56828:63:0;;;38047:21:1;38104:2;38084:18;;;38077:30;38143:33;38123:18;;;38116:61;38194:18;;56828:63:0;38037:181:1;56828:63:0;56073:1;56969:7;:18;;;74035:20:::1;::::0;:17:::1;:20::i;:::-;74066:34;74089:10;74066:22;:34::i;:::-;74143:11;:18;74133:6;:28;:50;;;-1:-1:-1::0;74165:18:0::1;::::0;;;::::1;;;74133:50;74111:136;;;::::0;-1:-1:-1;;;74111:136:0;;35823:2:1;74111:136:0::1;::::0;::::1;35805:21:1::0;35862:2;35842:18;;;35835:30;35901:34;35881:18;;;35874:62;-1:-1:-1;;;35952:18:1;;;35945:34;35996:19;;74111:136:0::1;35795:226:1::0;74111:136:0::1;74280:18:::0;;:23;;:45:::1;;-1:-1:-1::0;74307:18:0::1;::::0;;;::::1;;;74280:45;74258:131;;;::::0;-1:-1:-1;;;74258:131:0;;39953:2:1;74258:131:0::1;::::0;::::1;39935:21:1::0;39992:2;39972:18;;;39965:30;40031:34;40011:18;;;40004:62;-1:-1:-1;;;40082:18:1;;;40075:34;40126:19;;74258:131:0::1;39925:226:1::0;74258:131:0::1;74488:32;74494:10;74506:13;74513:6:::0;67191::::1;74506:13;:::i;:::-;74488:5;:32::i;:::-;74571:24;74597::::0;74628:11:::1;:9;:11::i;:::-;74568:71;;;;;;;74650:16;74755:11;:18;74746:6;:27;;;;:::i;:::-;74726:48;::::0;:16;:48:::1;:::i;:::-;74689:18:::0;;74670:37:::1;::::0;:16;:37:::1;:::i;:::-;74669:116;;;;:::i;:::-;74650:135;;74796:46;74821:10;74833:8;74796:24;:46::i;:::-;74888:28;74919:39;74934:6;74942:11;74955:2;74919:14;:39::i;:::-;74888:70;;74974:38;74983:11;74996;75009:2;74974:38;;;;;;;;:::i;:::-;;;;;;;;56029:1:::0;57148:7;:22;75030:11;73834:1215;-1:-1:-1;;;;;;;73834:1215:0:o;27820:377::-;20666:10;27913:4;27957:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;27957:34:0;;;;;;;;;;28010:35;;;;28002:85;;;;-1:-1:-1;;;28002:85:0;;39187:2:1;28002:85:0;;;39169:21:1;39226:2;39206:18;;;39199:30;39265:34;39245:18;;;39238:62;39336:7;39316:18;;;39309:35;39361:19;;28002:85:0;39159:227:1;28002:85:0;28098:67;20666:10;28121:7;28130:34;28149:15;28130:16;:34;:::i;28098:67::-;-1:-1:-1;28185:4:0;;27820:377;-1:-1:-1;;;27820:377:0:o;25084:175::-;25170:4;25187:42;20666:10;25211:9;25222:6;25187:9;:42::i;72938:655::-;73131:7;56073:1;56836:7;;:19;;56828:63;;;;-1:-1:-1;;;56828:63:0;;38065:2:1;56828:63:0;;;38047:21:1;38104:2;38084:18;;;38077:30;38143:33;38123:18;;;38116:61;38194:18;;56828:63:0;38037:181:1;56828:63:0;56073:1;56969:7;:18;73151:20:::1;73169:1;73151:17;:20::i;:::-;73182:34;73205:10;73182:22;:34::i;:::-;73235:10;::::0;;;::::1;;;73227:42;;;::::0;-1:-1:-1;;;73227:42:0;;35073:2:1;73227:42:0::1;::::0;::::1;35055:21:1::0;35112:2;35092:18;;;35085:30;35151:21;35131:18;;;35124:49;35190:18;;73227:42:0::1;35045:169:1::0;73227:42:0::1;73307:13;73323:30;73335:8;73345:7;73323:11;:30::i;:::-;73307:46:::0;-1:-1:-1;73396:23:0::1;73402:2:::0;73406:12:::1;73307:46:::0;67191:6:::1;73406:12;:::i;:::-;73396:5;:23::i;:::-;73430:16;73461:5;73449:9;:7;:9::i;:::-;:17;;;;:::i;:::-;73430:36;;73477:38;73502:2;73506:8;73477:24;:38::i;:::-;73533:29;73540:8;73550:7;73559:2;73533:29;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;56029:1:0;57148:7;:22;73580:5;72938:655;-1:-1:-1;;;;72938:655:0:o;68951:92::-;69013:22;69032:1;69013:10;:22::i;:::-;68951:92::o;73601:225::-;73736:16;73777:41;73786:6;73794:11;;73777:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73807:10:0;;-1:-1:-1;73777:8:0;;-1:-1:-1;;73777:41:0:i;:::-;73770:48;73601:225;-1:-1:-1;;;;73601:225:0:o;87781:379::-;53131:6;;-1:-1:-1;;;;;53131:6:0;20666:10;53278:23;53270:68;;;;-1:-1:-1;;;53270:68:0;;34712:2:1;53270:68:0;;;34694:21:1;;;34731:18;;;34724:30;34790:34;34770:18;;;34763:62;34842:18;;53270:68:0;34684:182:1;53270:68:0;87846:16:::1;67191:6;87865:13;24661:12:::0;;;24573:108;87865:13:::1;:20;;;;:::i;:::-;87846:39;;87915:1;87904:8;:12;87896:39;;;::::0;-1:-1:-1;;;87896:39:0;;37376:2:1;87896:39:0::1;::::0;::::1;37358:21:1::0;37415:2;37395:18;;;37388:30;37454:16;37434:18;;;37427:44;37488:18;;87896:39:0::1;37348:164:1::0;87896:39:0::1;87977:16;::::0;;87946:28:::1;87977:16:::0;;::::1;::::0;::::1;::::0;;;88004:48:::1;88019:8:::0;87977:16;88042:9;88004:14:::1;:48::i;:::-;-1:-1:-1::0;88082:12:0::1;::::0;88068:48:::1;::::0;;-1:-1:-1;;;;;88082:12:0;;::::1;23751:34:1::0;;23816:2;23801:18;;23794:34;;;23864:15;;;23844:18;;;23837:43;88068:48:0;::::1;::::0;;;;23678:2:1;88068:48:0;;::::1;-1:-1:-1::0;;88127:12:0::1;:25:::0;;-1:-1:-1;;;;;;88127:25:0::1;::::0;;-1:-1:-1;87781:379:0:o;72525:162::-;72598:16;:14;:16::i;:::-;72625:7;:18;;-1:-1:-1;;;;;;72625:18:0;-1:-1:-1;;;;;72625:18:0;;;;;;;;72659:20;;20131:74:1;;;72659:20:0;;20119:2:1;20104:18;72659:20:0;;;;;;;72525:162;:::o;77791:189::-;77909:12;;77932:7;;77909:31;;-1:-1:-1;;;77909:31:0;;77854:7;;;;-1:-1:-1;;;;;77909:12:0;;;;:22;;:31;;;;40302:25:1;;;40290:2;40275:18;;40257:76;77909:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77874:66:0;77791:189;-1:-1:-1;;;;;77791:189:0:o;75061:298::-;75265:16;75301:50;75308:8;;75301:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75301:50:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75318:7:0;;-1:-1:-1;75318:7:0;;;;75301:50;;;75318:7;;75301:50;75318:7;75301:50;;;;;;;;;-1:-1:-1;;75301:50:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75327:11:0;;-1:-1:-1;75327:11:0;;;;75301:50;;;75327:11;;75301:50;75327:11;75301:50;;;;;;;;;-1:-1:-1;75340:10:0;;-1:-1:-1;75301:6:0;;-1:-1:-1;;75301:50:0:i;:::-;75294:57;75061:298;-1:-1:-1;;;;;;;75061:298:0:o;33890:297::-;33977:7;-1:-1:-1;;;;;34005:22:0;;34022:4;34005:22;33997:62;;;;-1:-1:-1;;;33997:62:0;;33947:2:1;33997:62:0;;;33929:21:1;33986:2;33966:18;;;33959:30;34025:29;34005:18;;;33998:57;34072:18;;33997:62:0;33919:177:1;33997:62:0;-1:-1:-1;34178:1:0;33890:297;;;;:::o;69076:264::-;69213:16;:14;:16::i;:::-;69245:48;69260:6;:4;:6::i;:::-;69268:8;:6;:8::i;:::-;69278:5;;69285:7;;69245:48;;;;;;;;;;;:::i;:::-;;;;;;;;69304:28;69317:5;;69304:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69304:28:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69324:7:0;;-1:-1:-1;69324:7:0;;;;69304:28;;69324:7;;;;69304:28;;;;;;;;;-1:-1:-1;69304:12:0;;-1:-1:-1;;;69304:28:0:i;87624:149::-;53131:6;;-1:-1:-1;;;;;53131:6:0;20666:10;53278:23;53270:68;;;;-1:-1:-1;;;53270:68:0;;34712:2:1;53270:68:0;;;34694:21:1;;;34731:18;;;34724:30;34790:34;34770:18;;;34763:62;34842:18;;53270:68:0;34684:182:1;53270:68:0;87718:19:::1;87724:4;87730:6;87718:5;:19::i;:::-;87748:17;87754:2;87758:6;87748:5;:17::i;:::-;87624:149:::0;;;:::o;68142:801::-;19407:13;;;;;;;;:30;;-1:-1:-1;19425:12:0;;;;19424:13;19407:30;19399:89;;;;-1:-1:-1;;;19399:89:0;;33532:2:1;19399:89:0;;;33514:21:1;33571:2;33551:18;;;33544:30;33610:34;33590:18;;;33583:62;-1:-1:-1;;;33661:18:1;;;33654:44;33715:19;;19399:89:0;33504:236:1;19399:89:0;19501:19;19524:13;;;;;;19523:14;19548:101;;;;19583:13;:20;;-1:-1:-1;;19618:19:0;;;;;19548:101;68369:16:::1;:14;:16::i;:::-;68396:28;68409:5;68416:7;68396:12;:28::i;:::-;-1:-1:-1::0;;;;;68443:27:0;::::1;68435:59;;;::::0;-1:-1:-1;;;68435:59:0;;31660:2:1;68435:59:0::1;::::0;::::1;31642:21:1::0;31699:2;31679:18;;;31672:30;31738:21;31718:18;;;31711:49;31777:18;;68435:59:0::1;31632:169:1::0;68435:59:0::1;68505:12;:28:::0;;-1:-1:-1;;;;;;68505:28:0;;::::1;-1:-1:-1::0;;;;;68505:28:0;::::1;;::::0;;;68544:12:::1;:44:::0;;68577:10:::1;68544:44:::0;::::1;::::0;::::1;::::0;;68609:24:::1;::::0;;;;;;;:22:::1;::::0;:24:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;68577:10;68609:24;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68599:7;:34:::0;;;68644:6:::1;:16:::0;;68671:30;::::1;;68644:16;68671:30:::0;::::1;-1:-1:-1::0;;68644:16:0;::::1;;68671:30:::0;;;-1:-1:-1;;68671:30:0;;;;;;;::::1;::::0;;;68717:58:::1;::::0;;-1:-1:-1;;;;;23001:55:1;;22983:74;;23088:2;23073:18;;23066:50;;;;23132:18;;23125:50;;;;68717:58:0::1;::::0;22971:2:1;22956:18;68717:58:0::1;;;;;;;68786:149;68803:4;68824::::0;68853::::1;68882::::0;68909::::1;68786:16;:149::i;:::-;19679:14:::0;19675:68;;;19726:5;19710:21;;-1:-1:-1;;19710:21:0;;;19675:68;68142:801;;;;;;:::o;79323:117::-;79388:7;79415:17;:8;:15;:17::i;:::-;79408:24;;79323:117;:::o;78353:449::-;78511:13;;78485:4;;78511:13;;;;;78507:57;;;-1:-1:-1;78548:4:0;;78353:449;-1:-1:-1;78353:449:0:o;78507:57::-;78615:18;;-1:-1:-1;;;;;78615:18:0;78648:42;78644:87;;-1:-1:-1;78714:5:0;;78353:449;-1:-1:-1;;78353:449:0:o;78644:87::-;78748:46;;;;;-1:-1:-1;;;;;78748:36:0;;;;;:46;;78785:8;;78748:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78741:53;78353:449;-1:-1:-1;;;78353:449:0:o;54012:244::-;53131:6;;-1:-1:-1;;;;;53131:6:0;20666:10;53278:23;53270:68;;;;-1:-1:-1;;;53270:68:0;;34712:2:1;53270:68:0;;;34694:21:1;;;34731:18;;;34724:30;34790:34;34770:18;;;34763:62;34842:18;;53270:68:0;34684:182:1;53270:68:0;-1:-1:-1;;;;;54101:22:0;::::1;54093:73;;;::::0;-1:-1:-1;;;54093:73:0;;29731:2:1;54093:73:0::1;::::0;::::1;29713:21:1::0;29770:2;29750:18;;;29743:30;29809:34;29789:18;;;29782:62;29880:8;29860:18;;;29853:36;29906:19;;54093:73:0::1;29703:228:1::0;54093:73:0::1;54203:6;::::0;54182:38:::1;::::0;-1:-1:-1;;;;;54182:38:0;;::::1;::::0;54203:6:::1;::::0;54182:38:::1;::::0;54203:6:::1;::::0;54182:38:::1;54231:6;:17:::0;;-1:-1:-1;;;;;;54231:17:0::1;-1:-1:-1::0;;;;;54231:17:0;;;::::1;::::0;;;::::1;::::0;;54012:244::o;77387:194::-;77508:12;;77531:7;;77508:31;;-1:-1:-1;;;77508:31:0;;77452:7;;;;-1:-1:-1;;;;;77508:12:0;;;;:22;;:31;;;;40302:25:1;;;40290:2;40275:18;;40257:76;77508:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77472:67:0;;77387:194;-1:-1:-1;;;;;77387:194:0:o;77589:::-;77710:12;;77733:7;;77710:31;;-1:-1:-1;;;77710:31:0;;77654:7;;;;-1:-1:-1;;;;;77710:12:0;;;;:22;;:31;;;;40302:25:1;;;40290:2;40275:18;;40257:76;77710:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77674:67:0;;77589:194;-1:-1:-1;;;;;77589:194:0:o;87054:233::-;87109:7;;-1:-1:-1;;;;;87109:7:0;87105:175;;53131:6;;-1:-1:-1;;;;;53131:6:0;87155:10;:21;87147:43;;;;-1:-1:-1;;;87147:43:0;;36634:2:1;87147:43:0;;;36616:21:1;36673:1;36653:18;;;36646:29;36711:11;36691:18;;;36684:39;36740:18;;87147:43:0;36606:158:1;87105:175:0;87245:7;;-1:-1:-1;;;;;87245:7:0;87231:10;:21;87223:45;;;;-1:-1:-1;;;87223:45:0;;28299:2:1;87223:45:0;;;28281:21:1;28338:2;28318:18;;;28311:30;28377:13;28357:18;;;28350:41;28408:18;;87223:45:0;28271:161:1;31181:346:0;-1:-1:-1;;;;;31283:19:0;;31275:68;;;;-1:-1:-1;;;31275:68:0;;36971:2:1;31275:68:0;;;36953:21:1;37010:2;36990:18;;;36983:30;37049:34;37029:18;;;37022:62;37120:6;37100:18;;;37093:34;37144:19;;31275:68:0;36943:226:1;31275:68:0;-1:-1:-1;;;;;31362:21:0;;31354:68;;;;-1:-1:-1;;;31354:68:0;;30138:2:1;31354:68:0;;;30120:21:1;30177:2;30157:18;;;30150:30;30216:34;30196:18;;;30189:62;30287:4;30267:18;;;30260:32;30309:19;;31354:68:0;30110:224:1;31354:68:0;-1:-1:-1;;;;;31435:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;31487:32;;40302:25:1;;;31487:32:0;;40275:18:1;31487:32:0;;;;;;;;31181:346;;;:::o;28687:604::-;-1:-1:-1;;;;;28793:20:0;;28785:70;;;;-1:-1:-1;;;28785:70:0;;36228:2:1;28785:70:0;;;36210:21:1;36267:2;36247:18;;;36240:30;36306:34;36286:18;;;36279:62;36377:7;36357:18;;;36350:35;36402:19;;28785:70:0;36200:227:1;28785:70:0;-1:-1:-1;;;;;28874:23:0;;28866:71;;;;-1:-1:-1;;;28866:71:0;;27895:2:1;28866:71:0;;;27877:21:1;27934:2;27914:18;;;27907:30;27973:34;27953:18;;;27946:62;28044:5;28024:18;;;28017:33;28067:19;;28866:71:0;27867:225:1;28866:71:0;-1:-1:-1;;;;;29034:17:0;;29010:21;29034:17;;;:9;:17;;;;;;29070:23;;;;29062:74;;;;-1:-1:-1;;;29062:74:0;;30541:2:1;29062:74:0;;;30523:21:1;30580:2;30560:18;;;30553:30;30619:34;30599:18;;;30592:62;30690:8;30670:18;;;30663:36;30716:19;;29062:74:0;30513:228:1;29062:74:0;29167:22;29183:6;29167:13;:22;:::i;:::-;-1:-1:-1;;;;;29147:17:0;;;;;;;:9;:17;;;;;;:42;;;;29200:20;;;;;;;;:30;;29224:6;;29147:17;29200:30;;29224:6;;29200:30;:::i;:::-;;;;;;;;29265:9;-1:-1:-1;;;;;29248:35:0;29257:6;-1:-1:-1;;;;;29248:35:0;;29276:6;29248:35;;;;40302:25:1;;40290:2;40275:18;;40257:76;29248:35:0;;;;;;;;28687:604;;;;:::o;66119:114::-;66179:7;66206:19;66214:3;61329:18;;61246:109;66577:137;66648:7;66683:22;66687:3;66699:5;66683:3;:22::i;87295:150::-;87372:12;;:29;;;;;;;;40302:25:1;;;-1:-1:-1;;;;;87372:12:0;;;;:21;;40275:18:1;;87372:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;87371:30;:55;;;-1:-1:-1;53131:6:0;;-1:-1:-1;;;;;53131:6:0;87405:10;:21;87371:55;87363:74;;;;-1:-1:-1;;;87363:74:0;;28639:2:1;87363:74:0;;;28621:21:1;28678:1;28658:18;;;28651:29;28716:8;28696:18;;;28689:36;28742:18;;87363:74:0;28611:155:1;87363:74:0;87295:150;:::o;34977:782::-;35174:4;35196:11;35210:23;35219:5;35226:6;35210:8;:23::i;:::-;35196:37;;35244:32;35258:8;35269:6;35244:5;:32::i;:::-;35295:58;;;;;33065:45;;-1:-1:-1;;;;;35295:20:0;;;;;:58;;35316:10;;35328:5;;35335:6;;35343:3;;35348:4;;35295:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:74;35287:123;;;;-1:-1:-1;;;35287:123:0;;32364:2:1;35287:123:0;;;32346:21:1;32403:2;32383:18;;;32376:30;32442:34;32422:18;;;32415:62;32513:6;32493:18;;;32486:34;32537:19;;35287:123:0;32336:226:1;35287:123:0;-1:-1:-1;;;;;25438:18:0;;35421:24;25438:18;;;:11;:18;;;;;;;;35485:4;25438:27;;;;;;;;35530:12;35539:3;35530:6;:12;:::i;:::-;35510:16;:32;;35502:92;;;;-1:-1:-1;;;35502:92:0;;38425:2:1;35502:92:0;;;38407:21:1;38464:2;38444:18;;;38437:30;38503:34;38483:18;;;38476:62;38574:17;38554:18;;;38547:45;38609:19;;35502:92:0;38397:237:1;35502:92:0;35605:75;35622:8;35641:4;35676:3;35648:25;35667:6;35648:16;:25;:::i;:::-;:31;;;;:::i;35605:75::-;35691:38;35705:8;35716:12;35725:3;35716:6;:12;:::i;35691:38::-;-1:-1:-1;35747:4:0;;34977:782;-1:-1:-1;;;;;;34977:782:0:o;87453:163::-;87544:42;-1:-1:-1;;;;;87534:52:0;;;;87526:82;;;;-1:-1:-1;;;87526:82:0;;37719:2:1;87526:82:0;;;37701:21:1;37758:2;37738:18;;;37731:30;37797:19;37777:18;;;37770:47;37834:18;;87526:82:0;37691:167:1;83134:730:0;83391:12;;83420:42;;;;;83451:10;83420:42;;;20131:74:1;-1:-1:-1;;;;;83391:12:0;;;;;;83420:30;;20104:18:1;;83420:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;83416:81;;;83479:7;83134:730;;:::o;83416:81::-;83587:10;;83583:274;;83614:22;83639:13;-1:-1:-1;;;;;83639:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;83614:55;;83736:39;83746:4;83752:14;83768:6;83736:9;:39::i;:::-;83837:7;;83790:55;;;;;;;;40302:25:1;;;;-1:-1:-1;;;;;83790:46:0;;;;;40275:18:1;;83790:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83583:274;83134:730;;;:::o;81838:1288::-;82024:6;;82065:12;;81980:16;;82024:6;;;-1:-1:-1;;;;;82065:12:0;82009;82133:6;82119:21;;;;;;-1:-1:-1;;;82119:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;82119:21:0;-1:-1:-1;82176:18:0;;82088:52;;-1:-1:-1;82151:22:0;82205:846;82225:6;82221:1;:10;82205:846;;;82335:15;82357:14;82353:1;:18;:83;;82409:27;:25;:27::i;:::-;82353:83;;;82392:11;82404:1;82392:14;;;;;;-1:-1:-1;;;82392:14:0;;;;;;;;;;;;;;;82353:83;82335:101;;82468:7;82451:11;82463:1;82451:14;;;;;;-1:-1:-1;;;82451:14:0;;;;;;;;;;;;;;:24;;;;;82496:7;82492:548;;;82524:21;;;;:12;:21;;;;;:26;;82549:1;;82524:21;:26;;82549:1;;82524:26;:::i;:::-;;;;-1:-1:-1;;82573:21:0;;;;:12;:21;;;;;;82569:99;;82624:24;:8;82640:7;82624:15;:24::i;:::-;;82569:99;82688:210;;;;;82770:4;82688:210;;;21903:34:1;-1:-1:-1;;;;;21973:15:1;;;21953:18;;;21946:43;22005:18;;;21998:34;;;82853:1:0;22048:18:1;;;22041:34;22112:3;22091:19;;;22084:32;-1:-1:-1;22132:19:1;;;22125:33;82688:51:0;;;;;22175:19:1;;82688:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82492:548;;;82939:24;:8;82955:7;82939:15;:24::i;:::-;;82982:42;82997:13;83012:2;83016:7;82982:14;:42::i;:::-;-1:-1:-1;82233:3:0;;;:::i;:::-;;;82205:846;;;;83061:28;83077:11;83061:15;:28::i;:::-;-1:-1:-1;83107:11:0;81838:1288;-1:-1:-1;;;;;;81838:1288:0:o;79989:1841::-;80116:7;80149:22;80162:8;80149:12;:22::i;:::-;80141:58;;;;-1:-1:-1;;;80141:58:0;;31308:2:1;80141:58:0;;;31290:21:1;31347:2;31327:18;;;31320:30;31386:25;31366:18;;;31359:53;31429:18;;80141:58:0;31280:173:1;80141:58:0;80227:15;;80257:6;;;;80253:1570;;;80378:12;;80358:205;;;;;-1:-1:-1;;;;;80378:12:0;;;;80358:55;;:205;;80432:10;;80469:4;;80493:8;;80520:7;;80358:205;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80580:13;80613:9;80608:411;80628:6;80624:1;:10;80608:411;;;80660:15;80678:8;80687:1;80678:11;;;;;;-1:-1:-1;;;80678:11:0;;;;;;;;;;;;;;;80660:29;;80708:14;80725:7;80733:1;80725:10;;;;;;-1:-1:-1;;;80725:10:0;;;;;;;;;;;;;;;80708:27;;80762:6;80772:1;80762:11;;80754:51;;;;-1:-1:-1;;;80754:51:0;;32008:2:1;80754:51:0;;;31990:21:1;32047:2;32027:18;;;32020:30;32086:29;32066:18;;;32059:57;32133:18;;80754:51:0;31980:177:1;80754:51:0;80828:21;;;;:12;:21;;;;;;80824:96;;80879:21;:8;80892:7;80879:12;:21::i;:::-;;80824:96;80938:21;;;;:12;:21;;;;;:31;;80963:6;;80938:21;:31;;80963:6;;80938:31;:::i;:::-;;;;-1:-1:-1;80988:15:0;;-1:-1:-1;80997:6:0;80988:15;;:::i;:::-;;;80608:411;;80636:3;;;;:::i;:::-;;;80608:411;;;-1:-1:-1;81040:5:0;-1:-1:-1;81033:12:0;;-1:-1:-1;81033:12:0;80253:1570;81102:12;;-1:-1:-1;;;;;81102:12:0;81078:21;81129:655;81149:6;81145:1;:10;81129:655;;;81181:15;81199:8;81208:1;81199:11;;;;;;-1:-1:-1;;;81199:11:0;;;;;;;;;;;;;;;81181:29;;81686:42;81705:13;81720:7;81686:18;:42::i;:::-;81747:21;:8;81760:7;81747:12;:21::i;:::-;;81129:655;81157:3;;;;:::i;:::-;;;81129:655;;;;81805:6;81798:13;;;;;;30249:494;-1:-1:-1;;;;;30333:21:0;;30325:67;;;;-1:-1:-1;;;30325:67:0;;35421:2:1;30325:67:0;;;35403:21:1;35460:2;35440:18;;;35433:30;35499:34;35479:18;;;35472:62;35570:3;35550:18;;;35543:31;35591:19;;30325:67:0;35393:223:1;30325:67:0;-1:-1:-1;;;;;30492:18:0;;30467:22;30492:18;;;:9;:18;;;;;;30529:24;;;;30521:71;;;;-1:-1:-1;;;30521:71:0;;28973:2:1;30521:71:0;;;28955:21:1;29012:2;28992:18;;;28985:30;29051:34;29031:18;;;29024:62;29122:4;29102:18;;;29095:32;29144:19;;30521:71:0;28945:224:1;30521:71:0;30624:23;30641:6;30624:14;:23;:::i;:::-;-1:-1:-1;;;;;30603:18:0;;;;;;:9;:18;;;;;:44;;;;30658:12;:22;;30674:6;;30603:18;30658:22;;30674:6;;30658:22;:::i;:::-;;;;-1:-1:-1;;30698:37:0;;40302:25:1;;;30724:1:0;;-1:-1:-1;;;;;30698:37:0;;;;;40290:2:1;40275:18;30698:37:0;40257:76:1;29578:338:0;-1:-1:-1;;;;;29662:21:0;;29654:65;;;;-1:-1:-1;;;29654:65:0;;39593:2:1;29654:65:0;;;39575:21:1;39632:2;39612:18;;;39605:30;39671:33;39651:18;;;39644:61;39722:18;;29654:65:0;39565:181:1;29654:65:0;29810:6;29794:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;29827:18:0;;;;;;:9;:18;;;;;:28;;29849:6;;29827:18;:28;;29849:6;;29827:28;:::i;:::-;;;;-1:-1:-1;;29871:37:0;;40302:25:1;;;-1:-1:-1;;;;;29871:37:0;;;29888:1;;29871:37;;40290:2:1;40275:18;29871:37:0;;;;;;;29578:338;;:::o;23248:135::-;23334:13;;;;:5;;:13;;;;;:::i;:::-;-1:-1:-1;23358:17:0;;;;:7;;:17;;;;;:::i;52644:129::-;19407:13;;;;;;;;:30;;-1:-1:-1;19425:12:0;;;;19424:13;19407:30;19399:89;;;;-1:-1:-1;;;19399:89:0;;33532:2:1;19399:89:0;;;33514:21:1;33571:2;33551:18;;;33544:30;33610:34;33590:18;;;33583:62;-1:-1:-1;;;33661:18:1;;;33654:44;33715:19;;19399:89:0;33504:236:1;19399:89:0;19501:19;19524:13;;;;;;19523:14;19548:101;;;;19583:13;:20;;-1:-1:-1;;19618:19:0;;;;;19548:101;52702:26:::1;:24;:26::i;:::-;52739;:24;:26::i;:::-;19679:14:::0;19675:68;;;19726:5;19710:21;;-1:-1:-1;;19710:21:0;;;52644:129;:::o;22894:181::-;19407:13;;;;;;;;:30;;-1:-1:-1;19425:12:0;;;;19424:13;19407:30;19399:89;;;;-1:-1:-1;;;19399:89:0;;33532:2:1;19399:89:0;;;33514:21:1;33571:2;33551:18;;;33544:30;33610:34;33590:18;;;33583:62;-1:-1:-1;;;33661:18:1;;;33654:44;33715:19;;19399:89:0;33504:236:1;19399:89:0;19501:19;19524:13;;;;;;19523:14;19548:101;;;;19583:13;:20;;-1:-1:-1;;19618:19:0;;;;;19548:101;22992:26:::1;:24;:26::i;:::-;23029:38;23052:5;23059:7;23029:22;:38::i;:::-;19679:14:::0;19675:68;;;19726:5;19710:21;;-1:-1:-1;;19710:21:0;;;22894:181;;;:::o;61699:120::-;61766:7;61793:3;:11;;61805:5;61793:18;;;;;;-1:-1:-1;;;61793:18:0;;;;;;;;;;;;;;;;;61786:25;;61699:120;;;;:::o;86541:505::-;86604:7;86624:19;86957:17;:8;:15;:17::i;:::-;86745:16;86760:1;86745:12;:16;:::i;:::-;86786:9;;86696:232;;;86735:27;;86696:232;;;19451:19:1;19486:12;;19479:28;86818:14:0;19545:2:1;19541:15;;;-1:-1:-1;;19537:53:1;19523:12;;;19516:75;86855:16:0;19607:12:1;;;19600:28;86894:15:0;19644:13:1;;;19637:29;19682:13;;86696:232:0;;;;;;;;;;;;86668:275;;;;;;86646:308;;:328;;;;:::i;:::-;86624:350;;86987:9;;86985:11;;;;;:::i;:::-;;;;-1:-1:-1;87014:24:0;:8;87026:11;87014;:24::i;:::-;87007:31;;;86541:505;:::o;65664:137::-;65734:4;65758:35;65766:3;65786:5;65758:7;:35::i;83872:887::-;83990:42;84059;84112:17;-1:-1:-1;;;;;84144:20:0;;;;84140:483;;;84223:65;;-1:-1:-1;;;;;23378:55:1;;84223:65:0;;;23360:74:1;23450:18;;;23443:34;;;23333:18;;84223:65:0;;;-1:-1:-1;;84223:65:0;;;;;;;;;;;;;;-1:-1:-1;;;;;84223:65:0;;;;;;-1:-1:-1;84140:483:0;;;84323:5;-1:-1:-1;;;;;84310:18:0;:9;-1:-1:-1;;;;;84310:18:0;;84306:317;;;84381:69;;-1:-1:-1;;;;;23378:55:1;;84381:69:0;;;23360:74:1;23450:18;;;23443:34;;;23333:18;;84381:69:0;;;-1:-1:-1;;84381:69:0;;;;;;;;;;;;;;-1:-1:-1;;;;;84381:69:0;;;;;;-1:-1:-1;84306:317:0;;;84515:96;;84592:4;84515:96;;;21399:34:1;-1:-1:-1;;;;;21469:15:1;;21449:18;;;21442:43;21501:18;;;21494:34;;;21311:18;;84515:96:0;;;-1:-1:-1;;84515:96:0;;;;;;;;;;;;;;-1:-1:-1;;;;;84515:96:0;-1:-1:-1;;;84515:96:0;;;;-1:-1:-1;84306:317:0;84634:12;84648:23;84683:9;-1:-1:-1;;;;;84675:23:0;84699:4;84675:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84633:71;;;;84723:7;84739:10;84715:36;;;;;-1:-1:-1;;;84715:36:0;;;;;;;;:::i;79689:292::-;79808:18;;-1:-1:-1;;;;;79808:18:0;79841:42;79837:81;;79900:7;79689:292;:::o;79837:81::-;79928:45;;;;;-1:-1:-1;;;;;79928:35:0;;;;;:45;;79964:8;;79928:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65357:131;65424:4;65448:32;65453:3;65473:5;65448:4;:32::i;84767:1766::-;84877:42;84946;84999:17;-1:-1:-1;;;;;85031:20:0;;;;85027:1370;;;85106:100;;85171:10;85106:100;;;21399:34:1;85191:4:0;21449:18:1;;;21442:43;21501:18;;;21494:34;;;21311:18;;85106:100:0;;;-1:-1:-1;;85106:100:0;;;;;;;;;;;;;;-1:-1:-1;;;;;85106:100:0;;;;;;-1:-1:-1;85027:1370:0;;;85241:5;-1:-1:-1;;;;;85228:18:0;:9;-1:-1:-1;;;;;85228:18:0;;85224:1173;;;85355:31;85444:7;85389:63;;;;;;40302:25:1;;40290:2;40275:18;;40257:76;85389:63:0;;;;-1:-1:-1;;85389:63:0;;;;;;;;;;;;;;-1:-1:-1;;;;;85389:63:0;;;;;85510:49;85389:63;;-1:-1:-1;;;;;;;;;;85510:29:0;;;:49;;85389:63;;85510:49;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85467:92;;;;85575:16;85606:6;85595:29;;;;;;;;;;;;:::i;:::-;85574:50;;85647:12;:38;;;;-1:-1:-1;;;;;;85663:22:0;;85675:10;85663:22;85647:38;85639:68;;;;-1:-1:-1;;;85639:68:0;;38841:2:1;85639:68:0;;;38823:21:1;38880:2;38860:18;;;38853:30;38919:19;38899:18;;;38892:47;38956:18;;85639:68:0;38813:167:1;85639:68:0;85729:52;;;;;40302:25:1;;;40275:18;;85729:52:0;;;-1:-1:-1;;85729:52:0;;;;;;;;;;;;;;-1:-1:-1;;;;;85729:52:0;;;;;;-1:-1:-1;85224:1173:0;;-1:-1:-1;;;;85224:1173:0;;86059:12;;86040:49;;;;;;;;40302:25:1;;;86101:4:0;;-1:-1:-1;;;;;86059:12:0;;86040:40;;40275:18:1;;86040:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;86040:66:0;;86036:350;;;86136:26;:8;86154:7;65964:4;61128:19;;;:12;;;:19;;;;;;:24;;65988:37;61031:129;86136:26;86135:27;86127:66;;;;-1:-1:-1;;;86127:66:0;;29376:2:1;86127:66:0;;;29358:21:1;29415:2;29395:18;;;29388:30;29454:28;29434:18;;;29427:56;29500:18;;86127:66:0;29348:176:1;86127:66:0;86212:7;;;84767:1766;;:::o;86036:350::-;86266:104;;86335:10;86266:104;;;21399:34:1;86355:4:0;21449:18:1;;;21442:43;21501:18;;;21494:34;;;21311:18;;86266:104:0;;;-1:-1:-1;;86266:104:0;;;;;;;;;;;;;;-1:-1:-1;;;;;86266:104:0;-1:-1:-1;;;86266:104:0;;;;-1:-1:-1;86036:350:0;86408:12;86422:23;86457:9;-1:-1:-1;;;;;86449:23:0;86473:4;86449:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86407:71;;;;86497:7;86513:10;86489:36;;;;;-1:-1:-1;;;86489:36:0;;;;;;;;:::i;20515:65::-;19407:13;;;;;;;;:30;;-1:-1:-1;19425:12:0;;;;19424:13;19407:30;19399:89;;;;-1:-1:-1;;;19399:89:0;;33532:2:1;19399:89:0;;;33514:21:1;33571:2;33551:18;;;33544:30;33610:34;33590:18;;;33583:62;-1:-1:-1;;;33661:18:1;;;33654:44;33715:19;;19399:89:0;33504:236:1;19399:89:0;19501:19;19524:13;;;;;;19523:14;19548:101;;;;19583:13;:20;;-1:-1:-1;;19618:19:0;;;;;19675:68;;;;19726:5;19710:21;;-1:-1:-1;;19710:21:0;;;20515:65;:::o;52781:196::-;19407:13;;;;;;;;:30;;-1:-1:-1;19425:12:0;;;;19424:13;19407:30;19399:89;;;;-1:-1:-1;;;19399:89:0;;33532:2:1;19399:89:0;;;33514:21:1;33571:2;33551:18;;;33544:30;33610:34;33590:18;;;33583:62;-1:-1:-1;;;33661:18:1;;;33654:44;33715:19;;19399:89:0;33504:236:1;19399:89:0;19501:19;19524:13;;;;;;19523:14;19548:101;;;;19583:13;:20;;-1:-1:-1;;19618:19:0;;;;;19548:101;52892:6:::1;:18:::0;;-1:-1:-1;;;;;;52892:18:0::1;20666:10:::0;52892:18;;::::1;::::0;;;52926:43:::1;::::0;20666:10;;52849:17:::1;::::0;52926:43:::1;::::0;52849:17;;52926:43:::1;19661:1;19679:14:::0;19675:68;;;19726:5;19710:21;;-1:-1:-1;;19710:21:0;;;52781:196;:::o;23083:157::-;19407:13;;;;;;;;:30;;-1:-1:-1;19425:12:0;;;;19424:13;19407:30;19399:89;;;;-1:-1:-1;;;19399:89:0;;33532:2:1;19399:89:0;;;33514:21:1;33571:2;33551:18;;;33544:30;33610:34;33590:18;;;33583:62;-1:-1:-1;;;33661:18:1;;;33654:44;33715:19;;19399:89:0;33504:236:1;19399:89:0;19501:19;19524:13;;;;;;19523:14;19548:101;;;;19583:13;:20;;-1:-1:-1;;19618:19:0;;;;;19548:101;23191:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;23215:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;;19679:14:::0;19675:68;;;19726:5;19710:21;;-1:-1:-1;;19710:21:0;;;23083:157;;;:::o;59538:1407::-;59604:4;59743:19;;;:12;;;:19;;;;;;59779:15;;59775:1163;;60141:21;60165:14;60178:1;60165:10;:14;:::i;:::-;60214:18;;60141:38;;-1:-1:-1;60194:17:0;;60214:22;;60235:1;;60214:22;:::i;:::-;60194:42;;60270:13;60257:9;:26;60253:405;;60304:17;60324:3;:11;;60336:9;60324:22;;;;;;-1:-1:-1;;;60324:22:0;;;;;;;;;;;;;;;;;60304:42;;60478:9;60449:3;:11;;60461:13;60449:26;;;;;;-1:-1:-1;;;60449:26:0;;;;;;;;;;;;;;;;;;;;:38;;;;60563:23;;;:12;;;:23;;;;;:36;;;60253:405;60739:17;;:3;;:17;;;-1:-1:-1;;;60739:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;60834:3;:12;;:19;60847:5;60834:19;;;;;;;;;;;60827:26;;;60877:4;60870:11;;;;;;;59775:1163;60921:5;60914:12;;;;;58948:414;59011:4;61128:19;;;:12;;;:19;;;;;;59028:327;;-1:-1:-1;59071:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;59254:18;;59232:19;;;:12;;;:19;;;;;;:40;;;;59287:11;;59028:327;-1:-1:-1;59338:5:0;59331:12;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:395:1;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:2;;166:8;156;149:26;108:2;-1:-1:-1;196:20:1;;239:18;228:30;;225:2;;;278:8;268;261:26;225:2;322:4;314:6;310:17;298:29;;382:3;375:4;365:6;362:1;358:14;350:6;346:27;342:38;339:47;336:2;;;399:1;396;389:12;336:2;98:311;;;;;:::o;414:743::-;468:5;521:3;514:4;506:6;502:17;498:27;488:2;;543:5;536;529:20;488:2;583:6;570:20;609:4;632:18;628:2;625:26;622:2;;;654:18;;:::i;:::-;700:2;697:1;693:10;723:28;747:2;743;739:11;723:28;:::i;:::-;785:15;;;816:12;;;;848:15;;;882;;;878:24;;875:33;-1:-1:-1;872:2:1;;;925:5;918;911:20;872:2;951:5;942:14;;965:163;979:2;976:1;973:9;965:163;;;1036:17;;1024:30;;997:1;990:9;;;;;1074:12;;;;1106;;965:163;;;-1:-1:-1;1146:5:1;478:679;-1:-1:-1;;;;;;;478:679:1:o;1162:375::-;1213:8;1223:6;1277:3;1270:4;1262:6;1258:17;1254:27;1244:2;;1302:8;1292;1285:26;1244:2;-1:-1:-1;1332:20:1;;1375:18;1364:30;;1361:2;;;1414:8;1404;1397:26;1361:2;1458:4;1450:6;1446:17;1434:29;;1510:3;1503:4;1494:6;1486;1482:19;1478:30;1475:39;1472:2;;;1527:1;1524;1517:12;1542:550;1584:5;1637:3;1630:4;1622:6;1618:17;1614:27;1604:2;;1659:5;1652;1645:20;1604:2;1699:6;1686:20;1725:18;1721:2;1718:26;1715:2;;;1747:18;;:::i;:::-;1791:55;1834:2;1815:13;;-1:-1:-1;;1811:27:1;1840:4;1807:38;1791:55;:::i;:::-;1871:2;1862:7;1855:19;1917:3;1910:4;1905:2;1897:6;1893:15;1889:26;1886:35;1883:2;;;1938:5;1931;1924:20;1883:2;2007;2000:4;1992:6;1988:17;1981:4;1972:7;1968:18;1955:55;2030:16;;;2048:4;2026:27;2019:42;;;;2034:7;1594:498;-1:-1:-1;;1594:498:1:o;2097:257::-;2156:6;2209:2;2197:9;2188:7;2184:23;2180:32;2177:2;;;2230:6;2222;2215:22;2177:2;2274:9;2261:23;2293:31;2318:5;2293:31;:::i;2359:261::-;2429:6;2482:2;2470:9;2461:7;2457:23;2453:32;2450:2;;;2503:6;2495;2488:22;2450:2;2540:9;2534:16;2559:31;2584:5;2559:31;:::i;2899:398::-;2967:6;2975;3028:2;3016:9;3007:7;3003:23;2999:32;2996:2;;;3049:6;3041;3034:22;2996:2;3093:9;3080:23;3112:31;3137:5;3112:31;:::i;:::-;3162:5;-1:-1:-1;3219:2:1;3204:18;;3191:32;3232:33;3191:32;3232:33;:::i;:::-;3284:7;3274:17;;;2986:311;;;;;:::o;3302:1111::-;3456:6;3464;3472;3480;3488;3541:3;3529:9;3520:7;3516:23;3512:33;3509:2;;;3563:6;3555;3548:22;3509:2;3607:9;3594:23;3626:31;3651:5;3626:31;:::i;:::-;3676:5;-1:-1:-1;3733:2:1;3718:18;;3705:32;3746:33;3705:32;3746:33;:::i;:::-;3798:7;-1:-1:-1;3856:2:1;3841:18;;3828:32;3879:18;3909:14;;;3906:2;;;3941:6;3933;3926:22;3906:2;3969:61;4022:7;4013:6;4002:9;3998:22;3969:61;:::i;:::-;3959:71;;4083:2;4072:9;4068:18;4055:32;4039:48;;4112:2;4102:8;4099:16;4096:2;;;4133:6;4125;4118:22;4096:2;4161:63;4216:7;4205:8;4194:9;4190:24;4161:63;:::i;:::-;4151:73;;4277:3;4266:9;4262:19;4249:33;4233:49;;4307:2;4297:8;4294:16;4291:2;;;4328:6;4320;4313:22;4291:2;;4356:51;4399:7;4388:8;4377:9;4373:24;4356:51;:::i;:::-;4346:61;;;3499:914;;;;;;;;:::o;4418:466::-;4495:6;4503;4511;4564:2;4552:9;4543:7;4539:23;4535:32;4532:2;;;4585:6;4577;4570:22;4532:2;4629:9;4616:23;4648:31;4673:5;4648:31;:::i;:::-;4698:5;-1:-1:-1;4755:2:1;4740:18;;4727:32;4768:33;4727:32;4768:33;:::i;:::-;4522:362;;4820:7;;-1:-1:-1;;;4874:2:1;4859:18;;;;4846:32;;4522:362::o;4889:685::-;4984:6;4992;5000;5008;5061:3;5049:9;5040:7;5036:23;5032:33;5029:2;;;5083:6;5075;5068:22;5029:2;5127:9;5114:23;5146:31;5171:5;5146:31;:::i;:::-;5196:5;-1:-1:-1;5253:2:1;5238:18;;5225:32;5266:33;5225:32;5266:33;:::i;:::-;5318:7;-1:-1:-1;5372:2:1;5357:18;;5344:32;;-1:-1:-1;5427:2:1;5412:18;;5399:32;5454:18;5443:30;;5440:2;;;5491:6;5483;5476:22;5440:2;5519:49;5560:7;5551:6;5540:9;5536:22;5519:49;:::i;:::-;5509:59;;;5019:555;;;;;;;:::o;5579:754::-;5683:6;5691;5699;5707;5715;5768:3;5756:9;5747:7;5743:23;5739:33;5736:2;;;5790:6;5782;5775:22;5736:2;5834:9;5821:23;5853:31;5878:5;5853:31;:::i;:::-;5903:5;-1:-1:-1;5960:2:1;5945:18;;5932:32;5973:33;5932:32;5973:33;:::i;:::-;6025:7;-1:-1:-1;6079:2:1;6064:18;;6051:32;;-1:-1:-1;6130:2:1;6115:18;;6102:32;;-1:-1:-1;6185:3:1;6170:19;;6157:33;6213:18;6202:30;;6199:2;;;6250:6;6242;6235:22;6199:2;6278:49;6319:7;6310:6;6299:9;6295:22;6278:49;:::i;6338:325::-;6406:6;6414;6467:2;6455:9;6446:7;6442:23;6438:32;6435:2;;;6488:6;6480;6473:22;6435:2;6532:9;6519:23;6551:31;6576:5;6551:31;:::i;:::-;6601:5;6653:2;6638:18;;;;6625:32;;-1:-1:-1;;;6425:238:1:o;6668:803::-;6790:6;6798;6806;6814;6867:2;6855:9;6846:7;6842:23;6838:32;6835:2;;;6888:6;6880;6873:22;6835:2;6933:9;6920:23;6962:18;7003:2;6995:6;6992:14;6989:2;;;7024:6;7016;7009:22;6989:2;7068:70;7130:7;7121:6;7110:9;7106:22;7068:70;:::i;:::-;7157:8;;-1:-1:-1;7042:96:1;-1:-1:-1;7245:2:1;7230:18;;7217:32;;-1:-1:-1;7261:16:1;;;7258:2;;;7295:6;7287;7280:22;7258:2;;7339:72;7403:7;7392:8;7381:9;7377:24;7339:72;:::i;:::-;6825:646;;;;-1:-1:-1;7430:8:1;-1:-1:-1;;;;6825:646:1:o;7476:1128::-;7634:6;7642;7650;7658;7666;7674;7727:2;7715:9;7706:7;7702:23;7698:32;7695:2;;;7748:6;7740;7733:22;7695:2;7793:9;7780:23;7822:18;7863:2;7855:6;7852:14;7849:2;;;7884:6;7876;7869:22;7849:2;7928:70;7990:7;7981:6;7970:9;7966:22;7928:70;:::i;:::-;8017:8;;-1:-1:-1;7902:96:1;-1:-1:-1;8105:2:1;8090:18;;8077:32;;-1:-1:-1;8121:16:1;;;8118:2;;;8155:6;8147;8140:22;8118:2;8199:72;8263:7;8252:8;8241:9;8237:24;8199:72;:::i;:::-;8290:8;;-1:-1:-1;8173:98:1;-1:-1:-1;8378:2:1;8363:18;;8350:32;;-1:-1:-1;8394:16:1;;;8391:2;;;8428:6;8420;8413:22;8391:2;;8472:72;8536:7;8525:8;8514:9;8510:24;8472:72;:::i;:::-;7685:919;;;;-1:-1:-1;7685:919:1;;-1:-1:-1;7685:919:1;;8563:8;;7685:919;-1:-1:-1;;;7685:919:1:o;8609:368::-;8693:6;8746:2;8734:9;8725:7;8721:23;8717:32;8714:2;;;8767:6;8759;8752:22;8714:2;8812:9;8799:23;8845:18;8837:6;8834:30;8831:2;;;8882:6;8874;8867:22;8831:2;8910:61;8963:7;8954:6;8943:9;8939:22;8910:61;:::i;8982:760::-;9109:6;9117;9125;9178:2;9166:9;9157:7;9153:23;9149:32;9146:2;;;9199:6;9191;9184:22;9146:2;9244:9;9231:23;9273:18;9314:2;9306:6;9303:14;9300:2;;;9335:6;9327;9320:22;9300:2;9363:61;9416:7;9407:6;9396:9;9392:22;9363:61;:::i;:::-;9353:71;;9477:2;9466:9;9462:18;9449:32;9433:48;;9506:2;9496:8;9493:16;9490:2;;;9527:6;9519;9512:22;9490:2;;9555:63;9610:7;9599:8;9588:9;9584:24;9555:63;:::i;:::-;9545:73;;;9668:2;9657:9;9653:18;9640:32;9681:31;9706:5;9681:31;:::i;:::-;9731:5;9721:15;;;9136:606;;;;;:::o;9747:997::-;9908:6;9916;9924;9932;9985:3;9973:9;9964:7;9960:23;9956:33;9953:2;;;10007:6;9999;9992:22;9953:2;10052:9;10039:23;10081:18;10122:2;10114:6;10111:14;10108:2;;;10143:6;10135;10128:22;10108:2;10171:61;10224:7;10215:6;10204:9;10200:22;10171:61;:::i;:::-;10161:71;;10285:2;10274:9;10270:18;10257:32;10241:48;;10314:2;10304:8;10301:16;10298:2;;;10335:6;10327;10320:22;10298:2;10363:63;10418:7;10407:8;10396:9;10392:24;10363:63;:::i;:::-;10353:73;;10479:2;10468:9;10464:18;10451:32;10435:48;;10508:2;10498:8;10495:16;10492:2;;;10529:6;10521;10514:22;10492:2;;10557:63;10612:7;10601:8;10590:9;10586:24;10557:63;:::i;:::-;10547:73;;;10670:2;10659:9;10655:18;10642:32;10683:31;10708:5;10683:31;:::i;:::-;9943:801;;;;-1:-1:-1;9943:801:1;;-1:-1:-1;;9943:801:1:o;10749:255::-;10816:6;10869:2;10857:9;10848:7;10844:23;10840:32;10837:2;;;10890:6;10882;10875:22;10837:2;10927:9;10921:16;10946:28;10968:5;10946:28;:::i;11009:793::-;11089:6;11097;11105;11113;11121;11174:3;11162:9;11153:7;11149:23;11145:33;11142:2;;;11196:6;11188;11181:22;11142:2;11240:9;11227:23;11259:28;11281:5;11259:28;:::i;:::-;11306:5;-1:-1:-1;11363:2:1;11348:18;;11335:32;11376:30;11335:32;11376:30;:::i;:::-;11425:7;-1:-1:-1;11484:2:1;11469:18;;11456:32;11497:30;11456:32;11497:30;:::i;:::-;11546:7;-1:-1:-1;11605:2:1;11590:18;;11577:32;11618:30;11577:32;11618:30;:::i;:::-;11667:7;-1:-1:-1;11726:3:1;11711:19;;11698:33;11740:30;11698:33;11740:30;:::i;:::-;11789:7;11779:17;;;11132:670;;;;;;;;:::o;11807:194::-;11877:6;11930:2;11918:9;11909:7;11905:23;11901:32;11898:2;;;11951:6;11943;11936:22;11898:2;-1:-1:-1;11979:16:1;;11888:113;-1:-1:-1;11888:113:1:o;12006:352::-;12064:6;12117:2;12105:9;12096:7;12092:23;12088:32;12085:2;;;12138:6;12130;12123:22;12085:2;12182:9;12169:23;-1:-1:-1;;;;;;12225:5:1;12221:78;12214:5;12211:89;12201:2;;12319:6;12311;12304:22;12363:725;12498:6;12506;12514;12522;12575:3;12563:9;12554:7;12550:23;12546:33;12543:2;;;12597:6;12589;12582:22;13093:749;13185:6;13193;13201;13209;13262:2;13250:9;13241:7;13237:23;13233:32;13230:2;;;13283:6;13275;13268:22;13230:2;13328:9;13315:23;13357:18;13398:2;13390:6;13387:14;13384:2;;;13419:6;13411;13404:22;13384:2;13463:58;13513:7;13504:6;13493:9;13489:22;13463:58;:::i;:::-;13540:8;;-1:-1:-1;13437:84:1;-1:-1:-1;13628:2:1;13613:18;;13600:32;;-1:-1:-1;13644:16:1;;;13641:2;;;13678:6;13670;13663:22;13641:2;;13722:60;13774:7;13763:8;13752:9;13748:24;13722:60;:::i;13847:978::-;13956:6;13964;13972;13980;13988;14041:3;14029:9;14020:7;14016:23;14012:33;14009:2;;;14063:6;14055;14048:22;14009:2;14108:9;14095:23;14137:18;14178:2;14170:6;14167:14;14164:2;;;14199:6;14191;14184:22;14164:2;14227:49;14268:7;14259:6;14248:9;14244:22;14227:49;:::i;:::-;14217:59;;14329:2;14318:9;14314:18;14301:32;14285:48;;14358:2;14348:8;14345:16;14342:2;;;14379:6;14371;14364:22;14342:2;;14407:51;14450:7;14439:8;14428:9;14424:24;14407:51;:::i;:::-;14397:61;;;14508:2;14497:9;14493:18;14480:32;14521:31;14546:5;14521:31;:::i;14830:190::-;14889:6;14942:2;14930:9;14921:7;14917:23;14913:32;14910:2;;;14963:6;14955;14948:22;14910:2;-1:-1:-1;14991:23:1;;14900:120;-1:-1:-1;14900:120:1:o;15224:466::-;15301:6;15309;15317;15370:2;15358:9;15349:7;15345:23;15341:32;15338:2;;;15391:6;15383;15376:22;15338:2;15432:9;15419:23;15409:33;;15492:2;15481:9;15477:18;15464:32;15505:31;15530:5;15505:31;:::i;:::-;15555:5;-1:-1:-1;15612:2:1;15597:18;;15584:32;15625:33;15584:32;15625:33;:::i;15695:525::-;15790:6;15798;15806;15859:2;15847:9;15838:7;15834:23;15830:32;15827:2;;;15880:6;15872;15865:22;15827:2;15921:9;15908:23;15898:33;;15982:2;15971:9;15967:18;15954:32;16009:18;16001:6;15998:30;15995:2;;;16046:6;16038;16031:22;15995:2;16090:70;16152:7;16143:6;16132:9;16128:22;16090:70;:::i;:::-;15817:403;;16179:8;;-1:-1:-1;16064:96:1;;-1:-1:-1;;;;15817:403:1:o;16225:571::-;16327:6;16335;16343;16396:2;16384:9;16375:7;16371:23;16367:32;16364:2;;;16417:6;16409;16402:22;16364:2;16458:9;16445:23;16435:33;;16519:2;16508:9;16504:18;16491:32;16546:18;16538:6;16535:30;16532:2;;;16583:6;16575;16568:22;16532:2;16611:61;16664:7;16655:6;16644:9;16640:22;16611:61;:::i;16801:497::-;16880:6;16888;16896;16949:2;16937:9;16928:7;16924:23;16920:32;16917:2;;;16970:6;16962;16955:22;16917:2;17011:9;16998:23;16988:33;;17072:2;17061:9;17057:18;17044:32;17099:18;17091:6;17088:30;17085:2;;;17136:6;17128;17121:22;17085:2;17180:58;17230:7;17221:6;17210:9;17206:22;17180:58;:::i;17303:464::-;17398:6;17406;17414;17422;17430;17483:3;17471:9;17462:7;17458:23;17454:33;17451:2;;;17505:6;17497;17490:22;17451:2;-1:-1:-1;;17533:23:1;;;17603:2;17588:18;;17575:32;;-1:-1:-1;17654:2:1;17639:18;;17626:32;;17705:2;17690:18;;17677:32;;-1:-1:-1;17756:3:1;17741:19;17728:33;;-1:-1:-1;17441:326:1;-1:-1:-1;17441:326:1:o;17772:440::-;17878:6;17886;17894;17902;17910;17963:3;17951:9;17942:7;17938:23;17934:33;17931:2;;;17985:6;17977;17970:22;17931:2;-1:-1:-1;;18013:16:1;;18069:2;18054:18;;18048:25;18113:2;18098:18;;18092:25;18157:2;18142:18;;18136:25;18201:3;18186:19;;;18180:26;18013:16;;18048:25;;-1:-1:-1;18092:25:1;18136;-1:-1:-1;18180:26:1;;-1:-1:-1;17921:291:1;-1:-1:-1;17921:291:1:o;18217:437::-;18270:3;18308:5;18302:12;18335:6;18330:3;18323:19;18361:4;18390:2;18385:3;18381:12;18374:19;;18427:2;18420:5;18416:14;18448:3;18460:169;18474:6;18471:1;18468:13;18460:169;;;18535:13;;18523:26;;18569:12;;;;18604:15;;;;18496:1;18489:9;18460:169;;;-1:-1:-1;18645:3:1;;18278:376;-1:-1:-1;;;;;18278:376:1:o;18659:268::-;18747:6;18742:3;18735:19;18799:6;18792:5;18785:4;18780:3;18776:14;18763:43;-1:-1:-1;18717:3:1;18826:16;;;18844:4;18822:27;;;18815:40;;;;18909:2;18888:15;;;-1:-1:-1;;18884:29:1;18875:39;;;18871:50;;18725:202::o;18932:257::-;18973:3;19011:5;19005:12;19038:6;19033:3;19026:19;19054:63;19110:6;19103:4;19098:3;19094:14;19087:4;19080:5;19076:16;19054:63;:::i;:::-;19171:2;19150:15;-1:-1:-1;;19146:29:1;19137:39;;;;19178:4;19133:50;;18981:208;-1:-1:-1;;18981:208:1:o;19706:274::-;19835:3;19873:6;19867:13;19889:53;19935:6;19930:3;19923:4;19915:6;19911:17;19889:53;:::i;:::-;19958:16;;;;;19843:137;-1:-1:-1;;19843:137:1:o;20216:915::-;20592:4;-1:-1:-1;;;;;20702:2:1;20694:6;20690:15;20679:9;20672:34;20754:2;20746:6;20742:15;20737:2;20726:9;20722:18;20715:43;;20794:3;20789:2;20778:9;20774:18;20767:31;20821:57;20873:3;20862:9;20858:19;20850:6;20821:57;:::i;:::-;20926:9;20918:6;20914:22;20909:2;20898:9;20894:18;20887:50;20960:44;20997:6;20989;20960:44;:::i;:::-;21041:22;;;21035:3;21020:19;;;21013:51;;;;-1:-1:-1;21073:20:1;;21122:2;21110:15;;20601:530;-1:-1:-1;;;;20601:530:1:o;22205:583::-;22427:4;-1:-1:-1;;;;;22537:2:1;22529:6;22525:15;22514:9;22507:34;22589:2;22581:6;22577:15;22572:2;22561:9;22557:18;22550:43;;22629:6;22624:2;22613:9;22609:18;22602:34;22672:6;22667:2;22656:9;22652:18;22645:34;22716:3;22710;22699:9;22695:19;22688:32;22737:45;22777:3;22766:9;22762:19;22754:6;22737:45;:::i;23891:261::-;24070:2;24059:9;24052:21;24033:4;24090:56;24142:2;24131:9;24127:18;24119:6;24090:56;:::i;24157:585::-;24442:2;24431:9;24424:21;24405:4;24468:56;24520:2;24509:9;24505:18;24497:6;24468:56;:::i;:::-;24572:9;24564:6;24560:22;24555:2;24544:9;24540:18;24533:50;24600:44;24637:6;24629;24600:44;:::i;:::-;24592:52;;;-1:-1:-1;;;;;24684:6:1;24680:55;24675:2;24664:9;24660:18;24653:83;24414:328;;;;;;:::o;24747:996::-;25188:3;25177:9;25170:22;25151:4;25215:57;25267:3;25256:9;25252:19;25244:6;25215:57;:::i;:::-;25320:9;25312:6;25308:22;25303:2;25292:9;25288:18;25281:50;25354:44;25391:6;25383;25354:44;:::i;:::-;25340:58;;25446:9;25438:6;25434:22;25429:2;25418:9;25414:18;25407:50;25480:44;25517:6;25509;25480:44;:::i;:::-;25466:58;;25572:9;25564:6;25560:22;25555:2;25544:9;25540:18;25533:50;25600:44;25637:6;25629;25600:44;:::i;:::-;25592:52;;;-1:-1:-1;;;;;25685:6:1;25681:55;25675:3;25664:9;25660:19;25653:84;25160:583;;;;;;;;:::o;26703:219::-;26852:2;26841:9;26834:21;26815:4;26872:44;26912:2;26901:9;26897:18;26889:6;26872:44;:::i;26927:761::-;27240:3;27229:9;27222:22;27203:4;27267:45;27307:3;27296:9;27292:19;27284:6;27267:45;:::i;:::-;27360:9;27352:6;27348:22;27343:2;27332:9;27328:18;27321:50;27394:32;27419:6;27411;27394:32;:::i;:::-;27380:46;;27474:9;27466:6;27462:22;27457:2;27446:9;27442:18;27435:50;27508:49;27550:6;27542;27534;27508:49;:::i;:::-;27494:63;;27605:9;27597:6;27593:22;27588:2;27577:9;27573:18;27566:50;27633:49;27675:6;27667;27659;27633:49;:::i;:::-;27625:57;27212:476;-1:-1:-1;;;;;;;;;27212:476:1:o;40640:315::-;40825:6;40814:9;40807:25;40868:2;40863;40852:9;40848:18;40841:30;40788:4;40888:61;40945:2;40934:9;40930:18;40922:6;40914;40888:61;:::i;42157:275::-;42228:2;42222:9;42293:2;42274:13;;-1:-1:-1;;42270:27:1;42258:40;;42328:18;42313:34;;42349:22;;;42310:62;42307:2;;;42375:18;;:::i;:::-;42411:2;42404:22;42202:230;;-1:-1:-1;42202:230:1:o;42437:128::-;42477:3;42508:1;42504:6;42501:1;42498:13;42495:2;;;42514:18;;:::i;:::-;-1:-1:-1;42550:9:1;;42485:80::o;42570:120::-;42610:1;42636;42626:2;;42641:18;;:::i;:::-;-1:-1:-1;42675:9:1;;42616:74::o;42695:168::-;42735:7;42801:1;42797;42793:6;42789:14;42786:1;42783:21;42778:1;42771:9;42764:17;42760:45;42757:2;;;42808:18;;:::i;:::-;-1:-1:-1;42848:9:1;;42747:116::o;42868:125::-;42908:4;42936:1;42933;42930:8;42927:2;;;42941:18;;:::i;:::-;-1:-1:-1;42978:9:1;;42917:76::o;42998:258::-;43070:1;43080:113;43094:6;43091:1;43088:13;43080:113;;;43170:11;;;43164:18;43151:11;;;43144:39;43116:2;43109:10;43080:113;;;43211:6;43208:1;43205:13;43202:2;;;-1:-1:-1;;43246:1:1;43228:16;;43221:27;43051:205::o;43261:437::-;43340:1;43336:12;;;;43383;;;43404:2;;43458:4;43450:6;43446:17;43436:27;;43404:2;43511;43503:6;43500:14;43480:18;43477:38;43474:2;;;-1:-1:-1;;;43545:1:1;43538:88;43649:4;43646:1;43639:15;43677:4;43674:1;43667:15;43474:2;;43316:382;;;:::o;43703:135::-;43742:3;-1:-1:-1;;43763:17:1;;43760:2;;;43783:18;;:::i;:::-;-1:-1:-1;43830:1:1;43819:13;;43750:88::o;43843:112::-;43875:1;43901;43891:2;;43906:18;;:::i;:::-;-1:-1:-1;43940:9:1;;43881:74::o;43960:184::-;-1:-1:-1;;;44009:1:1;44002:88;44109:4;44106:1;44099:15;44133:4;44130:1;44123:15;44149:184;-1:-1:-1;;;44198:1:1;44191:88;44298:4;44295:1;44288:15;44322:4;44319:1;44312:15;44338:184;-1:-1:-1;;;44387:1:1;44380:88;44487:4;44484:1;44477:15;44511:4;44508:1;44501:15;44527:154;-1:-1:-1;;;;;44606:5:1;44602:54;44595:5;44592:65;44582:2;;44671:1;44668;44661:12;44686:118;44772:5;44765:13;44758:21;44751:5;44748:32;44738:2;;44794:1;44791;44784:12
Swarm Source
ipfs://822092582e88bb76ba54ceb4953ed87c984ff6175d5a6a89fde0fee445b8d40a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.